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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6565 by softime, Fri Apr 21 16:14:15 2017 UTC revision 19592 by softime, Wed Jan 22 18:04:27 2025 UTC
# Line 1  Line 1 
1  <?php  <?php
2  /**  /**
3     * DBFORM - 'instruction' - Surcharge gen.
4     *
5   * specific :   * specific :
6   * - cle secondaire   * - cle secondaire
7   *   destruction autorisée que pour le dernier evenement   *   destruction autorisée que pour le dernier evenement
# Line 12  Line 14 
14   * - function mois_date : pour ajouter des mois a une date   * - function mois_date : pour ajouter des mois a une date
15   *   [add months (delay) and calculation final date]   *   [add months (delay) and calculation final date]
16   * - voir script_lang.js : bible ...   * - voir script_lang.js : bible ...
17   *   *
18   * @package openfoncier   * @package openfoncier
19   * @version SVN : $Id$   * @version SVN : $Id$
20   */   */
21    
22  //  //
23  require_once "../gen/obj/instruction.class.php";  require_once "../gen/obj/instruction.class.php";
24    require_once "../obj/task.class.php";
25    require_once "../obj/action.class.php";
26    
27  //  //
28  class instruction extends instruction_gen {  class instruction extends instruction_gen {
29        
30      // Champs contenant les UID des fichiers      // Champs contenant les UID des fichiers
31      var $abstract_type = array(      var $abstract_type = array(
32          "om_fichier_instruction" => "file",          "om_fichier_instruction" => "file",
33      );      );
34        
     var $retourformulaire;   // specific  
     var $idxformulaire;      // specific  
35      var $valEvenement;      var $valEvenement;
36      var $restriction_valid = null;      var $restriction_valid = null;
37      // Tableau contenant une partie des métadonnées arrêtés      // Tableau contenant une partie des métadonnées arrêtés
# Line 69  class instruction extends instruction_ge Line 71  class instruction extends instruction_ge
71              "groupeInstruction" => 'getGroupeInstruction',              "groupeInstruction" => 'getGroupeInstruction',
72              "title" => 'getTitle',              "title" => 'getTitle',
73              'concerneERP' => 'get_concerne_erp',              'concerneERP' => 'get_concerne_erp',
74    
75                'date_cloture_metier' => 'getDossierDateDecision',
76                'type' => 'getDocumentType',
77                'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
78                'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
79                'region' => 'getDossierRegion',
80                'departement' => 'getDossierDepartement',
81                'commune' => 'getDossierCommune',
82                'annee' => 'getDossierAnnee',
83                'division' => 'getDossierDivision',
84                'collectivite' => 'getDossierServiceOrCollectivite',
85          ),          ),
86          "arrete" => array(          "arrete" => array(
87              "numArrete" => "getNumArrete",              "numArrete" => "getNumArrete",
# Line 85  class instruction extends instruction_ge Line 98  class instruction extends instruction_ge
98              "ap_ville" => "getAp_ville",              "ap_ville" => "getAp_ville",
99              "activite" => "getActivite",              "activite" => "getActivite",
100              "dateControleLegalite" => "getDateControleLegalite",              "dateControleLegalite" => "getDateControleLegalite",
101          ),          )
102      );      );
103    
104      function __construct($id, &$db, $debug) {      /**
105          $this->constructeur($id, $db, $debug);       * Flag pour identifier la reprise de l'instruction d'un dossier.
106         * Le statut de l'état passe de "cloture" à "encours".
107         *
108         * @var boolean
109         */
110        var $di_reopened = null;
111    
112        /**
113         * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
114         * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
115         *
116         * @param  bool  $only_for_class   Ne renvoie que les modules pour la classe de l'objet
117         *
118         * @return array  Liste de modules supplémentaires pour cet objet
119         */
120        public function get_modules_append(bool $only_for_class = false) {
121            $modules = array();
122    
123            // si on est sur un dossier d'instruction
124            if ($this->f->contexte_dossier_instruction()) {
125                $idx = $this->f->get_submitted_get_value('idxformulaire');
126    
127                $object_id = $this->getVal($this->clePrimaire);
128    
129                $evenements_ids = array();
130    
131                // Dans le cas ou on a un identifiant de dossier et que
132                // l'objet courant n'a pas de cle primaire définie
133                // ou qu'on est dans le contexte d'une classe d'objet
134                if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
135    
136                    // Utilise la valeur evenement si elle est déterminé,
137                    $evenement = $this->f->get_submitted_post_value('evenement');
138                    if (! empty($evenement)) $evenements_ids = array($evenement);
139                    // On déclenche soit lors du premier affichage d'un instruction,
140                    // soit dans le cas retour en refus de la validation du formulaire.
141                    $action = $this->f->get_submitted_get_value('action');
142    
143                    if (empty($evenements_ids) || ($this->correct !== true && $action == '0')){
144                        // si on est dans le cadre de l'affichage d'une nouvelle instruction
145                        if ($action == '0') {
146    
147                            // ajoute les modules des évènements possible sur le dossier courant
148                            $evenements_data = $this->get_var_sql_forminc__sql_evenement();
149                            $evenements_ids = array_column($evenements_data, 'evenement');
150                        }
151    
152                        // si on est dans le cadre d'un listing
153                        else if (is_null($action) || $action === '') {
154    
155                            // récupère la liste des évènements d'instructions du dossier d'instruction
156                            $sql = sprintf("
157                                SELECT
158                                    evenement
159                                FROM
160                                    ".DB_PREFIXE."instruction
161                                WHERE
162                                    dossier = '%s'
163                                ", $this->f->db->escapeSimple($idx));
164                            $qres = $this->f->get_all_results_from_db_query(
165                                $sql, array('origin' => __METHOD__));
166                            if ($qres['code'] !== 'OK') {
167                                $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
168                                $this->f->log(__METHOD__, $err_msg, 'ERROR');
169                                throw new RuntimeException($err_msg);
170                            }
171    
172                            // ajoute les modules des évènements des instructions du dossier courant
173                            $evenements_ids = array_column($qres['result'], 'evenement');
174                        }
175                    }
176                }
177                if (!empty($evenements_ids)){
178                    $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
179                    $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
180                        'evenement', $evenements_ids, $this, false);
181                }
182            }
183            return $modules;
184      }      }
185    
186      // {{{ Gestion de la confidentialité des données spécifiques      // {{{ Gestion de la confidentialité des données spécifiques
187        
188      /**      /**
189       * Définition des actions disponibles sur la classe.       * Définition des actions disponibles sur la classe.
190       *       *
# Line 113  class instruction extends instruction_ge Line 204  class instruction extends instruction_ge
204              "is_editable",              "is_editable",
205              "is_finalizable_without_bypass",              "is_finalizable_without_bypass",
206              "can_user_access_dossier_contexte_modification",              "can_user_access_dossier_contexte_modification",
207                "is_evenement_modifiable",
208          );          );
209          $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");          $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
210            
211          // ACTION - 002 - supprimer          // ACTION - 002 - supprimer
212          // Modifie la condition et le libellé du bouton supprimer          // Modifie la condition et le libellé du bouton supprimer
213          $this->class_actions[2]["condition"] = array(          $this->class_actions[2]["condition"] = array(
214              "is_deletable",              "is_deletable",
215              "is_finalizable_without_bypass",              "is_finalizable_without_bypass",
216              "can_user_access_dossier_contexte_modification"              "can_user_access_dossier_contexte_modification",
217                "is_evenement_supprimable",
218          );          );
219          $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");          $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
220    
221          // ACTION - 003 - consulter          // ACTION - 003 - consulter
222          //          //
223          $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";          $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
224    
225          // ACTION - 100 - finaliser          // ACTION - 100 - finaliser
# Line 135  class instruction extends instruction_ge Line 228  class instruction extends instruction_ge
228              "identifier" => "finaliser",              "identifier" => "finaliser",
229              "portlet" => array(              "portlet" => array(
230                  "type" => "action-direct",                  "type" => "action-direct",
231                  "libelle" => _("Finaliser le document"),                  "libelle" => __("Finaliser le document"),
232                  "order" => 110,                  "order" => 110,
233                  "class" => "finalise",                  "class" => "finalise",
234              ),              ),
# Line 157  class instruction extends instruction_ge Line 250  class instruction extends instruction_ge
250              "identifier" => "definaliser",              "identifier" => "definaliser",
251              "portlet" => array(              "portlet" => array(
252                  "type" => "action-direct",                  "type" => "action-direct",
253                  "libelle" => _("Reprendre la redaction du document"),                  "libelle" => __("Reprendre la redaction du document"),
254                  "order" => 110,                  "order" => 110,
255                  "class" => "definalise",                  "class" => "definalise",
256              ),              ),
# Line 169  class instruction extends instruction_ge Line 262  class instruction extends instruction_ge
262                  "is_unfinalizable",                  "is_unfinalizable",
263                  "is_unfinalizable_without_bypass",                  "is_unfinalizable_without_bypass",
264                  "can_user_access_dossier_contexte_modification",                  "can_user_access_dossier_contexte_modification",
265                    "is_not_sent_for_signature",
266                    "is_not_signed",
267                ),
268            );
269    
270            // ACTION - 115 - Modification d'un document généré par une instruction
271            // Permet à un instructeur de modifier un document généré par une instruction
272            $this->class_actions[115] = array(
273                "identifier" => "modale_selection_document_signe",
274                "portlet" => array(
275                    "type" => "action-self",
276                    "libelle" => __("Remplacer par le document signé"),
277                    "order" => 115,
278                    "class" => "selection-document-signé",
279                ),
280                "view" => "view_modale_selection_document_signe",
281                "permission_suffix" => "selection_document_signe",
282                "condition" => array(
283                    "is_finalized",
284                    "is_not_date_retour_signature_set",
285              ),              ),
286          );          );
287    
# Line 178  class instruction extends instruction_ge Line 291  class instruction extends instruction_ge
291              "identifier" => "edition",              "identifier" => "edition",
292              "portlet" => array(              "portlet" => array(
293                  "type" => "action-blank",                  "type" => "action-blank",
294                  "libelle" => _("Edition"),                  "libelle" => __("Edition"),
295                  "order" => 100,                  "order" => 100,
296                  "class" => "pdf-16",                  "class" => "pdf-16",
297              ),              ),
# Line 193  class instruction extends instruction_ge Line 306  class instruction extends instruction_ge
306              "identifier" => "modifier_suivi",              "identifier" => "modifier_suivi",
307              "portlet" => array(              "portlet" => array(
308                  "type" => "action-self",                  "type" => "action-self",
309                  "libelle" => _("Suivi des dates"),                  "libelle" => __("Suivi des dates"),
310                  "order" => 125,                  "order" => 125,
311                  "class" => "suivi-dates-16",                  "class" => "suivi-dates-16",
312              ),              ),
# Line 242  class instruction extends instruction_ge Line 355  class instruction extends instruction_ge
355              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
356          );          );
357    
358            // ACTION - 175 - edit_by_notification_task
359            // Action à utiliser lors de la mise à jour des instructions par notification
360            $this->class_actions[175] = array(
361                "identifier" => "edit_by_notification_task",
362                "view" => "formulaire",
363                "permission_suffix" => "modifier",
364                "crud" => "update",
365            );
366    
367            // ACTION - 176 - add_by_evenement_retour_after_notification_task
368            // Action à utiliser lors de l'ajout des instructions par événement suivant
369            // suite à une notification par tâche (donc notification dématerialisée)
370            $this->class_actions[176] = array(
371                "identifier" => "add_by_evenement_retour_after_notification_task",
372                "view" => "formulaire",
373                "permission_suffix" => "ajouter",
374                "crud" => "create",
375            );
376    
377          // ACTION - 180 - pdf_lettre_rar          // ACTION - 180 - pdf_lettre_rar
378          // Génère PDF sur bordereaux de lettres RAR          // Génère PDF sur bordereaux de lettres AR
379          $this->class_actions[180] = array(          $this->class_actions[180] = array(
380              "identifier" => "pdf_lettre_rar",              "identifier" => "pdf_lettre_rar",
381              "view" => "view_pdf_lettre_rar",              "view" => "view_pdf_lettre_rar",
# Line 273  class instruction extends instruction_ge Line 405  class instruction extends instruction_ge
405              "identifier" => "notifier_commune",              "identifier" => "notifier_commune",
406              "portlet" => array(              "portlet" => array(
407                  "type" => "action-direct-with-confirmation",                  "type" => "action-direct-with-confirmation",
408                  "libelle" => _("Notifier la commune par courriel"),                  "libelle" => __("Notifier la commune par courriel"),
409                  "order" => 210,                  "order" => 210,
410                  "class" => "notifier_commune-16",                  "class" => "notifier_commune-16",
411              ),              ),
# Line 283  class instruction extends instruction_ge Line 415  class instruction extends instruction_ge
415              "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),              "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
416          );          );
417    
418          // ACTION - 220 - generate_suivi_bordereaux          // ACTION - 220 - generate_suivi_bordereaux
419          // GénÚre PDF bordereaux            // GénÚre PDF bordereaux
420          $this->class_actions[220] = array(          $this->class_actions[220] = array(
421              "identifier" => "generate_suivi_bordereaux",              "identifier" => "generate_suivi_bordereaux",
422              "view" => "view_generate_suivi_bordereaux",              "view" => "view_generate_suivi_bordereaux",
423                "permission_suffix" => "consulter",
424            );
425    
426            // ACTION - 777 - pdf_temp
427            // Crée un PDF temporaire et affiche son contenu en base64
428            $this->class_actions[777] = array(
429                "identifier" => "pdf_temp",
430                "view" => "view_pdf_temp",
431                "permission_suffix" => "modifier",
432                "condition" => array("can_user_access_dossier_contexte_modification"),
433            );
434    
435            // ACTION - 701
436            $this->class_actions[701] = array(
437                "identifier" => "enable-edition-integrale",
438                "portlet" => array(
439                    "type" => "action-direct-with-confirmation",
440                    "libelle" => __("Rédaction libre"),
441                    "order" => 50,
442                    "class" => "redac-libre-16",
443                ),
444                "view" => "formulaire",
445                "method" => "enable_edition_integrale",
446                "permission_suffix" => "modifier",
447                "condition" => array(
448                    "is_editable",
449                    "is_finalizable_without_bypass",
450                    "can_user_access_dossier_contexte_modification",
451                    "is_edition_integrale_not_enabled",
452                    "is_option_redaction_libre_enabled",
453                    "has_an_edition",
454                ),
455            );
456            // ACTION - 702
457            $this->class_actions[702] = array(
458                "identifier" => "disable-edition-integrale",
459                "portlet" => array(
460                    "type" => "action-direct-with-confirmation",
461                    "libelle" => __("Rédaction par compléments"),
462                    "order" => 50,
463                    "class" => "redac-complement-16",
464                ),
465                "view" => "formulaire",
466                "method" => "disable_edition_integrale",
467                "permission_suffix" => "modifier",
468                "condition" => array(
469                    "is_editable",
470                    "is_finalizable_without_bypass",
471                    "can_user_access_dossier_contexte_modification",
472                    "is_edition_integrale_enabled",
473                    "is_option_redaction_libre_enabled",
474                    "has_an_edition",
475                ),
476            );
477            // ACTION - 300 - evenement_has_an_edition_json
478            //
479            $this->class_actions[300] = array(
480                "identifier" => "evenement_has_an_edition_json",
481                "view" => "view_evenement_has_an_edition_json",
482                "permission_suffix" => "consulter",
483            );
484    
485            // ACTION - 301 - evenement_has_a_commentaire
486            //
487            $this->class_actions[301] = array(
488                "identifier" => "evenement_has_a_commentaire_json",
489                "view" => "view_evenement_has_a_commentaire_json",
490                "permission_suffix" => "consulter",
491            );
492            // ACTION - 302 - evenement_has_a_tiers_destinataire
493            //
494            $this->class_actions[302] = array(
495                "identifier" => "evenement_has_a_tiers_destinataire",
496                "view" => "view_evenement_has_a_tiers_destinataire",
497                "permission_suffix" => "consulter",
498            );
499    
500            // ACTION - 400 - Envoyer en signature
501            // Cet évenement permet d'envoyer le document au parapheur pour signature
502            $this->class_actions[400] = array(
503                "identifier" => "envoyer_a_signature",
504                "portlet" => array(
505                    "libelle" => __("Envoyer à signature"),
506                    "type" => "action-direct-with-confirmation",
507                    "class" => "envoyer_a_signature-16",
508                ),
509                "view" => "formulaire",
510                "method" => "envoyer_a_signature_sans_relecture",
511                "condition" => array(
512                    "can_be_signed",
513                ),
514                "permission_suffix" => "envoyer_a_signature",
515            );
516    
517            // ACTION - 402 - Envoyer en signature avec relecture
518            // Cet évenement permet d'envoyer le document au parapheur pour signature
519            $this->class_actions[402] = array(
520                "identifier" => "envoyer_a_signature_relecture",
521                "portlet" => array(
522                    "libelle" => __("Envoyer à signature avec relecture"),
523                    "type" => "action-direct-with-confirmation",
524                    "class" => "envoyer_a_signature-16",
525                ),
526                "view" => "formulaire",
527                "method" => "envoyer_a_signature_avec_relecture",
528                "condition" => array(
529                    "can_be_signed",
530                    "is_parapheur_relecture_parameter_enabled"
531                ),
532                "permission_suffix" => "envoyer_a_signature",
533            );
534    
535            // ACTION - 404 - Annuler l'envoi en signature
536            // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
537            $this->class_actions[404] = array(
538                "identifier" => "annuler_envoi_signature",
539                "portlet" => array(
540                    "libelle" => __("Annuler l'envoi en signature"),
541                    "type" => "action-direct-with-confirmation",
542                    "class" => "annuler_envoi_signature-16",
543                ),
544                "view" => "formulaire",
545                "method" => "annuler_envoi_en_signature",
546                "condition" => array(
547                    "is_sent_for_signature",
548                    "is_parapheur_annulation_parameter_enabled"
549                ),
550                "permission_suffix" => "envoyer_a_signature",
551            );
552    
553            //
554            $this->class_actions[401] = array(
555                "identifier" => "preview_edition",
556                "view" => "formulaire",
557                "permission_suffix" => "tab",
558            );
559    
560            //
561            $this->class_actions[405] = array(
562                "identifier" => "telecharger_editions",
563                "view" => "view_telecharger_editions",
564                "permission_suffix" => "om_fichier_instruction_telecharger",
565            );
566    
567            // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
568            $this->class_actions[410] = array(
569                "identifier" => "overlay_notification_manuelle",
570                "portlet" => array(
571                    "libelle" => __("Notifier les pétitionnaires"),
572                    "type" => "action-self",
573                    "class" => "notifier_commune-16",
574                ),
575                "condition" => array(
576                    "is_notifiable_by_task_manual",
577                    "is_not_portail_notification_sans_annexe"
578                ),
579                "view" => "view_overlay_notification_manuelle",
580                "permission_suffix" => "modifier",
581            );
582    
583            // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
584            $this->class_actions[411] = array(
585                "identifier" => "notification_manuelle_portal",
586                "portlet" => array(
587                    "libelle" => __("Notifier les pétitionnaires"),
588                    "type" => "action-direct-with-confirmation",
589                    "class" => "notifier_commune-16",
590                ),
591                "condition" => array(
592                    "is_notifiable_by_task_manual",
593                    "is_portail_notification_sans_annexe"
594                ),
595                "method" => "notifier_demandeur_principal_via_portal",
596                "permission_suffix" => "modifier",
597            );
598    
599            // ACTION - 412 - Vérifie le dépassement de la date limite de notification
600            $this->class_actions[412] = array(
601                "identifier" => "is_date_limite_notification_dossier_depasse",
602                "view" => "is_date_limite_notification_dossier_depasse",
603                "permission_suffix" => "modifier",
604            );
605    
606            // ACTION - 420 - Notifier les services consultés (mail)
607            $this->class_actions[420] = array(
608                "identifier" => "overlay_notification_service_consulte",
609                "portlet" => array(
610                    "libelle" => __("Notifier les services consultés"),
611                    "type" => "action-self",
612                    "class" => "notifier_commune-16",
613                ),
614                "condition" => array(
615                    "is_service_notifiable"
616                ),
617                "view" => "view_overlay_notification_service_consulte",
618                "permission_suffix" => "tab",
619            );
620    
621            // ACTION - 430 - Notifier les tiers consultés (mail)
622            $this->class_actions[430] = array(
623                "identifier" => "overlay_notification_tiers_consulte",
624                "portlet" => array(
625                    "libelle" => __("Notifier les tiers consultés"),
626                    "type" => "action-self",
627                    "class" => "notifier_commune-16",
628                ),
629                "condition" => array(
630                    "is_tiers_notifiable"
631                ),
632                "view" => "view_overlay_notification_tiers_consulte",
633                "permission_suffix" => "tab",
634            );
635    
636            //
637            $this->class_actions[403] = array(
638                "identifier" => "envoyer_au_controle_de_legalite",
639                "portlet" => array(
640                    "libelle" => __("Envoyer au contrôle de légalité"),
641                    "type" => "action-direct-with-confirmation",
642                    "class" => "envoyer_au_controle_de_legalite-16",
643                ),
644                "view" => "formulaire",
645                "method" => "envoyer_au_controle_de_legalite",
646                "condition" => array(
647                    "can_be_sent_to_cl"
648                ),
649                "permission_suffix" => "envoyer_au_controle_de_legalite",
650            );
651    
652            //
653            $this->class_actions[998] = array(
654                "identifier" => "json_data",
655                "view" => "view_json_data",
656              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
657          );          );
658      }      }
659    
660        /**
661         * Clause select pour la requête de sélection des données de l'enregistrement.
662         *
663         * @return array
664         */
665        function get_var_sql_forminc__champs() {
666            return array(
667                "instruction",
668                "destinataire",
669                "instruction.evenement",
670                "instruction.commentaire",
671                "date_evenement",
672                "document_type_instruction",
673                "fichier_instruction_name",
674                "instruction.lettretype",
675                "signataire_arrete",
676                "tiers_destinataire",
677                "tiers_destinataire_parametre",
678                "flag_edition_integrale",
679                "om_final_instruction_utilisateur",
680                "date_finalisation_courrier",
681                "date_envoi_signature",
682                "date_retour_signature",
683                "date_envoi_rar",
684    
685                "date_retour_rar",
686                "date_envoi_controle_legalite",
687                "date_retour_controle_legalite",
688    
689                "numero_arrete",
690    
691                "complement_om_html",
692                "'' as bible_auto",
693                "'' as bible",
694                "complement2_om_html",
695                "'' as bible2",
696                "complement3_om_html",
697                "'' as bible3",
698                "complement4_om_html",
699                "'' as bible4",
700    
701                "titre_om_htmletat",
702                "corps_om_htmletatex",
703    
704                "'' as btn_preview",
705                "'' as btn_redaction",
706    
707                "'' as btn_refresh",
708                "'' as live_preview",
709    
710                "dossier",
711                "instruction.action",
712                "instruction.delai",
713                "instruction.etat",
714                "instruction.autorite_competente",
715                "instruction.accord_tacite",
716                "instruction.delai_notification",
717                "instruction.avis_decision",
718                "archive_delai",
719                "archive_accord_tacite",
720                "archive_etat",
721                "archive_avis",
722                "archive_date_complet",
723                "archive_date_rejet",
724                "archive_date_limite",
725                "archive_date_notification_delai",
726                "archive_date_decision",
727                "archive_date_validite",
728                "archive_date_achevement",
729                "archive_date_conformite",
730                "archive_date_chantier",
731                "archive_date_dernier_depot",
732                "date_depot",
733                "date_depot_mairie",
734                "complement5_om_html",
735                "'' as bible5",
736                "complement6_om_html",
737                "'' as bible6",
738                "complement7_om_html",
739                "'' as bible7",
740                "complement8_om_html",
741                "'' as bible8",
742                "complement9_om_html",
743                "'' as bible9",
744                "complement10_om_html",
745                "'' as bible10",
746                "complement11_om_html",
747                "'' as bible11",
748                "complement12_om_html",
749                "complement13_om_html",
750                "complement14_om_html",
751                "complement15_om_html",
752                "archive_incompletude",
753                "archive_incomplet_notifie",
754                "archive_evenement_suivant_tacite",
755                "archive_evenement_suivant_tacite_incompletude",
756                "archive_etat_pendant_incompletude",
757                "archive_date_limite_incompletude",
758                "archive_delai_incompletude",
759                "archive_autorite_competente",
760                "code_barres",
761                "om_fichier_instruction",
762                "om_final_instruction",
763                "om_fichier_instruction_dossier_final",
764                "document_numerise",
765                "duree_validite_parametrage",
766                "duree_validite",
767                "created_by_commune",
768                "archive_date_cloture_instruction",
769                "archive_date_premiere_visite",
770                "archive_date_derniere_visite",
771                "archive_date_contradictoire",
772                "archive_date_retour_contradictoire",
773                "archive_date_ait",
774                "archive_date_transmission_parquet",
775                "archive_dossier_instruction_type",
776                "archive_date_affichage",
777                "pec_metier",
778                "archive_pec_metier",
779                "archive_a_qualifier",
780                "id_parapheur_signature",
781                "statut_signature",
782                "commentaire_signature",
783                "historique_signature",
784                "'' as suivi_notification",
785                "'' as suivi_notification_service",
786                "'' as suivi_notification_tiers",
787                "'' as suivi_notification_commune",
788    
789                "'' as preview_edition",
790                "envoye_cl_platau",
791                "'' as log_instruction",
792                "parapheur_lien_page_signature"
793            );
794        }
795    
796        /**
797         * CONDITION - is_edition_integrale_enabled
798         *
799         * Vérifie que la rédaction libre est activée sur l'instruction en cours.
800         *
801         * @return boolean
802         */
803        function is_edition_integrale_enabled() {
804            if ($this->getVal("flag_edition_integrale") == 't') {
805                return true;
806            }
807            return false;
808        }
809    
810      /**      /**
811       * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier       * CONDITION - is_edition_integrale_not_enabled
812         *
813         * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
814         *
815         * @return boolean
816       */       */
817      function getNumDemandeAutorFromDossier($id) {      function is_edition_integrale_not_enabled() {
818            return !$this->is_edition_integrale_enabled();
819        }
820    
821        /**
822         * CONDITION - is_option_redaction_libre_enabled
823         *
824         * Vérifie que l'option de rédaction libre est activée.
825         *
826         * @return boolean
827         */
828        function is_option_redaction_libre_enabled() {
829            $collectivite_di = $this->get_dossier_instruction_om_collectivite();
830            return $this->f->is_option_redaction_libre_enabled($collectivite_di);
831        }
832    
833        /**
834         * CONDITION - is_option_parapheur_relecture_enabled
835         *
836         * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
837         *
838         * @return boolean
839         */
840        function is_parapheur_relecture_parameter_enabled() {
841            //Instanciation de la classe electronicsignature
842            $inst_es = $this->get_electronicsignature_instance();
843            if ($inst_es === false) {
844                return false;
845            }
846    
847            if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
848                return false;
849            }
850    
851            return true;
852        }
853    
854        /**
855         * CONDITION - is_parapheur_annulation_parameter_enabled
856         *
857         * Vérifie que l'option d'annulation de l'envoi en signature est activée.
858         *
859         * @return boolean
860         */
861        function is_parapheur_annulation_parameter_enabled() {
862            //Instanciation de la classe electronicsignature
863            $inst_es = $this->get_electronicsignature_instance();
864            if ($inst_es === false) {
865                return false;
866            }
867    
868            if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
869                return false;
870            }
871    
872            return true;
873        }
874    
875    
876        /**
877         * CONDITION - is_sent_for_signature
878         *
879         * Vérifie que l'instruction a été envoyé à signature
880         *
881         * @return boolean
882         */
883        function is_sent_for_signature() {
884            // Si un parapheur a été configuré
885            // et que le champ id_parapheur_signature n'est pas vide
886            // que le status est différent de "canceled" ou "expired"
887            // alors l'évènement a été envoyé en signature
888            if ($this->has_connector_electronicsignature() === true
889                && empty($this->getVal("id_parapheur_signature")) === false
890                && ($this->getVal("statut_signature") != "canceled"
891                && $this->getVal("statut_signature") != "expired"
892                && $this->getVal("statut_signature") != "finished")) {
893                //
894                return true;
895            }
896    
897            return false;
898        }
899    
900        /**
901         * CONDITION - is_not_sent_for_signature
902         *
903         * Vérifie que l'instruction n'a pas été envoyé à signature
904         *
905         * @return boolean
906         */
907        function is_not_sent_for_signature() {
908            // Contrôle si l'utilisateur possède un bypass
909            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
910            if ($bypass == true) {
911                return true;
912            }
913    
914            return !$this->is_sent_for_signature();
915        }
916    
917    
918        /**
919         * CONDITION - is_signed
920         *
921         * Vérifie que l'instruction a été signé
922         *
923         * @return boolean
924         */
925        function is_signed() {
926            // Si un parapheur a été configuré
927            // et que le champ id_parapheur_signature n'est pas vide
928            //  et que le statut est égal à "finished"
929            // alors le document de l'instruciton à été signé
930            if ($this->has_connector_electronicsignature() === true
931                && empty($this->getVal("id_parapheur_signature")) === false
932                && $this->getVal("statut_signature") == "finished") {
933                //
934                return true;
935            }
936    
937            return false;
938        }
939    
940        /**
941         * CONDITION - is_signed
942         *
943         * Vérifie que l'instruction n'a pas été signée
944         *
945         * @return boolean
946         */
947        function is_not_signed() {
948            // Contrôle si l'utilisateur possède un bypass
949            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
950            if ($bypass == true) {
951                return true;
952            }
953    
954            return !$this->is_signed();
955        }
956    
957    
958        /**
959         * is_sent_to_cl
960         *
961         * Vérifie que l'instruction a été envoyé au contrôle de légalité
962         *
963         * @return boolean
964         */
965        function is_sent_to_cl() {
966            // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
967            if ($this->getVal('envoye_cl_platau') === 't') {
968                //
969                return true;
970            }
971          //          //
972          if (!isset($id)) {          return false;
973              return NULL;      }
974    
975        /**
976         * CONDITION - is_portail_notification
977         *
978         * Vérifie si la notification est une notification de catégorie portail
979         *
980         * @return boolean
981         */
982        function is_portail_notification_sans_annexe() {
983            $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
984            $ev = $this->get_inst_evenement($this->getVal('evenement'));
985            if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
986                && $ev->getVal('notification') != 'notification_manuelle_annexe'
987                && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
988            ) {
989                return true;
990            }
991            return false;
992        }
993    
994        /**
995         * CONDITION - is_not_portail_notification
996         *
997         * Vérifie si la notification n'est pas une notification de catégorie portail
998         *
999         * @return boolean
1000         */
1001        function is_not_portail_notification_sans_annexe() {
1002            return (! $this->is_portail_notification_sans_annexe());
1003        }
1004    
1005        /**
1006         * CONDITION - can_be_signed
1007         *
1008         * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
1009         *
1010         * @return boolean
1011         */
1012        function can_be_signed() {
1013            // Instanciation de l'objet signataire_arrete
1014            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1015                "obj" => "signataire_arrete",
1016                "idx" => $this->getVal("signataire_arrete"),
1017            ));
1018            // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1019            // possède une adresse email, on vérifie le champ id_parapheur_signature
1020            // S'il est vide l'évènement peut être envoyé en signature
1021            // S'il ne l'est pas, alors on vérifie le champ statut_signature
1022            // Si la valeur de ce champ est égal à "canceled" ou "expired"
1023            // alors l'évènement peut être envoyé en signature
1024            if ($this->has_connector_electronicsignature() === true
1025                && $this->getVal("om_final_instruction") == 't'
1026                && empty($inst_signataire_arrete->getVal('email')) === false) {
1027                //
1028                if (empty($this->getVal("id_parapheur_signature")) === true
1029                    || $this->getVal("statut_signature") == "canceled"
1030                    || $this->getVal("statut_signature") == "expired") {
1031                    //
1032                    return true;
1033                }
1034            }
1035    
1036            $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1037            $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1038            $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1039            $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1040            $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1041    
1042            return false;
1043        }
1044    
1045        /**
1046         * CONDITION - has_connector_electronicsignature
1047         *
1048         * Vérifie qu'un parapheur est paramétré
1049         *
1050         * @return boolean
1051         */
1052        function has_connector_electronicsignature() {
1053            $inst_es = $this->get_electronicsignature_instance(false);
1054            if ($inst_es === false) {
1055                return false;
1056            }
1057            return true;
1058        }
1059    
1060        /**
1061         * CONDITION - can_display_parapheur
1062         *
1063         * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1064         *
1065         * @return boolean
1066         */
1067        function can_display_parapheur() {
1068            $evenement_id = $this->getVal("evenement");
1069            $inst_evenement = $this->get_inst_evenement($evenement_id);
1070            if ($this->has_connector_electronicsignature() === true
1071                && $inst_evenement->getVal('lettretype') !== ''
1072                && $inst_evenement->getVal('lettretype') !== null
1073                && (empty($this->getVal("id_parapheur_signature")) === false
1074                    || empty($this->getVal("historique_signature")) === false)) {
1075                //
1076                return true;
1077            }
1078    
1079            return false;
1080        }
1081    
1082        /**
1083         * CONDITION - can_display_notification
1084         *
1085         * Vérifie que le champs "Suivi notification" est affichable
1086         *
1087         * @return boolean
1088         */
1089        function can_display_notification_demandeur() {
1090            // Le suivi des notification est affiché si l'instruction a
1091            // des notifications de demandeurs associées
1092            $idsNotifs = $this->get_instruction_notification(
1093                $this->getVal($this->clePrimaire),
1094                array(
1095                    'notification_recepisse',
1096                    'notification_instruction',
1097                    'notification_decision',
1098                ),
1099                true
1100            );
1101            return isset($idsNotifs) && $idsNotifs !== array();
1102        }
1103    
1104        /**
1105         * CONDITION - can_display_notification
1106         *
1107         * Vérifie que le champs "suivi_notification_service" est affichable
1108         *
1109         * @return boolean
1110         */
1111        function can_display_notification_service() {
1112            // Le suivi des notification est affiché si l'événement est notifiable
1113            // et si des notifications ont été envoyées
1114            $evenement_id = $this->getVal("evenement");
1115            $inst_evenement = $this->get_inst_evenement($evenement_id);
1116            if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1117                // Des notifications ont été envoyé si il existe au moins une notification
1118                // de type notification_service_consulte liées à l'instruction
1119                $idsNotifs = $this->get_instruction_notification(
1120                    $this->getVal($this->clePrimaire),
1121                    'notification_service_consulte'
1122                );
1123                if (isset($idsNotifs) && $idsNotifs !== array()) {
1124                    return true;
1125                }
1126          }          }
1127            return false;
1128        }
1129    
1130    
1131        /**
1132         * CONDITION - can_display_notification_tiers
1133         *
1134         * Vérifie que le champs "suivi_notification_tiers" est affichable
1135         *
1136         * @return boolean
1137         */
1138        function can_display_notification_tiers() {
1139            // Le suivi des notification est affiché si l'instruction a
1140            // des notifications de tiers associées
1141            $idsNotifs = $this->get_instruction_notification(
1142                $this->getVal($this->clePrimaire),
1143                'notification_tiers_consulte'
1144            );
1145            return isset($idsNotifs) && $idsNotifs !== array();
1146        }
1147    
1148        /**
1149         * CONDITION - can_display_notification_commune
1150         *
1151         * Vérifie que le champs "suivi_notification_commune" est affichable
1152         *
1153         * @return boolean
1154         */
1155        function can_display_notification_commune() {
1156            // Le suivi des notification si il existe au moins une notification
1157            // de type notification_depot_demat liées à l'instruction
1158            $idsNotifs = $this->get_instruction_notification(
1159                $this->getVal($this->clePrimaire),
1160                array('notification_depot_demat', 'notification_commune')
1161            );
1162            if (isset($idsNotifs) && $idsNotifs !== array()) {
1163                return true;
1164            }
1165            return false;
1166        }
1167    
1168        /**
1169         * TREATMENT - disable_edition_integrale.
1170         *
1171         * Cette methode permet de passer la consultation en "lu"
1172         *
1173         * @return boolean true si maj effectué false sinon
1174         */
1175        function disable_edition_integrale() {
1176            // Cette méthode permet d'exécuter une routine en début des méthodes
1177            // dites de TREATMENT.
1178            $this->begin_treatment(__METHOD__);
1179            $this->correct = true;
1180            $valF = array(
1181                "flag_edition_integrale" => false,
1182                "titre_om_htmletat" => null,
1183                "corps_om_htmletatex" => null,
1184            );
1185            $res = $this->f->db->autoExecute(
1186                DB_PREFIXE.$this->table,
1187                $valF,
1188                DB_AUTOQUERY_UPDATE,
1189                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1190            );
1191            if ($this->f->isDatabaseError($res, true)) {
1192                // Appel de la methode de recuperation des erreurs
1193                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1194                $this->correct = false;
1195                // Termine le traitement
1196                return $this->end_treatment(__METHOD__, false);
1197            } else {
1198                $this->addToMessage(__("Rédaction par compléments activé."));
1199                return $this->end_treatment(__METHOD__, true);
1200            }
1201    
1202            // Termine le traitement
1203            return $this->end_treatment(__METHOD__, false);
1204        }
1205    
1206        /**
1207         * TREATMENT - enable_edition_integrale.
1208         *
1209         * Cette methode permet de passer la consultation en "lu"
1210         *
1211         * @return boolean true si maj effectué false sinon
1212         */
1213        function enable_edition_integrale() {
1214            // Cette méthode permet d'exécuter une routine en début des méthodes
1215            // dites de TREATMENT.
1216            $this->begin_treatment(__METHOD__);
1217            $this->correct = true;
1218    
1219            // Récupère la collectivite du dossier d'instruction
1220            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1221            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1222            //
1223            $params = array(
1224                "specific" => array(
1225                    "corps" => array(
1226                        "mode" => "get",
1227                    )
1228                ),
1229            );
1230            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1231            $corps = $result['pdf_output'];
1232          //          //
1233          $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";          $params = array(
1234          $sql .= " where dossier='".$id."'";              "specific" => array(
1235                    "titre" => array(
1236                        "mode" => "get",
1237                    )
1238                ),
1239            );
1240            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1241            $titre = $result['pdf_output'];
1242          //          //
1243          $dossier_autorisation = $this->db->getOne($sql);          $valF = array(
1244          $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);              "flag_edition_integrale" => true,
1245          database::isError($dossier_autorisation);              "titre_om_htmletat" => $titre,
1246                "corps_om_htmletatex" => $corps,
1247            );
1248            $res = $this->f->db->autoExecute(
1249                DB_PREFIXE.$this->table,
1250                $valF,
1251                DB_AUTOQUERY_UPDATE,
1252                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1253            );
1254            if ($this->f->isDatabaseError($res, true)) {
1255                // Appel de la methode de recuperation des erreurs
1256                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1257                $this->correct = false;
1258                // Termine le traitement
1259                return $this->end_treatment(__METHOD__, false);
1260            } else {
1261                $this->addToMessage(__("Rédaction libre activé."));
1262                return $this->end_treatment(__METHOD__, true);
1263            }
1264    
1265            // Termine le traitement
1266            return $this->end_treatment(__METHOD__, false);
1267        }
1268    
1269        /**
1270         * Cette méthode instancie le dossier à partir de l'identifiant passé
1271         * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1272         * associé au dossier.
1273         * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1274         * renverra NULL
1275         *
1276         * @param string identifiant du dossier
1277         * @return null|string null ou identifiant du DA
1278         */
1279        function getNumDemandeAutorFromDossier($id) {
1280            if (!isset($id)) {
1281                return NULL;
1282            }
1283    
1284            $dossier = $this->f->get_inst__om_dbform(array(
1285                'obj' => 'dossier',
1286                'idx' => $id,
1287            ));
1288    
1289            return $dossier->getVal('dossier_autorisation');
1290        }
1291    
1292    
1293        /**
1294         * Cette méthode permet de récupérer le libelle du type de document
1295         * en instanciant l'objet document_type.
1296         *
1297         * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1298         * on le récupère pour l'afficher.
1299         *
1300         * @return string|NULL Retourne le libelle du type de document ou vide
1301         */
1302        function get_type_document_linked_with_instruction(){
1303          //          //
1304          return $dossier_autorisation;          $document_type = $this->f->get_inst__om_dbform(array(
1305                'obj' => 'document_type',
1306                'idx' => $this->getVal("document_type_instruction"),
1307            ));
1308            if ($document_type->exists() === true) {
1309               return $document_type->getVal("libelle");
1310            }
1311            return NULL;
1312      }      }
1313    
     // }}}  
1314    
1315      function setType(&$form, $maj) {      function setType(&$form, $maj) {
1316          //          $data = array('form' => &$form, 'maj' => &$maj);
1317          parent::setType($form, $maj);          $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1318          // On cache tous les champs  
1319          // XXX          // Récupération du mode de l'action
1320          $form->setType('complement5_om_html', 'hidden');          $crud = $this->get_action_crud($maj);
1321          $form->setType('bible5', 'hidden');          // Récupère la collectivité du dossier d'instruction
1322          $form->setType('complement6_om_html', 'hidden');          $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1323          $form->setType('bible6', 'hidden');  
1324          $form->setType('complement7_om_html', 'hidden');          // Cache tous les champs
1325          $form->setType('bible7', 'hidden');          foreach ($this->champs as $value) {
1326          $form->setType('complement8_om_html', 'hidden');              $form->setType($value, 'hidden');
         $form->setType('bible8', 'hidden');  
         $form->setType('complement9_om_html', 'hidden');  
         $form->setType('bible9', 'hidden');  
         $form->setType('complement10_om_html', 'hidden');  
         $form->setType('bible10', 'hidden');  
         $form->setType('complement11_om_html', 'hidden');  
         $form->setType('bible11', 'hidden');  
         $form->setType('complement12_om_html', 'hidden');  
         $form->setType('bible12', 'hidden');  
         $form->setType('complement13_om_html', 'hidden');  
         $form->setType('bible13', 'hidden');  
         $form->setType('complement14_om_html', 'hidden');  
         $form->setType('bible14', 'hidden');  
         $form->setType('complement15_om_html', 'hidden');  
         $form->setType('bible15', 'hidden');  
         //  
         $form->setType('delai', 'hidden');  
         $form->setType('etat', 'hidden');  
         $form->setType('accord_tacite', 'hidden');  
         $form->setType('action', 'hidden');  
         $form->setType('delai_notification', 'hidden');  
         $form->setType('avis_decision', 'hidden');  
         $form->setType('autorite_competente', 'hidden');  
         //  
         $form->setType('archive_delai', 'hidden');  
         $form->setType('archive_etat', 'hidden');  
         $form->setType('archive_accord_tacite', 'hidden');  
         $form->setType('archive_avis', 'hidden');  
         $form->setType('archive_date_complet', 'hiddendate');  
         $form->setType('archive_date_dernier_depot', 'hiddendate');  
         $form->setType('archive_date_rejet', 'hiddendate');  
         $form->setType('archive_date_limite', 'hiddendate');  
         $form->setType('archive_date_notification_delai', 'hiddendate');  
         $form->setType('archive_date_decision', 'hiddendate');  
         $form->setType('archive_date_validite', 'hiddendate');  
         $form->setType('archive_date_achevement', 'hiddendate');  
         $form->setType('archive_date_conformite', 'hiddendate');  
         $form->setType('archive_date_chantier', 'hiddendate');  
         $form->setType('archive_autorite_competente','hidden');  
         $form->setType('date_depot','hidden');  
         //  
         $form->setType('numero_arrete', 'hidden');  
         //  
         $form->setType('code_barres', 'hidden');  
           
         //  
         $form->setType('archive_incompletude','hidden');  
         $form->setType('archive_incomplet_notifie','hidden');  
         $form->setType('archive_evenement_suivant_tacite','hidden');  
         $form->setType('archive_evenement_suivant_tacite_incompletude','hidden');  
         $form->setType('archive_etat_pendant_incompletude','hidden');  
         $form->setType('archive_date_limite_incompletude','hiddendate');  
         $form->setType('archive_delai_incompletude','hidden');  
   
         //  
         $form->setType('archive_date_cloture_instruction','hidden');  
         $form->setType('archive_date_premiere_visite','hidden');  
         $form->setType('archive_date_derniere_visite','hidden');  
         $form->setType('archive_date_contradictoire','hidden');  
         $form->setType('archive_date_retour_contradictoire','hidden');  
         $form->setType('archive_date_ait','hiddendate');  
         $form->setType('archive_date_transmission_parquet','hidden');  
   
         //  
         $form->setType('duree_validite','hidden');  
         $form->setType('duree_validite_parametrage','hidden');  
   
         //  
         $form->setType('created_by_commune','hidden');  
         //  
         // gestion du champ "finalisé par"  
         if ($this->getVal("om_final_instruction") == 't') {  
             $form->setType('om_final_instruction_utilisateur', 'static');  
         } else {  
             $form->setType('om_final_instruction_utilisateur', 'hidden');  
1327          }          }
1328          //  
1329          if ($maj < 2 || $maj == 125) { //ajouter, modifier et suivi des dates          // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1330              $form->setType('destinataire', 'hidden');          if ($this->can_display_parapheur() === true && $maj == 3) {
1331              $form->setType('lettretype', 'hiddenstatic');              $form->setType('statut_signature', 'selectstatic');
1332              $form->setType('complement_om_html', 'html');              $form->setType('historique_signature', 'jsontotab');
1333              $form->setType('complement2_om_html', 'html');              if ($this->getVal('commentaire_signature') == null) {
1334              $form->setType('complement3_om_html', 'html');                  $form->setType('commentaire_signature', 'hidden');
1335              $form->setType('complement4_om_html', 'html');              } else {
1336              $form->setType('bible_auto', 'httpclick');                  $form->setType('commentaire_signature', 'hiddenstatic');
1337              $form->setType('bible', 'httpclick');              }
1338              $form->setType('bible2', 'httpclick');          }
1339              $form->setType('bible3', 'httpclick');  
1340              $form->setType('bible4', 'httpclick');          // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1341              $form->setType('dossier', 'hidden');            if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1342              $form->setType('libelle', 'hiddenstatic');              $form->setType('suivi_notification', 'jsontotab');
1343              $form->setType('signataire_arrete','select');          }
1344              $form->setType('date_envoi_signature','datedisabled');          // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1345              $form->setType('date_retour_signature','datedisabled');          if ($maj == 3 && $this->can_display_notification_service() === true) {
1346              $form->setType('date_envoi_rar','datedisabled');              $form->setType('suivi_notification_service', 'jsontotab');
1347              $form->setType('date_retour_rar','datedisabled');          }
1348              $form->setType('date_envoi_controle_legalite','datedisabled');          // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1349              $form->setType('date_retour_controle_legalite','datedisabled');          if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1350              $form->setType('date_finalisation_courrier','datedisabled');              $form->setType('suivi_notification_tiers', 'jsontotab');
1351            }
1352              if($maj==0){ // ajouter          // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1353                  $form->setType('instruction', 'hidden');          if ($maj == 3 && $this->can_display_notification_commune() === true) {
1354                  $form->setType('lettretype', 'hidden');              $form->setType('suivi_notification_commune', 'jsontotab');
1355                  $form->setType('evenement', 'select');          }
1356                  $form->setType('date_evenement', 'date2');  
1357              }else{ // modifier et suivi des dates          // MODE AJOUTER
1358                  $form->setType('instruction', 'hiddenstatic');          if ($this->getParameter('maj') == 0) {
1359                  $form->setType('evenement', 'selecthiddenstatic');              $form->setType('commentaire', 'textareahidden');
1360                  //$form->setType('date_evenement', 'hiddenstaticdate');              // Si l'option est active passage du champ date en lecture seule
1361                  $form->setType('date_evenement', 'date2');              if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1362                    $form->setType("date_evenement", "hiddenstaticdate");
1363                } else {
1364                    $form->setType("date_evenement", "date");
1365                }
1366                if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1367                    $form->setType("evenement", "selecthiddenstatic");
1368                } else {
1369                    $form->setType("evenement", "select");
1370                }
1371                if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1372                    $form->setType("signataire_arrete", "selecthiddenstatic");
1373                } else {
1374                    $form->setType("signataire_arrete", "select");
1375                }
1376                if ($this->is_in_context_of_foreign_key("tiers_destinataire", $this->getParameter("retourformulaire"))) {
1377                    $form->setType("tiers_destinataire", "selecthiddenstatic");
1378                } else {
1379                    $form->setType("tiers_destinataire", "select");
1380                }
1381                if ($this->is_option_redaction_libre_enabled() === true) {
1382                    $form->setType("flag_edition_integrale", "select");
1383                }
1384            }
1385    
1386            // MODE MODIFIER
1387            if ($this->getParameter('maj') == 1) {
1388                // Si l'option est active passage du champ date en lecture seule
1389                if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1390                    $form->setType("date_evenement", "hiddenstaticdate");
1391                } else {
1392                    $form->setType("date_evenement", "date");
1393                }
1394                $form->setType("evenement", "selecthiddenstatic");
1395                if ($this->has_an_edition() === true) {
1396                    $form->setType('document_type_instruction', 'selecthiddenstatic');
1397                    $form->setType('lettretype', 'hiddenstatic');
1398                    if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1399                        $form->setType("signataire_arrete", "selecthiddenstatic");
1400                    } else {
1401                        $form->setType("signataire_arrete", "select");
1402                    }
1403                    if ($this->getVal('tiers_destinataire_parametre') != null
1404                        && $this->getVal('tiers_destinataire_parametre') != 'aucun') {
1405                        if ($this->is_in_context_of_foreign_key("tiers_destinataire", $this->getParameter("retourformulaire"))) {
1406                            $form->setType("tiers_destinataire", "selecthiddenstatic");
1407                        } else {
1408                            $form->setType("tiers_destinataire", "select");
1409                        }
1410                    }
1411                    if ($this->getVal("flag_edition_integrale") == "t") {
1412                        $form->setType("titre_om_htmletat", "htmlEtat");
1413                        $form->setType("corps_om_htmletatex", "htmlEtatEx");
1414                    } else {
1415                        $form->setType("complement_om_html", "html");
1416                        $form->setType("complement2_om_html", "html");
1417                        $form->setType("complement3_om_html", "html");
1418                        $form->setType("complement4_om_html", "html");
1419                        $form->setType('bible_auto', 'httpclick');
1420                        $form->setType('bible', 'httpclick');
1421                        $form->setType('bible2', 'httpclick');
1422                        $form->setType('bible3', 'httpclick');
1423                        $form->setType('bible4', 'httpclick');
1424                    }
1425                    if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1426                        //
1427                        $form->setType('btn_refresh', 'httpclickbutton');
1428                        $form->setType('btn_preview', 'httpclickbutton');
1429                        $form->setType('btn_redaction', 'httpclickbutton');
1430                        // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1431                        // pour identifiant le champ de prévisualisation et régler sa taille à
1432                        // l'affichage du champ. En cas de modification, le selecteur doit également
1433                        // être mis à jour
1434                        $form->setType('live_preview', 'previsualiser_pdf');
1435                    }
1436    
1437                  // necessaire pour calcul de date en modification                  // necessaire pour calcul de date en modification
1438                  //$form->setType('delai', 'hiddenstatic');                  //$form->setType('delai', 'hiddenstatic');
1439                  // les administrateurs technique et fonctionnel peuvent                  // les administrateurs technique et fonctionnel peuvent
1440                  // modifier tous les champs de date                  // modifier tous les champs de date
1441                  // si l'instruction a déjà été finalisée au moins une fois                  // si l'instruction a déjà été finalisée au moins une fois
1442                  if (($this->f->isAccredited(array(get_class($this), get_class($this)."modification_dates"), "OR")                  if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1443                          || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))                          || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1444                      && $this->getVal("date_finalisation_courrier") != '') {                      && $this->getVal("date_finalisation_courrier") != '') {
1445                        //
1446                      $form->setType('date_envoi_signature', 'date');                      $form->setType('date_envoi_signature', 'date');
1447                      $form->setType('date_retour_signature', 'date');                      $form->setType('date_retour_signature', 'date');
1448                        if ($this->is_sent_for_signature() === true
1449                            && $this->is_signed() === true) {
1450                            //
1451                            $form->setType("date_envoi_signature", "datereadonly");
1452                            $form->setType("date_retour_signature", "datereadonly");
1453                        }
1454                      $form->setType('date_envoi_rar', 'date');                      $form->setType('date_envoi_rar', 'date');
1455                      $form->setType('date_retour_rar', 'date');                      $form->setType('date_retour_rar', 'date');
1456                      $form->setType('date_envoi_controle_legalite', 'date');                      $form->setType('date_envoi_controle_legalite', 'date');
1457                        if ($this->is_sent_to_cl() === true) {
1458                            $form->setType("date_envoi_controle_legalite", "datedisabled");
1459                        }
1460                      $form->setType('date_retour_controle_legalite', 'date');                      $form->setType('date_retour_controle_legalite', 'date');
1461                      $form->setType('date_finalisation_courrier', 'date');                      $form->setType('date_finalisation_courrier', 'date');
                     // suivi des dates  
                     if ($maj == 125) {  
                         $form->setType('date_evenement', 'hiddenstaticdate');  
                         $form->setType('complement_om_html', 'hiddenstatic');  
                         $form->setType('complement2_om_html', 'hiddenstatic');  
                         $form->setType('complement3_om_html', 'hiddenstatic');  
                         $form->setType('complement4_om_html', 'hiddenstatic');  
                         $form->setType('bible_auto', 'hidden');  
                         $form->setType('bible', 'hidden');  
                         $form->setType('bible2', 'hidden');  
                         $form->setType('bible3', 'hidden');  
                         $form->setType('bible4', 'hidden');  
                         $form->setType('signataire_arrete','selecthiddenstatic');  
                         $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');  
                     }  
1462                  }                  }
1463              }              }
         } elseif($maj==2){  
             $form->setType('dossier', 'hidden');  
             $form->setType('bible_auto', 'hidden');  
             $form->setType('bible', 'hidden');  
             $form->setType('bible2', 'hidden');  
             $form->setType('bible3', 'hidden');  
             $form->setType('bible4', 'hidden');  
         }else {  
             $form->setType('destinataire', 'hidden');  
             $form->setType('dossier', 'hidden');  
             $form->setType('bible_auto', 'hidden');  
             $form->setType('bible', 'hidden');  
             $form->setType('bible2', 'hidden');  
             $form->setType('bible3', 'hidden');  
             $form->setType('bible4', 'hidden');  
         }  
   
         //Cache les champs pour la finalisation  
         $form->setType('om_fichier_instruction', 'hidden');  
         $form->setType('om_final_instruction', 'hidden');  
         // Cache le document arrêté  
         $form->setType('document_numerise', 'hidden');  
           
         //Masquer les champs date_envoi_controle_legalite et  
         //date_retour_controle_legalite si ce n'est pas un arrêté et si ce n'est  
         //pas un utilisateur ayant le droit spécifique  
         if ( !is_numeric($this->getVal("avis_decision"))&&  
             !$this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")){  
               
             $form->setType("date_envoi_controle_legalite", "hiddendate");  
             $form->setType("date_retour_controle_legalite", "hiddendate");  
1464          }          }
1465    
1466          // Pour les actions finalize, unfinalize et notifier_commune          // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1467          if($maj == 100 || $maj == 110 || $maj == 210) {          if ($this->getParameter('maj') == 3
1468              //              || $this->getParameter('maj') == 2
1469              foreach ($this->champs as $value) {              || $this->getParameter('maj') == 125
1470                  // Cache tous les champs              || $this->getParameter('maj') == 410) {
1471                  $form->setType($value, 'hidden');              //
1472                $form->setType("date_evenement", "datestatic");
1473                $form->setType("evenement", "selecthiddenstatic");
1474                if ($this->has_an_edition() === true) {
1475                    $form->setType("document_type_instruction", "selecthiddenstatic");
1476                    $form->setType('lettretype', 'hiddenstatic');
1477                    $form->setType("signataire_arrete", "selecthiddenstatic");
1478                    if ($this->getVal('tiers_destinataire_parametre') != null
1479                        && $this->getVal('tiers_destinataire_parametre') != 'aucun') {
1480                        $form->setType("tiers_destinataire", "selecthiddenstatic");
1481                    }
1482                    if ($this->getVal("om_final_instruction") == 't') {
1483                        $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1484                    } else {
1485                        $form->setType('om_final_instruction_utilisateur', 'hidden');
1486                    }
1487                }
1488                if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1489                    $form->setType('commentaire', 'textareastatic');
1490                }
1491            }
1492    
1493            // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1494            if ($this->getParameter('maj') == 3
1495                || $this->getParameter('maj') == 2
1496                || $this->getParameter('maj') == 410) {
1497                // Si il n'y a pas de lettre type (edition) associé à l'événement
1498                // les dates de suivi ne sont pas affichée
1499                if ($this->has_an_edition() === true) {
1500                    $form->setType('date_envoi_signature', 'datestatic');
1501                    $form->setType('date_retour_signature', 'datestatic');
1502                    $form->setType('date_envoi_rar', 'datestatic');
1503                    $form->setType('date_retour_rar', 'datestatic');
1504                    $form->setType('date_envoi_controle_legalite', 'datestatic');
1505                    $form->setType('date_retour_controle_legalite', 'datestatic');
1506                    $form->setType('date_finalisation_courrier', 'datestatic');
1507                    if ($this->getVal("flag_edition_integrale") == "t") {
1508                        $form->setType("titre_om_htmletat", "htmlstatic");
1509                        $form->setType("corps_om_htmletatex", "htmlstatic");
1510                    } else {
1511                        $form->setType("complement_om_html", "htmlstatic");
1512                        $form->setType("complement2_om_html", "htmlstatic");
1513                        $form->setType("complement3_om_html", "htmlstatic");
1514                        $form->setType("complement4_om_html", "htmlstatic");
1515                    }
1516                }
1517            }
1518    
1519            // MODE SUIVI DES DATES 125
1520            if ($this->getParameter('maj') == 125) {
1521                $form->setType("date_evenement", "hiddenstaticdate");
1522                $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1523                $form->setType('date_envoi_signature', 'date');
1524                $form->setType('date_retour_signature', 'date');
1525                if ($this->is_sent_for_signature() === true
1526                    || $this->is_signed() === true) {
1527                    //
1528                    $form->setType("date_envoi_signature", "datereadonly");
1529                    $form->setType("date_retour_signature", "datereadonly");
1530                }
1531                $form->setType('date_envoi_rar', 'date');
1532                $form->setType('date_retour_rar', 'date');
1533                $form->setType('date_envoi_controle_legalite', 'date');
1534                if ($this->is_sent_to_cl() === true) {
1535                    $form->setType("date_envoi_controle_legalite", "datedisabled");
1536                }
1537                $form->setType('date_retour_controle_legalite', 'date');
1538                $form->setType('date_finalisation_courrier', 'date');
1539            }
1540    
1541            if ($maj == 401) {
1542                foreach ($this->champs as $champ) {
1543                    $form->setType($champ, 'hidden');
1544                }
1545                $form->setType('preview_edition', 'previsualiser');
1546            }
1547    
1548            // Si l'instruction a été envoyé au contrôle de légalité et que la
1549            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1550            // l'utilisateur que l'envoi au cl est en cours de traitement.
1551            if ($this->is_sent_to_cl() === true
1552                && $maj == 3) {
1553                    $form->setType("date_envoi_controle_legalite", "datestatic");
1554                if (empty($this->getVal('date_envoi_controle_legalite'))) {
1555                    $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1556                }
1557            }
1558            $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1559            $this->f->module_manager->run_hooks('setType_post', $this, $data);
1560        }
1561    
1562        function setOnchange(&$form,$maj){
1563            $this->f->log(__METHOD__, 'BEGIN');
1564            $data = array('form' => &$form, 'maj' => &$maj);
1565            $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1566    
1567            parent::setOnchange($form,$maj);
1568            $qres = $this->f->get_all_results_from_db_query(
1569                sprintf(
1570                    'SELECT
1571                        lien_dossier_tiers.tiers
1572                    FROM
1573                        %1$slien_dossier_tiers
1574                    WHERE
1575                        dossier = \'%2$s\'
1576                    AND
1577                        service_consultant = \'t\'',
1578                    DB_PREFIXE,
1579                    $this->f->db->escapeSimple($this->getParameter('idxformulaire'))
1580                ),
1581                array(
1582                    "origin" => __METHOD__,
1583                )
1584            );
1585            $row = array_shift($qres['result']);
1586            $service_consultant_id = "";
1587            if (isset($row['tiers'])) {
1588                $service_consultant_id = $row['tiers'];
1589            }
1590            // MODE AJOUTER
1591            if ($this->getParameter('maj') == 0) {
1592                $form->setOnchange(
1593                    "evenement",
1594                    "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1595                    manage_instruction_evenement_destinataire(this.value, '".addslashes($this->getParameter('idxformulaire'))."', '".addslashes($service_consultant_id)."');
1596                    manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1597                );
1598            }
1599    
1600            $data = array('form' => &$form, 'maj' => &$maj);
1601            $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1602            $this->f->log(__METHOD__, 'END');
1603        }
1604    
1605        function evenement_has_an_edition($evenement_id) {
1606            $evenement = $this->get_inst_evenement($evenement_id);
1607            $lettretype = $evenement->getVal('lettretype');
1608            if ($lettretype !== '' && $lettretype !== null) {
1609                return true;
1610            }
1611            return false;
1612        }
1613    
1614        function view_evenement_has_an_edition_json() {
1615            $json_return = array(
1616                "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1617                "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1618            );
1619            echo json_encode($json_return);
1620        }
1621    
1622        function evenement_has_a_commentaire($evenement_id) {
1623            $evenement = $this->get_inst_evenement($evenement_id);
1624            return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1625        }
1626    
1627        function view_evenement_has_a_commentaire_json() {
1628            $json_return = array(
1629                "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1630            );
1631            echo json_encode($json_return);
1632        }
1633        
1634        function evenement_has_a_tiers_destinataire($evenement_id) {
1635            $evenement = $this->get_inst_evenement($evenement_id);
1636            return $evenement->getVal('tiers_destinataire');
1637        }
1638    
1639        function view_evenement_has_a_tiers_destinataire() {
1640            $json_return = array(
1641                "tiers_destinataire" => $this->evenement_has_a_tiers_destinataire($this->f->get_submitted_get_value('evenement_id'))
1642            );
1643            echo json_encode($json_return);
1644        }
1645    
1646        /**
1647         * CONDITION - can_be_sent_to_cl
1648         *
1649         * Vérifie que le contrôle de légalité est disponible
1650         *
1651         * @return boolean
1652         */
1653        function can_be_sent_to_cl() {
1654            $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1655    
1656            // Si événement est paramétré pour envoyer le contrôle de légalité
1657            // par Plat'AU
1658            if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1659                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1660    
1661                // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1662                // Que le type de dossier d'autorisation est transmissible à Plat'AU
1663                // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1664                if ($this->getVal('envoye_cl_platau') === 'f'
1665                    && $this->f->is_type_dossier_platau($this->getVal('dossier')) === true
1666                    && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1667    
1668                    // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL
1669                    if ($this->has_an_edition() === false) {
1670                        return true;
1671                    }
1672    
1673                    // Si l'instruction a une édition et que la date de retour signature est renseignée
1674                    // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1675                    // envoyer l'instruction au CL
1676                    if ($this->has_an_edition() === true
1677                        && empty($this->getVal('date_retour_signature')) === false
1678                        && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1679    
1680                        return true;
1681                    }
1682                }
1683            }
1684            //
1685            return false;
1686        }
1687    
1688        /**
1689         *
1690         * @return string
1691         */
1692        function get_var_sql_forminc__sql_signataire_arrete() {
1693            return sprintf(
1694                "SELECT
1695                    signataire_arrete.signataire_arrete,
1696                    CONCAT_WS(
1697                        ' - ',
1698                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1699                        signataire_habilitation.libelle,
1700                        signataire_arrete.description
1701                    )
1702                FROM
1703                    %1\$ssignataire_arrete
1704                    LEFT JOIN %1\$ssignataire_habilitation
1705                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1706                WHERE
1707                    ((signataire_arrete.om_validite_debut IS NULL
1708                        AND (signataire_arrete.om_validite_fin IS NULL
1709                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1710                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1711                            AND (signataire_arrete.om_validite_fin IS NULL
1712                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1713                ORDER BY
1714                    signataire_arrete.prenom,
1715                    signataire_arrete.nom",
1716                DB_PREFIXE
1717            );
1718        }
1719    
1720        /**
1721         *
1722         * @return string
1723         */
1724        function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1725            return sprintf(
1726                "SELECT
1727                    signataire_arrete.signataire_arrete,
1728                    CONCAT_WS(
1729                        ' - ',
1730                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1731                        signataire_habilitation.libelle,
1732                        signataire_arrete.description
1733                    )
1734                FROM
1735                    %1\$ssignataire_arrete
1736                    LEFT JOIN %1\$ssignataire_habilitation
1737                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1738                WHERE
1739                    signataire_arrete.signataire_arrete = <idx>",
1740                DB_PREFIXE
1741            );
1742        }
1743    
1744        /**
1745         *
1746         * @return string
1747         */
1748        function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1749            return sprintf(
1750                "SELECT
1751                    signataire_arrete.signataire_arrete,
1752                    CONCAT_WS(
1753                        ' - ',
1754                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1755                        signataire_habilitation.libelle,
1756                        signataire_arrete.description
1757                    )
1758                FROM
1759                    %1\$ssignataire_arrete
1760                    LEFT JOIN %1\$som_collectivite
1761                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1762                    LEFT JOIN %1\$ssignataire_habilitation
1763                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1764                WHERE
1765                    ((signataire_arrete.om_validite_debut IS NULL
1766                        AND (signataire_arrete.om_validite_fin IS NULL
1767                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1768                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1769                            AND (signataire_arrete.om_validite_fin IS NULL
1770                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1771                    AND (om_collectivite.niveau = '2'
1772                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1773                ORDER BY
1774                    signataire_arrete.prenom, signataire_arrete.nom",
1775                DB_PREFIXE
1776            );
1777        }
1778    
1779        /**
1780         *
1781         * @return string
1782         */
1783        function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1784            return sprintf(
1785                "SELECT
1786                    signataire_arrete.signataire_arrete,
1787                    CONCAT_WS(
1788                        ' - ',
1789                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1790                        signataire_habilitation.libelle,
1791                        signataire_arrete.description
1792                    )
1793                FROM
1794                    %1\$ssignataire_arrete
1795                    LEFT JOIN %1\$ssignataire_habilitation
1796                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1797                WHERE
1798                    ((signataire_arrete.om_validite_debut IS NULL
1799                        AND (signataire_arrete.om_validite_fin IS NULL
1800                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1801                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1802                            AND (signataire_arrete.om_validite_fin IS NULL
1803                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1804                    AND signataire_arrete.defaut IS TRUE
1805                ORDER BY
1806                    signataire_arrete.prenom, signataire_arrete.nom",
1807                DB_PREFIXE
1808            );
1809        }
1810    
1811        /**
1812         *
1813         * @return string
1814         */
1815        function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1816            return sprintf(
1817                "SELECT
1818                    signataire_arrete.signataire_arrete,
1819                        CONCAT_WS(
1820                            ' - ',
1821                            CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1822                            signataire_habilitation.libelle,
1823                            signataire_arrete.description
1824                        )
1825                FROM
1826                    %1\$ssignataire_arrete
1827                    LEFT JOIN %1\$ssignataire_habilitation
1828                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1829                    LEFT JOIN %1\$som_collectivite
1830                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1831                WHERE
1832                    ((signataire_arrete.om_validite_debut IS NULL
1833                        AND (signataire_arrete.om_validite_fin IS NULL
1834                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1835                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1836                            AND (signataire_arrete.om_validite_fin IS NULL
1837                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1838                    AND signataire_arrete.defaut IS TRUE
1839                    AND (om_collectivite.niveau = '2'
1840                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1841                ORDER BY
1842                    signataire_arrete.prenom,
1843                    signataire_arrete.nom",
1844                DB_PREFIXE
1845            );
1846        }
1847    
1848        /**
1849         *
1850         * @return string
1851         */
1852        function get_var_sql_forminc__sql_tiers_destinataire() {
1853            return sprintf(
1854                "SELECT
1855                    tiers_consulte.tiers_consulte,
1856                    tiers_consulte.libelle
1857                FROM
1858                    %1\$stiers_consulte
1859                    LEFT JOIN %1\$slien_dossier_tiers
1860                        ON lien_dossier_tiers.tiers = tiers_consulte.tiers_consulte
1861                WHERE
1862                    lien_dossier_tiers.dossier = '<di_id>'
1863                ORDER BY
1864                    tiers_consulte.libelle",
1865                DB_PREFIXE
1866            );
1867        }
1868    
1869        /**
1870         *
1871         * @return string
1872         */
1873        function get_var_sql_forminc__sql_tiers_destinataire_by_id() {
1874            return sprintf(
1875                "SELECT
1876                    tiers_consulte.tiers_consulte,
1877                    tiers_consulte.libelle
1878                FROM
1879                    %1\$stiers_consulte
1880                WHERE
1881                    tiers_consulte.tiers_consulte = <idx>",
1882                DB_PREFIXE
1883            );
1884        }
1885    
1886        /**
1887         * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1888         * dont l'identifiant a été passé en paramètre dans l'url.
1889         *
1890         * @return array
1891         */
1892        function get_var_sql_forminc__sql_evenement() {
1893            // Récupération du numéro de dossier
1894            $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1895            $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1896            // Si changement de décision par instructeur commune
1897            $filter = '';
1898            if ($this->f->isUserInstructeur() === true
1899                // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1900                && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1901                && $this->isInstrCanChangeDecision($dossier) === true) {
1902                $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1903            }
1904            // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1905            // de déterminer si il s'agit d'évènements suggérés.
1906            $qres = $this->f->get_all_results_from_db_query(
1907                sprintf(
1908                    'SELECT
1909                        DISTINCT(evenement.evenement),
1910                        evenement.libelle,
1911                        -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1912                        CASE WHEN evenement_suggere_dossier.evenement IS NULL
1913                            THEN FALSE
1914                            ELSE TRUE
1915                        END AS is_suggested
1916                    FROM
1917                        -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1918                        -- selon le type de dossier et l état du dossier.
1919                        %1$sevenement
1920                        JOIN %1$slien_dossier_instruction_type_evenement
1921                            ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1922                        JOIN %1$stransition
1923                            ON evenement.evenement = transition.evenement
1924                        JOIN %1$sdossier
1925                            ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1926                                AND transition.etat = dossier.etat
1927                        -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1928                        LEFT JOIN (
1929                            SELECT
1930                                lien_sig_contrainte_evenement.evenement,
1931                                dossier.dossier
1932                            FROM
1933                                %1$slien_sig_contrainte_evenement
1934                                JOIN %1$ssig_contrainte
1935                                    ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1936                                JOIN %1$slien_sig_contrainte_dossier_instruction_type
1937                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1938                                JOIN %1$slien_sig_contrainte_om_collectivite
1939                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1940                                JOIN %1$scontrainte
1941                                    ON sig_contrainte.libelle = contrainte.libelle
1942                                JOIN %1$sdossier_contrainte
1943                                    ON contrainte.contrainte = dossier_contrainte.contrainte
1944                                JOIN %1$sdossier
1945                                    ON dossier_contrainte.dossier = dossier.dossier
1946                                        AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1947                                JOIN %1$som_collectivite
1948                                    ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1949                                        AND (dossier.om_collectivite = om_collectivite.om_collectivite
1950                                            OR om_collectivite.niveau = \'2\')
1951                        ) AS evenement_suggere_dossier
1952                            ON evenement.evenement = evenement_suggere_dossier.evenement
1953                                AND dossier.dossier = evenement_suggere_dossier.dossier
1954                    WHERE
1955                        dossier.dossier = \'%2$s\'
1956                        %3$s
1957                    ORDER BY
1958                        is_suggested DESC,
1959                        evenement.libelle',
1960                    DB_PREFIXE,
1961                    $this->f->db->escapeSimple($dossier),
1962                    $filter
1963                ),
1964                array(
1965                    "origin" => __METHOD__
1966                )
1967            );
1968            return $qres['result'];
1969        }
1970    
1971        /**
1972         * Récupère un tableau contenant des évènements de la forme :
1973         * $events = array(
1974         *      1 => array(
1975         *         'libelle' => 'evenement_libelle',
1976         *         'evenement' => 'identifiant_evenement',
1977         *         'is_suggested' => true/false   -> booleen indiquant si c'est un événement suggéré
1978         *         ))
1979         * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1980         *
1981         * Le format de sorti est le suivant :
1982         * $select = array(
1983         *      0 => array( -> liste des id des événements
1984         *          '0' => '',
1985         *          '1' => array(
1986         *              '0' => array(), -> liste des id des événements suggérés
1987         *              '1' => array(), -> liste des libelles des événements suggérés
1988         *          ),
1989         *          ...,
1990         *          n => 'id_evenement_n'
1991         *      ),
1992         *      1 => array(
1993         *          '0' => '__('choisir')." ".__('evenement')',
1994         *          '1' => '💡 Suggestions',
1995         *          ...,
1996         *          'n' => 'libelle_evenement_n',
1997         *      )
1998         * )
1999         *
2000         * @param array tableau des événements
2001         * @return array
2002         */
2003        protected function convert_events_array_to_select_format($events) {
2004            // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
2005            $contenu = array(
2006                0 => array("",),
2007                1 => array(__('choisir')." ".__('evenement'),)
2008            );
2009    
2010            if (! empty($events)) {
2011                // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
2012                $suggested_event_group = array_filter($events, function($a) {
2013                        return $a['is_suggested'] === 't';
2014                });
2015                if (! empty($suggested_event_group)) {
2016                    // Prépare les données qui permettront d'afficher le groupe des événements
2017                    // suggérés.
2018                    $values = array();
2019                    $labels = array();
2020                    foreach ($suggested_event_group as $index => $suggested_event) {
2021                        $values[] = $suggested_event['evenement'];
2022                        $labels[] = $suggested_event['libelle'];
2023                        // Supprime les évènements suggérés de la liste des évènements
2024                        unset($events[$index]);
2025                    }
2026                    // Remplissage du select pour le groupe
2027                    $contenu[0][] = array($values, $labels);
2028                    $contenu[1][] = __('💡 Suggestions');
2029                }
2030    
2031                // Remplissage du select
2032                foreach ($events as $event) {
2033                    $contenu[0][] = $event['evenement'];
2034                    $contenu[1][] = $event['libelle'];
2035              }              }
2036          }          }
2037            return $contenu;
2038      }      }
2039    
2040      function setSelect(&$form, $maj,&$db,$debug) {      /**
2041         * SETTER_FORM - setSelect.
2042         *
2043         * @return void
2044         */
2045        function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
2046            //parent::setSelect($form, $maj);
2047            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2048            $this->f->module_manager->run_hooks('setSelect_pre', $this, $data);
2049    
2050          /**          /**
2051           * On ne surcharge pas la méthode parent car une requête sur la table           * On ne surcharge pas la méthode parent car une requête sur la table
2052           * dossier est mauvaise pour les performances, car la requête qui           * dossier est mauvaise pour les performances, car la requête qui
# Line 519  class instruction extends instruction_ge Line 2054  class instruction extends instruction_ge
2054           * champs action, avis_decision et etat ne sont pas utilisés comme des           * champs action, avis_decision et etat ne sont pas utilisés comme des
2055           * select           * select
2056           */           */
         if(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php"))  
             include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php");  
         elseif(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc"))  
             include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc");  
   
2057          //// action          //// action
2058          //$this->init_select($form, $db, $maj, $debug, "action",          //$this->init_select($form, $this->f->db, $maj, null, "action",
2059          //                   $sql_action, $sql_action_by_id, false);          //                   $sql_action, $sql_action_by_id, false);
2060    
2061          //// avis_decision          //// avis_decision
2062          //$this->init_select($form, $db, $maj, $debug, "avis_decision",          //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
2063          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);
2064    
2065          //// dossier          //// dossier
2066          //$this->init_select($form, $db, $maj, $debug, "dossier",          //$this->init_select($form, $this->f->db, $maj, null, "dossier",
2067          //                   $sql_dossier, $sql_dossier_by_id, false);          //                   $sql_dossier, $sql_dossier_by_id, false);
2068    
2069          //// etat          //// etat
2070          //$this->init_select($form, $db, $maj, $debug, "etat",          //$this->init_select($form, $this->f->db, $maj, null, "etat",
2071          //                   $sql_etat, $sql_etat_by_id, false);          //                   $sql_etat, $sql_etat_by_id, false);
2072    
2073          //// evenement          //// evenement
2074          //$this->init_select($form, $db, $maj, $debug, "evenement",          //$this->init_select($form, $this->f->db, $maj, null, "evenement",
2075          //                   $sql_evenement, $sql_evenement_by_id, false);          //                   $sql_evenement, $sql_evenement_by_id, false);
2076    
2077          // signataire_arrete          // signataire_arrete
2078          // si contexte DI          // si contexte DI
2079          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
2080                  || $this->getParameter("retourformulaire") == "dossier_instruction"                  || $this->f->contexte_dossier_instruction()) {
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {  
2081              // on recupère les signataires de la multicollectivité et de celle du DI              // on recupère les signataires de la multicollectivité et de celle du DI
2082              require_once "../obj/dossier_instruction.class.php";              $di = $this->f->get_inst__om_dbform(array(
2083              $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, $debug);                  "obj" => "dossier_instruction",
2084              $sql_signataire_arrete_by_di = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_by_di);                  "idx" => $this->getParameter('idxformulaire'),
2085              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              ));
2086                  $sql_signataire_arrete_by_di, $sql_signataire_arrete_by_id, true);              $sql_signataire_arrete_by_di = str_replace(
2087                    '<collectivite_di>',
2088                    $di->getVal("om_collectivite"),
2089                    $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
2090                );
2091                $this->init_select(
2092                    $form,
2093                    $this->f->db,
2094                    $maj,
2095                    null,
2096                    "signataire_arrete",
2097                    $sql_signataire_arrete_by_di,
2098                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2099                    true
2100                );
2101          } else {          } else {
2102              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              $this->init_select(
2103                  $sql_signataire_arrete, $sql_signataire_arrete_by_id, true);                  $form,
2104                    $this->f->db,
2105                    $maj,
2106                    null,
2107                    "signataire_arrete",
2108                    $this->get_var_sql_forminc__sql("signataire_arrete"),
2109                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2110                    true
2111                );
2112          }          }
2113            $di = $this->f->get_inst__om_dbform(array(
2114                "obj" => "dossier_instruction",
2115                "idx" => $this->getParameter('idxformulaire'),
2116            ));
2117            $sql_tiers_destinataire = str_replace(
2118                '<di_id>',
2119                $di->getVal($di->clePrimaire),
2120                $this->get_var_sql_forminc__sql("tiers_destinataire")
2121            );
2122            $this->init_select(
2123                $form,
2124                $this->f->db,
2125                $maj,
2126                null,
2127                "tiers_destinataire",
2128                $sql_tiers_destinataire,
2129                $this->get_var_sql_forminc__sql("tiers_destinataire_by_id"),
2130                true
2131            );
2132    
2133          /**          /**
2134           * Gestion du filtre sur les événements de workflow disponibles           * Gestion du filtre sur les événements de workflow disponibles
# Line 574  class instruction extends instruction_ge Line 2137  class instruction extends instruction_ge
2137           * événements disponibles.           * événements disponibles.
2138           */           */
2139          if ($maj == 0) {          if ($maj == 0) {
2140              // Récupération des événements par une jointure entre la table dossier              $evenements = $this->get_var_sql_forminc__sql_evenement();
2141              // et la table transition et la table evenement et la table              $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
             // lien_dossier_instruction_type_evenement en fonction de l'identifiant  
             // du dossier d'instruction en cours  
             $sql = "SELECT  
             evenement.evenement,  
             evenement.libelle as lib  
             FROM ".DB_PREFIXE."dossier  
             INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement  
                 ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type  
             INNER JOIN ".DB_PREFIXE."evenement  
                 ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement  
             INNER JOIN ".DB_PREFIXE."transition  
                 ON evenement.evenement = transition.evenement  
                 AND dossier.etat=transition.etat  
             WHERE dossier.dossier='".$this->idxformulaire."' ";  
   
             // Si changement de décision par instructeur commune  
             if($this->f->isUserInstructeur() === true  
                 && $this->getDivisionFromDossier($this->idxformulaire) != $_SESSION["division"]  
                 && $this->isInstrCanChangeDecision($this->idxformulaire) === true) {  
                 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";  
             }  
             $sql .= "ORDER BY evenement.libelle, evenement.action";  
             $res = $db->query($sql);  
             $this->addToLog("setSelect(): db->query(\"".$sql."\");", VERBOSE_MODE);  
             if (database::isError($res)) {  
                 die($res->getMessage());  
             }  
             // Remplissage du tableau du select  
             $contenu = array(  
                 0 => array("",),  
                 1 => array(_('choisir')." "._('evenement'),)  
             );  
             while ($row=& $res->fetchRow()) {  
                 $contenu[0][] = $row[0];  
                 $contenu[1][] = $row[1];  
             }  
             $form->setSelect("evenement", $contenu);  
2142          } else {          } else {
2143              $sql = "SELECT              // Instanciation de l'événement pour récupérer son libellé
2144              evenement.libelle as lib              $evenement = $this->f->get_inst__om_dbform(array(
2145              FROM ".DB_PREFIXE."evenement                  "obj" => "evenement",
2146              WHERE evenement.evenement=".$this->getVal("evenement")."";                  "idx" => $this->getVal("evenement"),
2147              $res = $db->getone($sql);              ));
2148              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);  
             if (database::isError($res)) {  
                 die($res->getMessage());  
             }  
             //  
2149              $contenu = array(              $contenu = array(
2150                  0 => array($this->getVal("evenement"),),                  0 => array($this->getVal("evenement"),),
2151                  1 => array($res,)                  1 => array($evenement->getVal('libelle'),)
2152              );              );
2153              $form->setSelect("evenement", $contenu);              $form->setSelect("evenement", $contenu);
2154          }          }
# Line 635  class instruction extends instruction_ge Line 2157  class instruction extends instruction_ge
2157           * Gesion des liens vers la bible           * Gesion des liens vers la bible
2158           */           */
2159          // lien bible_auto          // lien bible_auto
2160          $contenu = array(_("automatique"));          $contenu = array(__("automatique"));
2161          $form->setSelect("bible_auto",$contenu);          $form->setSelect("bible_auto",$contenu);
2162          // lien bible1          // lien bible1
2163          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2164          $form->setSelect("bible",$contenu);          $form->setSelect("bible",$contenu);
2165          // lien bible2          // lien bible2
2166          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2167          $form->setSelect("bible2",$contenu);          $form->setSelect("bible2",$contenu);
2168          // lien bible3          // lien bible3
2169          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2170          $form->setSelect("bible3",$contenu);          $form->setSelect("bible3",$contenu);
2171          // lien bible4          // lien bible4
2172          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2173          $form->setSelect("bible4",$contenu);          $form->setSelect("bible4",$contenu);
2174    
2175            if ($maj == 1) {
2176                $base64 = $this->init_pdf_temp();
2177                $form->setSelect('live_preview', array('base64'=>$base64));
2178                $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2179                $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2180                $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2181            }
2182    
2183            // Selection du type de rédaction à l'ajout
2184            $content = array(
2185                0 => array('f', 't', ),
2186                1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2187            );
2188            $form->setSelect('flag_edition_integrale', $content);
2189    
2190            $contenu = array();
2191            foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2192                $contenu[0][] = $value;
2193                $contenu[1][] = $this->get_trad_for_statut($value);
2194            }
2195            $form->setSelect('statut_signature', $contenu);
2196    
2197    
2198            if ($maj == 401) {
2199                $idx = $this->getParameter("idx");
2200                $dossier = $this->getParameter("idxformulaire");
2201                if ( strpos($idx, 'STORAGE_') !== FALSE) {
2202                    $idx = substr($idx, 8);
2203                    $model = 'storage';
2204                    $champ = 'uid';
2205                    $object = $this->f->get_inst__om_dbform(array(
2206                        "obj" => $model,
2207                        "idx" => $idx,
2208                    ));
2209    
2210                    $file = $this->f->storage->get($object->getVal($champ));
2211                    $label = $file['metadata']['filename'];
2212                    $href =sprintf(
2213                        '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2214                        $idx
2215                    );
2216                    $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2217                    $this->val['preview_edition'] = '';
2218                }else{
2219                    $label = $this->getVal("fichier_instruction_name");
2220                    $href =sprintf(
2221                        '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2222                        $this->getVal($this->clePrimaire)
2223                    );
2224                    $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2225                }
2226    
2227                $form->setSelect('preview_edition', array(
2228                    'base64' => base64_encode($file['file_content']),
2229                    'mimetype' => $file['metadata']['mimetype'],
2230                    'label' => $label,
2231                    'href' => $href
2232                ));
2233            }
2234    
2235            // document_type_instruction
2236            $this->init_select(
2237                $form,
2238                $this->f->db,
2239                $maj,
2240                null,
2241                "document_type_instruction",
2242                $this->get_var_sql_forminc__sql("document_type_instruction"),
2243                $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2244                true,
2245                false,
2246                '',
2247                $maj == 999 ? true : false
2248            );
2249    
2250            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2251            $this->f->module_manager->run_hooks('setSelect_post', $this, $data);
2252      }      }
2253    
2254      function cleSecondaire($id, &$db, $val, $DEBUG) {      function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2255          //          //
2256          parent::cleSecondaire($id, $db, $val, $DEBUG);          // Vérifie uniquementla cle secondaire : demande
2257                    $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2258    
2259          $id = $this->getVal($this->clePrimaire);          $id = $this->getVal($this->clePrimaire);
2260    
2261                    //Requête de vérification que cet événement d'instruction n'est pas lié
         //Requête de vérification que cet événement d'instruction n'est pas lié  
2262          //à la création d'un dossier d'instruction          //à la création d'un dossier d'instruction
2263          $sql = "SELECT demande_type.dossier_instruction_type          $qres = $this->f->get_one_result_from_db_query(
2264              FROM ".DB_PREFIXE."demande_type              sprintf(
2265              LEFT JOIN ".DB_PREFIXE."demande                  'SELECT
2266              ON demande.demande_type = demande_type.demande_type                      demande_type.dossier_instruction_type
2267              WHERE demande.instruction_recepisse = ".$id;                  FROM
2268          $res = $this->db->getOne($sql);                      %1$sdemande_type
2269          $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdemande
2270          if (database::isError($res)) {                          ON demande.demande_type = demande_type.demande_type
2271              die($res->getMessage());                  WHERE
2272          }                      demande.instruction_recepisse = \'%2$d\'',
2273                    DB_PREFIXE,
2274                    intval($id)
2275                ),
2276                array(
2277                    "origin" => __METHOD__,
2278                )
2279            );
2280    
2281          // Aucune clé secondaire n'a été trouvée ou c'est un événement sans          // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2282          //création de dossier d'instruction, l'événement d'instruction peut être          //création de dossier d'instruction, l'événement d'instruction peut être
2283          //supprimé          //supprimé
2284          if ( $this->correct !== false || $res == null || $res == ""){          if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
   
2285              // Requête de vérification que cet événement d'instruction est lié              // Requête de vérification que cet événement d'instruction est lié
2286              // à une demande              // à une demande
2287              $sql = "SELECT demande              $qres = $this->f->get_one_result_from_db_query(
2288                  FROM ".DB_PREFIXE."demande                  sprintf(
2289                  WHERE instruction_recepisse = ".$id;                      'SELECT
2290              $res = $this->db->getOne($sql);                          demande
2291              $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      FROM
2292              if (database::isError($res)) {                          %1$sdemande
2293                  die($res->getMessage());                      WHERE
2294              }                          instruction_recepisse = \'%2$d\'',
2295                        DB_PREFIXE,
2296                        intval($id)
2297                    ),
2298                    array(
2299                        "origin" => __METHOD__,
2300                    )
2301                );
2302    
2303              //Si c'est un événement d'instruction lié à une demande              //Si c'est un événement d'instruction lié à une demande
2304              if ($res != null || $res != ""){              if ($qres['result'] != null || $qres['result'] != ""){
2305                                    $demande = $this->f->get_inst__om_dbform(array(
2306                  require_once "../obj/demande.class.php";                      "obj" => "demande",
2307                  $demande = new demande($res, $this->db, DEBUG);                      "idx" => $qres['result'],
2308                    ));
2309    
2310                  //On met à jour la demande en supprimant la liaison vers                  //On met à jour la demande en supprimant la liaison vers
2311                  //l'événement d'instruction                  //l'événement d'instruction
2312                  $demande->setParameter("maj", 1);                  $demande->setParameter("maj", 1);
2313                  $valF = array();                  $valF = array();
# Line 702  class instruction extends instruction_ge Line 2316  class instruction extends instruction_ge
2316                  }                  }
2317                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2318                  $valF['instruction_recepisse']=NULL;                  $valF['instruction_recepisse']=NULL;
2319                  $ret = $demande->modifier($valF, $this->db, DEBUG);                  $ret = $demande->modifier($valF);
2320              }              }
2321                    
2322              /**              /**
2323               * Vérification que l'élément supprimé est le dernier pour pouvoir               * Vérification que l'élément supprimé est le dernier pour pouvoir
2324               * remodifier les données de manière itérative.               * remodifier les données de manière itérative.
2325               */               */
2326              // Initialisation              $qres = $this->f->get_one_result_from_db_query(
2327              $dernierevenement = "";                  sprintf(
2328              // Récupération du dernier élément de la table d'instruction qui                      'SELECT
2329              // concerne le dossier en cours                          max(instruction)
2330              $sql = "SELECT max(instruction)                      FROM
2331              FROM ".DB_PREFIXE."instruction                          %1$sinstruction
2332              WHERE dossier ='".$this->idxformulaire."'";                      WHERE
2333              $dernierevenement = $db->getOne($sql);                          dossier = \'%2$s\'',
2334              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      DB_PREFIXE,
2335              if (database::isError($dernierevenement)) {                      $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2336                  die($dernierevenement->getMessage());                  ),
2337              }                  array(
2338                        "origin" => __METHOD__,
2339                    )
2340                );
2341    
2342              // Si on se trouve effectivement sur le dernier evenement d'instruction              // Si on se trouve effectivement sur le dernier evenement d'instruction
2343              if ($dernierevenement == $id) {              // alors on valide la suppression sinon on l'annule
2344                $this->correct = false;
2345                $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2346                if ($qres['result'] == $id) {
2347                  // Alors on valide la suppression                  // Alors on valide la suppression
2348                  $this->correct = true;                  $this->correct = true;
2349                  $this->addToMessage(_('Destruction_chronologique'));                  $message = __('Destruction_chronologique');
             } else {  
                 // Alors on annule la suppression  
                 $this->correct = false;  
                 $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));  
2350              }              }
2351                $this->addToMessage($message);
2352          }          }
2353      }      }
2354    
# Line 739  class instruction extends instruction_ge Line 2357  class instruction extends instruction_ge
2357       * @param  string $champ champ date à vérifier       * @param  string $champ champ date à vérifier
2358       */       */
2359      function updateDate($champ) {      function updateDate($champ) {
2360            
2361          //Si le retourformulaire est "dossier_instruction"          //Si le retourformulaire est "dossier_instruction"
2362          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
2363                  || $this->getParameter("retourformulaire") == "dossier_instruction"                  || $this->f->contexte_dossier_instruction()) {
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {  
2364    
2365              // Vérification de la possibilité de modifier les dates si déjà éditées              // Vérification de la possibilité de modifier les dates si déjà éditées
2366              if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {              if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2367                  // si l'utilisateur n'est pas un admin                  // si l'utilisateur n'est pas un admin
2368                  if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {                  if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2369                      $this->correct = false;  
2370                      $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));                      // si le champ concerné est 'date_envoi_signature'
2371                        // et que le statut du parapheur est 'expired'
2372                        // alors on autorise le changement de la date
2373                        // pour tous les autres cas, on ne peut modifier la date
2374                        if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2375                            $this->correct = false;
2376                            $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2377                        }
2378                  }                  }
2379              }              }
2380          }          }
2381            
2382          //          //
2383          return true;          return true;
2384      }      }
2385    
2386      /*Met des valeurs par défaut dans certains des sous-formulaire*/      /**
2387      function setValsousformulaire(&$form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire){       * SETTER_FORM - setValsousformulaire (setVal).
2388         *
2389         * @return void
2390         */
2391        function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2392            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2393            $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2394    
2395            // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2396            //
2397            $this->retourformulaire = $retourformulaire;
2398          //          //
         $this->retourformulaire=$retourformulaire;  
         $this->idxformulaire=$idxformulaire;  
         // Ajout  
2399          if ($maj == 0) {          if ($maj == 0) {
2400              $form->setVal("destinataire", $idxformulaire);              $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2401              $form->setVal("dossier", $idxformulaire);              $form->setVal("dossier", $this->getParameter("idxformulaire"));
2402            }
2403    
2404            // Si l'instruction a été envoyé au contrôle de légalité et que la
2405            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2406            // l'utilisateur que l'envoi au cl est en cours de traitement.
2407            if ($this->is_sent_to_cl() === true
2408                && empty($this->getVal('date_envoi_controle_legalite'))
2409                && $maj == 3) {
2410                $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2411          }          }
2412          //          //
2413          $this->set_form_default_values($form, $maj, $validation);          $this->set_form_default_values($form, $maj, $validation);
2414    
2415            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2416            $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2417      }      }
2418    
2419      /**      /**
2420       *  Permet de pré-remplir les valeurs des formulaires.       * SETTER_FORM - set_form_default_values (setVal).
2421       *         *
2422       * @param [object]   $form        formulaire       * @return void
      * @param [integer]  $maj         mode  
      * @param [integer]  $validation  validation  
2423       */       */
2424      function set_form_default_values(&$form, $maj, $validation) {      function set_form_default_values(&$form, $maj, $validation) {
2425            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2426            $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2427    
         // Ajout  
2428          if ($maj == 0) {          if ($maj == 0) {
             if(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php"))  
                 include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php");  
             elseif(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc"))  
                 include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc");  
2429              // si contexte DI              // si contexte DI
2430              if ($this->getParameter("retourformulaire") == "dossier"              if ($this->getParameter("retourformulaire") == "dossier"
2431                  || $this->getParameter("retourformulaire") == "dossier_instruction"                  || $this->f->contexte_dossier_instruction()) {
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"  
                 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {  
2432                  // on recupère les signataires de la multicollectivité et de celle du DI                  // on recupère les signataires de la multicollectivité et de celle du DI
2433                  require_once "../obj/dossier_instruction.class.php";                  $di = $this->f->get_inst__om_dbform(array(
2434                  $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, DEBUG);                      "obj" => "dossier_instruction",
2435                  $sql = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_defaut_by_di);                      "idx" => $this->getParameter("idxformulaire"),
2436                    ));
2437                    $sql = str_replace(
2438                        "<collectivite_di>",
2439                        $di->getVal("om_collectivite"),
2440                        $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2441                    );
2442              } else {              } else {
2443                  $sql = $sql_signataire_arrete_defaut;                  $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2444              }              }
             // Date du jour  
             $form->setVal("date_evenement", date('Y-m-d'));  
2445    
2446              // Exécution de la requête              $qres = $this->f->get_all_results_from_db_query($sql, array(
2447              $res = $this->f->db->query($sql);                      "origin" => __METHOD__));
2448              $this->f->addToLog("setVal(): db->query(\"".$sql."\");", VERBOSE_MODE);              $row = array_shift($qres['result']);
2449              if ( database::isError($res)){              if (isset($row["signataire_arrete"])
2450                  die();                  && is_numeric($row["signataire_arrete"])) {
2451              }                  //
2452                            $form->setVal("signataire_arrete", $row["signataire_arrete"]);
             $row = $res->fetchrow(DB_FETCHMODE_ASSOC);  
               
             if (isset($row['signataire_arrete']) && is_numeric($row['signataire_arrete'])){  
                 $form->setVal("signataire_arrete",$row['signataire_arrete']);  
2453              }              }
2454                // Date du jour
2455                $form->setVal("date_evenement", date("Y-m-d"));
2456          }          }
2457            //
         // Ajout et modification  
2458          if ($maj == 0 || $maj == 1 || $maj == 125) {          if ($maj == 0 || $maj == 1 || $maj == 125) {
2459              $form->setVal("bible_auto","bible_auto()");              $form->setVal("bible_auto", "bible_auto()");
2460              $form->setVal("bible","bible(1)");              $form->setVal("bible", "bible(1)");
2461              $form->setVal("bible2","bible(2)");              $form->setVal("bible2", "bible(2)");
2462              $form->setVal("bible3","bible(3)");              $form->setVal("bible3", "bible(3)");
2463              $form->setVal("bible4","bible(4)");              $form->setVal("bible4", "bible(4)");
2464            }
2465            // 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 !
2466            $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2467            if ($maj == 1
2468                && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2469                && $this->has_an_edition() === true) {
2470                //
2471                $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2472                $form->setVal("btn_refresh", "reload_pdf_viewer()");
2473                $form->setVal("btn_preview", "show_instr_preview()");
2474                $form->setVal("btn_redaction", "show_instr_redaction()");
2475          }          }
     }  
2476    
2477            // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2478            // des communes
2479            if ($maj == 3) {
2480                if ($this->can_display_notification_demandeur()) {
2481                    $typeNotification = array(
2482                        'notification_recepisse',
2483                        'notification_instruction',
2484                        'notification_decision',
2485                    );
2486                    $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2487                }
2488                if ($this->can_display_notification_service()) {
2489                    $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2490                }
2491                if ($this->can_display_notification_tiers()) {
2492                    $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2493                }
2494                if ($this->can_display_notification_commune()) {
2495                    $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2496                }
2497                if ($this->getVal('flag_edition_integrale') == 't') {
2498                    $message = __("Aucun contenu à afficher.");
2499                    if (empty($this->getVal('titre_om_htmletat'))) {
2500                        $form->setVal("titre_om_htmletat", $message);
2501                    }
2502                    if (empty($this->getVal('corps_om_htmletatex'))) {
2503                        $form->setVal("corps_om_htmletatex", $message);
2504                    }
2505                }
2506            }
2507            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2508            $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2509        }
2510    
2511      function setLayout(&$form, $maj){      function setLayout(&$form, $maj){
2512          if ( $maj < 2 OR $maj == 3 OR $maj == 125 ) {          $data = array('form' => &$form, 'maj' => &$maj);
2513                          /*Champ sur lequel s'ouvre le bloc 1 */          $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
             $form->setBloc('evenement','D',"","col_12");  
2514    
2515              $form->setFieldset('evenement','D',_('Evenement'));          $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
             $form->setFieldset('om_final_instruction_utilisateur','F','');  
               
             $form->setBloc('om_final_instruction_utilisateur','F');  
   
             $form->setBloc('date_finalisation_courrier','D',"","col_12");  
2516    
2517              $form->setFieldset('date_finalisation_courrier','D',_('Dates'));          $form->setFieldset('evenement','D',_('Evenement'));
2518              $form->setBloc('date_finalisation_courrier','D',"","col_6");          $form->setFieldset('om_final_instruction_utilisateur','F','');
             $form->setBloc('date_envoi_controle_legalite','F');  
2519    
2520              $form->setBloc('signataire_arrete','D',"","col_6");          $form->setBloc('om_final_instruction_utilisateur','F');
2521              $form->setBloc('date_retour_controle_legalite','F');          // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2522              $form->setFieldset('date_retour_controle_legalite','F','');          // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2523                        $form->setBloc('om_final_instruction_utilisateur','F');
2524              $form->setBloc('date_retour_controle_legalite','F');          $form->setBloc('parapheur_lien_page_signature','D');
2525    
2526            $form->setBloc('date_finalisation_courrier','D',"","");
2527    
2528            $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2529            $form->setBloc('date_finalisation_courrier','D');
2530            $form->setBloc('date_envoi_rar','F');
2531    
2532            $form->setBloc('date_retour_rar','D');
2533            $form->setBloc('date_retour_controle_legalite','F');
2534            $form->setFieldset('date_retour_controle_legalite','F','');
2535    
2536            $form->setBloc('date_retour_controle_legalite','F');
2537    
2538            $form->setBloc('statut_signature','D');
2539            $form->setFieldset('statut_signature','D','Suivi Parapheur');
2540            $form->setBloc('commentaire_signature','F');
2541            $form->setBloc('historique_signature','D');
2542            $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2543            $form->setBloc('historique_signature','F');
2544            $form->setFieldset('historique_signature','F');
2545    
2546            $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2547            $form->setFieldset('suivi_notification','F');
2548            $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2549            $form->setFieldset('suivi_notification_service','F');
2550            $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2551            $form->setFieldset('suivi_notification_tiers','F');
2552            $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2553            $form->setFieldset('suivi_notification_commune','F');
2554    
2555            if ($maj == 1) {
2556                // Récupère la collectivité du dossier d'instruction
2557                $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2558    
2559              $form->setBloc('complement_om_html','D',"","col_12");              //
2560                if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2561                    && $this->has_an_edition() === true) {
2562                    //
2563                    $form->setBloc('complement_om_html','D',"","container_instr_edition");
2564                    $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2565                    $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2566                    $form->setFieldset('complement_om_html','D',_('Complement'));
2567                    $form->setFieldset('bible','F','');
2568                    $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2569                    $form->setFieldset('bible2','F','');
2570                    $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2571                    $form->setFieldset('bible3','F','');
2572                    $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2573                    $form->setFieldset('bible4','F','');
2574                    $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2575                    $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2576                    $form->setBloc('corps_om_htmletatex','F');
2577                    $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2578                    $form->setBloc('btn_preview','F');
2579                    $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2580                    $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2581                    $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2582                    $form->setFieldset('live_preview','F');
2583                    $form->setBloc('live_preview','F');
2584                    $form->setBloc('live_preview','F');
2585                } else {
2586                    $form->setBloc('complement_om_html','D',"","hidelabel");
2587                    $form->setFieldset('complement_om_html','D',_('Complement'));
2588                    $form->setFieldset('bible','F','');
2589                    $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2590                    $form->setFieldset('bible2','F','');
2591                    $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2592                    $form->setFieldset('bible3','F','');
2593                    $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2594                    $form->setFieldset('bible4','F','');
2595                    $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2596                    $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2597                    $form->setBloc('corps_om_htmletatex','F');
2598                }
2599            } else {
2600                $form->setBloc('complement_om_html','D',"","hidelabel");
2601              $form->setFieldset('complement_om_html','D',_('Complement'));              $form->setFieldset('complement_om_html','D',_('Complement'));
2602              $form->setFieldset('bible','F','');              $form->setFieldset('bible','F','');
             $form->setBloc('bible','F');  
   
             $form->setBloc('complement2_om_html','D',"","col_12");  
2603              $form->setFieldset('complement2_om_html','D',_('Complement 2'));              $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2604              $form->setFieldset('bible2','F','');              $form->setFieldset('bible2','F','');
             $form->setBloc('bible2','F');  
               
             $form->setBloc('complement3_om_html','D',"","col_12");  
2605              $form->setFieldset('complement3_om_html','D',_('Complement 3'));              $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2606              $form->setFieldset('bible3','F','');              $form->setFieldset('bible3','F','');
             $form->setBloc('bible3','F');  
               
             $form->setBloc('complement4_om_html','D',"","col_12");  
2607              $form->setFieldset('complement4_om_html','D',_('Complement 4'));              $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2608              $form->setFieldset('bible4','F','');              $form->setFieldset('bible4','F','');
2609              $form->setBloc('bible4','F');              $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2610                $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2611                $form->setBloc('corps_om_htmletatex','F');
2612          }          }
2613            $data = array('form' => &$form, 'maj' => &$maj);
2614            $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2615      }      }
2616        
2617      function setLib(&$form, $maj) {      function setLib(&$form, $maj) {
2618            $data = array('form' => &$form, 'maj' => &$maj);
2619            $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2620          //          //
2621          parent::setLib($form, $maj);          parent::setLib($form, $maj);
2622          //          //
# Line 895  class instruction extends instruction_ge Line 2625  class instruction extends instruction_ge
2625          $form->setLib('bible2', "");          $form->setLib('bible2', "");
2626          $form->setLib('bible3', "");          $form->setLib('bible3', "");
2627          $form->setLib('bible4', "");          $form->setLib('bible4', "");
2628          $form->setLib('om_final_instruction_utilisateur', _("finalise par"));          $form->setLib('btn_refresh', "");
2629            $form->setLib('btn_preview', "");
2630            $form->setLib('btn_redaction', "");
2631            $form->setLib('live_preview', "");
2632            $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2633            $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2634            $form->setLib('date_retour_rar', __("date_notification"));
2635            $form->setLib('statut_signature', __("statut"));
2636            $form->setLib('commentaire_signature', __("commentaire"));
2637            $form->setLib('historique_signature', '');
2638            $form->setLib('suivi_notification', '');
2639            $form->setLib('suivi_notification_service', '');
2640            $form->setLib('suivi_notification_tiers', '');
2641            $form->setLib('suivi_notification_commune', '');
2642            $form->setLib('preview_edition', "");
2643            $form->setLib('document_type_instruction', __("Type de document"));
2644            $form->setLib('tiers_destinataire', __("Tiers destinataire"));
2645    
2646            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2647            // ajout et que l'option de rédaction libre est activée sur la
2648            // collectivité du dossier
2649            if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2650                //
2651                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2652                $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.");
2653                $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2654            }
2655            else {
2656                $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2657            }
2658    
2659            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2660            // modification et que l'option de prévisualisation de l'édition est
2661            // activée sur la collectivité du dossier
2662            if ($maj === '1'
2663                && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2664                //
2665                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2666                $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.");
2667                $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2668                $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2669            }
2670            $data = array('form' => &$form, 'maj' => &$maj);
2671            $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2672        }
2673    
2674        /**
2675         * Surcharge om_dbform::set_form_specificity()
2676         *
2677         * Traitements spécifiques lié à l'affichage des formulaires.
2678         * Les traitements gérés ici sont les suivants :
2679         *   - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2680         *     pu être récupérée.
2681         *   - Affichage d'un message d'information à l'attention de l'utilisateur si
2682         *     la notification est activée mais qu'elle n'est pas possible à cause du
2683         *     paramètrage.
2684         *
2685         * @param formulaire $form Instance formulaire.
2686         * @param string $maj
2687         *
2688         * @return void
2689         */
2690        function set_form_specificity(&$form, $maj) {
2691            parent::set_form_specificity($form, $maj);
2692    
2693            // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2694            // Si ce n'est pas le cas affiche un message d'erreur.
2695            if ((! empty($maj) && $maj == 3)) {
2696                if (! empty($this->getVal('lettretype'))) {
2697    
2698                    $om_edition = $this->f->get_inst__om_edition();
2699                    $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2700                    $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2701                    $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2702    
2703                    if (empty($edition)) {
2704                        $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2705                    }
2706                }
2707            }
2708    
2709            $this->display_notification_info($maj);
2710        }
2711    
2712        /**
2713         * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2714         * citoyen, si la notification des demandeurs est activée sur l'évenement
2715         * d'instruction et que le paramétrage du demandeur principal n'est pas
2716         * correct alors un message a destination de l'instructeur est affiché.
2717         *
2718         * @param string $maj
2719         *
2720         * @return void
2721         */
2722        public function display_notification_info($maj) {
2723            if ((! empty($maj) && $maj == 3)) {
2724                // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2725                // la requête permettant de savoir le type de demande à échouée) et si
2726                // la notification se fait par mail vérifie si il y a des erreurs de
2727                // paramétrage et si c'est le cas on affiche un message d'information
2728                if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2729                    $erreurParam = $this->get_info_notification_fail();
2730                    // Récupération de l'évenement d'instruction
2731                    $instEV = $this->get_inst_evenement();
2732                    if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2733                        $class = 'text-info ui-state-highlight ui-state-info';
2734                        $message = __("La notification n'est pas possible.");
2735                        $this->f->display_panel_information(
2736                            $class,
2737                            $message,
2738                            $erreurParam,
2739                            __('Les données suivantes doivent être modifiées'),
2740                            'erreur_param_notif'
2741                        );
2742                    }
2743                }
2744            }
2745        }
2746    
2747        /**
2748         * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2749         */
2750        public function display_error_message($msg) {
2751            $this->correct = false;
2752            $this->msg = $msg;
2753      }      }
2754    
2755      function triggerajouter($id, &$db, $val, $DEBUG) {      /**
2756         * TRIGGER - triggerajouter.
2757         * Réalise différents traitements avant d'ajouter l'instruction en base.
2758         *
2759         * Les traitements réalisés sont les suivant :
2760         *  - TODO : documenter les traietements existant
2761         *  - Intégre les bibles pré-chargé aux compléments de l'instruction.
2762         *    Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2763         *
2764         * @return boolean
2765         */
2766        function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2767            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2768            $parent_res = parent::triggerajouter($id, $dnu1, $val);
2769            if ($parent_res === false) return $parent_res;
2770    
2771            $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2772            if (! $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data)) {
2773                return false;
2774            }
2775    
2776          /**          /**
2777           * Le code suivant permet de récupérer des valeurs des tables evenement           * Le code suivant permet de récupérer des valeurs des tables evenement
2778           * et dossier pour les stocker dans l'instruction :           * et dossier pour les stocker dans l'instruction :
# Line 911  class instruction extends instruction_ge Line 2785  class instruction extends instruction_ge
2785           * - delai_notification           * - delai_notification
2786           * - lettretype           * - lettretype
2787           * - autorite_competente           * - autorite_competente
2788             * - pec_metier
2789           * - complement_om_html           * - complement_om_html
2790           * - complement2_om_html           * - complement2_om_html
2791           * - complement3_om_html           * - complement3_om_html
# Line 933  class instruction extends instruction_ge Line 2808  class instruction extends instruction_ge
2808           * - avis_decision           * - avis_decision
2809           */           */
2810          // Récupération de tous les paramètres de l'événement sélectionné          // Récupération de tous les paramètres de l'événement sélectionné
2811          $sql = "SELECT * FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
2812          WHERE evenement=".$this->valF['evenement'];              "obj" => "evenement",
2813          $res = $db->query($sql);              "idx" => intval($this->valF['evenement']),
2814          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);          ));
2815          if (database::isError($res)) {          if ($evenement->exists() === true) {
             die($res->getMessage());  
         }  
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {  
2816              // Récupération de l'identifiant de l'action              // Récupération de l'identifiant de l'action
2817              // si une action est paramétrée dans l'événement              // si une action est paramétrée dans l'événement
2818              $this->valF['action'] = NULL;              $this->valF['action'] = NULL;
2819              if (isset($row['action']) and !empty($row['action'])) {              if (!empty($evenement->getVal('action'))) {
2820                  $this->valF['action']=$row['action'];                  $this->valF['action']=$evenement->getVal('action');
2821              }              }
2822              // Récupération de la valeur du délai              // Récupération de la valeur du délai
2823              $this->valF['delai'] = $row['delai'];              $this->valF['delai'] = $evenement->getVal('delai');
2824              // Récupération de l'identifiant de l'état              // Récupération de l'identifiant de l'état
2825              // si un état est paramétré dans l'événement              // si un état est paramétré dans l'événement
2826              $this->valF['etat']=NULL;              $this->valF['etat']=NULL;
2827              if (isset($row['etat']) and !empty($row['etat'])) {              if (!empty($evenement->getVal('etat'))) {
2828                  $this->valF['etat']=$row['etat'];                  $this->valF['etat']=$evenement->getVal('etat');
2829              }              }
2830              // Récupération de la valeur d'accord tacite              // Récupération de la valeur d'accord tacite
2831              $this->valF['accord_tacite']=$row['accord_tacite'];              $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2832              // Récupération de la valeur du délai de notification              // Récupération de la valeur du délai de notification
2833              $this->valF['delai_notification']=$row['delai_notification'];              $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2834              // Récupération de l'identifiant de l'avis              // Récupération de l'identifiant de l'avis
2835              // si un avis est paramétré dans l'événement              // si un avis est paramétré dans l'événement
2836              $this->valF['avis_decision'] = NULL;              $this->valF['avis_decision'] = NULL;
2837              if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {              if(!empty($evenement->getVal('avis_decision'))) {
2838                  $this->valF['avis_decision']=$row['avis_decision'];                  $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2839              }              }
2840              // Récupération de la valeur de l'autorité compétente              // Récupération de la valeur de l'autorité compétente
2841              // si l'autorité compétente est paramétré dans l'événement              // si l'autorité compétente est paramétré dans l'événement
2842              $this->valF['autorite_competente'] = NULL;              $this->valF['autorite_competente'] = NULL;
2843              if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {              if(!empty($evenement->getVal('autorite_competente'))) {
2844                  $this->valF['autorite_competente']=$row['autorite_competente'];                  $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2845              }              }
2846              // Récupération de la valeur de la lettre type              // Récupération de la valeur de la lettre type
2847              $this->valF['lettretype']=$row['lettretype'];              $this->valF['lettretype']=$evenement->getVal('lettretype');
2848    
2849                // Récupération de la valeur du document_type
2850                if(!empty($evenement->getVal('document_type'))){
2851                    $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2852                }
2853                // Récupération de la valeur de la prise en compte métier
2854                // si la prise en compte métier est paramétrée dans l'événement
2855                $this->valF['pec_metier'] = NULL;
2856                if(!empty($evenement->getVal('pec_metier'))) {
2857                    $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2858                }
2859                
2860                $this->valF['tiers_destinataire_parametre'] = NULL;
2861                if(!empty($evenement->getVal('tiers_destinataire'))) {
2862                    $this->valF['tiers_destinataire_parametre'] = $evenement->getVal('tiers_destinataire');
2863                }
2864          }          }
2865          // Récupération de toutes les valeurs du dossier d'instruction en cours          // Récupération de toutes les valeurs du dossier d'instruction en cours
2866          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par l'instanciation de l'objet
2867          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
2868          $res = $db->query($sql);              sprintf(
2869          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
2870          if (database::isError($res)) {                      *
2871              die($res->getMessage());                  FROM
2872          }                      %1$sdossier
2873          $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);                  WHERE
2874                    dossier = \'%2$s\'',
2875                    DB_PREFIXE,
2876                    $this->f->db->escapeSimple($this->valF['dossier'])
2877                ),
2878                array(
2879                    "origin" => __METHOD__,
2880                )
2881            );
2882            $row = array_shift($qres['result']);
2883          $this->updateArchiveData($row);          $this->updateArchiveData($row);
2884                    
2885          // Récupération de la duree de validite du dossier d'autorisation          // Récupération de la duree de validite du dossier d'autorisation
2886          $sql = "SELECT duree_validite_parametrage          $qres = $this->f->get_one_result_from_db_query(
2887                  FROM ".DB_PREFIXE."dossier_autorisation_type_detaille              sprintf(
2888                  LEFT JOIN ".DB_PREFIXE."dossier_autorisation                  'SELECT
2889                      ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                      duree_validite_parametrage
2890                  LEFT JOIN ".DB_PREFIXE."dossier                  FROM
2891                      ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                      %1$sdossier_autorisation_type_detaille
2892          WHERE dossier.dossier='".$this->valF['dossier']."'";                      LEFT JOIN %1$sdossier_autorisation
2893          $duree_validite_parametrage = $db->getOne($sql);                          ON  dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2894          $this->addToLog("triggerajouter(): db->getOne(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdossier
2895          database::isError($duree_validite_parametrage);                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2896          if ($duree_validite_parametrage != '') {                  WHERE
2897              $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;                      dossier.dossier = \'%2$s\'',
2898                    DB_PREFIXE,
2899                    $this->f->db->escapeSimple($this->valF['dossier'])
2900                ),
2901                array(
2902                    "origin" => __METHOD__,
2903                )
2904            );
2905    
2906            if ($qres['result'] != '') {
2907                $this->valF['duree_validite_parametrage'] = $qres['result'];
2908          }          }
2909    
2910          // Identifiant du type de courrier          // Identifiant du type de courrier
# Line 1005  class instruction extends instruction_ge Line 2912  class instruction extends instruction_ge
2912          $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);          $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2913          // Code barres          // Code barres
2914          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2915    
2916            // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2917            // à l'ajout de l'instruction.
2918            // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2919            if (! empty($this->valF['lettretype'])) {
2920                $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2921            }
2922    
2923            $res = true;
2924            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2925            if (! $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data)) {
2926                return false;
2927            }
2928            return $res;
2929      }      }
2930        
2931      // Test si une restriction est valide      /**
2932      // return boolean       * Récupère pour chaque champ complementX_om_html le complément correspondant
2933         * et set l'entrée correspondante de valF avec.
2934         *
2935         * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2936         * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2937         * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2938         * aura donc un impact sur cette méthode.
2939         *
2940         * @param string dossier : identifiant du dossier de l'instruction
2941         * @param int    evenement : identifiant de l'évènement d'instruction
2942         *
2943         * @return void
2944         */
2945        public function set_precharge_complement($evenement, $dossier) {
2946            // Récupération des bibles et chargement dans les compléments
2947            for ($i = 1; $i <= 15; $i++) {
2948                // Constitution de l'id du champs.
2949                // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2950                $field = "complement".($i === 1 ? '' : $i)."_om_html";
2951                // Récupération des compléments correspondant en fonction de l'évènement
2952                // et du dossier puis insertion dans la champs voulu
2953                $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2954            }
2955        }
2956    
2957    
2958    
2959        /**
2960         * Test si une restriction est valide.
2961         *
2962         * @return boolean
2963         */
2964      function restrictionIsValid($restriction){      function restrictionIsValid($restriction){
2965          if($this->restriction_valid != null) {          if($this->restriction_valid != null) {
2966              return $this->restriction_valid;              return $this->restriction_valid;
# Line 1028  class instruction extends instruction_ge Line 2980  class instruction extends instruction_ge
2980    
2981          // Supprime tous les espaces de la chaîne de caractère          // Supprime tous les espaces de la chaîne de caractère
2982          $restriction = preg_replace('/\s+/', '', $restriction);          $restriction = preg_replace('/\s+/', '', $restriction);
2983            
2984          // Met un marqueur avant et après les opérateurs          // Met un marqueur avant et après les opérateurs
2985          // puis transforme la chaine en un tableau          // puis transforme la chaine en un tableau
2986          $restriction = str_replace($operateurs, $operateurs_marked,          $restriction = str_replace($operateurs, $operateurs_marked,
2987              $restriction);              $restriction);
2988    
2989          // Pour chaque opérateur logique          // Pour chaque opérateur logique
# Line 1093  class instruction extends instruction_ge Line 3045  class instruction extends instruction_ge
3045                              $res[] = $this->getRestrictionValue($value);                              $res[] = $this->getRestrictionValue($value);
3046                          } else {                          } else {
3047                              // Message d'erreur                              // Message d'erreur
3048                              $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");                              $error_message = sprintf(__("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
3049                              $this->addToMessage($error_message);                              $this->addToMessage($error_message);
3050                              // Arrête le traitement                              // Arrête le traitement
3051                              return false;                              return false;
# Line 1102  class instruction extends instruction_ge Line 3054  class instruction extends instruction_ge
3054                  }                  }
3055    
3056                  // Boucle dans le tableau                  // Boucle dans le tableau
3057                  // commence à 1 car le 0 doit rester inchangé tout au long du                  // commence à 1 car le 0 doit rester inchangé tout au long du
3058                  // traitement                  // traitement
3059                  for ($i = 1; $i<count($restriction); $i++) {                  for ($i = 1; $i<count($restriction); $i++) {
3060                        
3061                      // Récupère le comparateur                      // Récupère le comparateur
3062                      if ($restriction[$i] === ">="                      if ($restriction[$i] === ">="
3063                          || $restriction[$i] === "<="                          || $restriction[$i] === "<="
3064                          || $restriction[$i] === "=="                          || $restriction[$i] === "=="
3065                          || $restriction[$i] === "!=") {                          || $restriction[$i] === "!=") {
# Line 1132  class instruction extends instruction_ge Line 3084  class instruction extends instruction_ge
3084                          $res[$j] = $this->f->mois_date($dateDep, $duree, "-");                          $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
3085                      }                      }
3086                  }                  }
3087                    
3088              }              }
3089    
3090              // Si les tableau des résultats n'est pas vide              // Si les tableau des résultats n'est pas vide
# Line 1169  class instruction extends instruction_ge Line 3121  class instruction extends instruction_ge
3121          } else {          } else {
3122    
3123              // Message d'erreur              // Message d'erreur
3124              $error_message = _("Mauvais parametrage de la restriction.")." ".              $error_message = __("Mauvais parametrage de la restriction.")." ".
3125                  _("Contactez votre administrateur");                  __("Contactez votre administrateur");
3126              $this->addToMessage($error_message);              $this->addToMessage($error_message);
3127              // Arrête le traitement              // Arrête le traitement
3128              return false;              return false;
3129          }          }
3130            
3131          return $res_bool;          return $res_bool;
3132    
3133      }      }
# Line 1183  class instruction extends instruction_ge Line 3135  class instruction extends instruction_ge
3135      /**      /**
3136       * Permet de définir si l'événement passé en paramètre est un événement retour.       * Permet de définir si l'événement passé en paramètre est un événement retour.
3137       * @param integer $evenement événement à tester       * @param integer $evenement événement à tester
3138       *       *
3139       * @return boolean retourne true si événement retour sinon false       * @return boolean retourne true si événement retour sinon false
3140       */       */
3141      function is_evenement_retour($evenement) {      function is_evenement_retour($evenement) {
3142          if(empty($evenement) || !is_numeric($evenement)) {          if(empty($evenement) || !is_numeric($evenement)) {
3143              return "";              return "";
3144          }          }
3145          $sql = "SELECT retour  
3146              FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
3147              WHERE evenement = ".$evenement;              "obj" => "evenement",
3148          $retour = $this->db->getOne($sql);              "idx" => $evenement,
3149          $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);          ));
3150          if (database::isError($retour)) {  
3151              die($retour->getMessage());          return $evenement->getVal('retour') == 't';
         }  
         if ($retour == 't') {  
             return true;  
         } else {  
             return false;  
         }  
3152      }      }
3153    
3154      /**      /**
3155       * Retourne le champ restriction de l'événement passé en paramètre.       * Retourne le champ restriction de l'événement passé en paramètre.
3156       *       *
3157       * @param integer $evenement id de l'événement sur lequel récupérer la restriction       * @param integer $evenement id de l'événement sur lequel récupérer la restriction
3158       *       *
3159       * @return string             contenu du champ restriction       * @return string             contenu du champ restriction
3160       */       */
3161      function get_restriction($evenement) {      function get_restriction($evenement) {
# Line 1217  class instruction extends instruction_ge Line 3163  class instruction extends instruction_ge
3163              return "";              return "";
3164          }          }
3165          //Récupère la restriction          //Récupère la restriction
3166          $sql= "SELECT          $evenement = $this->f->get_inst__om_dbform(array(
3167                    restriction              "obj" => "evenement",
3168                FROM              "idx" => $evenement,
3169                    ".DB_PREFIXE."evenement          ));
3170                WHERE  
3171                    evenement =".$evenement;          return $evenement->getVal('restriction');
   
         $restriction = $this->db->getOne($sql);  
         $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);  
         if (database::isError($restriction)) {  
             die($restriction->getMessage());  
         }          
         return $restriction;  
3172      }      }
3173    
3174      /**      /**
# Line 1245  class instruction extends instruction_ge Line 3184  class instruction extends instruction_ge
3184          // Récupére les valeurs du dossier          // Récupére les valeurs du dossier
3185          $value_dossier = $this->get_dossier_actual();          $value_dossier = $this->get_dossier_actual();
3186    
3187          //          //
3188          if (is_numeric($restrictionValue)) {          if (is_numeric($restrictionValue)) {
3189              $return = $restrictionValue;              $return = $restrictionValue;
3190          }elseif (isset($value_dossier[$restrictionValue])) {          }elseif (isset($value_dossier[$restrictionValue])) {
# Line 1260  class instruction extends instruction_ge Line 3199  class instruction extends instruction_ge
3199    
3200    
3201      /**      /**
3202         * Calcul une regle à partir des données de l'url et affiche son
3203         * résultat au format json
3204         */
3205        public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3206            // Récupération de la date limite
3207            $dossier = $this->f->get_inst__om_dbform(array(
3208                'obj' => 'dossier',
3209                'idx' => $this->getVal('dossier')
3210            ));
3211            $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3212                $dossier->getVal('date_limite') :
3213                $dossier->getVal('date_limite_incompletude');
3214            // Ajout d'un jour à la date limite (reglementaire lors de la notification
3215            // par demat)
3216            $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3217            // Compare la date limite à j+1 et la date du jour
3218            // La date du jour est récupérée via la fonction date pour pouvoir comparer
3219            // des timestamps de début de journée
3220            if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3221            echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3222        }
3223    
3224        /**
3225         * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3226         *
3227         * @param  object $ev Instance de l'événement associé à l'instruction
3228         * @param  array  $params Types d'événements autorisés
3229         * @return boolean
3230         */
3231        public function is_type_evenement_autorise($ev, $params = array()) {
3232            $type_evenement = $ev->getVal('type');
3233            if (isset($params["types_evenements_autorises"])
3234                && ! empty($params["types_evenements_autorises"])
3235                && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3236                return true;
3237            }
3238            return false;
3239        }
3240    
3241        /**
3242         * Vérifie si la date limite de notification au demandeur est dépassée.
3243         *
3244         * @param  boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3245         * @return boolean
3246         */
3247        public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3248            $dln = $this->getVal('archive_date_notification_delai');
3249            if ($dln === ''
3250                || $dln === null) {
3251                //
3252                $dossier = $this->f->get_inst__om_dbform(array(
3253                    'obj' => 'dossier',
3254                    'idx' => $this->getVal('dossier')
3255                ));
3256                $dln = $dossier->getVal('date_notification_delai');
3257            }
3258            if ($dln === ''
3259                || $dln === null) {
3260                //
3261                return false;
3262            }
3263            // Ajout d'un jour à la date limite de notification
3264            if ($add_one_day === true) {
3265                $dln = $this->f->mois_date($dln, "1", "+", "jour");
3266            }
3267            // Compare la date limite de notification et la date du jour
3268            return strtotime($dln) <= strtotime(date("Y-m-d"));
3269        }
3270    
3271        /**
3272       * Calcul des règle d'action selon leur type.       * Calcul des règle d'action selon leur type.
3273       *       *
3274       * Types de règle :       * Types de règle :
# Line 1269  class instruction extends instruction_ge Line 3278  class instruction extends instruction_ge
3278       * - bool       * - bool
3279       * - specific       * - specific
3280       * - technical_data       * - technical_data
3281       *       *
3282       * @param string $rule      Règle d'action.       * @param string $rule      Règle d'action.
3283       * @param string $rule_name Nom de la règle.       * @param string $rule_name Nom de la règle.
3284       * @param string $type      Type de la règle.       * @param string $type      Type de la règle.
3285       *       *
3286       * @return mixed            Résultat de la règle       * @return mixed            Résultat de la règle
3287       */       */
3288      public function regle($rule, $rule_name, $type = null) {      public function regle($rule, $rule_name, $type = null) {
3289    
3290          // Supprime tous les espaces de la chaîne de caractère          // Supprime tous les espaces de la chaîne de caractère
3291          $rule = str_replace(' ', '', $rule);          $rule = str_replace(' ', '', $rule);
3292            // On force les minuscules
3293            $rule = strtolower($rule);
3294          // Coupe la chaîne au niveau de l'opérateur          // Coupe la chaîne au niveau de l'opérateur
3295          $operands = explode ("+", $rule);          $operands = explode ("+", $rule);
3296          // Nombre d'opérande          // Nombre d'opérande
# Line 1310  class instruction extends instruction_ge Line 3321  class instruction extends instruction_ge
3321              "regle_date_retour_contradictoire",              "regle_date_retour_contradictoire",
3322              "regle_date_ait",              "regle_date_ait",
3323              "regle_date_transmission_parquet",              "regle_date_transmission_parquet",
3324                "regle_date_affichage",
3325                "duree_validite",
3326                "duree_validite_parametrage",
3327          );          );
3328          // Tableau des champs de type numérique          // Tableau des champs de type numérique
3329          $rule_type_numeric = array(          $rule_type_numeric = array(
3330            );
3331            // Tableau des champs de type text
3332            $rule_type_time_delai = array(
3333              "regle_delai",              "regle_delai",
3334              "regle_delai_incompletude",              "regle_delai_incompletude",
3335          );          );
# Line 1321  class instruction extends instruction_ge Line 3338  class instruction extends instruction_ge
3338          );          );
3339          // Tableau des champs de type booléen          // Tableau des champs de type booléen
3340          $rule_type_bool = array(          $rule_type_bool = array(
3341                "regle_a_qualifier",
3342                "regle_incompletude",
3343                "regle_incomplet_notifie",
3344                "regle_evenement_suivant_tacite_incompletude",
3345          );          );
3346          // Tableau des champs spécifiques          // Tableau des champs spécifiques
3347          $rule_type_specific = array(          $rule_type_specific = array(
# Line 1328  class instruction extends instruction_ge Line 3349  class instruction extends instruction_ge
3349              "regle_etat",              "regle_etat",
3350              "regle_accord_tacite",              "regle_accord_tacite",
3351              "regle_avis",              "regle_avis",
3352                "regle_pec_metier",
3353                "regle_etat_pendant_incompletude",
3354          );          );
3355          // Tableau des champs de données techniques          // Tableau des champs de données techniques
3356          $rule_type_technical_data = array(          $rule_type_technical_data = array(
# Line 1337  class instruction extends instruction_ge Line 3360  class instruction extends instruction_ge
3360              'regle_donnees_techniques4',              'regle_donnees_techniques4',
3361              'regle_donnees_techniques5',              'regle_donnees_techniques5',
3362          );          );
3363            // Tableau des champs simple
3364            $rule_type_simple = array(
3365                "regle_dossier_instruction_type",
3366            );
3367    
3368          // Définit le type du champ          // Définit le type du champ
3369          if (in_array($rule_name, $rule_type_date) == true) {          if (in_array($rule_name, $rule_type_date) == true) {
# Line 1355  class instruction extends instruction_ge Line 3382  class instruction extends instruction_ge
3382              $type = "specific";              $type = "specific";
3383          }          }
3384          if (in_array($rule_name, $rule_type_technical_data) === true) {          if (in_array($rule_name, $rule_type_technical_data) === true) {
3385              $type = 'text';              $type = 'technical_text';
3386            }
3387            if (in_array($rule_name, $rule_type_simple) === true) {
3388                $type = 'simple';
3389            }
3390            if (in_array($rule_name, $rule_type_time_delai) === true) {
3391                $type = "time_delai";
3392          }          }
3393    
3394          // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande          // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3395          // Récupère directement la valeur de l'opérande          // Récupère directement la valeur de l'opérande
3396          if ($type === 'specific' || $type === 'bool') {          if ($type === 'specific') {
3397              //              //
3398              return $this->get_value_for_rule($rule);              return $this->get_value_for_rule($rule);
3399          }          }
3400    
3401          // Initialisation des variables          // Initialisation des variables
         $key_date = 0;  
3402          $total_numeric = 0;          $total_numeric = 0;
3403          $res_text = '';          $res_text = '';
3404            $final_date = null;
3405            $merged_date_elements = array();
3406          // Pour chaque opérande          // Pour chaque opérande
3407          foreach ($operands as $key => $operand) {          foreach ($operands as $key => $operand) {
   
3408              // Si c'est une règle de type date              // Si c'est une règle de type date
3409              if ($type == 'date') {              if ($type == 'date') {
3410                  // Vérifie si au moins une des opérandes est une date                  if (is_numeric($operand) === false){
3411                  if (is_numeric($operand) === false                      $rule_value = $this->get_value_for_rule($operand);
3412                      && $this->get_value_for_rule($operand) !== null                      if (
3413                      && $this->f->check_date($this->get_value_for_rule($operand)) == true) {                          $rule_value !== null
3414                      // Récupère la position de la date                          && (
3415                      $key_date = $key;                              strpos($operand, 'mois') !== false
3416                                || strpos($operand, 'jour') !== false
3417                            )
3418                        ){
3419                            $rule_value = $operand;
3420                        }
3421                        if ($rule_value !== null){
3422                            // Vérifie si l'opérande est une date
3423                            if ($this->f->check_date($rule_value) == true) {
3424                                // Affecte la date
3425                                $final_date = $rule_value;
3426                            }else{
3427                                // Gère les opérandes
3428                                preg_match_all('/(\d+)\s*([a-zA-Z]+)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3429                                $elements = [];
3430                                foreach ($matches[1] as $key => $value) {
3431                                    $timelength = (int) $value[0];
3432                                    $timetype = strtolower($matches[2][$key][0]); // Convertit en minuscule pour uniformité
3433                                    if ($timetype === 'jour') {
3434                                        $timetype = 'jours'; // Normalise l'unité
3435                                    }
3436                                    $elements[] = ['timelength' => $timelength, 'timetype' => $timetype];
3437                                }
3438                                // Fusionne les éléments similaires consécutifs
3439                                foreach ($elements as $element) {
3440                                    $last_key = array_key_last($merged_date_elements);
3441                                    if (!empty($merged_date_elements[$last_key][$element['timetype']])
3442                                    ) {
3443                                        $merged_date_elements[$last_key][$element['timetype']] += $element['timelength'];
3444                                    } else {
3445                                        // Ajoute un nouvel élément à la liste fusionnée
3446                                        $merged_date_elements[][$element['timetype']] = $element['timelength'];
3447                                    }
3448                                }
3449                            }
3450                        }
3451                  }                  }
3452                  // Les autres opérandes doivent être que des numériques                  // Les autres opérandes doivent être que des numériques
3453                  if (is_numeric($operand) == true) {                  if (is_numeric($operand) == true) {
3454                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
3455                      $total_numeric += $operand;                      $last_key = array_key_last($merged_date_elements);
3456                  }                      if (!empty($merged_date_elements[$last_key]["mois"]) ) {
3457                  if (is_numeric($operand) === false                          $merged_date_elements[$last_key]["mois"] += $operand;
3458                      && $this->get_value_for_rule($operand) !== null                      } else {
3459                      && is_numeric($this->get_value_for_rule($operand)) == true) {                          // Ajoute un nouvel élément à la liste fusionnée
3460                      // Ajoute l'opérande au total                          $merged_date_elements[]["mois"] += $operand;
3461                      $total_numeric += $this->get_value_for_rule($operand);                      }
3462                  }                  }
3463              }              }
3464    
# Line 1411  class instruction extends instruction_ge Line 3478  class instruction extends instruction_ge
3478              }              }
3479    
3480              // Si c'est une règle de type text              // Si c'est une règle de type text
3481              if ($type === 'text') {              if ($type === 'text' || $type === 'technical_text') {
3482                  // Concatène toutes les chaînes de caractère                  // Concatène toutes les chaînes de caractère
3483                  $res_text .= $this->get_value_for_rule($operand);                  $res_text .= $this->get_value_for_rule($operand);
3484              }              }
3485    
3486                // Si c'est une règle de type time_delai
3487                if ($type === 'time_delai') {
3488                    $rule_value = $this->get_value_for_rule($operand);
3489                    if ( strlen($res_text) != 0) {
3490                        $res_text .= "+";
3491                    }
3492                    if ($rule_value != null && $rule_value != '' && $rule_value != 'null'){
3493                        // Supprime tous les espaces de la chaîne de caractère
3494                        // Concatène toutes les chaînes de caractère
3495                        $res_text .= $rule_value;
3496                    } else if (! in_array($operand, action::EVENEMENT_FIELDS)) {
3497                        $res_text .= $operand;
3498                    }
3499                }
3500    
3501          }          }
3502    
3503          // Résultat pour une règle de type date          // Résultat pour une règle de type date
3504          if ($type == 'date') {          if ($type == 'date') {
3505              // Retourne le calcul de la date              // Utilise la règle fusionnée pour calculer la date finale
3506              return $this->f->mois_date($this->valF[$operands[$key_date]],              foreach ($merged_date_elements as $element) {
3507                  $total_numeric, "+");                  if (!empty($element['mois'])) {
3508                        $final_date = $this->f->mois_date($final_date, $element['mois'], "+", 'mois');
3509                    }
3510                    if (!empty($element['jours'])) {
3511                        $final_date = $this->f->mois_date($final_date, $element['jours'], "+", 'jours');
3512                    }
3513                }
3514                // Retourne la date
3515                return $final_date;
3516          }          }
3517    
3518          // Résultat pour une règle de type numérique          // Résultat pour une règle de type numérique
3519          if ($type == 'numeric') {          if ($type == 'numeric') {
3520              // Retourne le calcul              // Retourne le calcul
3521              return $total_numeric;              return $total_numeric;
3522          }          }
3523    
3524          // Résultat pour une règle de type text          // Résultat pour une règle de type text
3525          if ($type === 'text') {          if (in_array($type, array('text', 'technical_text')) === true) {
3526              // Retourne la chaîne de caractère              // Retourne la chaîne de caractère
3527              return $res_text;              return $res_text;
3528          }          }
3529    
3530            // Résultat pour une règle de type text
3531            if (in_array($type, array('time_delai')) === true) {
3532                // Traitement de la valeur à afficher
3533                if (empty($res_text)) return $res_text;
3534    
3535                // Match sequences de "X mois" ou "X jour(s)"
3536                $pattern = '/(\d+)\s*(mois|jour(?:s?))/'; // Updated regex to include "jour" and "jours"
3537                preg_match_all($pattern, $res_text, $matches, PREG_OFFSET_CAPTURE);
3538    
3539                $compressed = [];
3540                $currentType = null;
3541                $currentSum = 0;
3542    
3543                foreach ($matches[0] as $index => $match) {
3544                    $value = (int)$matches[1][$index][0];
3545                    $type = $matches[2][$index][0];
3546    
3547                    // Normalize "jour" and "jours" to a single term for consistent grouping
3548                    if ($type === 'jour' || $type === 'jours') {
3549                        $type = 'jours'; // Use "jours" as the standard
3550                    }
3551    
3552                    if ($type === $currentType) {
3553                        $currentSum += $value; // Continue summing the same type
3554                    } else {
3555                        if (!empty($currentType)) {
3556                            // Save the previous group
3557                            $compressed[] = "$currentSum $currentType";
3558                        }
3559                        $currentType = $type; // Update to the new type
3560                        $currentSum = $value;
3561                    }
3562                }
3563    
3564                // Add the final group
3565                if (!empty($currentType)) {
3566                    $compressed[] = "$currentSum $currentType";
3567                }
3568    
3569                // Retourne la chaîne de caractère
3570                return implode(' + ', $compressed);
3571            }
3572    
3573            if ($type === 'simple' || $type === 'bool') {
3574                // Retourne la valeur du champs rule
3575                return $rule;
3576            }
3577      }      }
3578    
3579    
# Line 1462  class instruction extends instruction_ge Line 3601  class instruction extends instruction_ge
3601    
3602    
3603      /**      /**
3604         * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3605         * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3606         *
3607         * 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é
3608         * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3609         *
3610         * @return string : le nom du fichier générer
3611         */
3612        function determinate_name_doc_pdf(){
3613            $id_DI = $this->getVal("dossier");
3614            $date = date('Ymd');
3615            $data = "";
3616    
3617            // Récupération de l'id de la lettre type associée à l'instruction
3618            $data = $this->getVal("lettretype");
3619    
3620            // Récupération de l'id de l'instruction
3621            $id_instr = $this->getVal("instruction");
3622    
3623            // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3624            if(!empty($this->get_type_document_linked_with_instruction())){
3625                $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3626            }
3627    
3628            // On retourne le nom du fichier généré
3629            return $this->f->normalize_string(
3630                sprintf(
3631                    "%s_%s_%s_%s",
3632                    $id_DI,
3633                    $id_instr,
3634                    $date,
3635                    $data
3636                )
3637            );
3638        }
3639    
3640    
3641        /**
3642       * [get_inst_donnees_techniques description]       * [get_inst_donnees_techniques description]
3643       *       *
3644       * @param [type] $donnees_techniques [description]       * @param [type] $donnees_techniques [description]
# Line 1470  class instruction extends instruction_ge Line 3647  class instruction extends instruction_ge
3647       */       */
3648      function get_inst_donnees_techniques($donnees_techniques = null) {      function get_inst_donnees_techniques($donnees_techniques = null) {
3649          //          //
3650          if (isset($this->inst_donnees_techniques) === false or          if (isset($this->inst_donnees_techniques) === false ||
3651              $this->inst_donnees_techniques === null) {              $this->inst_donnees_techniques === null) {
3652              //              //
3653              if (is_null($donnees_techniques)) {              if (is_null($donnees_techniques)) {
3654                  $donnees_techniques = $this->getDonneesTechniques();                  $donnees_techniques = $this->getDonneesTechniques();
3655              }              }
3656              //              //
3657              require_once "../obj/donnees_techniques.class.php";              $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3658              $this->inst_donnees_techniques = new donnees_techniques($donnees_techniques);                  "obj" => "donnees_techniques",
3659                    "idx" => $donnees_techniques,
3660                ));
3661          }          }
3662          //          //
3663          return $this->inst_donnees_techniques;          return $this->inst_donnees_techniques;
# Line 1490  class instruction extends instruction_ge Line 3669  class instruction extends instruction_ge
3669       * @return string L'identifiant des données techniques liées du dossier       * @return string L'identifiant des données techniques liées du dossier
3670       */       */
3671      function getDonneesTechniques() {      function getDonneesTechniques() {
           
         $donnees_techniques = '';  
3672    
3673          $sql = "SELECT donnees_techniques          $qres = $this->f->get_one_result_from_db_query(
3674              FROM ".DB_PREFIXE."donnees_techniques              sprintf(
3675              WHERE dossier_instruction ='".$this->valF["dossier"]."'";                  'SELECT
3676          $donnees_techniques = $this->db->getOne($sql);                      donnees_techniques
3677          $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                  FROM
3678          if ( database::isError($donnees_techniques)){                      %1$sdonnees_techniques
3679              die();                  WHERE
3680          }                      dossier_instruction = \'%2$s\'',
3681                    DB_PREFIXE,
3682                    $this->f->db->escapeSimple($this->valF["dossier"])
3683                ),
3684                array(
3685                    "origin" => __METHOD__,
3686                )
3687            );
3688    
3689          return $donnees_techniques;          return $qres['result'];
3690      }      }
3691    
   
3692      /**      /**
3693       * TRIGGER - triggerajouterapres.       * TRIGGER - triggerajouterapres.
3694       *       *
# Line 1516  class instruction extends instruction_ge Line 3699  class instruction extends instruction_ge
3699       *       *
3700       * @return boolean       * @return boolean
3701       */       */
3702      function triggerajouterapres($id, &$db, $val, $DEBUG) {      function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3703            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3704    
3705            $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3706            if ($parent_res === false) return $parent_res;
3707    
3708            $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3709            if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data)) {
3710                return false;
3711            }
3712    
3713          // On a besoin de l'instance du dossier lié à l'événement d'instruction          // On a besoin de l'instance du dossier lié à l'événement d'instruction
3714          $inst_di = $this->get_inst_dossier($this->valF['dossier']);          $inst_di = $this->get_inst_dossier($this->valF['dossier']);
   
3715          // Instance de la classe evenement          // Instance de la classe evenement
3716          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3717            // Instance de l'état courant du dossier d'instruction
3718            $inst_current_etat = $this->f->get_inst__om_dbform(array(
3719                "obj" => "etat",
3720                "idx" => $inst_di->get_id_etat(),
3721            ));
3722    
3723          /**          /**
3724           * Mise à jour des valeurs du dossier en fonction des valeurs calculées           * Mise à jour des valeurs du dossier en fonction des valeurs calculées
# Line 1530  class instruction extends instruction_ge Line 3726  class instruction extends instruction_ge
3726           */           */
3727          // état de complétude actuel du dossier          // état de complétude actuel du dossier
3728          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3729            // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3730            $ev_suiv_tacite_incompletude = false;
3731          // Initialisation          // Initialisation
3732          $valF = "";          $valF = array();
3733          $valF_dt = "";          $valF_dt = array();
3734          //          //
         if($incompletude === FALSE) {  
             // Si l'événement d'instruction est de type incompletude  
             if($inst_evenement->getVal('type') == "incompletude") {  
                 // On marque le dossier en incomplétude pour application des actions  
                 $incompletude = TRUE;  
                 // Set du flag incomplétude de la table dossier  
                 $valF['incompletude'] = TRUE;  
                 // Enregistrement de l'état dans la variable provisoire  
                 $valF['etat_pendant_incompletude'] = $this->valF['archive_etat'];  
             }  
         } else {  
             // Si l'evenement d'instruction est de type retour ou contient une  
             // decision, on sort d'incomplétude  
             if($inst_evenement->getVal('type') == "retour" OR  
                $inst_evenement->getVal('avis_decision') != NULL) {  
                 // On enlève la marque d'incomplétude pour application des actions  
                 $incompletude = FALSE;  
                 // On enlève le flag d'incomplétude sur l'enregistrement de la table dossier  
                 $valF['incompletude'] = FALSE;  
                 $valF['incomplet_notifie'] = FALSE;  
                  // Restauration de l'état depuis l'état provisoire  
                 $valF['etat'] = $this->valF['archive_etat_pendant_incompletude'];  
                 // On vide la variable provisoire ainsi que le délai de complétude  
                 // et la date limite de complétude  
                 $valF['etat_pendant_incompletude'] = NULL;  
                 $valF['delai_incompletude'] = NULL;  
                 $valF['date_limite_incompletude'] = NULL;  
                 $valF['evenement_suivant_tacite_incompletude'] = NULL;  
             }  
         }  
3735          // Récupération des paramètres de l'action          // Récupération des paramètres de l'action
3736          $sql = "SELECT * FROM ".DB_PREFIXE."action          // TODO : remplacer cette requête par l'instanciation de l'action
3737          WHERE action='".$this->valF['action']."'";          $qres = $this->f->get_all_results_from_db_query(
3738          $res = $db->query($sql);              sprintf(
3739          $this->addToLog("triggerajouterapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
3740          if (database::isError($res)) {                      *
3741              die($res->getMessage());                  FROM
3742          }                      %1$saction
3743          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  WHERE
3744                        action = \'%2$s\'',
3745                    DB_PREFIXE,
3746                    $this->f->db->escapeSimple($this->valF['action'])
3747                ),
3748                array(
3749                    "origin" => __METHOD__
3750                )
3751            );
3752            foreach ($qres['result'] as $row) {
3753    
3754              // pour chacune des regles, on applique la regle              // pour chacune des regles, on applique la regle
3755              if ($row['regle_delai'] != '') {              if ($row['regle_delai'] != '') {
# Line 1624  class instruction extends instruction_ge Line 3801  class instruction extends instruction_ge
3801                  $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');                  $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3802              }              }
3803              if ($row['regle_etat'] != '') {              if ($row['regle_etat'] != '') {
3804                  // Si on est dans le cas général ou qu'on est en incomplétude et                  $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
                 // qu'on a un événement de type incomplétude alors : on stocke  
                 // l'état dans la variable courante  
                 if ($incompletude == FALSE OR $inst_evenement->getVal('type') == "incompletude") {  
                     $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');  
                 } else {  
                     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat'], 'regle_etat');  
                 }  
3805              }              }
3806              if ($row['regle_date_cloture_instruction'] !== '') {              if ($row['regle_date_cloture_instruction'] !== '') {
3807                  $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');                  $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
# Line 1669  class instruction extends instruction_ge Line 3839  class instruction extends instruction_ge
3839              if ($row['regle_date_transmission_parquet'] !== '') {              if ($row['regle_date_transmission_parquet'] !== '') {
3840                  $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');                  $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3841              }              }
3842                if ($row['regle_dossier_instruction_type'] !== '') {
3843                    $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3844                }
3845                // La date d'affichage est modifiée seulement si le champ n'est pas
3846                // renseigné
3847                if ($row['regle_date_affichage'] !== ''
3848                    && ($inst_di->getVal('date_affichage') === ''
3849                        || $inst_di->getVal('date_affichage') === null)) {
3850                    //
3851                    $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3852                }
3853                //
3854                if ($row['regle_pec_metier'] != '') {
3855                    $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3856                }
3857                if ($row['regle_a_qualifier'] != '') {
3858                    $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3859                }
3860                //
3861                if ($row['regle_incompletude'] != '') {
3862                    $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3863                }
3864                if ($row['regle_incomplet_notifie'] != '') {
3865                    $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3866                }
3867                if ($row['regle_etat_pendant_incompletude'] != '') {
3868                    $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3869                }
3870                if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3871                    $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3872                    if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3873                        $ev_suiv_tacite_incompletude = true;
3874                    }
3875                }
3876          }          }
3877    
3878          // Si l'événement a un événement suivant tacite          // Si l'événement a un événement suivant tacite
3879          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3880              // Si le DI n'est pas en incomplétude, l'événement tacite est stocké              // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3881              // dans le champ evenement_suivant_tacite du dossier              // pas associé de le même façon au dossier d'instruction
3882              if ($incompletude == false OR $inst_evenement->getVal('type') != "incompletude") {              if ($ev_suiv_tacite_incompletude === false) {
                 //  
3883                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3884              } else {              }
3885                  // Sinon l'événement tacite est stocké dans le champ              if ($ev_suiv_tacite_incompletude === true) {
                 // evenement_suivant_tacite_incompletude du dossier  
3886                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3887              }              }
3888          }          }
3889          // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement          // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3890          if ($valF_dt != "") {          if (count($valF_dt) > 0) {
3891              $dt_id = $this->getDonneesTechniques();              $dt_id = $this->getDonneesTechniques();
3892              // On met à jour le dossier              // On met à jour le dossier
3893              $cle = " donnees_techniques='".$dt_id."'";              $cle = " donnees_techniques='".$dt_id."'";
3894              $res1 = $db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);              $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3895              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);              $this->addToLog(
3896              if (database::isError($res1)) {                  __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3897                  die($res->getMessage());                  VERBOSE_MODE
3898              }              );
3899                $this->f->isDatabaseError($res1);
3900              // Affichage d'informations à l'utilisateur              // Affichage d'informations à l'utilisateur
3901              $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");              $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3902          }          }
3903          // Si des valeurs ont été calculées alors on met à jour l'enregistrement          // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3904          if ($valF != "") {          if (count($valF) > 0) {
3905              // On met à jour le dossier              //
3906              $cle = " dossier='".$this->valF['dossier']."'";              $inst_dossier = $this->f->get_inst__om_dbform(array(
3907              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);                  "obj" => "dossier",
3908              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);                  "idx" => $this->valF['dossier'],
3909              if (database::isError($res1)) {              ));
3910                  die($res->getMessage());              $valF['instruction'] = $id;
3911                $valF['crud'] = 'create';
3912                $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3913                if ($update_by_instruction === false) {
3914                    $this->cleanMessage();
3915                    $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3916                    return false;
3917              }              }
3918              // Affichage d'informations à l'utilisateur              // Affichage d'informations à l'utilisateur
3919              $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");              $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3920          }          }
3921    
3922          /**          /**
# Line 1737  class instruction extends instruction_ge Line 3946  class instruction extends instruction_ge
3946              $ret = $this->f->send_message_to_referentiel_erp(105, $infos);              $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3947              if ($ret !== true) {              if ($ret !== true) {
3948                  $this->cleanMessage();                  $this->cleanMessage();
3949                  $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));                  $this->addToMessage(__("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3950                    return false;
3951                }
3952                $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3953            }
3954    
3955            // Si le mode en rédaction intégrale est activé
3956            if (isset($this->valF['flag_edition_integrale']) === true
3957                && $this->valF['flag_edition_integrale'] === true) {
3958                $redactionIntegraleValF = array();
3959    
3960                // Récupère la collectivite du dossier d'instruction
3961                $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3962                $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3963                // Récupère le corps de la lettre type
3964                $params = array(
3965                    "specific" => array(
3966                        "corps" => array(
3967                            "mode" => "get",
3968                        )
3969                    ),
3970                );
3971                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3972                $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3973                // Récupère le titre de la lettre type
3974                $params = array(
3975                    "specific" => array(
3976                        "titre" => array(
3977                            "mode" => "get",
3978                        )
3979                    ),
3980                );
3981                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3982                $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3983    
3984                // mise à jour en base de données
3985                $res = $this->f->db->autoExecute(
3986                    DB_PREFIXE.$this->table,
3987                    $redactionIntegraleValF,
3988                    DB_AUTOQUERY_UPDATE,
3989                    $this->clePrimaire."=".$id
3990                );
3991                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3992                if ($this->f->isDatabaseError($res, true) === true) {
3993                  return false;                  return false;
3994              }              }
             $this->addToMessage(_("Notification (105) du référentiel ERP OK."));  
3995          }          }
3996    
3997          /**          /**
3998             * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3999             */
4000            // Si la finalisation automatique de l'événement est activée
4001            // ET si l'instruction n'a pas déjà été finalisée
4002            // ET s'il existe une lettre type associée
4003            if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
4004                && $inst_evenement->getVal('om_final_instruction') !== 't'
4005                && $inst_evenement->getVal('lettretype') !== ''
4006                && $inst_evenement->getVal('lettretype') !== null) {
4007    
4008                 // On instancie l'instruction
4009                $inst_instruction = $this->f->get_inst__om_dbform(array(
4010                    "obj" => "instruction",
4011                    "idx" => $this->valF[$this->clePrimaire],
4012                ));
4013    
4014                // On finalise l'instruction dans le contexte de finalisation : action 100
4015                $inst_instruction->setParameter('maj', 100);
4016                $finalize = $inst_instruction->finalize($inst_instruction->valF);
4017    
4018                // Une erreur de finalisation renvoie 'false' : ajout dans les logs
4019                // et dans le message d'erreur
4020                if ($finalize === false) {
4021                    $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
4022                    $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
4023                    return false;
4024                }
4025            }
4026    
4027            /**
4028             * Finalisation automatique des instructions tacites ou retours.
4029             */
4030            // Si l'option de finalisation automatique des instructions tacites ou
4031            // retours est activée et l'événement d'instruction a une lettre type
4032            // associée
4033            $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4034            if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
4035                && $inst_evenement->getVal('lettretype') !== ''
4036                && $inst_evenement->getVal('lettretype') !== null) {
4037    
4038                // Rècupère l'identifiant de l'événement
4039                $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
4040    
4041                // Si l'événement d'instruction est identifié comme un événement
4042                // retour
4043                // OU l'événement d'instruction est l'événement suivant tacite du
4044                // dossier d'instruction (incomplétude prise en compte)
4045                // ET l'événement d'instruction n'a pas déjà été finalisé
4046                if (($inst_evenement->getVal("retour") === 't'
4047                    || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
4048                        || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
4049                        && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
4050    
4051                    // Finalise l'instruction
4052                    $inst_instruction = $this->f->get_inst__om_dbform(array(
4053                        "obj" => "instruction",
4054                        "idx" => $this->valF[$this->clePrimaire],
4055                    ));
4056                    $inst_instruction->setParameter('maj', 100);
4057                    $finalize = $inst_instruction->finalize($inst_instruction->valF);
4058                    if ($finalize === false) {
4059                        //
4060                        return false;
4061                    }
4062                }
4063            }
4064    
4065            /**
4066             * Mise à jour de la version de clôture *version_clos* du dossier si et
4067             * seulement si l'instruction met à jour l'état du dossier.
4068             */
4069            if (isset($valF['etat']) === true
4070                && $valF['etat'] !== null
4071                && $valF['etat'] !== '') {
4072                // Instanciation de l'état appliqué sur le dossier par l'instruction
4073                $inst_etat = $this->f->get_inst__om_dbform(array(
4074                    "obj" => "etat",
4075                    "idx" => $valF['etat'],
4076                ));
4077                //
4078                $update_version_clos = null;
4079                // En cas d'instruction qui clôture le dossier
4080                if ($inst_etat->getVal('statut') === 'cloture') {
4081                    $update_version_clos = $inst_di->update_version_clos('up');
4082                }
4083                // En cas d'instruction qui rouvre le dossier
4084                if ($inst_current_etat->getVal('statut') === 'cloture'
4085                    && $inst_etat->getVal('statut') !== 'cloture') {
4086                    //
4087                    $update_version_clos = $inst_di->update_version_clos('down');
4088                    //
4089                    $params = array(
4090                        'di_reopened' => true,
4091                    );
4092                }
4093                //
4094                if ($update_version_clos === false) {
4095                    $this->f->addToLog(sprintf(
4096                        "%s() : ERREUR - %s %s",
4097                        __METHOD__,
4098                        sprintf(
4099                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4100                            $inst_di->getVal($inst_di->clePrimaire)
4101                        ),
4102                        sprintf(
4103                            __("L'instruction tente d'appliquer l'état %s."),
4104                            $inst_etat->getVal($inst_etat->clePrimaire)
4105                        )
4106                    ));
4107                    $this->addToMessage(sprintf(
4108                        "%s %s",
4109                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4110                        __("Veuillez contacter votre administrateur.")
4111                    ));
4112                    return false;
4113                }
4114            }
4115    
4116            /**
4117             * Notification automatique
4118             */
4119            // Notification automatique à l'ajout de l'instruction si la notification
4120            // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
4121            if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
4122                ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
4123    
4124                // Message à afficher dans les logs pour indiquer quelle notification a échouée
4125                $msgLog = sprintf(
4126                    '%s %s : %d',
4127                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
4128                    __('Instruction notifiée'),
4129                    $id
4130                );
4131    
4132                // Récupération de la liste des demandeurs à notifier et de la catégorie
4133                $categorie = $this->f->get_param_option_notification($collectivite_di);
4134                $isPortal = $categorie === PORTAL;
4135                $demandeursANotifie = $this->get_demandeurs_notifiable(
4136                    $this->valF['dossier'],
4137                    $isPortal
4138                );
4139    
4140                //
4141                $msg_notif = '';
4142    
4143                // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4144                $demandeurPrincipalNotifie = false;
4145                foreach ($demandeursANotifie as $demandeur) {
4146                    // Identifie si le demandeur principal a été notifié ou pas
4147                    // et récupère ses informations
4148                    if ($demandeur['petitionnaire_principal'] == 't') {
4149                        $demandeurPrincipalNotifie = true;
4150                        // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4151                        // son paramétrage, on effectue pas le traitement et on passe à l'itération
4152                        // suivante. On le considère également comme non notifié pour gérer l'envoie
4153                        // des messages d'erreurs
4154                        // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4155                        // d'impact sur la notification
4156                        $erreursParam = $this->get_info_notification_fail($val['dossier']);
4157                        if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
4158                            $demandeurPrincipalNotifie = false;
4159                            continue;
4160                        }
4161                    }
4162                    // Récupération du contenu de l'option option_bloquer_notif_auto_dln
4163                    $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
4164                    // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
4165                    // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
4166                    if (! empty($option_bloquer_notif_auto_dln_types_evenements)
4167                        && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
4168                        && $this->is_date_limite_notification_premier_mois_depasee() === true) {
4169                        // Ajout de la notif et récupération de son id
4170                        $idNotif = $this->ajouter_notification(
4171                            $this->valF[$this->clePrimaire],
4172                            $this->f->get_connected_user_login_name(),
4173                            $demandeur,
4174                            $collectivite_di,
4175                            array(),
4176                            true,
4177                            'Echec',
4178                            __('La date limite de notification au demandeur est dépassée')
4179                        );
4180                        if ($idNotif === false) {
4181                            // Termine le traitement
4182                            $this->addToLog(
4183                                sprintf('%s() : %s', __METHOD__, $msgLog),
4184                                DEBUG_MODE
4185                            );
4186                            return $this->end_treatment(__METHOD__, false);
4187                        }
4188                        $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4189                    }
4190                    else {
4191                        // Ajout de la notif et récupération de son id
4192                        $idNotif = $this->ajouter_notification(
4193                            $this->valF[$this->clePrimaire],
4194                            $this->f->get_connected_user_login_name(),
4195                            $demandeur,
4196                            $collectivite_di,
4197                            array(),
4198                            true
4199                        );
4200                        if ($idNotif === false) {
4201                            $this->addToLog(
4202                                sprintf('%s() : %s', __METHOD__, $msgLog),
4203                                DEBUG_MODE
4204                            );
4205                            return false;
4206                        }
4207                        // Création de la tache en lui donnant l'id de la notification
4208                        $notification_by_task = $this->notification_by_task(
4209                            $idNotif,
4210                            $this->valF['dossier'],
4211                            $categorie
4212                        );
4213                        if ($notification_by_task === false) {
4214                            $this->addToLog(
4215                                sprintf('%s() : %s', __METHOD__, $msgLog),
4216                                DEBUG_MODE
4217                            );
4218                            $this->addToMessage(
4219                                __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4220                            );
4221                            return false;
4222                        }
4223                        $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4224                    }
4225                }
4226                // Pour la notification par mail ou la notification via portal si le dossier a
4227                // été déposés via portal, si le demandeur principal n'est pas notifiable,
4228                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4229                // laquelle le demandeur principal n'a pas pu être notifié
4230                $depotPortal = $this->dossier_depose_sur_portail();
4231                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4232                    // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4233                    // ' ' permet de mettre un espace entre les 2 msg de log.
4234                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4235                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4236                    $erreursParam = $this->get_info_notification_fail($val['dossier']);
4237                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4238                    // Ajout de la notif et récupération de son id
4239                    $idNotif = $this->ajouter_notification(
4240                        $this->valF[$this->clePrimaire],
4241                        $this->f->get_connected_user_login_name(),
4242                        $demandeurPrincipal,
4243                        $collectivite_di,
4244                        array(),
4245                        true,
4246                        'Echec',
4247                        implode(' ', $erreursParam)
4248                    );
4249                    if ($idNotif === false) {
4250                        $this->addToLog(
4251                            sprintf('%s() : %s', __METHOD__, $msgLog),
4252                            DEBUG_MODE
4253                        );
4254                        $this->addToMessage(
4255                            __('Erreur : la création de la notification a échouée.').
4256                            __("Veuillez contacter votre administrateur.")
4257                        );
4258                        return false;
4259                    }
4260                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4261                    // de l'échec de la notification
4262                    $dossier_message = $this->get_inst_dossier_message(0);
4263                    $dossier_message_val = array(
4264                        'dossier' => $val['dossier'],
4265                        'type' => __('erreur expedition'),
4266                        'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4267                        'login' => $_SESSION['login'],
4268                        'date_emission' => date('Y-m-d H:i:s'),
4269                        'contenu' => __('Échec lors de la notification de l\'instruction ').
4270                            $inst_evenement->getVal('libelle').
4271                            '.<br>'.
4272                            implode("\n", $erreursParam).
4273                            '<br>'.
4274                            __('Veuillez corriger ces informations avant de renvoyer la notification.')
4275                    );
4276                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
4277                    // Si une erreur se produit pendant l'ajout
4278                    if ($add !== true) {
4279                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4280                        return false;
4281                    }
4282                }
4283                $this->addToMessage($msg_notif);
4284            }
4285    
4286            // Notification automatique en cas de dépôt de dossier dématérialisé
4287            // Vérifie si l'option de notification est active et si il s'agit bien d'une
4288            // instruction de récépissé
4289            if (
4290                $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4291                && $this->is_instruction_recepisse()
4292            ) {
4293                // Message à afficher dans les logs pour indiquer quelle notification a échouée
4294                $msgLog = sprintf(
4295                    __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4296                    $val['dossier']
4297                );
4298                // Récupère l'instance de la demande
4299                $demande = $inst_di->get_inst_demande();
4300                // Vérifie que le dossier a été déposé via platau ou portal
4301                if (
4302                    ($demande->getVal('source_depot') == PLATAU ||
4303                    $demande->getVal('source_depot') == PORTAL)
4304                ) {
4305                    // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4306                    // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4307                    $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4308                    if (empty($listeEmails)) {
4309                        $this->addToLog(
4310                            sprintf(
4311                                '%s(): %s %s',
4312                                __METHOD__,
4313                                $msgLog,
4314                                __('Aucun courriel paramétré.')
4315                            ),
4316                            DEBUG_MODE
4317                        );
4318                    } else {
4319                        foreach ($listeEmails as $email) {
4320                            // Ajout de la notif et récupération de son id
4321                            $destinataire = array(
4322                                'destinataire' => $email,
4323                                'courriel' => $email
4324                            );
4325                            $idNotif = $this->ajouter_notification(
4326                                $this->valF[$this->clePrimaire],
4327                                $this->f->get_connected_user_login_name(),
4328                                $destinataire,
4329                                $collectivite_di,
4330                                array(),
4331                                true
4332                            );
4333                            if ($idNotif === false) {
4334                                $this->addToLog(
4335                                    sprintf('%s(): %s', __METHOD__, $msgLog),
4336                                    DEBUG_MODE
4337                                );
4338                                return false;
4339                            }
4340                            // Création de la tache en lui donnant l'id de la notification
4341                            $notification_by_task = $this->notification_by_task(
4342                                $idNotif,
4343                                $this->valF['dossier'],
4344                                'mail',
4345                                'notification_depot_demat'
4346                            );
4347                            if ($notification_by_task === false) {
4348                                $this->addToMessage(
4349                                    __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4350                                );
4351                                $this->addToLog(
4352                                    sprintf('%s(): %s', __METHOD__, $msgLog),
4353                                    DEBUG_MODE
4354                                );
4355                                return false;
4356                            }
4357                        }
4358                    }
4359                }
4360            }
4361    
4362            /**
4363             * Mise à jour de la date de dernière modification du dossier
4364             */
4365            $inst_di->update_last_modification_date();
4366    
4367            /**
4368           * Mise à jour des données du DA.           * Mise à jour des données du DA.
4369           */           */
         //  
4370          $inst_da = $inst_di->get_inst_dossier_autorisation();          $inst_da = $inst_di->get_inst_dossier_autorisation();
4371          //          $params['di_id'] = $this->valF['dossier'];
4372          if ($inst_da->majDossierAutorisation() === false) {          if ($inst_da->majDossierAutorisation($params) === false) {
4373              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4374              $this->correct = false;              $this->correct = false;
4375              return false;              return false;
4376          }          }
# Line 1758  class instruction extends instruction_ge Line 4378  class instruction extends instruction_ge
4378          /**          /**
4379           * Historisation de la vie du DI.           * Historisation de la vie du DI.
4380           */           */
4381          //  
4382          return $this->add_log_to_dossier($id, array_merge($val, $this->valF));          $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4383    
4384            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4385            if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data)) {
4386                return false;
4387            }
4388            return $res;
4389      }      }
4390    
4391      function triggermodifierapres($id,&$db,$val,$DEBUG) {      /**
4392          /**       * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4393           * L'objectif ici est d'effectuer les recalculs de date dans le dossier       * sont remplies.
4394           * si la date de l'evenement est modifiee       * Les conditions vérifiées sont les suivantes :
4395           */       *  - L'option de notification *option_notification* doit être définie
4396          // Initialisation       *  - Le petitionnaire principal doit accepter les notifications
4397          $valF = "";       *  - Le pétitionnaire principal doit avoir une adresse mail renseignée
4398          $valF_dt = "";       *  - Le pétitionnaire principal doit avoir une adresse mail correcte
4399          // Initialisation du type d'événement       * Pour chaque vérification effectué un message d'erreur est ajouté si la
4400          $type_evmt = "";       * condition n'est pas remplie.
4401          // Récupération de l'action correspondante à l'événement       * Renvoie le message d'erreur en sortie.
4402          $sql = "SELECT action       *
4403          FROM ".DB_PREFIXE."evenement       * @param string identifiant du dossier sur lequel les notifications ont échouée
4404          WHERE evenement=".$this->valF['evenement'];       * @return string
4405          $action = $db->getOne($sql);       */
4406          $this->addToLog("triggermodifierapres(): db->getone(\"".$sql."\");", VERBOSE_MODE);      public function get_info_notification_fail($dossier = null) {
4407          if (database::isError($action)) {          // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4408              die($action->getMessage());          // utilise celui associé à l'instruction
4409            if ($dossier == null) {
4410                $dossier = $this->getVal('dossier');
4411            }
4412            // Tableau contenant la liste des messages d'erreur
4413            $errorMessage = array();
4414            // Récupère l'option de notification
4415            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4416            $option_notification = $this->f->get_param_option_notification($collectivite_di);
4417            if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4418                $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4419            }
4420            // Récupère les informations du demandeurs principal
4421            $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4422            // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4423            if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4424                $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4425            }
4426            // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4427            if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4428                // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4429                // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4430                if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4431                    $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4432                        $infoPetitionnaire['courriel'].
4433                        '.';
4434                }
4435            } else {
4436                // Si le courriel du pétitionnaire principal
4437                $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4438          }          }
4439    
4440          // Récupération des paramètres de l'action          return $errorMessage;
4441          $sql = "SELECT * FROM ".DB_PREFIXE."action      }
4442          WHERE action='".$action."'";  
4443          $res = $db->query($sql);      /**
4444          $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);       * Méthode servant à vérifier si un dossier a été déposé sur
4445          if (database::isError($res)) {       * le portail citoyen ou pas.
4446              die($res->getMessage());       * La verification se fait via une requête sql dans laquelle
4447         * on va chercher un dossier ayant pour id l'identifiant de
4448         * dossier associé à l'instruction et pour lequel la demande
4449         * associée la plus ancienne est une demande de création de
4450         * dossier via portail
4451         *
4452         * @param string identifiant du dossier. Si non renseigné c'est le dossier
4453         * associé à l'instruction qui est utilisé
4454         * @return boolean|void true : dossier déposé via portail, false : dossier
4455         * non déposé via portail et null : erreur de base de données.
4456         */
4457        protected function dossier_depose_sur_portail($dossier = null) {
4458            if (empty($dossier)) {
4459                $dossier = $this->getVal('dossier');
4460            }
4461            $qres = $this->f->get_one_result_from_db_query(
4462                sprintf(
4463                    'SELECT
4464                        dossier
4465                    FROM
4466                        %1$sdossier
4467                        -- Récuperation de la première demande associée au dossier
4468                        LEFT JOIN (
4469                            SELECT
4470                                demande,
4471                                dossier_instruction,
4472                                source_depot
4473                            FROM
4474                                %1$sdemande
4475                            WHERE
4476                               dossier_instruction = \'%2$s\'
4477                            ORDER BY
4478                               demande ASC
4479                            LIMIT 1
4480                        ) AS demande
4481                            ON dossier.dossier = demande.dossier_instruction
4482                    WHERE
4483                        dossier.dossier = \'%2$s\'
4484                        AND demande.source_depot = \'portal\'',
4485                    DB_PREFIXE,
4486                    $this->f->db->escapeSimple($dossier)
4487                ),
4488                array(
4489                    "origin" => __METHOD__,
4490                    "force_return" => true,
4491                )
4492            );
4493            if ($qres["code"] !== "OK") {
4494                $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4495                return;
4496          }          }
4497          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){          // Si on a un résultat c'est que le dossier a été déposé via le portail
4498              // application des regles sur le courrier + delai          return ! empty($qres["result"]);
4499              if(preg_match("/date_evenement/",$row['regle_date_limite'])){      }
4500                  $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');  
4501              }      public function is_service_notifiable() {
4502              if(preg_match("/date_evenement/",$row['regle_date_complet'])){          $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4503                  $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');  
4504              }          // Si l'instruction a une édition non finalisé quel que soit
4505              if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){          // le type de notification, il n'est pas notifiable
4506                  $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');          if ($this->has_an_edition() === true) {
4507              }              if ($this->is_unfinalizable_without_bypass() === false) {
4508              if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){                  return false;
                 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_decision'])){  
                 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_rejet'])){  
                 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_validite'])){  
                 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_chantier'])){  
                 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_achevement'])){  
                 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_conformite'])){  
                 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');  
             }  
             if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){  
                 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');  
4509              }              }
4510              if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){          }
4511                  $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');          // Vérifie si la notification des tiers est active pour l'évènement
4512            return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4513        }
4514    
4515        public function is_tiers_notifiable() {
4516            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4517    
4518            // Si l'instruction a une édition non finalisé quel que soit
4519            // le type de notification, il n'est pas notifiable
4520            if ($this->has_an_edition() === true) {
4521                if ($this->is_unfinalizable_without_bypass() === false) {
4522                    return false;
4523              }              }
4524              if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){          }
4525                  $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');          // Vérifie si la notification des tiers est active pour l'évènement
4526            return ! empty($evenement->getVal('notification_tiers'));
4527        }
4528    
4529        /**
4530         * Méthode permettant de savoir si une instruction peut
4531         * être notifiée manuellement selon les différents types
4532         * de notification.
4533         *
4534         * Si l'instruction a une édition non finalisée alors elle n'est pas
4535         * manuellement notifiable.
4536         * Si l'instruction est associé à un événement de notification pour
4537         * lequel un retour signature est recquis, elle n'est notifiable que
4538         * si la date de retour de signature est remplie.
4539         * Par défaut si le type de notification n'est pas connu alors l'instruction
4540         * n'est pas notifiable.
4541         * Pour tous les autres cas l'instruction est manuellement notifiable.
4542         *
4543         * @return boolean true : notifiable | false : non notifiable
4544         */
4545        public function is_notifiable_by_task_manual() {
4546            $ev = $this->get_inst_evenement($this->getVal('evenement'));
4547    
4548            // Si l'instruction a une édition non finalisé quel que soit
4549            // le type de notification, il n'est pas notifiable
4550            if ($this->has_an_edition() === true) {
4551                if ($this->is_unfinalizable_without_bypass() === false) {
4552                    return false;
4553              }              }
4554              if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){          }
4555                  $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');  
4556            // Gestion des différents cas selon la valeur du champs notification
4557            if ($ev->getVal('notification') == 'notification_manuelle' ||
4558                $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4559                $ev->getVal('notification') == 'notification_automatique'
4560            ) {
4561                return true;
4562            } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4563                $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4564                $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4565                $this->getVal('date_retour_signature') != null &&
4566                $this->getVal('date_retour_signature') != ''
4567            ) {
4568                return true ;
4569            }
4570            return false;
4571        }
4572    
4573        /**
4574         * Crée une instance de notification et une tache notification_instruction de catégorie portal
4575         * pour le demandeur principal.
4576         *
4577         * @return boolean true si le traitement à réussi
4578         */
4579        protected function notifier_demandeur_principal_via_portal() {
4580            $this->begin_treatment(__METHOD__);
4581            $message = '';
4582            // Récupération des informations concernant le demandeur
4583            $dossier = $this->getVal('dossier');
4584            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4585            $demandeur = $this->get_demandeurs_notifiable(
4586                $dossier,
4587                true
4588            );
4589            if ($demandeur !== array()) {
4590                $destinataire = array_values($demandeur);
4591                // Ajout de la notif et récupération de son id
4592                $idNotification = $this->ajouter_notification(
4593                    $this->getVal($this->clePrimaire),
4594                    $this->f->get_connected_user_login_name(),
4595                    $destinataire[0],
4596                    $collectivite_di,
4597                    array(),
4598                    true
4599                );
4600                if ($idNotification === false) {
4601                    return $this->end_treatment(__METHOD__, false);
4602              }              }
4603              if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){              // Création de la tâche en lui donnant l'id de la notification
4604                  $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');              $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4605                if ($notification_by_task === false) {
4606                    $this->addToMessage(
4607                        __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4608                    );
4609                    return $this->end_treatment(__METHOD__, false);
4610              }              }
4611              if(preg_match("/date_evenement/",$row['regle_date_ait'])){              $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.")));
4612                  $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');              return $this->end_treatment(__METHOD__, true);
4613            }
4614            $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4615            return $this->end_treatment(__METHOD__, false);
4616        }
4617    
4618        public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4619            // Si le type n'est pas correctement spécifié, alors il est calculé
4620            if ($type !== 'notification_recepisse'
4621                && $type !== 'notification_instruction'
4622                && $type !== 'notification_decision'
4623                && $type !== 'notification_service_consulte'
4624                && $type !== 'notification_tiers_consulte'
4625                && $type !== 'notification_depot_demat'
4626                && $type !== 'notification_commune'
4627                && $type !== 'notification_signataire') {
4628                //
4629                $type = 'notification_instruction';
4630                // Vérifie si l'instruction est un récépissé
4631                if ($this->is_instruction_recepisse()) {
4632                    $type = 'notification_recepisse';
4633    
4634                }
4635                // Vérifie si l'instruction est une décision
4636                if ($type !== 'notification_recepisse') {
4637                    $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4638                    if ($avis_decision !== null && $avis_decision !== '') {
4639                        $type = 'notification_decision';
4640                    }
4641              }              }
4642              if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){          }
4643                  $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');          // Préparation des valeurs de la tâche
4644            $task_val = array(
4645                'type' => $type,
4646                'object_id' => $object_id,
4647                'dossier' => $dossier,
4648                'category' => $category,
4649            );
4650            // Préparation de la tache de notification
4651            $inst_task = $this->f->get_inst__om_dbform(array(
4652                "obj" => "task",
4653                "idx" => 0,
4654            ));
4655    
4656            $add_task = $inst_task->add_task(array('val' => $task_val));
4657            if ($add_task === false) {
4658                $this->addToLog(
4659                    sprintf(
4660                        '%s(): %s %s : %s',
4661                        __METHOD__,
4662                        __('Echec de l\'ajout de la tâche de notification.'),
4663                        __('Paramétrage de la tâche'),
4664                        var_export($task_val, true)
4665                    ),
4666                    DEBUG_MODE
4667                );
4668                return false;
4669            }
4670    
4671            return true;
4672        }
4673    
4674        /**
4675         * Cette méthode permet de savoir si l'instruction est une instruction
4676         * de recepisse (instruction lié à l'ajout du dossier).
4677         *
4678         * Pour cela, on récupère la liste des actions qui ont menées à la création
4679         * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4680         * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4681         * l'instruction et donc qu'il s'agit d'un recepisse.
4682         *
4683         * @return boolean
4684         */
4685        protected function is_instruction_recepisse() {
4686            // Récupère la liste des actions qui ont mené à la création de
4687            // l'instruction
4688            $trace = debug_backtrace();
4689            // Parcours la liste des actions et si une de ces actions est lié
4690            // à la classe demande on cosidère que l'instruction est un recepisse
4691            foreach ($trace as $key => $value) {
4692                if (isset($trace[$key]['class']) === true
4693                    && empty($trace[$key]['class']) === false) {
4694                    if (strtolower($trace[$key]['class']) === 'demande') {
4695                        return true;
4696                    }
4697              }              }
4698              if ($row['regle_donnees_techniques1'] !== '') {          }
4699                  $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');          return false;
4700        }
4701    
4702        /**
4703         * A partir des informations passée en argument ajoute un nouvel élément
4704         * dans la table instruction_notification.
4705         * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4706         * paramètre si le paramétrage attendus est ok.
4707         * Ajoute également un nouvel élement dans instruction_notification_document
4708         * si l'instruction possède une lettretype.
4709         * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4710         * élement dans la table instruction_notification_document qui correspondra
4711         * à l'annexe de la notification.
4712         *
4713         * @param integer identifiant de l'instruction notifiée
4714         * @param string information concernant l'emetteur
4715         * @param array tableau contenant 2 entrées
4716         *  - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4717         *  - courriel : adresse mail de la personne à notifier
4718         * @param integer identifiant de la collectivité permettant de récupèrer les
4719         * paramètres à valider
4720         * @param boolean indique si la notification est automatique ou manuelle
4721         * @param integer identifiant d'une instruction dont l'édition sera annexé
4722         * à la notification
4723         *
4724         * @return integer|boolean identifiant de la notification créée si le traitement
4725         * a réussie, false sinon.
4726         */
4727        protected function ajouter_notification(
4728            $idInstruction,
4729            $emetteur,
4730            $destinataire,
4731            $collectiviteId,
4732            $annexes = array(),
4733            $demandeAuto = false,
4734            $statut = 'en cours d\'envoi',
4735            $commentaire = 'Notification en cours de traitement'
4736        ) {
4737            // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4738            // de créer la notification
4739            if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4740                $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4741                $this->addToMessage($msgErreur);
4742                $this->addToLog(
4743                    sprintf('%s() : %s', __METHOD__, $msgErreur),
4744                    DEBUG_MODE
4745                );
4746                return false;
4747            }
4748            // Préparation de la notification
4749            $inst_notif = $this->f->get_inst__om_dbform(array(
4750                "obj" => "instruction_notification",
4751                "idx" => "]",
4752            ));
4753            $notif_val = array(
4754                'instruction_notification' => null,
4755                'instruction' => $idInstruction,
4756                'automatique' => $demandeAuto,
4757                'emetteur' => $emetteur,
4758                'date_envoi' => null,
4759                'destinataire' => $destinataire['destinataire'],
4760                'courriel' => $destinataire['courriel'],
4761                'date_premier_acces' => null,
4762                'statut' => $statut,
4763                'commentaire' => $commentaire
4764            );
4765    
4766            // Création de la notification
4767            $add_notif = $inst_notif->ajouter($notif_val);
4768            if ($add_notif === false) {
4769                $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4770                $this->addToLog(
4771                    sprintf(
4772                        '%s() : %s %s : %s',
4773                        __METHOD__,
4774                        __("Echec de l'ajout de la notification en base de données."),
4775                        __('Paramétrage de la notification'),
4776                        var_export($notif_val, true)
4777                    ),
4778                    DEBUG_MODE
4779                );
4780                return false;
4781            }
4782    
4783            // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4784            if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4785                $add_notif_doc = $this->ajouter_notification_document(
4786                    $inst_notif->getVal($inst_notif->clePrimaire),
4787                    $this->getVal($this->clePrimaire),
4788                    'instruction'
4789                );
4790                if ($add_notif_doc === false) {
4791                    $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4792                    return false;
4793              }              }
4794              if ($row['regle_donnees_techniques2'] !== '') {          }
4795                  $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');          // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4796            if (! empty($annexes) && is_array($annexes)) {
4797                $add_notif_annexe = $this->ajouter_notification_document_multiple(
4798                    $inst_notif->getVal($inst_notif->clePrimaire),
4799                    $annexes
4800                );
4801                if ($add_notif_annexe === false) {
4802                    $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4803                    return false;
4804              }              }
4805              if ($row['regle_donnees_techniques3'] !== '') {          }
4806                  $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');  
4807            // Renvoie l'id de la nouvelle instance de instruction_notification
4808            return $inst_notif->getVal($inst_notif->clePrimaire);
4809        }
4810    
4811        /**
4812         * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4813         * instance dans la table instruction_notification_document lié a la
4814         * notification dont l'id est passé en paramètre.
4815         *
4816         * @param array tableau contenant les informations nécessaires pour créer les annexes
4817         *
4818         * @return integer|boolean identifiant de la notification créée si le traitement
4819         * a réussie, false sinon.
4820         */
4821        protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4822            foreach ($listeDocument as $paramDoc) {
4823                if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4824                    $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4825                    return false;
4826              }              }
4827              if ($row['regle_donnees_techniques4'] !== '') {          }
4828                  $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');          return true;
4829        }
4830    
4831        /**
4832         * Ajoute un élément dans la table instruction_notification_document en utilisant
4833         * les éléments fourni en paramètre
4834         *
4835         * @param integer $idNotification : id de la notification à laquelle on associe le document
4836         * @param integer $idDocument : id de l'objet auquel est rattaché le document
4837         * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4838         * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4839         *
4840         * @return boolean indique si le traitement a réussi
4841         */
4842        protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4843            $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4844                "obj" => "instruction_notification_document",
4845                "idx" => "]",
4846            ));
4847            // l'attribut instruction doit obligatoirement être renseigné
4848            // pour éviter toutes confusion avec d'autres instruction l'id
4849            // 0 est donné au document n'appartenant pas aux instructions
4850            $notif_doc_val = array(
4851                'instruction_notification_document' => null,
4852                'instruction_notification' => $idNotification,
4853                'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4854                'document_type' => $tableDocument,
4855                'document_id' => $idDocument,
4856                'cle' => $this->getCleAccesDocument(),
4857                'annexe' => $isAnnexe
4858            );
4859    
4860            $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4861            if ($add_notif_doc === false) {
4862                $this->addToLog(
4863                    sprintf(
4864                        '%s() : %s %s : %s',
4865                        __METHOD__,
4866                        __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4867                        __('Paramétrage du document'),
4868                        var_export($notif_doc_val, true)
4869                    ),
4870                    DEBUG_MODE
4871                );
4872                return false;
4873            }
4874            return true;
4875        }
4876    
4877        /**
4878         * Récupère via une requête la liste des identifiants des éléments de la table
4879         * parametrage_annexe liés à une instruction.
4880         * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4881         * et lui appliquer le traitement de suppression.
4882         *
4883         * @param integer identifiant d'une instruction
4884         * @return boolean état du traitement. True : OK, False : Echec
4885         */
4886        function supprimer_parametrage_annexe($id_instruction) {
4887            // Récupère la liste des parametrage_annexe associés à l'instruction
4888            $qres = $this->f->get_all_results_from_db_query(sprintf(
4889                'SELECT parametrage_annexe
4890                FROM %sparametrage_annexe
4891                WHERE parametrage_annexe.instruction = %d',
4892                DB_PREFIXE,
4893                intval($id_instruction)),
4894                array('origin' => __METHOD__));
4895            // Instancie puis supprime chacun des éléments de la liste
4896            foreach ($qres['result'] as $res) {
4897                $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4898                    'obj' => 'parametrage_annexe',
4899                    'idx' => $res['parametrage_annexe']
4900                ));
4901                foreach ($parametrage_annexe->champs as $champ) {
4902                    $val[$champ] = $parametrage_annexe->getVal($champ);
4903              }              }
4904              if ($row['regle_donnees_techniques5'] !== '') {              $suppression = $parametrage_annexe->supprimer($val);
4905                  $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');              // En cas d'échec arrête le traitement et renvoie false
4906                if ($suppression === false) {
4907                    return false;
4908              }              }
4909          }          }
4910          // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement          return true;
4911          if ($valF_dt != "") {      }
4912              $dt_id = $this->getDonneesTechniques();  
4913              // On met à jour le dossier      /**
4914              $cle = " donnees_techniques='".$dt_id."'";       * Vérifie si le paramétrage de la notification des demandeurs est correct.
4915              $res1 = $db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);       *
4916              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);       * @param integer identifiant de la collectivité
4917              if (database::isError($res1)) {       * @return boolean
4918                  die($res->getMessage());       */
4919              }      protected function is_parametrage_notification_correct($collectiviteId) {
4920              // Affichage d'informations à l'utilisateur          $categorie = $this->f->get_param_option_notification($collectiviteId);
4921              $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");          $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4922            if ($categorie === 'mail' && $urlAccesNotif === null) {
4923                return false;
4924          }          }
4925          // Si des valeurs ont été calculées alors on met à jour l'enregistrement          return true;
4926          if ($valF != "") {      }
4927              // On met à jour le dossier  
4928              $cle = " dossier='".$this->valF['dossier']."'";      /**
4929              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);       * Calcule les nouvelles métadonnées pour un fichier d'instruction.
4930              $this->addToLog("triggermodifierapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);       * Ajoute des métadonnées spécifiques si l'événement est de type "arrêté".
4931              if (database::isError($res1)) {       *
4932                  die($res->getMessage());       * @return array|false Les métadonnées ou false en cas d'erreur.
4933         */
4934        protected function calculate_metadata() {
4935            // Calculs des nouvelles métadonnées
4936            $metadata = $this->getMetadata("om_fichier_instruction");
4937    
4938            // On vérifie si l'instruction à finaliser a un événement de type arrete
4939            // TODO : A voir pour remplacer par une instanciation de l'événement.
4940            //        Voir également si l'événement ne dois pas être instancié en début de
4941            //        méthode pour pouvoir être réutilisé.
4942            $qres = $this->f->get_one_result_from_db_query(
4943                sprintf(
4944                    'SELECT
4945                        type
4946                    FROM
4947                        %1$sevenement
4948                    WHERE
4949                        evenement = \'%2$d\'',
4950                    DB_PREFIXE,
4951                    intval($this->getVal("evenement"))
4952                ),
4953                array(
4954                    "origin" => __METHOD__,
4955                    "force_return" => true,
4956                )
4957            );
4958            if ($qres["code"] !== "OK") {
4959                return false;
4960            }
4961            // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4962            if ($qres['result'] == 'arrete'){
4963                $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4964            }
4965    
4966            //
4967            return $metadata;
4968        }
4969    
4970        /**
4971         * TRIGGER - triggermodifierapres.
4972         *
4973         * @return boolean
4974         */
4975        function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4976            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4977    
4978            $data = array('val' => &$val, 'id' => $id);
4979            if (! $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data)) {
4980                return false;
4981            }
4982    
4983            $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4984            $message = '';
4985            $res = true;
4986            // Définit si le dossier d'instruction doit être mis à jour
4987            $update_dossier = true;
4988            // Les actions de mise à jour des dates ne doivent pas appliquer
4989            // l'action de l'événement et donc ne pas mettre à jour le dossier
4990            if ($this->getParameter("maj") == 125
4991                || $this->getParameter("maj") == 170
4992                || $this->getParameter("maj") == 175) {
4993                $update_dossier = false;
4994            }
4995    
4996            // Traitement en cas de mise à jour du dossier
4997            if ($update_dossier === true) {
4998                /**
4999                 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
5000                 * si la date de l'evenement est modifiee
5001                 */
5002                // Initialisation
5003                $valF = array();
5004                $valF_dt = array();
5005                // Initialisation du type d'événement
5006                $type_evmt = "";
5007                // Récupération de l'action correspondante à l'événement
5008                $evenement = $this->f->get_inst__om_dbform(array(
5009                    "obj" => "evenement",
5010                    "idx" => $this->valF['evenement']
5011                ));
5012    
5013                // Récupération des paramètres de l'action
5014                // TODO : remplacer cette requête par l'instanciation de l'action
5015                $qres = $this->f->get_all_results_from_db_query(
5016                    sprintf(
5017                        'SELECT
5018                            *
5019                        FROM
5020                            %1$saction
5021                        WHERE
5022                            action = \'%2$s\'',
5023                        DB_PREFIXE,
5024                        $this->f->db->escapeSimple($evenement->getVal('action'))
5025                    ),
5026                    array(
5027                        "origin" => __METHOD__
5028                    )
5029                );
5030                foreach ($qres['result'] as $row) {
5031                    // application des regles sur le courrier + delai
5032                    if(preg_match("/date_evenement/",$row['regle_date_limite'])){
5033                        $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
5034                    }
5035                    if(preg_match("/date_evenement/",$row['regle_date_complet'])){
5036                        $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
5037                    }
5038                    if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
5039                        $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
5040                    }
5041                    if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
5042                        $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
5043                    }
5044                    if(preg_match("/date_evenement/",$row['regle_date_decision'])){
5045                        $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
5046                    }
5047                    if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
5048                        $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
5049                    }
5050                    if(preg_match("/date_evenement/",$row['regle_date_validite'])){
5051                        $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
5052                    }
5053                    if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
5054                        $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
5055                    }
5056                    if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
5057                        $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
5058                    }
5059                    if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
5060                        $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
5061                    }
5062                    if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
5063                        $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
5064                    }
5065                    if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
5066                        $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
5067                    }
5068                    if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
5069                        $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
5070                    }
5071                    if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
5072                        $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
5073                    }
5074                    if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
5075                        $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
5076                    }
5077                    if(preg_match("/date_evenement/",$row['regle_date_ait'])){
5078                        $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
5079                    }
5080                    if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
5081                        $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
5082                    }
5083                    if ($row['regle_donnees_techniques1'] !== '') {
5084                        $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
5085                    }
5086                    if ($row['regle_donnees_techniques2'] !== '') {
5087                        $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
5088                    }
5089                    if ($row['regle_donnees_techniques3'] !== '') {
5090                        $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
5091                    }
5092                    if ($row['regle_donnees_techniques4'] !== '') {
5093                        $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
5094                    }
5095                    if ($row['regle_donnees_techniques5'] !== '') {
5096                        $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
5097                    }
5098                    if ($row['regle_dossier_instruction_type'] !== '') {
5099                        $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
5100                    }
5101                }
5102                // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
5103                if (count($valF_dt) > 0) {
5104                    $dt_id = $this->getDonneesTechniques();
5105                    // On met à jour le dossier
5106                    $cle = " donnees_techniques='".$dt_id."'";
5107                    $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
5108                    $this->addToLog(
5109                        __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
5110                        VERBOSE_MODE
5111                    );
5112                    $this->f->isDatabaseError($res1);
5113                    // Affichage d'informations à l'utilisateur
5114                    $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5115                }
5116                // Si des valeurs ont été calculées alors on met à jour l'enregistrement
5117                if (count($valF) > 0) {
5118                    $inst_dossier = $this->f->get_inst__om_dbform(array(
5119                        "obj" => "dossier",
5120                        "idx" => $this->valF['dossier'],
5121                    ));
5122                    $valF['instruction'] = $id;
5123                    $valF['crud'] = 'update';
5124                    $update_by_instruction = $inst_dossier->update_by_instruction($valF);
5125                    if ($update_by_instruction === false) {
5126                        $this->cleanMessage();
5127                        $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5128                        return false;
5129                    }
5130                    // Affichage d'informations à l'utilisateur
5131                    $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5132              }              }
             // Affichage d'informations à l'utilisateur  
             $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");  
5133          }          }
5134    
5135            // Par défaut les instructions à ajouter suite à la saisie d'une date
5136            // de retour signature ou de notification, utilisent l'action 0
5137            // Si la création d'événement d'instruction suivant est déclenchée par
5138            // une notification suite au traitement d'une tâche (démat') alors l'ajout
5139            // de la nouvelle instruction se fait avec l'action 176
5140            // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
5141            // nouvelle instruction, depuis la méthode verifier()
5142            $code_action_add = 0;
5143            if ($this->getParameter("maj") == 175) {
5144                $code_action_add = 176;
5145            }
5146          $restriction = $this->get_restriction($val['evenement']);          $restriction = $this->get_restriction($val['evenement']);
5147          $this->restriction_valid = $this->restrictionIsValid($restriction);          $this->restriction_valid = $this->restrictionIsValid($restriction);
5148    
5149          if($restriction == "" || $this->restriction_valid ){          if($restriction == "" || $this->restriction_valid ){
5150              // Récupération de tous les paramètres de l'événement sélectionné              // Récupération de tous les paramètres de l'événement sélectionné
5151              $sql = "SELECT * FROM ".DB_PREFIXE."evenement              // TODO : remplacer cette requête par l'instanciation de l'evenement
5152              WHERE evenement=".$this->valF['evenement'];              $qres = $this->f->get_all_results_from_db_query(
5153              $res = $db->query($sql);                  sprintf(
5154              $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                      'SELECT
5155              if (database::isError($res)) {                          *
5156                  die($res->getMessage());                      FROM
5157              }                          %1$sevenement
5158                        WHERE
5159                            evenement = %2$d',
5160                        DB_PREFIXE,
5161                        intval($this->valF['evenement'])
5162                    ),
5163                    array(
5164                        "origin" => __METHOD__
5165                    )
5166                );
5167              $current_id = $this->getVal($this->clePrimaire);              $current_id = $this->getVal($this->clePrimaire);
5168              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
5169                  // Si la date de retour signature est éditée on vérifie si il existe un événement automatique                  // Si la date de retour signature est éditée
5170                  if ($this->getVal('date_retour_signature') == "" AND                  if (
5171                      $this->valF['date_retour_signature'] != "" AND                      $this->getVal('date_retour_signature') == "" &&
5172                      $row['evenement_retour_signature'] != "") {                      $this->valF['date_retour_signature'] != ""
5173                      $new_instruction = new instruction("]", $db, $DEBUG);                  ){
5174                      // Création d'un tableau avec la liste des champs de l'instruction                      // On Lance le hook
5175                      foreach($new_instruction->champs as $champ) {                      $data = array('val' => $this->valF);
5176                          $valNewInstr[$champ] = "";                      $data['dossier'] = $this->valF['dossier'];
5177                      }                      $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
5178                      // Définition des valeurs de la nouvelle instruction  
5179                      $valNewInstr["evenement"] = $row['evenement_retour_signature'];                      // On vérifie si il existe un événement automatique
5180                      $valNewInstr["destinataire"] = $this->valF['destinataire'];                      if (
5181                      $valNewInstr["dossier"] = $this->valF['dossier'];                          $row['evenement_retour_signature'] != ""
5182                      $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);                      ) {
5183                      $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);                          $new_instruction = $this->f->get_inst__om_dbform(array(
5184                      $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);                              "obj" => "instruction",
5185                      $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);                              "idx" => "]",
5186                      $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                          ));
5187                      $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);                          // Création d'un tableau avec la liste des champs de l'instruction
5188                      $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);                          foreach($new_instruction->champs as $champ) {
5189                      $new_instruction->setParameter("maj", 0);                              $valNewInstr[$champ] = "";
5190                      $new_instruction->class_actions[0]["identifier"] =                          }
5191                          "retour signature de l'instruction $current_id";                          // Définition des valeurs de la nouvelle instruction
5192                      $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                          $valNewInstr["evenement"] = $row['evenement_retour_signature'];
5193                                                $valNewInstr["destinataire"] = $this->valF['destinataire'];
5194                      //Si une erreur s'est produite et qu'il s'agit d'un problème                          $valNewInstr["dossier"] = $this->valF['dossier'];
5195                      //de restriction                          $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
5196                      if ($retour == false && !$new_instruction->restriction_valid){                          $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5197                          $error_message = $this->get_restriction_error_message($restriction);                          $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5198                          $this->f->displayMessage("error", $error_message);                          $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5199                          $this->addToLog("triggermodifierapres() : evenement retour ".                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5200                              "instruction ".$this->valF[$this->clePrimaire]." : ".                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5201                              $new_instruction->msg);                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5202                      }                          $new_instruction->setParameter("maj", $code_action_add);
5203                      //Si une erreur s'est produite après le test de la restriction                          $new_instruction->class_actions[$code_action_add]["identifier"] =
5204                      elseif ($retour == false && $new_instruction->restriction_valid){                              sprintf(
5205                          $this->correct = false ;                                  __("Ajout suite au retour signature de l'instruction %s"),
5206                          $this->msg .= $new_instruction->msg;                                  $current_id
5207                          return false;                              );
5208                            $retour = $new_instruction->ajouter($valNewInstr);
5209    
5210                            //Si une erreur s'est produite et qu'il s'agit d'un problème
5211                            //de restriction
5212                            if ($retour == false && !$new_instruction->restriction_valid){
5213                                $error_message = $this->get_restriction_error_message($restriction);
5214                                $this->f->displayMessage("error", $error_message);
5215                                $this->addToLog(__METHOD__."(): evenement retour ".
5216                                    "instruction ".$this->valF[$this->clePrimaire]." : ".
5217                                    $new_instruction->msg);
5218                            }
5219                            //Si une erreur s'est produite après le test de la restriction
5220                            elseif ($retour == false && $new_instruction->restriction_valid){
5221                                $this->correct = false ;
5222                                $this->msg .= $new_instruction->msg;
5223                                return false;
5224                            }
5225                      }                      }
5226    
5227                        $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
5228                  }                  }
5229                  // Si la date de retour AR est éditée on vérifie si il existe un événement automatique  
5230                  if ($this->getVal('date_retour_rar') == "" AND                  // Si la date de retour AR est éditée
5231                      $this->valF['date_retour_rar'] != "") {                  if (
5232                                            $this->getVal('date_retour_rar') == "" &&
5233                      if($row['evenement_retour_ar'] != "") {                      $this->valF['date_retour_rar'] != ""
5234                          $new_instruction = new instruction("]", $db, $DEBUG);                  ){
5235                        // On Lance le hook Notification/Date retour Accusée Reception
5236                        $data = array('val' => $this->valF);
5237                        $data['dossier'] = $this->valF['dossier'];
5238                        $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
5239    
5240                        // On vérifie si il existe un événement automatique
5241                        if ( $row['evenement_retour_ar'] != "" ) {
5242                            $new_instruction = $this->f->get_inst__om_dbform(array(
5243                                "obj" => "instruction",
5244                                "idx" => "]",
5245                            ));
5246                          // Création d'un tableau avec la liste des champs de l'instruction                          // Création d'un tableau avec la liste des champs de l'instruction
5247                          foreach($new_instruction->champs as $champ) {                          foreach($new_instruction->champs as $champ) {
5248                              $valNewInstr[$champ] = "";                              $valNewInstr[$champ] = "";
5249                          }                          }
5250                          // Définition des valeurs de la nouvelle instruction                          // Définition des valeurs de la nouvelle instruction
5251                          $valNewInstr["evenement"] = $row['evenement_retour_ar'];                          $valNewInstr["evenement"] = $row['evenement_retour_ar'];
# Line 1961  class instruction extends instruction_ge Line 5258  class instruction extends instruction_ge
5258                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5259                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5260                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5261                          $new_instruction->setParameter("maj", 0);                          $new_instruction->setParameter("maj", $code_action_add);
5262                          $new_instruction->class_actions[0]["identifier"] =                          $new_instruction->class_actions[$code_action_add]["identifier"] =
5263                              "retour RAR de l'instruction $current_id";                              sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5264                          $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                          $retour = $new_instruction->ajouter($valNewInstr);
5265    
5266                          //Si une erreur s'est produite et qu'il s'agit d'un problème                          //Si une erreur s'est produite et qu'il s'agit d'un problème
5267                          //de restriction                          //de restriction
# Line 1972  class instruction extends instruction_ge Line 5269  class instruction extends instruction_ge
5269                              $error_message = $this->get_restriction_error_message($restriction);                              $error_message = $this->get_restriction_error_message($restriction);
5270                              $this->f->displayMessage("error", $error_message);                              $this->f->displayMessage("error", $error_message);
5271                              $this->addToLog(                              $this->addToLog(
5272                                  "triggermodifierapres() : evenement retour instruction ".                                  __METHOD__."(): evenement retour instruction ".
5273                                  $this->valF[$this->clePrimaire]." : ".                                  $this->valF[$this->clePrimaire]." : ".
5274                                  $new_instruction->msg                                  $new_instruction->msg
5275                              );                              );
# Line 1984  class instruction extends instruction_ge Line 5281  class instruction extends instruction_ge
5281                              return false;                              return false;
5282                          }                          }
5283                      }                      }
5284                      // Mise à jour du flag incomplet_notifie dans dossier si la                      $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5285                      // date limite d'instruction n'est pas dépassée                  }
5286                      if($row['type']=='incompletude' &&  
5287                          ($this->valF['archive_date_notification_delai'] >= $this->valF['date_retour_rar'] ||                  // Si la date_envoi_signature est éditée
5288                          $this->valF['archive_date_notification_delai'] == "")) {                  if (
5289                          $valFIncomp['incomplet_notifie'] = true;                      $this->getVal('date_envoi_signature') == "" &&
5290                          $cle = " dossier='".$val['dossier']."'";                      $this->valF['date_envoi_signature'] != ""
5291                          $resIncomp = $db->autoExecute(                  ){
5292                              DB_PREFIXE.'dossier',                      // On Lance le hook
5293                              $valFIncomp,                      $data = array('val' => $this->valF);
5294                              DB_AUTOQUERY_UPDATE,                      $data['dossier'] = $this->valF['dossier'];
5295                              $cle                      $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5296                    }
5297                    // Si la date de envoi AR est éditée
5298                    if (
5299                        $this->getVal('date_envoi_rar') == "" &&
5300                        $this->valF['date_envoi_rar'] != ""
5301                    ){
5302                        // On Lance le hook
5303                        $data = array('val' => $this->valF);
5304                        $data['dossier'] = $this->valF['dossier'];
5305                        $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5306                    }
5307                    // Si la date de envoi controle legalite est éditée
5308                    if (
5309                        $this->getVal('date_envoi_controle_legalite') == "" &&
5310                        $this->valF['date_envoi_controle_legalite'] != ""
5311                    ){
5312                        // On Lance le hook
5313                        $data = array('val' => $this->valF);
5314                        $data['dossier'] = $this->valF['dossier'];
5315                        $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5316                    }
5317                    // Si la date de retour controle legalite est éditée
5318                    if (
5319                        $this->getVal('date_retour_controle_legalite') == "" &&
5320                        $this->valF['date_retour_controle_legalite'] != ""
5321                    ){
5322                        // On Lance le hook
5323                        $data = array('val' => $this->valF);
5324                        $data['dossier'] = $this->valF['dossier'];
5325                        $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5326                    }
5327                }
5328            }
5329    
5330            // Traitement en cas de mise à jour du dossier
5331            if ($update_dossier === true) {
5332                /**
5333                 * Mise à jour de la date de dernière modification du dossier
5334                 * d'instruction
5335                 */
5336                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5337                $inst_di->update_last_modification_date();
5338    
5339                // Mise à jour des données du dossier d'autorisation
5340                $da = $this->f->get_inst__om_dbform(array(
5341                    "obj" => "dossier_autorisation",
5342                    "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5343                ));
5344                $params = array(
5345                    'di_id' => $this->getVal('dossier'),
5346                );
5347                if($da->majDossierAutorisation($params) === false) {
5348                    $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5349                    $this->correct = false;
5350                    return false;
5351                }
5352            }
5353    
5354            // mise à jour des métadonnées issues des dates de suivi
5355            $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5356            $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5357            if ($dateRetourSignatureModified || $dateRetourRARModified) {
5358    
5359                $docUid = $this->getVal("om_fichier_instruction");
5360    
5361                // Calculs des nouvelles métadonnées
5362                $metadata = $this->calculate_metadata();
5363                if ($metadata === false) {
5364                    $this->correct = false;
5365                    $this->addToMessage(__("Erreur de traitement de fichier."));
5366                    $log_msg_error = "Modification non enregistrée - id instruction = %s - uid fichier = %s";
5367                    $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $this->getVal($this->clePrimaire), $docUid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
5368                    return false;
5369                }
5370    
5371                // Filtre pour conserver uniquement les métadonnées liées aux dates
5372                $metadataToKeep = array(
5373                    "statutAutorisation",
5374                    "dateEvenementDocument",
5375                    'date_cloture_metier',
5376                    "NotificationArrete",
5377                    "dateNotificationArrete",
5378                    "controleLegalite",
5379                    "dateSignature",
5380                    "nomSignataire",
5381                    "qualiteSignataire",
5382                    "dateControleLegalite",
5383                );
5384                $metadata = array_filter(
5385                    $metadata,
5386                    function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5387                    ARRAY_FILTER_USE_KEY
5388                );
5389    
5390                // Mise à jour des métadonnées du document en GED
5391                $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5392                if ($operationOrUID == 'OP_FAILURE') {
5393                    $this->correct = false;
5394                    $this->addToMessage(__("Erreur de traitement de fichier."));
5395                    $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5396                    return false;
5397                }
5398    
5399                // mise à jour de l'UID du document en BDD
5400                else {
5401                    $valF = array('om_fichier_instruction' => $operationOrUID);
5402                    $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5403                    $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5404                    if ($this->f->isDatabaseError($res, true) === true) {
5405                        $this->correct = false;
5406                        $this->addToMessage(__("Erreur de traitement de fichier."));
5407                        $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5408                        return false;
5409                    }
5410                    $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5411                }
5412            }
5413    
5414            // Déclenchement des notifications automatique après finalisation et
5415            // retour de signature
5416            if ($dateRetourSignatureModified === true
5417                && $this->valF['date_retour_signature'] !== ''
5418                && $this->valF['date_retour_signature'] !== null) {
5419    
5420                // Message à afficher dans les logs pour indiquer quelle notification a échouée
5421                $msgLog = sprintf(
5422                    '%s %s : %d',
5423                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5424                    __('Instruction notifiée'),
5425                    $id
5426                );
5427    
5428                // Récupération de l'instance de l'événement pour accéder au paramètrage
5429                // des notifications
5430                $ev = $this->get_inst_evenement($this->valF['evenement']);
5431                // Si la notification automatique des tiers consulté est active
5432                // déclenche le traitement de notification.
5433                // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5434                $typeNotifTiers = $ev->getVal('notification_tiers');
5435                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5436                if ($typeNotifTiers === 'notification_automatique') {
5437                    if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5438                        $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5439                        $this->correct = false;
5440                    }
5441                }
5442    
5443                if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5444                    // Récupération de la liste des demandeurs à notifier et de la catégorie
5445                    $categorie = $this->f->get_param_option_notification($collectivite_di);
5446                    $isPortal = $categorie === PORTAL;
5447                    $demandeursANotifie = $this->get_demandeurs_notifiable(
5448                        $this->valF['dossier'],
5449                        $isPortal
5450                    );
5451    
5452                    //
5453                    $msg_notif = '';
5454    
5455                    // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5456                    $demandeurPrincipalNotifie = false;
5457                    foreach ($demandeursANotifie as $demandeur) {
5458                        // Identifie si le demandeur principal a été notifié ou pas
5459                        // et récupère ses informations
5460                        if ($demandeur['petitionnaire_principal'] == 't') {
5461                            $demandeurPrincipalNotifie = true;
5462                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5463                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
5464                            // suivante. On le considère également comme non notifié pour gérer l'envoie
5465                            // des messages d'erreurs
5466                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5467                            // d'impact sur la notification
5468                            $erreursParam = $this->get_info_notification_fail();
5469                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5470                                $demandeurPrincipalNotifie = false;
5471                                continue;
5472                            }
5473                        }
5474                        // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5475                        $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
5476                        // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5477                        // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5478                        if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5479                            && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5480                            && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5481                                // Ajout de la notif et récupération de son id
5482                                $idNotif = $this->ajouter_notification(
5483                                    $this->valF[$this->clePrimaire],
5484                                    $this->f->get_connected_user_login_name(),
5485                                    $demandeur,
5486                                    $collectivite_di,
5487                                    array(),
5488                                    true,
5489                                    'Echec',
5490                                    __('La date limite de notification au demandeur est dépassée')
5491                                );
5492                                if ($idNotif === false) {
5493                                    // Termine le traitement
5494                                    $this->addToLog(
5495                                        sprintf('%s() : %s', __METHOD__, $msgLog),
5496                                        DEBUG_MODE
5497                                    );
5498                                    return $this->end_treatment(__METHOD__, false);
5499                                }
5500                                $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5501                        }
5502                        else {
5503                            // Ajout de la notif et récupération de son id
5504                            $idNotif = $this->ajouter_notification(
5505                                $this->valF[$this->clePrimaire],
5506                                $this->f->get_connected_user_login_name(),
5507                                $demandeur,
5508                                $collectivite_di,
5509                                array(),
5510                                true
5511                            );
5512                            if ($idNotif === false) {
5513                                $this->addToLog(
5514                                    sprintf('%s() : %s',__METHOD__, $msgLog),
5515                                    DEBUG_MODE
5516                                );
5517                                return false;
5518                            }
5519                            // Création de la tache en lui donnant l'id de la notification
5520                            $notification_by_task = $this->notification_by_task(
5521                                $idNotif,
5522                                $this->valF['dossier'],
5523                                $categorie
5524                            );
5525                            if ($notification_by_task === false) {
5526                                $this->addToLog(
5527                                    sprintf('%s() : %s',__METHOD__, $msgLog),
5528                                    DEBUG_MODE
5529                                );
5530                                $this->addToMessage(
5531                                    __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5532                                );
5533                                return false;
5534                            }
5535                            $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5536                        }
5537                    }
5538    
5539                    // Pour la notification par mail ou la notification via portal si le dossier a
5540                    // été déposés via portal, si le demandeur principal n'est pas notifiable,
5541                    // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5542                    // laquelle le demandeur principal n'a pas pu être notifié
5543                    $depotPortal = $this->dossier_depose_sur_portail();
5544                    if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5545                        // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5546                        $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5547                        // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5548                        $erreursParam = $this->get_info_notification_fail();
5549                        $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5550                        // Ajout de la notif et récupération de son id
5551                        $idNotif = $this->ajouter_notification(
5552                            $this->valF[$this->clePrimaire],
5553                            $this->f->get_connected_user_login_name(),
5554                            $demandeurPrincipal,
5555                            $collectivite_di,
5556                            array(),
5557                            true,
5558                            'Echec',
5559                            implode(' ', $erreursParam)
5560                        );
5561                        if ($idNotif === false) {
5562                            $this->addToLog(
5563                                sprintf('%s() : %s', __METHOD__, $msgLog),
5564                                DEBUG_MODE
5565                            );
5566                            $this->addToMessage(
5567                                __('Erreur : la création de la notification a échouée.').
5568                                __("Veuillez contacter votre administrateur.")
5569                          );                          );
5570                            return false;
5571                        }
5572                        // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5573                        // de l'échec de la notification
5574                        $dossier_message = $this->get_inst_dossier_message(0);
5575                        $dossier_message_val = array(
5576                            'dossier' => $this->getVal('dossier'),
5577                            'type' => __('erreur expedition'),
5578                            'emetteur' => $this->f->get_connected_user_login_name(),
5579                            'login' => $_SESSION['login'],
5580                            'date_emission' => date('Y-m-d H:i:s'),
5581                            'contenu' => __('Échec lors de la notification de l\'instruction ').
5582                                $ev->getVal('libelle').
5583                                '.<br>'.
5584                                implode("\n", $erreursParam).
5585                                '<br>'.
5586                                __('Veuillez corriger ces informations avant de renvoyer la notification.')
5587                        );
5588                        $add = $dossier_message->add_notification_message($dossier_message_val, true);
5589                        // Si une erreur se produit pendant l'ajout
5590                        if ($add !== true) {
5591                          $this->addToLog(                          $this->addToLog(
5592                              "triggersupprimer(): db->autoexecute(\"".                              sprintf(
5593                                  DB_PREFIXE."dossier\", ".print_r($valFIncomp, true).                                  '%s() : %s',
5594                                  ", DB_AUTOQUERY_UPDATE, \"".$cle."\");",                                  __METHOD__,
5595                              VERBOSE_MODE                                  __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5596                                ),
5597                                DEBUG_MODE
5598                          );                          );
5599                          if (database::isError($resIncomp)) {                          return false;
                             die($resIncomp->getMessage());  
                         }  
5600                      }                      }
5601                  }                  }
5602                    $this->addToMessage($msg_notif);
5603                }
5604            }
5605            // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5606            if ($res !== false) {
5607                foreach($this->champs as $index => $champ) {
5608                    // if (get_class($this) == 'instruction') {
5609                        $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');
5610                    // }
5611                    $this->val[$index] = $this->valF[$champ] ?? null;
5612              }              }
5613          }          }
5614    
5615          // Mise à jour des données du dossier d'autorisation          $res = $this->add_log_to_dossier($id, $val);
5616          require_once "../obj/dossier_autorisation.class.php";          $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5617          $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($this->valF['dossier']), $this->db, DEBUG);          if (! $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data)) {
         if($da->majDossierAutorisation() === false) {  
             $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));  
             $this->correct = false;  
5618              return false;              return false;
5619          }          }
5620          return $this->add_log_to_dossier($id, $val);          return $res;
5621      }      }
5622    
5623      function triggersupprimer($id,&$db,$val,$DEBUG) {      /**
5624         * TRIGGER - triggersupprimer.
5625         *
5626         * @return boolean
5627         */
5628        function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5629            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5630            $data = array('val' => &$val, 'id' => $id);
5631            if (! $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data)) {
5632                return false;
5633            }
5634    
5635          /**          /**
5636           * L'objectif ici est de repositionner les valeurs récupérées en           * L'objectif ici est de repositionner les valeurs récupérées en
5637           * archive dans le dossier d'instruction avant de supprimer l'événement           * archive dans le dossier d'instruction avant de supprimer l'événement
5638           * d'instruction           * d'instruction si les valeurs du dossier sont différentes
5639           */           */
5640                    $valF = array();
5641          // Mise à jour des 4 valeurs modifiées par l'action          $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5642          $valF['delai'] = $val['archive_delai'];          foreach ($inst_di->champs as $key => $champ) {
5643          $valF['accord_tacite'] = $val['archive_accord_tacite'];              // Si le champ du DI à une archive dans l'instruction
5644          $valF['etat'] = $val['archive_etat'];              if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5645          if ($val['archive_avis'] != '') {                  // Si la valeur entre le champ du DI et son archive dans instruction
5646              $valF['avis_decision'] = $val['archive_avis'];                  // est différente
5647          } else {                  if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5648              $valF['avis_decision'] = null;                      $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5649          }                      // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur '   ' (3 espaces vides) au lieu de null
5650          // Mise à jour des dates avec la valeur présente dans le formulaire                      // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou '   '
5651          // de suppression. Si la valeur de la date est vide alors on fixe                      if ($champ === "accord_tacite" && $valF[$champ] === null) {
5652          // à la valeur null                          $valF[$champ] = '   ';
5653          if ($val['archive_date_complet'] != '') {                      }
5654              $valF['date_complet'] = $val['archive_date_complet'];                  }
5655          } else {              }
             $valF['date_complet'] = null;  
         }  
         if ($val['archive_date_dernier_depot'] != '') {  
             $valF['date_dernier_depot'] = $val['archive_date_dernier_depot'];  
         } else {  
             $valF['date_dernier_depot'] = null;  
         }  
         if ($val['archive_date_rejet'] != '') {  
             $valF['date_rejet'] = $val['archive_date_rejet'];  
         } else {  
             $valF['date_rejet'] = null;  
         }  
         if ($val['archive_date_limite'] != '') {  
             $valF['date_limite'] = $val['archive_date_limite'];  
         } else {  
             $valF['date_limite'] = null;  
         }  
         if ($val['archive_date_notification_delai'] != '') {  
             $valF['date_notification_delai'] = $val['archive_date_notification_delai'];  
         } else {  
             $valF['date_notification_delai'] = null;  
         }  
         if ($val['archive_date_decision'] != '') {  
             $valF['date_decision'] = $val['archive_date_decision'];  
         } else {  
             $valF['date_decision'] = null;  
         }  
         if ($val['archive_date_validite'] != '') {  
             $valF['date_validite'] = $val['archive_date_validite'];  
         } else {  
             $valF['date_validite'] = null;  
         }  
         if ($val['archive_date_achevement'] != '') {  
             $valF['date_achevement'] = $val['archive_date_achevement'];  
         } else {  
             $valF['date_achevement'] = null;  
         }  
         if ($val['archive_date_chantier'] != '') {  
             $valF['date_chantier'] = $val['archive_date_chantier'];  
         } else {  
             $valF['date_chantier'] = null;  
         }  
         if ($val['archive_date_conformite'] != '') {  
             $valF['date_conformite'] = $val['archive_date_conformite'];  
         } else {  
             $valF['date_conformite'] = null;  
         }  
         if ($val['archive_incompletude'] != '') {  
             $valF['incompletude'] = $val['archive_incompletude'];  
         } else {  
             $valF['incompletude'] = null;  
         }  
         if ($val['archive_incomplet_notifie'] != '') {  
             $valF['incomplet_notifie'] = $val['archive_incomplet_notifie'];  
         } else {  
             $valF['incomplet_notifie'] = null;  
         }  
         if ($val['archive_evenement_suivant_tacite'] != '') {  
             $valF['evenement_suivant_tacite'] = $val['archive_evenement_suivant_tacite'];  
         } else {  
             $valF['evenement_suivant_tacite'] = null;  
         }  
         if ($val['archive_evenement_suivant_tacite_incompletude'] != '') {  
             $valF['evenement_suivant_tacite_incompletude'] = $val['archive_evenement_suivant_tacite_incompletude'];  
         } else {  
             $valF['evenement_suivant_tacite_incompletude'] = null;  
         }  
         if ($val['archive_etat_pendant_incompletude'] != '') {  
             $valF['etat_pendant_incompletude'] = $val['archive_etat_pendant_incompletude'];  
         } else {  
             $valF['etat_pendant_incompletude'] = null;  
         }  
         if ($val['archive_date_limite_incompletude'] != '') {  
             $valF['date_limite_incompletude'] = $val['archive_date_limite_incompletude'];  
         } else {  
             $valF['date_limite_incompletude'] = null;  
         }  
         if ($val['archive_delai_incompletude'] != '') {  
             $valF['delai_incompletude'] = $val['archive_delai_incompletude'];  
         } else {  
             $valF['delai_incompletude'] = null;  
5656          }          }
5657          if ($val['archive_autorite_competente'] != '') {          // Spécificité du champ avis_decision dont le champ archive est nommé
5658              $valF['autorite_competente'] = $val['archive_autorite_competente'];          // différemment
5659          } else {          if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5660              $valF['autorite_competente'] = null;              $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5661            }
5662            // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5663            // par l'archive
5664            unset($valF['date_affichage']);
5665    
5666            /**
5667             * Mise à jour de la version de clôture *version_clos* du dossier si et
5668             * seulement si l'instruction met à jour l'état du dossier.
5669             */
5670            if (isset($valF['etat']) === true
5671                && $valF['etat'] !== null
5672                && $valF['etat'] !== '') {
5673                // Récupère l'état actuel du dossier d'instruction
5674                $inst_current_etat = $this->f->get_inst__om_dbform(array(
5675                    "obj" => "etat",
5676                    "idx" => $inst_di->get_id_etat(),
5677                ));
5678                // Instanciation de l'état archivé appliqué sur le dossier
5679                $inst_etat = $this->f->get_inst__om_dbform(array(
5680                    "obj" => "etat",
5681                    "idx" => $valF['etat'],
5682                ));
5683                //
5684                $update_version_clos = null;
5685                // En cas de clôture du dossier par l'état archivé
5686                if ($inst_etat->getVal('statut') === 'cloture') {
5687                    $update_version_clos = $inst_di->update_version_clos('up');
5688                }
5689                // En cas de réouverture du dossier par l'état archivé
5690                if ($inst_current_etat->getVal('statut') === 'cloture'
5691                    && $inst_etat->getVal('statut') !== 'cloture') {
5692                    //
5693                    $update_version_clos = $inst_di->update_version_clos('down');
5694                    //
5695                    $this->set_att_di_reopened(true);
5696                }
5697                //
5698                if ($update_version_clos === false) {
5699                    $this->f->addToLog(sprintf(
5700                        "%s() : ERREUR - %s %s",
5701                        __METHOD__,
5702                        sprintf(
5703                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5704                            $inst_di->getVal($inst_di->clePrimaire)
5705                        ),
5706                        sprintf(
5707                            __("L'instruction tente d'appliquer l'état %s."),
5708                            $inst_etat->getVal($inst_etat->clePrimaire)
5709                        )
5710                    ));
5711                    $this->addToMessage(sprintf(
5712                        "%s %s",
5713                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5714                        __("Veuillez contacter votre administrateur.")
5715                    ));
5716                    return false;
5717                }
5718          }          }
5719          $valF['date_cloture_instruction'] = null;          // On supprime toutes les notications liées à l'instruction
5720          if ($val['archive_date_cloture_instruction'] !== '') {          $notifASupprimer = $this->get_instruction_notification(
5721              $valF['date_cloture_instruction'] = $val['archive_date_cloture_instruction'];              $this->getVal($this->clePrimaire),
5722                array(
5723                    'notification_recepisse',
5724                    'notification_instruction',
5725                    'notification_decision',
5726                    'notification_service_consulte',
5727                    'notification_tiers_consulte',
5728                    'notification_depot_demat',
5729                    'notification_commune',
5730                    'notification_signataire'
5731                ),
5732                true
5733            );
5734    
5735            foreach ($notifASupprimer as $idNotif) {
5736                $inst_notif = $this->f->get_inst__om_dbform(array(
5737                    "obj" => "instruction_notification",
5738                    "idx" => $idNotif,
5739                ));
5740                $val_notif = array();
5741                foreach ($inst_notif->champs as $champ) {
5742                    $val_notif[$champ] = $inst_notif->getVal($champ);
5743                }
5744                // La suppression des notifications entrainera la suppression des tâches qui y sont
5745                // liées
5746                $supprNotif = $inst_notif->supprimer($val_notif);
5747                if ($supprNotif == false) {
5748                    $this->addToMessage(sprintf(
5749                        "%s %s",
5750                        __("Erreur lors de la suppression des notifications de l'instruction."),
5751                        __("Veuillez contacter votre administrateur.")
5752                    ));
5753                    return false;
5754                }
5755          }          }
5756          // Dates concernant les dossiers contentieux  
5757          // Date de première visite          // Suppression du paramétrage de l'annexe lié à l'évènement
5758          $valF['date_premiere_visite'] = null;          if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5759          if ($val['archive_date_premiere_visite'] !== '') {              $this->addToLog(sprintf(
5760              $valF['date_premiere_visite'] = $val['archive_date_premiere_visite'];                  "%s %s",
5761          }                  __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5762          // Date de dernière visite                  __("Veuillez contacter votre administrateur.")
5763          $valF['date_derniere_visite'] = null;              ), DEBUG_MODE);
5764          if ($val['archive_date_derniere_visite'] !== '') {              return false;
             $valF['date_derniere_visite'] = $val['archive_date_derniere_visite'];  
         }  
         // Date contradictoire  
         $valF['date_contradictoire'] = null;  
         if ($val['archive_date_contradictoire'] !== '') {  
             $valF['date_contradictoire'] = $val['archive_date_contradictoire'];  
         }  
         // Date de retour contradictoire  
         $valF['date_retour_contradictoire'] = null;  
         if ($val['archive_date_retour_contradictoire'] !== '') {  
             $valF['date_retour_contradictoire'] = $val['archive_date_retour_contradictoire'];  
         }  
         // Date de l'AIT  
         $valF['date_ait'] = null;  
         if ($val['archive_date_ait'] !== '') {  
             $valF['date_ait'] = $val['archive_date_ait'];  
         }  
         // Date de transmission au parquet  
         $valF['date_transmission_parquet'] = null;  
         if ($val['archive_date_transmission_parquet'] !== '') {  
             $valF['date_transmission_parquet'] = $val['archive_date_transmission_parquet'];  
5765          }          }
5766    
5767          // On met à jour le dossier          // On met à jour le dossier
5768          $cle = " dossier='".$val['dossier']."'";          $valF['instruction'] = $id;
5769          $res = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);          $valF['crud'] = 'delete';
5770          $this->addToLog("triggersupprimer(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);          $update_by_instruction = $inst_di->update_by_instruction($valF);
5771          if (database::isError($res)) {          if ($update_by_instruction === false) {
5772              die($res->getMessage());              $this->cleanMessage();
5773                $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5774                return false;
5775          }          }
5776    
5777          // Affichage d'informations à l'utilisateur          // Affichage d'informations à l'utilisateur
5778          $this->addToMessage(_("Suppression de l'instruction")." [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");          $this->addToMessage(__("Suppression de l'instruction")." [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5779    
5780          // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer          // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5781    
5782            $res = true;
5783            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5784            if (! $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data)) {
5785                return false;
5786            }
5787            return $res;
5788      }      }
5789    
5790      function triggersupprimerapres($id,&$db,$val,$DEBUG) {      /**
5791         * TRIGGER - triggersupprimerapres.
5792         *
5793         * @return boolean
5794         */
5795        function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5796            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5797            $data = array('val' => &$val, 'id' => $id);
5798            if (! $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data)) {
5799                return false;
5800            }
5801    
5802            /**
5803             * Mise à jour de la date de dernière modification du dossier
5804             * d'instruction
5805             */
5806            $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5807            $inst_di->update_last_modification_date();
5808    
5809          // Mise à jour des données du dossier d'autorisation          /**
5810          require_once "../obj/dossier_autorisation.class.php";           * Mise à jour des données du dossier d'autorisation
5811          $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($val["dossier"]), $this->db, DEBUG);           */
5812          if($da->majDossierAutorisation() === false) {          $da = $this->f->get_inst__om_dbform(array(
5813              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              "obj" => "dossier_autorisation",
5814                "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5815            ));
5816            $params = array(
5817                'di_id' => $this->getVal('dossier'),
5818                'di_reopened' => $this->get_att_di_reopened(),
5819            );
5820            if($da->majDossierAutorisation($params) === false) {
5821                $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5822              $this->correct = false;              $this->correct = false;
5823              return false;              return false;
5824          }          }
5825    
5826            /**
5827             * Gestion des tâches pour la dématérialisation
5828             */
5829            $inst_task_empty = $this->f->get_inst__om_dbform(array(
5830                "obj" => "task",
5831                "idx" => 0,
5832            ));
5833            foreach ($inst_di->task_types as $task_type) {
5834                $task_exists = $inst_task_empty->task_exists($task_type, $id);
5835                if ($task_exists !== false) {
5836                    $inst_task = $this->f->get_inst__om_dbform(array(
5837                        "obj" => "task",
5838                        "idx" => $task_exists,
5839                    ));
5840                    if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5841                        $task_val = array(
5842                            'state' => task::STATUS_CANCELED,
5843                        );
5844                        $update_task = $inst_task->update_task(array('val' => $task_val));
5845                        if ($update_task === false) {
5846                            $this->addToMessage(sprintf('%s %s',
5847                                sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5848                                __("Veuillez contacter votre administrateur.")
5849                            ));
5850                            $this->correct = false;
5851                            return false;
5852                        }
5853                    }
5854                }
5855            }
5856    
5857            //
5858          $val['evenement'] = $this->getVal('evenement');          $val['evenement'] = $this->getVal('evenement');
5859          return $this->add_log_to_dossier($id, $val);  
5860            $res = $this->add_log_to_dossier($id, $val);
5861            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5862            if (! $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data)) {
5863                return false;
5864            }
5865            return $res;
5866        }
5867    
5868        /**
5869         * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5870         * "di_reopened".
5871         *
5872         * @param boolean $val
5873         */
5874        function set_att_di_reopened($val) {
5875            $this->di_reopened = $val;
5876        }
5877    
5878        /**
5879         * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5880         *
5881         * @return boolean
5882         */
5883        function get_att_di_reopened() {
5884            return $this->di_reopened;
5885      }      }
5886    
5887      /**      /**
5888       * Permet de composer un message d'erreur sur restriction non valide en       * Permet de composer un message d'erreur sur restriction non valide en
5889       * fonction du contexte.       * fonction du contexte.
5890       *       *
5891       * @param string $restriction formule de la restriction       * @param string $restriction formule de la restriction
# Line 2205  class instruction extends instruction_ge Line 5895  class instruction extends instruction_ge
5895      function get_restriction_error_message($restriction) {      function get_restriction_error_message($restriction) {
5896          // Affichage du message si la restriction s'applique          // Affichage du message si la restriction s'applique
5897          // Contexte du suivi des dates (message simple)          // Contexte du suivi des dates (message simple)
5898          $message_restrict = _("Probleme de dates :");          $message_restrict = __("Probleme de dates :");
5899          // Split restriction          // Split restriction
5900          $champs_restrict = preg_split(          $champs_restrict = preg_split(
5901                  '/(\W+)/',                  '/(\W+)/',
# Line 2216  class instruction extends instruction_ge Line 5906  class instruction extends instruction_ge
5906          $formated_restrict = "";          $formated_restrict = "";
5907          // Ajout des chaînes à traduire          // Ajout des chaînes à traduire
5908          foreach ($champs_restrict as $value) {          foreach ($champs_restrict as $value) {
5909              $formated_restrict .= _($value)." ";              $formated_restrict .= __($value)." ";
5910          }          }
5911          $formated_restrict = substr($formated_restrict, 0, -1);          $formated_restrict = substr($formated_restrict, 0, -1);
5912          // Message d'erreur dans le contexte du suivi des dates          // Message d'erreur dans le contexte du suivi des dates
5913          if($this->getParameter("maj") == 170) {          if($this->getParameter("maj") == 170) {
5914              $message_restrict .= " "._("contactez l'instructeur du dossier");              $message_restrict .= " ".__("contactez l'instructeur du dossier");
5915              $message_restrict .= "<br/>(".$formated_restrict.")";              $message_restrict .= "<br/>(".$formated_restrict.")";
5916          } else {          } else {
5917              // Affichage du message si la restriction s'applique              // Affichage du message si la restriction s'applique
# Line 2233  class instruction extends instruction_ge Line 5923  class instruction extends instruction_ge
5923      }      }
5924    
5925      /**      /**
5926       * Vérifie la restriction sur l'événement.       * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5927         * les vérifications suivantes :
5928         *   - Si l'instruction à un événement associé et que cet événement à des restrictions :
5929         *       1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5930         *          le message d'erreur associé à la restriction
5931         *       2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5932         *          et / ou la modification et affiche un message d'erreur
5933         *   -
5934         *   -
5935         *   -
5936         *   -
5937         *   -
5938         *   -
5939         *
5940         * @param array val : tableau contenant les valeurs issues du formulaire.
5941         * @param - dnu1 : Paramètre déprécié et non utilisé.
5942         * @param - dnu2 : Paramètre déprécié et non utilisé.
5943       *       *
5944       * @param array    $val   valeurs du formulaire       * @return void
      * @param database $db    handler database  
      * @param boolean  $DEBUG NA  
      *  
      * @return [type] [description]  
5945       */       */
5946      function verifier($val = array(), &$db, $DEBUG) {      function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5947          parent::verifier($val, $db, $DEBUG);          parent::verifier($val);
5948            //
5949          if ( isset($val['evenement']) && is_numeric($val['evenement'])){          if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5950              $restriction = $this->get_restriction($val['evenement']);              $restriction = $this->get_restriction($val['evenement']);
5951        
5952              //Test qu'une restriction est présente              //Test qu'une restriction est présente
5953              if ($restriction != "" ){              if ($restriction != "" ){
5954                    
5955                  //Test si la restriction est valide                  // Vérifie le contexte de la modification et test si la restriction est valide.
5956                    // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5957                    // Il n'est donc pas nécessaire de vérifier les restrictions.
5958                  $this->restriction_valid = $this->restrictionIsValid($restriction);                  $this->restriction_valid = $this->restrictionIsValid($restriction);
5959                  if ( !$this->restriction_valid ){                  if ($this->getParameter("maj") != 176
5960                        && !$this->restriction_valid) {
5961    
5962                      // Affichage du message si la restriction s'applique                      // Affichage du message si la restriction s'applique
5963                      $this->addToMessage(                      $this->addToMessage(
# Line 2266  class instruction extends instruction_ge Line 5971  class instruction extends instruction_ge
5971                  $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");                  $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5972                  // Supprime tous les espaces de la chaîne de caractère                  // Supprime tous les espaces de la chaîne de caractère
5973                  $restriction = str_replace(' ', '', $restriction);                  $restriction = str_replace(' ', '', $restriction);
5974                    
5975                  // Met des espace avant et après les opérateurs puis transforme la                  // Met des espace avant et après les opérateurs puis transforme la
5976                  // chaine en un tableau                  // chaine en un tableau
5977                  $tabRestriction = str_replace($operateurs, " ", $restriction);                  $tabRestriction = str_replace($operateurs, " ", $restriction);
5978                  // Tableau des champ                  // Tableau des champ
5979                  $tabRestriction = explode(" ", $tabRestriction);                  $tabRestriction = explode(" ", $tabRestriction);
# Line 2287  class instruction extends instruction_ge Line 5992  class instruction extends instruction_ge
5992                      $string_error_fields = implode(", ", $check_field_exist);                      $string_error_fields = implode(", ", $check_field_exist);
5993    
5994                      // Message d'erreur                      // Message d'erreur
5995                      $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");                      $error_message = __("Le champ %s n'est pas utilisable pour le champ %s");
5996                      if (count($check_field_exist) > 1) {                      if (count($check_field_exist) > 1) {
5997                          $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");                          $error_message = __("Les champs %s ne sont pas utilisable pour le champ %s");
5998                      }                      }
5999    
6000                      // Affiche l'erreur                      // Affiche l'erreur
6001                      $this->correct=false;                      $this->correct=false;
6002                      $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));                      $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
6003                      $this->addToMessage(_("Veuillez contacter votre administrateur."));                      $this->addToMessage(__("Veuillez contacter votre administrateur."));
6004                  }                  }
6005              }              }
6006    
# Line 2320  class instruction extends instruction_ge Line 6025  class instruction extends instruction_ge
6025          }          }
6026    
6027      }      }
6028        
6029        /**
6030         * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
6031         * principal du dossier auquel appartiens l'instruction.
6032         * Renvoie un tableau contenant les informations du pétitionnaire principal.
6033         *
6034         * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
6035         * et affiche un message dans les logs.
6036         * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
6037         *
6038         * @param string identifiant du dossier
6039         * @return array|boolean
6040         */
6041        public function get_info_petitionnaire_principal_dossier($dossier = null) {
6042            // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
6043            // l'objet courant
6044            if (empty($dossier)) {
6045                $dossier = $this->getVal('dossier');
6046                // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
6047                // false et on affiche un message d'erreur dans les logs
6048                if (empty($dossier)) {
6049                    $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
6050                    return false;
6051                }
6052            }
6053    
6054            // Requête sql servant à récupérer toutes les informations relatives au demandeurs
6055            // principal
6056            $qres = $this->f->get_all_results_from_db_query(
6057                sprintf(
6058                    'SELECT
6059                        -- Récupère toutes les informations du demandeur principal
6060                        demandeur.*,
6061                        CASE
6062                            WHEN demandeur.qualite=\'particulier\'
6063                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
6064                        ELSE
6065                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
6066                        END AS destinataire
6067                    FROM
6068                        %1$sdossier
6069                        LEFT JOIN %1$slien_dossier_demandeur
6070                            ON lien_dossier_demandeur.dossier = dossier.dossier
6071                        LEFT JOIN %1$sdemandeur
6072                            ON demandeur.demandeur = lien_dossier_demandeur.demandeur
6073                    WHERE
6074                        dossier.dossier = \'%2$s\'
6075                        AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
6076                    DB_PREFIXE,
6077                    $this->f->db->escapeSimple($dossier)
6078                ),
6079                array(
6080                    "origin" => __METHOD__,
6081                )
6082            );
6083            if (is_array($qres["result"]) === true
6084                && array_key_exists(0, $qres["result"]) === true) {
6085                //
6086                return $qres["result"][0];
6087            }
6088            return null;
6089        }
6090    
6091    
6092    
6093      /**      /**
6094       * Finalisation des documents.       * Finalisation des documents.
6095       * @param  string $champ    champ du fichier à finaliser       * @param  string $champ    champ du fichier à finaliser
# Line 2335  class instruction extends instruction_ge Line 6104  class instruction extends instruction_ge
6104          $id_inst = $this->getVal($this->clePrimaire);          $id_inst = $this->getVal($this->clePrimaire);
6105    
6106          //          //
6107          $admin_msg_error = _("Veuillez contacter votre administrateur.");          $admin_msg_error = __("Veuillez contacter votre administrateur.");
6108          $file_msg_error = _("Erreur de traitement de fichier.")          $file_msg_error = __("Erreur de traitement de fichier.")
6109              ." ".$admin_msg_error;              ." ".$admin_msg_error;
6110          $bdd_msg_error = _("Erreur de base de données.")          $bdd_msg_error = __("Erreur de base de données.")
6111              ." ".$admin_msg_error;              ." ".$admin_msg_error;
6112          $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";          $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
6113    
6114          // Si on finalise le document          // Si on finalise le document
6115          if ($mode == "finalize"){          if ($mode == "finalize"){
6116              //              //
6117              $etat = _('finalisation');              $etat = __('finalisation');
6118    
6119              // Récupère la collectivite du dossier d'instruction              // Récupère la collectivite du dossier d'instruction
6120              $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();              $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6121    
6122              //              //
6123              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6124                
6125                //
6126                $params = array(
6127                    "specific" => array(),
6128                );
6129                // Si la rédaction libre est activée sur l'instruction
6130                if ($this->getVal("flag_edition_integrale") == 't') {
6131                    $params["specific"]["corps"] = array(
6132                        "mode" => "set",
6133                        "value" => $this->getVal("corps_om_htmletatex"),
6134                    );
6135                    $params["specific"]["titre"] = array(
6136                        "mode" => "set",
6137                        "value" => $this->getVal("titre_om_htmletat"),
6138                    );
6139                }
6140              // Génération du PDF              // Génération du PDF
6141              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite);              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6142              $pdf_output = $result['pdf_output'];              $pdf_output = $result['pdf_output'];
6143                
6144              //Métadonnées du document              //Métadonnées du document
6145              $metadata = array(              $metadata = array(
6146                  'filename' => 'instruction_'.$id_inst.'.pdf',                  'filename' => $this->determinate_name_doc_pdf().'.pdf',
6147                  'mimetype' => 'application/pdf',                  'mimetype' => 'application/pdf',
6148                  'size' => strlen($pdf_output)                  'size' => strlen($pdf_output)
6149              );              );
6150    
6151              // Récupération des métadonnées calculées après validation              // Récupération des métadonnées calculées après validation
6152              $spe_metadata = $this->getMetadata("om_fichier_instruction");              $spe_metadata = $this->calculate_metadata();
6153                if ($spe_metadata === false) {
             //On vérifie si l'instruction à finaliser a un événement de type arrete  
             $sql = "SELECT type  
                 FROM ".DB_PREFIXE."evenement  
                 WHERE evenement = ".$this->getVal("evenement");  
             $typeEvenement = $this->db->getOne($sql);  
             $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);  
             if ($this->f->isDatabaseError($typeEvenement, true) === true) {  
6154                  $this->correct = false;                  $this->correct = false;
6155                  $this->addToMessage($bdd_msg_error);                  $this->addToMessage($bdd_msg_error);
6156                    $uid = $this->getVal("om_fichier_instruction");
6157                    $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $id_inst, $uid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
6158                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
6159              }              }
6160    
6161              //Initialisation de la variable              $metadata = array_merge($metadata, $spe_metadata);
             $arrete_metadata = array();  
             // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques  
             if ( $typeEvenement === 'arrete' ){  
                 $arrete_metadata = $this->getMetadata("arrete");  
             }  
6162    
6163              $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);              // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
6164                $res = $this->f->db->autoExecute(
6165                    DB_PREFIXE.$this->table,
6166                    ['fichier_instruction_name' => $metadata['filename']],
6167                    DB_AUTOQUERY_UPDATE,
6168                    "instruction='".$this->getVal("instruction")."'"
6169                );
6170    
6171              // Si le document a déjà été finalisé on le met à jour              // Si le document a déjà été finalisé on le met à jour
6172              // en conservant son UID              // en conservant son UID
6173              if ($this->getVal("om_fichier_instruction") != ''){              if ($this->getVal("om_fichier_instruction") != ''){
6174                  $uid = $this->f->storage->update(                  $uid = $this->f->storage->update(
6175                      $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);                      $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
6176                    );
6177              }              }
6178              // Sinon on crée un nouveau document et dont on récupère l'UID              // Sinon on crée un nouveau document et dont on récupère l'UID
6179              else {              else {
6180                  $uid = $this->f->storage->create($pdf_output, $metadata);                  $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
6181              }              }
6182          }          }
6183    
6184          // Si on définalise le document          // Si on définalise le document
6185          if ($mode == "unfinalize") {          if ($mode == "unfinalize") {
6186              //              //
6187              $etat = _('définalisation');              $etat = __('définalisation');
6188              // Récupération de l'uid du document finalisé              // Récupération de l'uid du document finalisé
6189              $uid = $this->getVal("om_fichier_instruction");              $uid = $this->getVal("om_fichier_instruction");
6190          }          }
6191            
6192          // Si on définalise l'UID doit être défini          // Si on définalise l'UID doit être défini
6193          // Si on finalise la création/modification du fichier doit avoir réussi          // Si on finalise la création/modification du fichier doit avoir réussi
6194          if ($uid == '' || $uid == 'OP_FAILURE' ) {          if ($uid == '' || $uid == 'OP_FAILURE' ) {
6195              $this->correct = false;              $this->correct = false;
6196              $this->addToMessage($file_msg_error);              $this->addToMessage($file_msg_error);
6197              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6198              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
6199          }          }
6200    
# Line 2450  class instruction extends instruction_ge Line 6231  class instruction extends instruction_ge
6231          $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);          $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6232          $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);          $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6233          $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);          $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6234            $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6235          $this->setvalF($val);          $this->setvalF($val);
6236    
6237          // Verification de la validite des donnees          // Verification de la validite des donnees
6238          $this->verifier($this->val, $this->db, DEBUG);          $this->verifier($this->val);
6239          // Si les verifications precedentes sont correctes, on procede a          // Si les verifications precedentes sont correctes, on procede a
6240          // la modification, sinon on ne fait rien et on retourne une erreur          // la modification, sinon on ne fait rien et on retourne une erreur
6241          if ($this->correct === true) {          if ($this->correct === true) {
# Line 2487  class instruction extends instruction_ge Line 6269  class instruction extends instruction_ge
6269    
6270              // Execution de la requête de modification des donnees de l'attribut              // Execution de la requête de modification des donnees de l'attribut
6271              // valF de l'objet dans l'attribut table de l'objet              // valF de l'objet dans l'attribut table de l'objet
6272              $res = $this->db->autoExecute(DB_PREFIXE.$this->table, $valF,              $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6273                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6274               $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);               $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6275              //              //
# Line 2498  class instruction extends instruction_ge Line 6280  class instruction extends instruction_ge
6280              }              }
6281    
6282              //              //
6283              $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));              $this->addToMessage(sprintf(__("La %s du document s'est effectuee avec succes."), $etat));
6284              //              //
6285              if ($this->add_log_to_dossier($id_inst, $val) === false) {              if ($this->add_log_to_dossier($id_inst, $val) === false) {
6286                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
# Line 2508  class instruction extends instruction_ge Line 6290  class instruction extends instruction_ge
6290          }          }
6291          // L'appel de verifier() a déjà positionné correct à false          // L'appel de verifier() a déjà positionné correct à false
6292          // et défini un message d'erreur.          // et défini un message d'erreur.
6293          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6294          return $this->end_treatment(__METHOD__, false);          return $this->end_treatment(__METHOD__, false);
6295      }      }
6296    
# Line 2516  class instruction extends instruction_ge Line 6298  class instruction extends instruction_ge
6298       * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées       * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
6299       * @return string numéro de dossier d'instruction       * @return string numéro de dossier d'instruction
6300       */       */
6301      protected function getDossier() {      protected function getDossier($champ = null) {
6302          if(empty($this->specificMetadata)) {          if(empty($this->specificMetadata)) {
6303              $this->getSpecificMetadata();              $this->getSpecificMetadata();
6304          }          }
# Line 2606  class instruction extends instruction_ge Line 6388  class instruction extends instruction_ge
6388      protected function getTitle() {      protected function getTitle() {
6389    
6390          // Récupère le champ événement          // Récupère le champ événement
6391          if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {          if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6392              $evenement = $this->valF["evenement"];              $evenement = $this->valF["evenement"];
6393          } else {          } else {
6394              $evenement = $this->getVal("evenement");              $evenement = $this->getVal("evenement");
6395          }          }
6396    
6397          // Requête sql          // Requête sql
6398          $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
6399                  WHERE evenement=".$evenement;              "obj" => "evenement",
6400          $evenement_libelle = $this->db->getOne($sql);              "idx" => $evenement
6401          $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);          ));
         if (database::isError($evenement_libelle)) {  
             die();  
         }  
6402    
6403          // Retourne le libelle de l'événement          // Retourne le libelle de l'événement
6404          return $evenement_libelle;          return $evenement->getVal('libelle');
6405      }      }
6406    
6407    
# Line 2646  class instruction extends instruction_ge Line 6425  class instruction extends instruction_ge
6425       * nécessaire à l'ajout d'un document.       * nécessaire à l'ajout d'un document.
6426       */       */
6427      public function getSpecificMetadata() {      public function getSpecificMetadata() {
6428          if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {          if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6429              $dossier = $this->valF["dossier"];              $dossier = $this->valF["dossier"];
6430          } else {          } else {
6431              $dossier = $this->getVal("dossier");              $dossier = $this->getVal("dossier");
6432          }          }
6433          //Requête pour récupérer les informations essentiels sur le dossier d'instruction          //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6434          $sql = "SELECT dossier.dossier as dossier,          $qres = $this->f->get_all_results_from_db_query(
6435                          dossier_autorisation.dossier_autorisation as dossier_autorisation,              sprintf(
6436                          to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,                  'SELECT
6437                          dossier_instruction_type.code as dossier_instruction_type,                      dossier.dossier AS dossier,
6438                          etat_dossier_autorisation.libelle as statut,                      dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6439                          dossier_autorisation_type.code as dossier_autorisation_type,                      to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6440                          groupe.code as groupe_instruction,                      dossier_instruction_type.code AS dossier_instruction_type,
6441                          CASE WHEN dossier.erp IS TRUE                      etat_dossier_autorisation.libelle AS statut,
6442                              THEN 'true'                      dossier_autorisation_type.code AS dossier_autorisation_type,
6443                              ELSE 'false'                      groupe.code AS groupe_instruction,
6444                          END as erp                      CASE WHEN dossier.erp IS TRUE
6445                  FROM ".DB_PREFIXE."dossier                          THEN \'true\'
6446                      LEFT JOIN ".DB_PREFIXE."dossier_instruction_type                            ELSE \'false\'
6447                        END AS erp
6448                    FROM
6449                        %1$sdossier
6450                        LEFT JOIN %1$sdossier_instruction_type
6451                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6452                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation                      LEFT JOIN %1$sdossier_autorisation
6453                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6454                      LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation                      LEFT JOIN %1$setat_dossier_autorisation
6455                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6456                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                      LEFT JOIN %1$sdossier_autorisation_type_detaille
6457                          ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                          ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6458                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type                      LEFT JOIN %1$sdossier_autorisation_type
6459                          ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type                          ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6460                      LEFT JOIN ".DB_PREFIXE."groupe                      LEFT JOIN %1$sgroupe
6461                          ON dossier_autorisation_type.groupe = groupe.groupe                          ON dossier_autorisation_type.groupe = groupe.groupe
6462                  WHERE dossier.dossier = '".$dossier."'";                  WHERE
6463          $res = $this->db->query($sql);                      dossier.dossier = \'%2$s\'',
6464          $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);                  DB_PREFIXE,
6465          if ( database::isError($res)){                  $this->f->db->escapeSimple($dossier)
6466              die();              ),
6467          }              array(
6468                            "origin" => __METHOD__,
6469          //Le résultat est récupéré dans un objet              )
6470          $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);          );
6471            $row = array_shift($qres['result']);
6472    
6473          //Si il y a un résultat          //Si il y a un résultat
6474          if ($row !== null) {          if (! empty($row)) {
6475    
6476              // Instrance de la classe dossier              // Instrance de la classe dossier
6477              $inst_dossier = $this->get_inst_dossier($dossier);              $inst_dossier = $this->get_inst_dossier($dossier);
6478                // TODO : améliorer ce code
6479                //
6480                // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6481                // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6482                // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6483                // valeurs issues de la requête en objet.
6484                $metadata = (object)$row;
6485              // Insère l'attribut version à l'objet              // Insère l'attribut version à l'objet
6486              $row->version = $inst_dossier->get_dossier_instruction_version();              $metadata->version = $inst_dossier->get_di_numero_suffixe();
6487    
6488              //Alors on créé l'objet dossier_instruction              //Alors on créé l'objet dossier_instruction
6489              $this->specificMetadata = $row;              $this->specificMetadata = $metadata;
6490    
6491          }          }
6492      }      }
6493        
6494      /**      /**
6495       * Retourne le statut du dossier d'instruction       * Retourne le statut du dossier d'instruction
6496       * @param string $idx Identifiant du dossier d'instruction       * @param string $idx Identifiant du dossier d'instruction
6497       * @return string Le statut du dossier d'instruction       * @return string Le statut du dossier d'instruction
6498       */       */
6499      function getStatutAutorisationDossier($idx){      function getStatutAutorisationDossier($idx){
6500            
6501          $statut = '';          $statut = '';
6502            
6503          //Si l'identifiant du dossier d'instruction fourni est correct          //Si l'identifiant du dossier d'instruction fourni est correct
6504          if ( $idx != '' ){          if ( $idx != '' ){
6505                
6506              //On récupère le statut de l'état du dossier à partir de l'identifiant du              //On récupère le statut de l'état du dossier à partir de l'identifiant du
6507              //dossier              //dossier
6508              $sql = "SELECT etat.statut              $qres = $this->f->get_one_result_from_db_query(
6509                  FROM ".DB_PREFIXE."dossier                  sprintf(
6510                  LEFT JOIN                      'SELECT
6511                      ".DB_PREFIXE."etat                          etat.statut
6512                      ON                      FROM
6513                          dossier.etat = etat.etat                          %1$sdossier
6514                  WHERE dossier ='".$idx."'";                          LEFT JOIN
6515              $statut = $this->db->getOne($sql);                              %1$setat
6516              $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                              ON
6517              if ( database::isError($statut)){                                  dossier.etat = etat.etat
6518                  die();                      WHERE
6519              }                          dossier = \'%2$s\'',
6520                        DB_PREFIXE,
6521                        $this->f->db->escapeSimple($idx)
6522                    ),
6523                    array(
6524                        "origin" => __METHOD__,
6525                    )
6526                );
6527          }          }
6528          return $statut;  
6529            return $qres['result'];
6530      }      }
6531    
6532      /**      /**
# Line 2741  class instruction extends instruction_ge Line 6539  class instruction extends instruction_ge
6539          $return = array();          $return = array();
6540    
6541          // Récupération de toutes les valeurs du dossier d'instruction en cours          // Récupération de toutes les valeurs du dossier d'instruction en cours
6542          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par une instanciation de l'objet
6543          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
6544          $res = $this->db->query($sql);              sprintf(
6545          $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
6546          $this->f->isDatabaseError($res);                      *
6547                    FROM
6548                        %1$sdossier
6549                    WHERE
6550                        dossier = \'%2$s\'',
6551                    DB_PREFIXE,
6552                    $this->f->db->escapeSimple($this->valF['dossier'])
6553                ),
6554                array(
6555                    'origin' => __METHOD__
6556                )
6557            );
6558    
6559          //          foreach ($qres['result'] as $row) {
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {  
6560    
6561              // Récupération de la valeur actuelle du délai, de l'accord tacite,              // Récupération de la valeur actuelle du délai, de l'accord tacite,
6562              // de l'état et de l'avis du dossier d'instruction              // de l'état et de l'avis du dossier d'instruction
# Line 2776  class instruction extends instruction_ge Line 6584  class instruction extends instruction_ge
6584              $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];              $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6585              $return['archive_delai_incompletude'] = $row['delai_incompletude'];              $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6586              $return['archive_autorite_competente'] = $row['autorite_competente'];              $return['archive_autorite_competente'] = $row['autorite_competente'];
6587                $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6588              $return['duree_validite'] = $row['duree_validite'];              $return['duree_validite'] = $row['duree_validite'];
6589              $return['date_depot'] = $row['date_depot'];              $return['date_depot'] = $row['date_depot'];
6590                $return['date_depot_mairie'] = $row['date_depot_mairie'];
6591              $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];              $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6592              $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];              $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6593              $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];              $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
# Line 2785  class instruction extends instruction_ge Line 6595  class instruction extends instruction_ge
6595              $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];              $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6596              $return['archive_date_ait'] = $row['date_ait'];              $return['archive_date_ait'] = $row['date_ait'];
6597              $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];              $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6598                $return['archive_date_affichage'] = $row['date_affichage'];
6599                $return['archive_pec_metier'] = $row['pec_metier'];
6600                $return['archive_a_qualifier'] = $row['a_qualifier'];
6601          }          }
6602    
6603          // Retour de la fonction          // Retour de la fonction
# Line 2795  class instruction extends instruction_ge Line 6608  class instruction extends instruction_ge
6608      /**      /**
6609       * Permet de vérifier qu'un événement est verrouillable       * Permet de vérifier qu'un événement est verrouillable
6610       * @param  integer $idx     Identifiant de l'instruction       * @param  integer $idx     Identifiant de l'instruction
6611       * @return boolean                 * @return boolean
6612       */       */
6613      function checkEvenementNonVerrouillable($idx) {      function checkEvenementNonVerrouillable($idx) {
   
         // Initialisation du résultat  
         $non_verrouillable = false;  
   
6614          // Si la condition n'est pas vide          // Si la condition n'est pas vide
6615          if ($idx != "") {          if ($idx != "") {
6616    
6617              // Requête SQL              // Requête SQL
6618              $sql = "SELECT evenement.non_verrouillable              $qres = $this->f->get_one_result_from_db_query(
6619                      FROM ".DB_PREFIXE."evenement                  sprintf(
6620                      LEFT JOIN ".DB_PREFIXE."instruction                      'SELECT
6621                          ON instruction.evenement = evenement.evenement                          evenement.non_verrouillable
6622                      WHERE instruction.instruction = $idx";                      FROM
6623              $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                          %1$sevenement
6624              $res = $this->db->getOne($sql);                          LEFT JOIN %1$sinstruction
6625              $this->f->isDatabaseError($res);                              ON instruction.evenement = evenement.evenement
6626                        WHERE
6627              // Si le retour de la requête est true                          instruction.instruction = \'%2$s\'',
6628              if ($res == 't') {                      DB_PREFIXE,
6629                  //                      intval($idx)
6630                  $non_verrouillable = true;                  ),
6631              }                  array(
6632                        "origin" => __METHOD__,
6633                    )
6634                );
6635          }          }
6636    
6637          // Retourne résultat          // Si on a un résultat et que ce résultat indique que l'événement n'est
6638          return $non_verrouillable;          // pas vérrouillable renvoie true, sinon renvoie false
6639            return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6640      }      }
6641        
6642      /**      /**
6643       * Mise à jour des champs archive_*       * Mise à jour des champs archive_*
6644       * @param mixed $row La ligne de données       * @param mixed $row La ligne de données
6645       */       */
6646      public function updateArchiveData($row){      public function updateArchiveData($row){
6647            
6648          // Récupération de la valeur actuelle du délai, de l'accord tacite,          // Récupération de la valeur actuelle du délai, de l'accord tacite,
6649          // de l'état et de l'avis du dossier d'instruction          // de l'état et de l'avis du dossier d'instruction
6650          $this->valF['archive_delai']=$row['delai'];          $this->valF['archive_delai']=$row['delai'];
# Line 2868  class instruction extends instruction_ge Line 6681  class instruction extends instruction_ge
6681              $this->valF['archive_date_chantier']= $row['date_chantier'];              $this->valF['archive_date_chantier']= $row['date_chantier'];
6682          }          }
6683          if ($row['date_conformite'] != '') {          if ($row['date_conformite'] != '') {
6684              $this->valF['archive_date_conformite']= $row['date_conformite'];                $this->valF['archive_date_conformite']= $row['date_conformite'];
6685          }          }
6686          if ($row['incompletude'] != '') {          if ($row['incompletude'] != '') {
6687              $this->valF['archive_incompletude']= $row['incompletude'];                $this->valF['archive_incompletude']= $row['incompletude'];
6688          }          }
6689          if ($row['incomplet_notifie'] != '') {          if ($row['incomplet_notifie'] != '') {
6690              $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];                $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6691          }          }
6692          if ($row['evenement_suivant_tacite'] != '') {          if ($row['evenement_suivant_tacite'] != '') {
6693              $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];                $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6694          }          }
6695          if ($row['evenement_suivant_tacite_incompletude'] != '') {          if ($row['evenement_suivant_tacite_incompletude'] != '') {
6696              $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];                $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6697          }          }
6698          if ($row['etat_pendant_incompletude'] != '') {          if ($row['etat_pendant_incompletude'] != '') {
6699              $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];                $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6700          }          }
6701          if ($row['date_limite_incompletude'] != '') {          if ($row['date_limite_incompletude'] != '') {
6702              $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];                $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6703          }          }
6704          if ($row['delai_incompletude'] != '') {          if ($row['delai_incompletude'] != '') {
6705              $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];                $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6706          }          }
6707          if ($row['autorite_competente'] != '') {          if ($row['autorite_competente'] != '') {
6708              $this->valF['archive_autorite_competente']= $row['autorite_competente'];                $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6709          }          }
6710          if ($row['duree_validite'] != '') {          if ($row['duree_validite'] != '') {
6711              $this->valF['duree_validite']= $row['duree_validite'];                $this->valF['duree_validite']= $row['duree_validite'];
6712          }          }
6713          if ($row['date_depot'] != '') {          if ($row['date_depot'] != '') {
6714              $this->valF['date_depot']= $row['date_depot'];                $this->valF['date_depot']= $row['date_depot'];
6715            }
6716            if ($row['date_depot_mairie'] != '') {
6717                $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6718          }          }
6719          // Dates concernant les dossiers contentieux          // Dates concernant les dossiers contentieux
6720          if ($row['date_cloture_instruction'] != '') {          if ($row['date_cloture_instruction'] != '') {
6721              $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];                $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6722          }          }
6723          if ($row['date_premiere_visite'] != '') {          if ($row['date_premiere_visite'] != '') {
6724              $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];                $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6725          }          }
6726          if ($row['date_derniere_visite'] != '') {          if ($row['date_derniere_visite'] != '') {
6727              $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];                $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6728          }          }
6729          if ($row['date_contradictoire'] != '') {          if ($row['date_contradictoire'] != '') {
6730              $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];                $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6731          }          }
6732          if ($row['date_retour_contradictoire'] != '') {          if ($row['date_retour_contradictoire'] != '') {
6733              $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];                $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6734          }          }
6735          if ($row['date_ait'] != '') {          if ($row['date_ait'] != '') {
6736              $this->valF['archive_date_ait']= $row['date_ait'];                $this->valF['archive_date_ait']= $row['date_ait'];
6737          }          }
6738          if ($row['date_transmission_parquet'] != '') {          if ($row['date_transmission_parquet'] != '') {
6739              $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];                $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6740            }
6741            //
6742            if ($row['dossier_instruction_type'] != '') {
6743                $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6744            }
6745            if ($row['date_affichage'] != '') {
6746                $this->valF['archive_date_affichage']= $row['date_affichage'];
6747            }
6748            if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6749                $this->valF['archive_pec_metier']= $row['pec_metier'];
6750            }
6751            if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6752                $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6753          }          }
6754      }      }
6755    
# Line 3047  class instruction extends instruction_ge Line 6876  class instruction extends instruction_ge
6876       */       */
6877      function getArreteMetadata() {      function getArreteMetadata() {
6878    
6879      //Récupération de la dernière instruction dont l'événement est de type 'arrete'          //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6880      $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",          $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6881          "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",              "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6882          "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",              "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6883          "ap_codepostal"=>"", "ap_ville"=>"");              "ap_codepostal"=>"", "ap_ville"=>"");
6884    
6885          $sqlArrete = "SELECT    signataire_arrete.nom as \"nomsignataire\",          $qres = $this->f->get_all_results_from_db_query(
6886                  signataire_arrete.qualite as \"qualitesignataire\",              sprintf(
6887                  instruction.etat as \"decisionarrete\",                  'SELECT
6888                  instruction.date_retour_rar as \"datenotification\",                      signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6889                  instruction.date_retour_signature as \"datesignaturearrete\",                      signataire_arrete.qualite as qualitesignataire,
6890                  instruction.date_retour_controle_legalite as \"datecontrolelegalite\",                      instruction.etat as decisionarrete,
6891                  dossier.terrain_adresse_voie_numero as \"ap_numrue\",                      instruction.date_retour_rar as datenotification,
6892                  dossier.terrain_adresse_voie as \"ap_nomdelavoie\",                      instruction.date_retour_signature as datesignaturearrete,
6893                  dossier.terrain_adresse_code_postal as \"ap_codepostal\",                      instruction.date_retour_controle_legalite as datecontrolelegalite,
6894                  dossier.terrain_adresse_localite as \"ap_ville\"                      dossier.terrain_adresse_voie_numero as ap_numrue,
6895              FROM ".DB_PREFIXE."instruction                      dossier.terrain_adresse_voie as ap_nomdelavoie,
6896              LEFT JOIN ".DB_PREFIXE."signataire_arrete ON                      dossier.terrain_adresse_code_postal as ap_codepostal,
6897                  instruction.signataire_arrete = signataire_arrete.signataire_arrete                      dossier.terrain_adresse_localite as ap_ville
6898              LEFT JOIN ".DB_PREFIXE."dossier ON                  FROM
6899                  instruction.dossier = dossier.dossier                      %1$sinstruction
6900              LEFT JOIN ".DB_PREFIXE."donnees_techniques ON                      LEFT JOIN %1$ssignataire_arrete
6901                      donnees_techniques.dossier_instruction = dossier.dossier                          ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6902              WHERE instruction.instruction = ".$this->getVal("instruction");                      LEFT JOIN %1$sdossier
6903          $resArrete = $this->db->query($sqlArrete);                          ON instruction.dossier = dossier.dossier
6904          $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdonnees_techniques
6905          if ( database::isError($resArrete)){                          ON donnees_techniques.dossier_instruction = dossier.dossier
6906              die();                  WHERE
6907          }                      instruction.instruction = %2$d',
6908                    DB_PREFIXE,
6909          $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);                  intval($this->getVal('instruction'))
6910                ),
6911                array(
6912                    'origin' => __METHOD__
6913                )
6914            );
6915            $this->metadonneesArrete = array_shift($qres['result']);
6916      }      }
6917    
6918      /**      /**
# Line 3091  class instruction extends instruction_ge Line 6926  class instruction extends instruction_ge
6926          // Récupère la valeur du champ lettretype          // Récupère la valeur du champ lettretype
6927          $lettretype = $this->getVal("lettretype");          $lettretype = $this->getVal("lettretype");
6928          // Si le champ est vide          // Si le champ est vide
6929          if (empty($lettretype)) {          if ($lettretype !== '' && $lettretype !== null) {
6930              //              //
6931              return false;              return true;
6932          }          }
6933    
6934          //          //
6935          return true;          return false;
6936        }
6937    
6938        /**
6939         * CONDITION - is_modifiable.
6940         *
6941         * Controle si l'évenement est modifiable.
6942         *
6943         * @return boolean
6944         */
6945        function is_evenement_modifiable() {
6946            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6947            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6948      }      }
6949    
6950      /**      /**
# Line 3108  class instruction extends instruction_ge Line 6955  class instruction extends instruction_ge
6955       * @return boolean       * @return boolean
6956       */       */
6957      function is_editable() {      function is_editable() {
6958    
6959            // XXX
6960            // 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é)
6961            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6962    
6963          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6964          $bypass = $this->f->isAccredited(get_class($this)."_modifier_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6965          //          //
6966          if ($bypass == true) {          if ($bypass == true) {
6967              //              //
6968              return true;              return true;
6969          }          }
6970            
6971          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6972          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
6973          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
# Line 3132  class instruction extends instruction_ge Line 6984  class instruction extends instruction_ge
6984              return true;              return true;
6985          }          }
6986    
         // Si l'utilisateur est instructeur de la commune du dossier et que la  
         // décision peut être changée par la commune.  
         if ($this->is_instructeur_from_collectivite_dossier() === true and  
             $this->isInstrCanChangeDecision($this->getVal('dossier')) === true) {  
             return true;  
         }  
   
6987          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
6988          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
6989          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
6990              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
6991              return true;              return true;
6992          }          }
# Line 3151  class instruction extends instruction_ge Line 6996  class instruction extends instruction_ge
6996      }      }
6997    
6998      /**      /**
6999         * Vérifie si l'événement est supprimable ou pas.
7000         *
7001         * @return boolean
7002         */
7003        function is_evenement_supprimable() {
7004            // Controle si l'évenement est supprimable
7005            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
7006            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
7007        }
7008    
7009        /**
7010       * CONDITION - is_deletable.       * CONDITION - is_deletable.
7011       *       *
7012       * Condition pour lma modification.       * Condition pour la suppression.
7013       *       *
7014       * @return boolean       * @return boolean
7015       */       */
7016      function is_deletable() {      function is_deletable() {
7017          // Contrôle si l'utilisateur possède un bypass  
7018          $bypass = $this->f->isAccredited(get_class($this)."_supprimer_bypass");          // XXX
7019            // 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é)
7020            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
7021    
7022            // Contrôle si l'utilisateur possède un bypass intégral
7023            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
7024          //          //
7025          if ($bypass == true) {          if ($bypass == true) {
7026    
# Line 3168  class instruction extends instruction_ge Line 7029  class instruction extends instruction_ge
7029          }          }
7030    
7031          // Si l'utilisateur est un intructeur qui ne correspond pas à la          // Si l'utilisateur est un intructeur qui ne correspond pas à la
7032          // division du dossier          // division du dossier et si l'utilisateur n'a pas la permission bypass
7033          if ($this->is_instructeur_from_division_dossier() !== true) {          // de la division
7034            if ($this->is_instructeur_from_division_dossier() === false
7035                && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
7036    
7037              //              //
7038              return false;              return false;
7039          }          }
7040            
7041          // l'événement est-il le dernier ?          // l'événement est-il le dernier ?
7042          $dernier_evenement = false;          $dernier_evenement = false;
7043          // instanciation dossier          // instanciation dossier
7044          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
7045          $dossier = new dossier($this->getVal('dossier'), $this->db, DEBUG);              "obj" => "dossier",
7046                "idx" => $this->getVal('dossier'),
7047            ));
7048          // récupération dernier événement          // récupération dernier événement
7049          $id_dernier_evenement = $dossier->get_dernier_evenement();          $id_dernier_evenement = $dossier->get_dernier_evenement();
7050          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
# Line 3205  class instruction extends instruction_ge Line 7070  class instruction extends instruction_ge
7070          //          //
7071          return true;          return true;
7072      }      }
7073        
7074        
7075      /**      /**
7076       * Vérifie que l'utilisateur est instructeur et qu'il est de la division du       * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
7077       * dossier.       * dossier.
# Line 3214  class instruction extends instruction_ge Line 7079  class instruction extends instruction_ge
7079       * @return,  boolean true/false       * @return,  boolean true/false
7080       */       */
7081      function is_instructeur_from_collectivite_dossier() {      function is_instructeur_from_collectivite_dossier() {
7082          if ($this->f->isUserInstructeur() === true and          if ($this->f->isUserInstructeur() === true &&
7083              $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {              $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
7084              return true;              return true;
7085          }          }
7086          return false;          return false;
7087      }      }
7088        
7089      /**      /**
7090       * CONDITION - is_addable.       * CONDITION - is_addable.
7091       *       *
7092       * Condition pour afficher les boutons modifier et supprimer.       * Condition pour afficher les boutons modifier et supprimer.
7093       *       *
7094       * @return boolean       * @return boolean
7095       */       */
7096      function is_addable() {      function is_addable() {
7097          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
7098          $bypass = $this->f->isAccredited(get_class($this)."_ajouter_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
7099          //          //
7100          if ($bypass == true) {          if ($bypass == true) {
7101    
# Line 3239  class instruction extends instruction_ge Line 7104  class instruction extends instruction_ge
7104          }          }
7105          // Si l'utilisateur est un intructeur qui correspond à la          // Si l'utilisateur est un intructeur qui correspond à la
7106          // division du dossier ou qu'il peut changer la décision          // division du dossier ou qu'il peut changer la décision
7107          if ($this->is_instructeur_from_division_dossier() === true or          if ($this->is_instructeur_from_division_dossier() === true ||
7108              $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {              $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
7109              //              //
7110              return true;              return true;
# Line 3258  class instruction extends instruction_ge Line 7123  class instruction extends instruction_ge
7123       */       */
7124      function is_finalizable() {      function is_finalizable() {
7125          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
7126          $bypass = $this->f->isAccredited(get_class($this)."_finaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
7127          //          //
7128          if ($bypass == true) {          if ($bypass == true) {
7129              //              //
7130              return true;              return true;
7131          }          }
7132            
7133          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
7134          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
7135          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
# Line 3273  class instruction extends instruction_ge Line 7138  class instruction extends instruction_ge
7138              //              //
7139              return false;              return false;
7140          }          }
7141            
7142          // Si l'utilisateur est un intructeur qui correspond à la division du          // Si l'utilisateur est un intructeur qui correspond à la division du
7143          // dossier          // dossier
7144          if ($this->is_instructeur_from_division_dossier() === true) {          if ($this->is_instructeur_from_division_dossier() === true) {
# Line 3281  class instruction extends instruction_ge Line 7146  class instruction extends instruction_ge
7146              return true;              return true;
7147          }          }
7148    
         // Si l'utilisateur est instructeur de la commune du dossier et que la  
         // décision peut être changée par la commune.  
         if ($this->is_instructeur_from_collectivite_dossier() === true and  
             $this->isInstrCanChangeDecision($this->getVal('dossier')) === true) {  
             return true;  
         }  
   
7149          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
7150          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
7151          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
7152              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
7153              return true;              return true;
7154          }          }
# Line 3330  class instruction extends instruction_ge Line 7188  class instruction extends instruction_ge
7188       */       */
7189      function is_unfinalizable(){      function is_unfinalizable(){
7190          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
7191          $bypass = $this->f->isAccredited(get_class($this)."_definaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
7192          //          //
7193          if ($bypass == true) {          if ($bypass == true) {
7194              //              //
7195              return true;              return true;
7196          }          }
7197            
7198          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
7199          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
7200          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
# Line 3353  class instruction extends instruction_ge Line 7211  class instruction extends instruction_ge
7211              return true;              return true;
7212          }          }
7213    
         // Si l'utilisateur est instructeur de la commune du dossier et que la  
         // décision peut être changée par la commune.  
         if ($this->is_instructeur_from_collectivite_dossier() === true and  
             $this->isInstrCanChangeDecision($this->getVal('dossier')) === true) {  
             return true;  
         }  
   
7214          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
7215          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
7216          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
7217              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
7218              return true;              return true;
7219          }          }
# Line 3399  class instruction extends instruction_ge Line 7250  class instruction extends instruction_ge
7250       * @return boolean true si il peut       * @return boolean true si il peut
7251       */       */
7252      function isInstrCanChangeDecision($idx) {      function isInstrCanChangeDecision($idx) {
7253            
7254          if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or          if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7255              $this->f->isUserInstructeur() !== true) {              $this->f->isUserInstructeur() !== true) {
7256              return false;              return false;
7257          }          }
7258            
7259            
7260    
7261          // Sinon on vérifie l'éligibilité du dossier au changement de décision          // Sinon on vérifie l'éligibilité du dossier au changement de décision
7262          $sql =          // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7263              "SELECT          // de décision :
7264            //   * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7265            //   * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7266            $sql = sprintf(
7267                'SELECT
7268                  dossier.dossier                  dossier.dossier
7269              FROM              FROM
7270                  ".DB_PREFIXE."dossier                  %1$sdossier
7271              JOIN ".DB_PREFIXE."instruction ON instruction.instruction = (                  JOIN %1$setat
7272                  SELECT instruction                      ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7273                  FROM ".DB_PREFIXE."instruction                  JOIN %1$slien_dossier_demandeur
7274                  JOIN ".DB_PREFIXE."evenement on instruction.evenement=evenement.evenement                      ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7275                  WHERE instruction.dossier = dossier.dossier                  JOIN %1$sdossier_instruction_type
7276                  AND evenement.retour IS FALSE                      ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7277                  ORDER BY date_evenement DESC, instruction DESC                  JOIN %1$sinstruction
7278                  LIMIT 1                      -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7279              )                      ON instruction.instruction = (
7280              JOIN ".DB_PREFIXE."evenement ON instruction.evenement=evenement.evenement                              SELECT instruction
7281              JOIN ".DB_PREFIXE."instructeur ON dossier.instructeur=instructeur.instructeur                              FROM %1$sinstruction
7282              JOIN ".DB_PREFIXE."om_utilisateur ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur                              JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7283              JOIN ".DB_PREFIXE."om_collectivite ON om_collectivite.om_collectivite=om_utilisateur.om_collectivite                              AND evenement.retour IS FALSE
7284              JOIN ".DB_PREFIXE."etat ON dossier.etat = etat.etat                              WHERE instruction.dossier = dossier.dossier
7285                                ORDER BY date_evenement DESC, instruction DESC
7286                                LIMIT 1
7287                            )
7288                            -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7289                            -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7290                            -- non signée, non notifié, etc.
7291                            AND (instruction.om_final_instruction IS TRUE
7292                                OR instruction.created_by_commune IS TRUE)
7293                            AND instruction.date_retour_signature IS NULL
7294                            AND instruction.date_envoi_rar IS NULL
7295                            AND instruction.date_retour_rar IS NULL
7296                            AND instruction.date_envoi_controle_legalite IS NULL
7297                            AND instruction.date_retour_controle_legalite IS NULL
7298                    -- On vérifie que l instruction soit un arrêté ou un changement de décision
7299                    JOIN %1$sevenement
7300                        ON instruction.evenement=evenement.evenement
7301                            AND (evenement.type = \'arrete\'
7302                                OR evenement.type = \'changement_decision\')
7303                    -- Recherche les informations du pétitionnaire principal pour l affichage
7304                    JOIN %1$sdemandeur
7305                        ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7306                    -- Recherche la collectivité rattachée à l instructeur
7307                    JOIN %1$sinstructeur
7308                        ON dossier.instructeur=instructeur.instructeur
7309                    JOIN %1$sdivision
7310                        ON instructeur.division=division.division
7311                    JOIN %1$sdirection
7312                        ON division.direction=direction.direction
7313                    JOIN %1$som_collectivite
7314                        ON direction.om_collectivite=om_collectivite.om_collectivite
7315              WHERE              WHERE
7316                                    -- Vérification que la décision a été prise par l agglo
7317                      (                  om_collectivite.niveau = \'2\'
7318                          evenement.type = 'arrete' AND                  AND dossier.dossier = \'%2$s\'
7319                          (              ',
7320                              instruction.om_final_instruction IS TRUE              DB_PREFIXE,
7321                              OR instruction.created_by_commune IS TRUE              $this->f->db->escapeSimple($idx)
7322                          ) OR          );
                         evenement.type = 'changement_decision'  
                     )  
                 AND evenement.retour IS FALSE  
                 AND instruction.date_retour_signature IS NULL  
                 AND instruction.date_envoi_rar IS NULL  
                 AND instruction.date_retour_rar IS NULL  
                 AND instruction.date_envoi_controle_legalite IS NULL  
                 AND instruction.date_retour_controle_legalite IS NULL  
                 AND etat.statut = 'encours'  
                 AND dossier.dossier = '".$idx."'  
                 AND om_collectivite.niveau = '2'  
             ";  
7323    
7324    
7325          // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci          // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7326          if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {          if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7327              $sql .= " AND dossier.om_collectivite=".$_SESSION['collectivite'];              $sql .= sprintf(
7328          }                  ' AND dossier.om_collectivite = %1$d',
7329          $res = $this->db->getone($sql);                  intval($_SESSION['collectivite'])
7330          if (database::isError($res)) {              );
             die();  
         }  
         // Si le dossier n'est pas sujet au changement de decision  
         if($res == null) {  
             return false;  
7331          }          }
7332          return true;          $qres = $this->f->get_one_result_from_db_query(
7333                $sql,
7334                array(
7335                    "origin" => __METHOD__,
7336                )
7337            );
7338    
7339            return $qres['result'] !== null;
7340      }      }
7341    
7342    
# Line 3483  class instruction extends instruction_ge Line 7358  class instruction extends instruction_ge
7358          }          }
7359    
7360          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
7361          $bypass = $this->f->isAccredited(get_class($this)."_modification_dates_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7362          if ($bypass === true) {          if ($bypass === true) {
7363              return true;              return true;
7364          }          }
7365    
7366          // On vérifie en premier lieu que le DI n'est pas clôturé          // Permission de modifier le suivi des dates sur un dossier cloturé pour
7367            // un utilisateur lié à un instructeur
7368            $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7369    
7370            // On vérifie en premier lieu que le DI n'est pas clôturé et que
7371            // l'utilisateur ne possède pas la permission de modifier le suivi des
7372            // dates sur un dossier clôturé
7373          $inst_dossier = $this->get_inst_dossier();          $inst_dossier = $this->get_inst_dossier();
7374          if ($inst_dossier->getStatut() === 'cloture') {          if ($inst_dossier->getStatut() === 'cloture'
7375                && $perm_moni_dates_d_closed === false) {
7376              //              //
7377              return false;              return false;
7378          }          }
# Line 3539  class instruction extends instruction_ge Line 7421  class instruction extends instruction_ge
7421    
7422    
7423      /**      /**
7424         * CONDITION - is_finalized.
7425         *
7426         * Condition pour vérifier si une instruction est finalisée.
7427         *
7428         * @return boolean
7429         */
7430        public function is_finalized() {
7431    
7432            return $this->getVal('om_final_instruction') === "t";
7433        }
7434    
7435        /**
7436         * CONDITION - is_not_date_retour_signature_set.
7437         *
7438         * Condition pour vérifier si une date de retour signature n'est pas définie.
7439         *
7440         * @return boolean
7441         */
7442        public function is_not_date_retour_signature_set() {
7443    
7444            return $this->getVal('date_retour_signature') == null;
7445    
7446        }
7447    
7448    
7449        /**
7450       * TREATMENT - finalize.       * TREATMENT - finalize.
7451       *       *
7452       * Permet de finaliser un enregistrement.       * Permet de finaliser un enregistrement.
# Line 3548  class instruction extends instruction_ge Line 7456  class instruction extends instruction_ge
7456       * @return boolean       * @return boolean
7457       */       */
7458      function finalize($val = array()) {      function finalize($val = array()) {
   
7459          // Cette méthode permet d'exécuter une routine en début des méthodes          // Cette méthode permet d'exécuter une routine en début des méthodes
7460          // dites de TREATMENT.          // dites de TREATMENT.
7461          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
7462            $message = '';
7463            $ev = $this->get_inst_evenement($this->getVal('evenement'));
7464    
7465            $this->f->log(__METHOD__, 'BEGIN');
7466            $collectivite_di = null;
7467            $data = array('val' => &$val);
7468            $data['ev'] = $ev;
7469            $data['collectivite_di'] = $collectivite_di;
7470            $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7471    
7472            // Controle du signataire
7473            if (! $this->controle_signataire($ev)) {
7474                $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7475                // Termine le traitement
7476                return $this->end_treatment(__METHOD__, false);
7477            }
7478    
7479          // Traitement de la finalisation          // Traitement de la finalisation
7480          $ret = $this->manage_finalizing("finalize", $val);          $ret = $this->manage_finalizing("finalize", $val);
# Line 3563  class instruction extends instruction_ge Line 7486  class instruction extends instruction_ge
7486              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
7487          }          }
7488    
7489            // Envoi des notifications aux demandeurs si la notification est automatique
7490            // et que la signature n'est pas requise
7491            if ($ev->getVal('notification') === 'notification_automatique') {
7492                // Préparation du message de log en cas d'erreur de notification
7493                $msgLog = sprintf(
7494                    '%s %s : %d',
7495                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7496                    __('Instruction notifiée'),
7497                    $this->getVal($this->clePrimaire)
7498                );
7499                // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7500                $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7501                // Récupération de la liste des demandeurs à notifier et de la catégorie
7502                $categorie = $this->f->get_param_option_notification($collectivite_di);
7503                $isPortal = $categorie === PORTAL;
7504                $demandeursANotifie = $this->get_demandeurs_notifiable(
7505                    $this->getVal('dossier'),
7506                    $isPortal
7507                );
7508    
7509                // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7510                $demandeurPrincipalNotifie = false;
7511                if (count($demandeursANotifie) > 0) {
7512                    foreach ($demandeursANotifie as $demandeur) {
7513                        // Identifie si le demandeur principal a été notifié ou pas
7514                        // et récupère ses informations
7515                        if ($demandeur['petitionnaire_principal'] == 't') {
7516                            $demandeurPrincipalNotifie = true;
7517                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7518                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
7519                            // suivante. On le considère également comme non notifié pour gérer l'envoie
7520                            // des messages d'erreurs
7521                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7522                            // d'impact sur la notification
7523                            $erreursParam = $this->get_info_notification_fail();
7524                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7525                                $demandeurPrincipalNotifie = false;
7526                                continue;
7527                            }
7528                        }
7529                        //
7530                        $msg_notif = '';
7531    
7532                        $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
7533                        // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7534                        // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7535                        if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7536                            && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7537                            && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7538                            // Ajout de la notif et récupération de son id
7539                            $idNotif = $this->ajouter_notification(
7540                                $this->getVal($this->clePrimaire),
7541                                $this->f->get_connected_user_login_name(),
7542                                $demandeur,
7543                                $collectivite_di,
7544                                array(),
7545                                true,
7546                                'Echec',
7547                                __('La date limite de notification au demandeur est dépassée')
7548                            );
7549                            if ($idNotif === false) {
7550                                // Termine le traitement
7551                                $this->addToLog(
7552                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7553                                    DEBUG_MODE
7554                                );
7555                                return $this->end_treatment(__METHOD__, false);
7556                            }
7557                            $msg_notif = sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7558                        }
7559                        else {
7560                            // Ajout de la notif et récupération de son id
7561                            $idNotif = $this->ajouter_notification(
7562                                $this->getVal($this->clePrimaire),
7563                                $this->f->get_connected_user_login_name(),
7564                                $demandeur,
7565                                $collectivite_di,
7566                                array(),
7567                                true
7568                            );
7569                            if ($idNotif === false) {
7570                                // Termine le traitement
7571                                $this->addToLog(
7572                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7573                                    DEBUG_MODE
7574                                );
7575                                return $this->end_treatment(__METHOD__, false);
7576                            }
7577                            $notification_by_task = $this->notification_by_task(
7578                                $idNotif,
7579                                $this->getVal('dossier'),
7580                                $categorie
7581                            );
7582                            if ($notification_by_task === false) {
7583                                $this->addToLog(
7584                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7585                                    DEBUG_MODE
7586                                );
7587                                $this->addToMessage(
7588                                    __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7589                                );
7590                                // Termine le traitement
7591                                return $this->end_treatment(__METHOD__, false);
7592                            }
7593                            $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7594                        }
7595                    }
7596                    $this->addToMessage($message .= $msg_notif);
7597                }
7598                // Pour la notification par mail ou la notification via portal si le dossier a
7599                // été déposés via portal, si le demandeur principal n'est pas notifiable,
7600                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7601                // laquelle le demandeur principal n'a pas pu être notifié
7602                $depotPortal = $this->dossier_depose_sur_portail();
7603                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7604                    // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7605                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7606                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7607                    $erreursParam = $this->get_info_notification_fail();
7608                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7609                    // Ajout de la notif et récupération de son id
7610                    $idNotif = $this->ajouter_notification(
7611                        $this->valF[$this->clePrimaire],
7612                        $this->f->get_connected_user_login_name(),
7613                        $demandeurPrincipal,
7614                        $collectivite_di,
7615                        array(),
7616                        true,
7617                        'Echec',
7618                        implode(' ', $erreursParam)
7619                    );
7620                    if ($idNotif === false) {
7621                        $this->addToMessage(
7622                            __('Erreur : la création de la notification a échouée.').
7623                            __("Veuillez contacter votre administrateur.")
7624                        );
7625                        $this->addToLog(
7626                            sprintf('%s() : %s', __METHOD__, $msgLog),
7627                            DEBUG_MODE
7628                        );
7629                        return false;
7630                    }
7631                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7632                    // de l'échec de la notification
7633                    $dossier_message = $this->get_inst_dossier_message(0);
7634                    $dossier_message_val = array(
7635                        'dossier' => $this->getVal('dossier'),
7636                        'type' => __('erreur expedition'),
7637                        'emetteur' => $this->f->get_connected_user_login_name(),
7638                        'login' => $_SESSION['login'],
7639                        'date_emission' => date('Y-m-d H:i:s'),
7640                        'contenu' => __('Échec lors de la notification de l\'instruction ').
7641                            $ev->getVal('libelle').
7642                            '.<br>'.
7643                            implode("\n", $erreursParam).
7644                            '<br>'.
7645                            __('Veuillez corriger ces informations avant de renvoyer la notification.')
7646                    );
7647                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
7648                    // Si une erreur se produit pendant l'ajout
7649                    if ($add !== true) {
7650                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7651                        return false;
7652                    }
7653                }
7654            }
7655    
7656          // Termine le traitement          // Termine le traitement
7657            // Événement
7658            $data['ev'] = $ev;
7659            $data['collectivite_di'] = $collectivite_di;
7660            $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7661            $this->f->log(__METHOD__, 'END');
7662    
7663          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
7664      }      }
7665    
7666      /**      /**
7667         * Récupère l'instance de dossier message.
7668         *
7669         * @param string $dossier_message Identifiant du message.
7670         *
7671         * @return object
7672         */
7673        private function get_inst_dossier_message($dossier_message = null) {
7674            //
7675            return $this->get_inst_common("dossier_message", $dossier_message);
7676        }
7677    
7678        /**
7679         * Vérifie si le signataire est obligatoire pour finaliser
7680         * le document apartir du paramétrage de l'événement.
7681         * Si c'est le cas, vérifie si il y a bien un signataire
7682         * renseigné.
7683         * Si c'est le cas renvoie true, sinon renvoie false.
7684         *
7685         * @param evenement évenement de l'instruction permettant de
7686         * récupérer le paramétrage
7687         * @return boolean
7688         */
7689        protected function controle_signataire($evenement) {
7690            // Vérifie si le signataire est obligatoire et si c'est le cas
7691            // vérifie si il y a bien un signataire pour le document
7692            if ($evenement->is_signataire_obligatoire() &&
7693                ($this->getVal('signataire_arrete') === null ||
7694                $this->getVal('signataire_arrete') === '')) {
7695                return false;
7696            }
7697            return true;
7698        }
7699    
7700        /**
7701       * TREATMENT - unfinalize.       * TREATMENT - unfinalize.
7702       *       *
7703       * Permet de définaliser un enregistrement.       * Permet de définaliser un enregistrement.
# Line 3598  class instruction extends instruction_ge Line 7728  class instruction extends instruction_ge
7728    
7729      /**      /**
7730       * VIEW - view_edition       * VIEW - view_edition
7731       *       *
7732       * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.       * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7733       *       *
7734       * @return null Si l'action est incorrecte       * @return null Si l'action est incorrecte
# Line 3610  class instruction extends instruction_ge Line 7740  class instruction extends instruction_ge
7740              && $this->getVal("om_final_instruction") != null) {              && $this->getVal("om_final_instruction") != null) {
7741    
7742              // Ouvre le document              // Ouvre le document
7743              $lien = '../spg/file.php?obj='.$this->table.'&'.              $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7744                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7745              //              //
7746              header("Location: ".$lien);              header("Location: ".$lien);
# Line 3624  class instruction extends instruction_ge Line 7754  class instruction extends instruction_ge
7754    
7755              // Paramètre du PDF              // Paramètre du PDF
7756              $params = array(              $params = array(
7757                  "watermark" => true,                  "watermark" => true,
7758                  "specific" => array(                  "specific" => array(
7759                      "mode" => "previsualisation",                      "mode" => "previsualisation",
7760                  ),                  ),
7761              );              );
7762                // Si la rédaction libre est activée sur l'instruction
7763                if ($this->getVal("flag_edition_integrale") == 't') {
7764                    $params["specific"]["corps"] = array(
7765                        "mode" => "set",
7766                        "value" => $this->getVal("corps_om_htmletatex"),
7767                    );
7768                    $params["specific"]["titre"] = array(
7769                        "mode" => "set",
7770                        "value" => $this->getVal("titre_om_htmletat"),
7771                    );
7772                }
7773    
7774              // Génération du PDF              // Génération du PDF
7775              $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);              $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7776                $result['filename'] = $this->determinate_name_doc_pdf();
7777              // Affichage du PDF              // Affichage du PDF
7778              $this->expose_pdf_output(              $this->expose_pdf_output(
7779                  $result['pdf_output'],                  $result['pdf_output'],
7780                  $result['filename']                  $result['filename']
7781              );              );
7782          }          }
# Line 3643  class instruction extends instruction_ge Line 7785  class instruction extends instruction_ge
7785      /**      /**
7786       * Récupère la collectivité du dossier d'instruction.       * Récupère la collectivité du dossier d'instruction.
7787       *       *
7788         * @param string $dossier_instruction_id Identifiant du DI.
7789         *
7790       * @return integer       * @return integer
7791       */       */
7792      function get_dossier_instruction_om_collectivite() {      function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7793    
7794            // Si l'identifiant n'est pas renseigné
7795            if ($dossier_instruction_id === null) {
7796                // Récupère la valeur
7797                if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7798                    $dossier_instruction_id = $this->getVal('dossier');
7799                } elseif ($this->getParameter('idxformulaire') !== null
7800                    && $this->getParameter('idxformulaire') !== '') {
7801                    //
7802                    $dossier_instruction_id = $this->getParameter('idxformulaire');
7803                } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7804                    && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7805                    //
7806                    $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7807                }
7808            }
7809    
7810          //          //
7811          require_once "../obj/dossier_instruction.class.php";          $dossier_instruction = $this->f->get_inst__om_dbform(array(
7812          $dossier_instruction = new dossier_instruction($this->getVal('dossier'), $this->f->db, false);              "obj" => "dossier_instruction",
7813                "idx" => $dossier_instruction_id,
7814            ));
7815    
7816          //          //
7817          return $dossier_instruction->getVal('om_collectivite');          return $dossier_instruction->getVal('om_collectivite');
# Line 3666  class instruction extends instruction_ge Line 7828  class instruction extends instruction_ge
7828          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7829          $this->checkAccessibility();          $this->checkAccessibility();
7830    
         // XXX APP  
   
         $f = $this->f;  
   
7831          /**          /**
7832           * Affichage de la structure HTML           * Affichage de la structure HTML
7833           */           */
7834          //          //
7835          if ($f->isAjaxRequest()) {          if ($this->f->isAjaxRequest()) {
7836              //              //
7837              header("Content-type: text/html; charset=".HTTPCHARSET."");              header("Content-type: text/html; charset=".HTTPCHARSET."");
7838          } else {          } else {
7839              //              //
7840              $f->setFlag("htmlonly");              $this->f->setFlag("htmlonly");
7841              $f->display();              $this->f->display();
7842          }          }
7843          //          //
7844          $f->displayStartContent();          $this->f->displayStartContent();
7845          //          //
7846          $f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));          $this->f->setTitle(__("Liste des éléments de la bible en lien avec un evenement"));
7847          $f->displayTitle();          $this->f->displayTitle();
7848    
7849          /**          /**
7850           *           *
7851           */           */
7852          //          //
7853          ($f->get_submitted_get_value("ev") ? $evenement = $f->get_submitted_get_value("ev") : $evenement = "");          ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7854          $evenement = intval($evenement);          $evenement = intval($evenement);
7855          //          //
7856          ($f->get_submitted_get_value("idx") ? $idx = $f->get_submitted_get_value("idx") : $idx = "");          ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7857          // Récupération du code du type de DA          // Récupération du code du type de DA
7858          $code_da_type = '';          $code_da_type = '';
7859          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7860              $code_da_type = $matches[0];              $code_da_type = $matches[0];
7861          }          }
7862          //          //
7863          ($f->get_submitted_get_value("complement") ? $complement = $f->get_submitted_get_value("complement") : $complement = "1");          ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7864    
7865          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
7866          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
7867          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
7868                "idx" => $idx,
7869          /**          ));
7870           *  
7871           */          $qres = $this->f->get_all_results_from_db_query(
7872          //              sprintf(
7873          $sql = "SELECT *, bible.libelle as bible_lib                  'SELECT
7874          FROM ".DB_PREFIXE."bible                      *,
7875          LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type                      bible.libelle as bible_lib
7876              ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type                  FROM
7877          LEFT JOIN ".DB_PREFIXE."om_collectivite                      %1$sbible
7878              ON bible.om_collectivite = om_collectivite.om_collectivite                      LEFT OUTER JOIN %1$sdossier_autorisation_type
7879          WHERE evenement=".$evenement."                          ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7880              AND complement=".$complement."                      LEFT JOIN %1$som_collectivite
7881              AND (bible.dossier_autorisation_type IS NULL                          ON bible.om_collectivite = om_collectivite.om_collectivite
7882                  OR dossier_autorisation_type.code ='".$code_da_type."')                  WHERE
7883              AND (om_collectivite.niveau = '2'                      (evenement = %2$d
7884                  OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")                          OR evenement IS NULL)
7885          ORDER BY bible_lib ASC";                      AND (complement = %3$d
7886          $res = $f->db->query($sql);                          OR complement IS NULL)
7887          $f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);                      AND (bible.dossier_autorisation_type IS NULL
7888          $f->isDatabaseError($res);                          OR dossier_autorisation_type.code = \'%4$s\')
7889                        AND (om_collectivite.niveau = \'2\'
7890                            OR bible.om_collectivite = %5$d)
7891                    ORDER BY
7892                        bible_lib ASC',
7893                    DB_PREFIXE,
7894                    intval($evenement),
7895                    intval($complement),
7896                    $this->f->db->escapeSimple($code_da_type),
7897                    intval($dossier->getVal("om_collectivite"))
7898                ),
7899                array(
7900                    'origin' => __METHOD__
7901                )
7902            );
7903          //          //
7904          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7905          //          //
7906          if ($res->numrows() > 0) {          if ($qres['row_count'] > 0) {
7907              //              //
7908              echo "\t<table id='tab-bible' width='100%'>\n";              echo "\t<table id='tab-bible' width='100%'>\n";
7909              //              //
7910              echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";              echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7911              echo "<th>"._("Choisir")."</th>";              echo "<th>".__("Choisir")."</th>";
7912              echo "<th>"._("Libelle")."</th>";              echo "<th>".__("Libelle")."</th>";
7913              echo "</tr>\n";              echo "</tr>\n";
7914              //              //
7915              $i = 0;              $i = 0;
7916              //              //
7917              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
7918                  //                  //
7919                  echo "\t\t<tr";                  echo "\t\t<tr";
7920                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
# Line 3759  class instruction extends instruction_ge Line 7931  class instruction extends instruction_ge
7931              echo "\t</table>\n";              echo "\t</table>\n";
7932              //              //
7933              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
7934              $f->layout->display_form_button(array(              $this->f->layout->display_form_button(array(
7935                  "value" => _("Valider"),                  "value" => __("Valider"),
7936                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7937              ));              ));
7938              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
7939              echo "</div>\n";              echo "</div>\n";
7940    
7941          } else {          } else {
7942              //              //
7943              $message_class = "error";              $message_class = "error";
7944              $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;              $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7945              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
7946              //              //
7947              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
7948              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
7949              echo "</div>\n";              echo "</div>\n";
7950          }          }
7951          //          //
# Line 3783  class instruction extends instruction_ge Line 7955  class instruction extends instruction_ge
7955           * Affichage de la structure HTML           * Affichage de la structure HTML
7956           */           */
7957          //          //
7958          $f->displayEndContent();          $this->f->displayEndContent();
7959      }      }
7960    
7961      /**      /**
# Line 3796  class instruction extends instruction_ge Line 7968  class instruction extends instruction_ge
7968      function view_bible_auto() {      function view_bible_auto() {
7969          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7970          $this->checkAccessibility();          $this->checkAccessibility();
   
         // XXX APP  
   
         $f = $this->f;  
   
7971          //          //
7972          $f->disableLog();          $this->f->disableLog();
7973    
7974          $formatDate="AAAA-MM-JJ";          $formatDate="AAAA-MM-JJ";
7975    
7976          // Récupération des paramètres          // Récupération des paramètres
7977          $idx = $f->get_submitted_get_value('idx');          $idx = $this->f->get_submitted_get_value('idx');
7978          $evenement = $f->get_submitted_get_value('ev');          $evenement = $this->f->get_submitted_get_value('ev');
7979    
7980          // Initialisation de la variable de retour          // Initialisation de la variable de retour
7981          $retour['complement_om_html'] = '';          $retour['complement_om_html'] = '';
7982          $retour['complement2_om_html'] = '';          $retour['complement2_om_html'] = '';
7983          $retour['complement3_om_html'] = '';          $retour['complement3_om_html'] = '';
7984          $retour['complement4_om_html'] = '';          $retour['complement4_om_html'] = '';
7985    
7986          // Vérification d'une consultation liée à l'événement          // Vérification d'une consultation liée à l'événement
7987          $consultation = $f->db->getOne(          $instEvenement = $this->f->get_inst__om_dbform(array(
7988              "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement              "obj" => "evenement",
7989          );              "idx" => $evenement,
7990          $f->isDatabaseError($consultation);          ));
7991    
7992          // Si consultation liée, récupération du retour d'avis          // Si consultation liée, récupération du retour d'avis
7993          if($consultation=='Oui'){          if($instEvenement->getVal('consultation') == 'Oui'){
7994              $sql="select date_retour,avis_consultation.libelle as avis_consultation,  
7995                    service.libelle as service              $qres = $this->f->get_all_results_from_db_query(
7996                    from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service                  sprintf(
7997                    on consultation.service =service.service                      'SELECT
7998                    left join ".DB_PREFIXE."avis_consultation on                          date_retour,
7999                      consultation.avis_consultation = avis_consultation.avis_consultation                          avis_consultation.libelle as avis_consultation,
8000                    where dossier ='".$idx."'";                          COALESCE(service.libelle, tiers_consulte.libelle) as service
8001              $res = $f->db->query($sql);                      FROM
8002              $f->isDatabaseError($res);                          %1$sconsultation
8003                            LEFT JOIN %1$stiers_consulte
8004                                ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
8005                            LEFT JOIN %1$sservice
8006                                ON consultation.service = service.service
8007                            LEFT JOIN %1$savis_consultation
8008                                ON consultation.avis_consultation = avis_consultation.avis_consultation
8009                        WHERE
8010                            dossier = \'%2$s\'
8011                            AND consultation.visible',
8012                        DB_PREFIXE,
8013                        $this->f->db->escapeSimple($idx)
8014                    ),
8015                    array(
8016                        'origin' => __METHOD__
8017                    )
8018                );
8019              // Récupération des consultations              // Récupération des consultations
8020              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){              foreach ($qres['result'] as $row) {
8021                  $correct=false;                  $correct=false;
8022                  // date retour                  // date retour
8023                  if ($row['date_retour']<>""){                  if ($row['date_retour']<>""){
8024                      if ($formatDate=="AAAA-MM-JJ"){                      if ($formatDate=="AAAA-MM-JJ"){
8025                          $date = explode("-", $row['date_retour']);                          $date = explode("-", $row['date_retour']);
8026                          // controle de date                          // controle de date
8027                          if (count($date) == 3 and                          if (count($date) == 3 &&
8028                                  checkdate($date[1], $date[2], $date[0])) {                                  checkdate($date[1], $date[2], $date[0])) {
8029                              $date_retour_f= $date[2]."/".$date[1]."/".$date[0];                              $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
8030                              $correct=true;                              $correct=true;
# Line 3849  class instruction extends instruction_ge Line 8034  class instruction extends instruction_ge
8034                          }                          }
8035                      }                      }
8036                  }                  }
8037                  //                  //
8038                  $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];                  $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
8039                  if($correct == true){                  if($correct == true){
8040                      $temp=$temp." du ".$date_retour_f;                      $temp=$temp." du ".$date_retour_f;
8041                  }                  }
8042                  // Concaténation des retours d'avis de consultation                  // Concaténation des retours d'avis de consultation
8043                  $retour['complement_om_html'] .= $temp;                  $retour['complement_om_html'] .= $temp . "<br/><br/>";
8044              } // while              } // while
8045                
8046          } // consultation          } // consultation
8047          // Récupération des bibles automatiques pour le champ complement_om_html          // Récupération des bibles automatiques pour le champ complement_om_html
8048          $retour['complement_om_html'] .= $this->getBible($f, $evenement, $idx, '1');          $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
8049          // Récupération des bibles automatiques pour le champ complement2_om_html          // Récupération des bibles automatiques pour le champ complement2_om_html
8050          $retour['complement2_om_html'] .= $this->getBible($f, $evenement, $idx, '2');          $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
8051          // Récupération des bibles automatiques pour le champ complement3_om_html          // Récupération des bibles automatiques pour le champ complement3_om_html
8052          $retour['complement3_om_html'] .= $this->getBible($f, $evenement, $idx, '3');          $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
8053          // Récupération des bibles automatiques pour le champ complement4_om_html          // Récupération des bibles automatiques pour le champ complement4_om_html
8054          $retour['complement4_om_html'] .= $this->getBible($f, $evenement, $idx, '4');          $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
8055    
8056    
8057    
# Line 3874  class instruction extends instruction_ge Line 8059  class instruction extends instruction_ge
8059      }      }
8060    
8061      /**      /**
8062         * VIEW - view_pdf_temp
8063         *
8064         * @return void
8065         */
8066        function view_pdf_temp() {
8067            $this->checkAccessibility();
8068            // Utilisation de $_POST pour ne pas que les textes soient altérés.
8069            $this->f->set_submitted_value();
8070            $merge_fields = array();
8071            //
8072            if (array_key_exists('c1', $_POST) === true) {
8073                $merge_fields['[complement_instruction]'] = $_POST['c1'];
8074                $merge_fields['[complement1_instruction]'] = $_POST['c1'];
8075            }
8076            if (array_key_exists('c2', $_POST) === true) {
8077                $merge_fields['[complement2_instruction]'] = $_POST['c2'];
8078            }
8079            if (array_key_exists('c3', $_POST) === true) {
8080                $merge_fields['[complement3_instruction]'] = $_POST['c3'];
8081            }
8082            if (array_key_exists('c4', $_POST) === true) {
8083                $merge_fields['[complement4_instruction]'] = $_POST['c4'];
8084            }
8085            $params = array(
8086                "watermark" => true,
8087                "specific" => array(
8088                    "merge_fields" => $merge_fields,
8089                ),
8090            );
8091            //
8092            if (array_key_exists('corps', $_POST) === true) {
8093                $params["specific"]["corps"] = array(
8094                    "mode" => "set",
8095                    "value" => $_POST['corps'],
8096                );
8097            }
8098            if (array_key_exists('titre', $_POST) === true) {
8099                $params["specific"]["titre"] = array(
8100                    "mode" => "set",
8101                    "value" => $_POST['titre'],
8102                );
8103            }
8104            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
8105            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
8106            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
8107            $retour = array(
8108                'base' => base64_encode($result['pdf_output']),
8109            );
8110            echo json_encode($retour);
8111        }
8112    
8113        /**
8114         * Dans le contexte de prévisualisation des éditions, génère le rendu du
8115         * PDF sans prise en compte de la valeur des compléments et le retourne en
8116         * base 64.
8117         *
8118         * @return string Rendu PDF converti en base 64.
8119         */
8120        function init_pdf_temp() {
8121            $params = array(
8122                "watermark" => true,
8123            );
8124            // Si la rédaction libre est activée sur l'instruction
8125            if ($this->getVal("flag_edition_integrale") == 't') {
8126                $params["specific"]["corps"] = array(
8127                    "mode" => "set",
8128                    "value" => $this->getVal("corps_om_htmletatex"),
8129                );
8130                $params["specific"]["titre"] = array(
8131                    "mode" => "set",
8132                    "value" => $this->getVal("titre_om_htmletat"),
8133                );
8134            }
8135            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
8136            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
8137            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
8138    
8139            return base64_encode($result['pdf_output']);
8140        }
8141    
8142        /**
8143       * Récupération des éléments de bible.       * Récupération des éléments de bible.
8144       *       *
      * @param utils   $f      handler de om_application  
8145       * @param integer $event  id de l'événement       * @param integer $event  id de l'événement
8146       * @param string  $idx    id du dossier       * @param string  $idx    id du dossier
8147       * @param integer $compnb numéro du champ complement       * @param integer $compnb numéro du champ complement
8148         * @param string $type types possibles : automatique ou precharge
8149       *       *
8150       * @return string   Chaîne de texte à insérer dans le champ complement       * @return string   Chaîne de texte à insérer dans le champ complement
8151       */       */
8152      function getBible($f, $event, $idx, $compnb) {      function getBible($event, $idx, $compnb, $type = 'automatique') {
8153          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
8154          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
8155          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
8156          // Récupération du code du type de DA              "idx" => $idx,
8157            ));
8158            // Récupération du code du type de DA
8159          $code_da_type = '';          $code_da_type = '';
8160          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
8161              $code_da_type = $matches[0];              $code_da_type = $matches[0];
8162          }          }
         //  
         $sql = "SELECT * FROM ".DB_PREFIXE."bible  
             LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type  
                 ON bible.dossier_autorisation_type=  
                     dossier_autorisation_type.dossier_autorisation_type  
             LEFT JOIN  
                     ".DB_PREFIXE."om_collectivite  
                     ON bible.om_collectivite = om_collectivite.om_collectivite  
             WHERE evenement =".$event." and  
                 complement=".$compnb." and  
                 automatique='Oui' and  
                 (dossier_autorisation_type.code ='".$code_da_type."' or  
                     bible.dossier_autorisation_type IS NULL) and  
                 (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";  
8163    
8164          $res = $f->db->query($sql);          // Prépare le filtre de la requête selon le type de remplissage voulu
8165          $f->isDatabaseError($res);          $sql_filter_type = '';
8166            if ($type === 'automatique') {
8167                $sql_filter_type = "AND automatique = 'Oui'";
8168            } elseif ($type === 'precharge') {
8169                $sql_filter_type = "AND precharge IS TRUE";
8170            }
8171    
8172            $qres = $this->f->get_all_results_from_db_query(
8173                sprintf(
8174                    'SELECT
8175                        *
8176                    FROM
8177                        %1$sbible
8178                        LEFT OUTER JOIN %1$sdossier_autorisation_type
8179                            ON bible.dossier_autorisation_type =
8180                                dossier_autorisation_type.dossier_autorisation_type
8181                        LEFT JOIN %1$som_collectivite
8182                            ON bible.om_collectivite = om_collectivite.om_collectivite
8183                    WHERE
8184                        (evenement = %2$d
8185                            OR evenement IS NULL)
8186                        AND (complement = %3$d
8187                            OR complement IS NULL)
8188                        AND (dossier_autorisation_type.code = \'%4$s\'
8189                            OR bible.dossier_autorisation_type IS NULL)
8190                        AND (om_collectivite.niveau = \'2\'
8191                            OR bible.om_collectivite = %5$d)
8192                        %6$s',
8193                    DB_PREFIXE,
8194                    intval($event),
8195                    intval($compnb),
8196                    $this->f->db->escapeSimple($code_da_type),
8197                    intval($dossier->getVal("om_collectivite")),
8198                    $sql_filter_type
8199                ),
8200                array(
8201                    "origin" => __METHOD__
8202                )
8203            );
8204          $temp = "";          $temp = "";
8205          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){          foreach ($qres['result'] as $row) {
8206              // Remplacement des retours à la ligne par des br              // Remplacement des retours à la ligne par des br
8207              $temp .= preg_replace(              $temp .= preg_replace(
8208                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
8209              );              );
8210                // Ajout d'un saut de ligne entre chaque bible.
8211                $temp .= '<br/>';
8212          } // fin while          } // fin while
8213          return $temp;          return $temp;
8214      }      }
# Line 3932  class instruction extends instruction_ge Line 8226  class instruction extends instruction_ge
8226          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8227          $this->checkAccessibility();          $this->checkAccessibility();
8228    
         // XXX APP  
   
         $f = $this->f;  
   
8229          /**          /**
8230           * Validation du formulaire           * Validation du formulaire
8231           */           */
8232          // Si le formulaire a été validé          // Si le formulaire a été validé
8233          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
8234              // Si un bordereau à été sélectionné              // Si un bordereau à été sélectionné
8235              if ($f->get_submitted_post_value("bordereau") !== null && $f->get_submitted_post_value("bordereau") == "" ) {              if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
8236                  // Si aucun bordereau n'a été sélectionné                  // Si aucun bordereau n'a été sélectionné
8237                  $message_class = "error";                  $message_class = "error";
8238                  $message = _("Veuillez selectionner un bordereau.");                  $message = __("Veuillez selectionner un bordereau.");
8239                }
8240                // Sinon si les dates ne sont pas valide
8241                elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8242                    && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8243                    || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8244                    && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8245                    // Si aucune date n'a été saisie
8246                    $message_class = "error";
8247                    $message = __("Veuillez saisir une date valide.");
8248              }              }
8249              // Sinon si les dates ne sont pas valide              // Sinon si les dates ne sont pas valides
8250              elseif (($f->get_submitted_post_value("date_bordereau_debut") !== null              elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8251                  && $f->get_submitted_post_value("date_bordereau_debut") == "")                  && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
                 || ($f->get_submitted_post_value("date_bordereau_fin") !== null  
                 && $f->get_submitted_post_value("date_bordereau_fin") == "")) {  
8252                  // Si aucune date n'a été saisie                  // Si aucune date n'a été saisie
8253                  $message_class = "error";                  $message_class = "error";
8254                  $message = _("Veuillez saisir une date valide.");                  $message = __("Erreur de parametrage. Contactez votre administrateur.");
8255              }              }
8256              // Affiche le message de validation              // Affiche le message de validation
8257              else {              else {
8258                  // On récupère le libellé du bordereau pour l'afficher à l'utilisateur                  // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
8259                  $sql = "SELECT om_etat.libelle                  $etat = $this->f->get_inst__om_dbform(array(
8260                  FROM ".DB_PREFIXE."om_etat                      "obj" => "om_etat",
8261                  WHERE om_etat.id = '".$f->get_submitted_post_value("bordereau")."'";                      "idx" => $this->f->get_submitted_post_value("bordereau")
8262                  $res = $f->db->getone($sql);                  ));
8263                  $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                  $qres = $this->f->get_one_result_from_db_query(
8264                  $f->isDatabaseError($res);                      sprintf(
8265                            'SELECT
8266                                om_etat.libelle
8267                            FROM
8268                                %som_etat
8269                            WHERE
8270                                om_etat.id = \'%s\'',
8271                            DB_PREFIXE,
8272                            $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8273                        ),
8274                        array(
8275                            "origin" => __METHOD__,
8276                        )
8277                    );
8278    
8279                  //                  //
8280                  $message_class = "valid";                  $message_class = "valid";
8281                  $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");                  $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8282                  $message .= " : <br/><br/>";                  $message .= " : <br/><br/>";
8283                  $message .= "<a class='om-prev-icon pdf-16'";                  $message .= "<a class='om-prev-icon pdf-16'";
8284                  $message .= " title=\""._("Bordereau")."\"";                  $message .= " title=\"".__("Bordereau")."\"";
8285                  $message .= "href='../scr/form.php?obj=instruction";                  $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8286                  $message .= "&action=220";                  $message .= "&action=220";
8287                  $message .= "&idx=0";                  $message .= "&idx=0";
8288                  $message .= "&type_bordereau=".$f->get_submitted_post_value("bordereau");                  $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8289                  $message .= "&date_bordereau_debut=".$f->get_submitted_post_value("date_bordereau_debut");                  $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
8290                  $message .= "&date_bordereau_fin=".$f->get_submitted_post_value("date_bordereau_fin");                  $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
8291                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8292                  if ($f->get_submitted_post_value("om_collectivite") !== null) {                  if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8293                      $message .= "&collectivite=".$f->get_submitted_post_value("om_collectivite");                      $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8294                  }                  }
8295                  $message .= "'"." target='_blank'>";                  $message .= "'"." target='_blank'>";
8296                  $message .= $res." "._("du")." ".$f->get_submitted_post_value("date_bordereau_debut")                  $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8297                      ." "._("au")." ".$f->get_submitted_post_value("date_bordereau_fin");                      ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8298                  $message .= "</a>";                  $message .= "</a>";
8299              }              }
8300          }          }
# Line 3993  class instruction extends instruction_ge Line 8304  class instruction extends instruction_ge
8304           */           */
8305          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8306          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8307              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8308          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8309          // Ouverture du formulaire          // Ouverture du formulaire
8310          printf("\t<form");          printf("\t<form");
8311          printf(" method=\"post\"");          printf(" method=\"post\"");
# Line 4005  class instruction extends instruction_ge Line 8314  class instruction extends instruction_ge
8314          printf(">\n");          printf(">\n");
8315          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8316          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8317          // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select          // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
8318          // collectivité dans le formulaire          // collectivité dans le formulaire
8319          if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
8320              array_push($champs, "om_collectivite");              array_push($champs, "om_collectivite");
8321          }          }
8322          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8323          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8324                "validation" => 0,
8325                "maj" => 0,
8326                "champs" => $champs,
8327            ));
8328          // Paramétrage du champ date_bordereau_debut          // Paramétrage du champ date_bordereau_debut
8329          $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));          $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8330          $form->setType("date_bordereau_debut", "date");          $form->setType("date_bordereau_debut", "date");
8331          $form->setTaille("date_bordereau_debut", 12);          $form->setTaille("date_bordereau_debut", 12);
8332          $form->setMax("date_bordereau_debut", 12);          $form->setMax("date_bordereau_debut", 12);
# Line 4021  class instruction extends instruction_ge Line 8334  class instruction extends instruction_ge
8334          $form->setOnchange("date_bordereau_debut", "fdate(this)");          $form->setOnchange("date_bordereau_debut", "fdate(this)");
8335          $form->setVal("date_bordereau_debut", date("d/m/Y"));          $form->setVal("date_bordereau_debut", date("d/m/Y"));
8336          // Paramétrage du champ date_bordereau_fin          // Paramétrage du champ date_bordereau_fin
8337          $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));          $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8338          $form->setType("date_bordereau_fin", "date");          $form->setType("date_bordereau_fin", "date");
8339          $form->setTaille("date_bordereau_fin", 12);          $form->setTaille("date_bordereau_fin", 12);
8340          $form->setMax("date_bordereau_fin", 12);          $form->setMax("date_bordereau_fin", 12);
# Line 4029  class instruction extends instruction_ge Line 8342  class instruction extends instruction_ge
8342          $form->setOnchange("date_bordereau_fin", "fdate(this)");          $form->setOnchange("date_bordereau_fin", "fdate(this)");
8343          $form->setVal("date_bordereau_fin", date("d/m/Y"));          $form->setVal("date_bordereau_fin", date("d/m/Y"));
8344          // Paramétrage du champ bordereau          // Paramétrage du champ bordereau
8345          $form->setLib("bordereau", _("bordereau"));          $form->setLib("bordereau", __("bordereau"));
8346          $form->setType("bordereau", "select");          $form->setType("bordereau", "select");
8347          $form->setRequired("bordereau");          $form->setRequired("bordereau");
8348          // Valeurs des champs          // Valeurs des champs
8349          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
8350              $form->setVal("date_bordereau_debut", $f->get_submitted_post_value("date_bordereau_debut"));              $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8351              $form->setVal("date_bordereau_fin", $f->get_submitted_post_value("date_bordereau_fin"));              $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8352              $form->setVal("bordereau", $f->get_submitted_post_value("bordereau"));              $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8353              $form->setVal("om_collectivite", $f->get_submitted_post_value("om_collectivite"));              $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8354          }          }
8355          // Données du select - On récupère ici la liste de tous les états disponibles          // Données du select - On récupère ici la liste de tous les états disponibles
8356          // dans la table om_etat qui ont un id qui commence par la cahine de caractères          // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8357          // 'bordereau_'          // 'bordereau_'
8358          $sql = "SELECT om_etat.id, om_etat.libelle          $qres = $this->f->get_all_results_from_db_query(
8359                  FROM ".DB_PREFIXE."om_etat              sprintf(
8360                  WHERE om_etat.id LIKE 'bordereau_%'                  'SELECT
8361                  ORDER BY om_etat.id";                      om_etat.id,
8362          $res = $f->db->query($sql);                      om_etat.libelle
8363          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                  FROM
8364          $f->isDatabaseError($res);                      %1$som_etat
8365                    WHERE
8366                        om_etat.id LIKE \'bordereau_%%\'
8367                    ORDER BY
8368                        om_etat.id',
8369                    DB_PREFIXE
8370                ),
8371                array(
8372                    "origin" => __METHOD__
8373                )
8374            );
8375          // Données du select          // Données du select
8376          $contenu = array(          $contenu = array(
8377              0 => array("", ),              0 => array("", ),
8378              1 => array(_("choisir bordereau")),              1 => array(__("choisir bordereau")),
8379          );          );
8380          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {          foreach ($qres['result'] as $row) {
8381              $contenu[0][] = $row['id'];              $contenu[0][] = $row['id'];
8382              $contenu[1][] = $row['libelle'];              $contenu[1][] = $row['libelle'];
8383          }          }
8384          $form->setSelect("bordereau", $contenu);          $form->setSelect("bordereau", $contenu);
8385      //          //
8386      if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
8387          $form->setLib("om_collectivite", _("collectivite"));              $form->setLib("om_collectivite", __("collectivite"));
8388          $form->setType("om_collectivite", "select");              $form->setType("om_collectivite", "select");
8389    
8390          // Données du select - On récupère ici la liste de tous toutes les collectivités              // Données du select - On récupère ici la liste de tous toutes les collectivités
8391          // de niveau 1              // de niveau 1
8392          $sql = "SELECT om_collectivite, libelle              $qres = $this->f->get_all_results_from_db_query(
8393                  FROM ".DB_PREFIXE."om_collectivite                  sprintf(
8394                  WHERE niveau = '1' ORDER BY libelle";                      'SELECT
8395          $res = $f->db->query($sql);                          om_collectivite,
8396          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                          libelle
8397          $f->isDatabaseError($res);                      FROM
8398          // La valeur par défaut du select est Toutes                          %1$som_collectivite
8399          $list_collectivites = array(                      WHERE
8400              0 => array("", ),                          niveau = \'1\'
8401              1 => array(_("toutes"))                      ORDER BY
8402          );                          libelle',
8403                        DB_PREFIXE
8404          $id_colls = "";                  ),
8405          // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées                  array(
8406          // par des virgules, pour un traitement plus facile dans la requête de sous-état                      "origin" => __METHOD__
8407          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  )
8408              if ($id_colls != "") {              );
8409                  $id_colls .= ",";              // La valeur par défaut du select est Toutes
8410              }              $list_collectivites = array(
8411              $id_colls .= $row['om_collectivite'];                  0 => array("", ),
8412              $list_collectivites[0][] = $row['om_collectivite'];                  1 => array(__("toutes"))
8413              $list_collectivites[1][] = $row['libelle'];              );
         }  
         // On affecte la liste d'identifiants à l'option Toutes  
         $list_collectivites[0][0] = $id_colls ;  
         $form->setSelect("om_collectivite", $list_collectivites);  
     }  
8414    
8415                $id_colls = "";
8416                // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8417                // par des virgules, pour un traitement plus facile dans la requête de sous-état
8418                foreach ($qres['result'] as $row) {
8419                    if ($id_colls != "") {
8420                        $id_colls .= ",";
8421                    }
8422                    $id_colls .= $row['om_collectivite'];
8423                    $list_collectivites[0][] = $row['om_collectivite'];
8424                    $list_collectivites[1][] = $row['libelle'];
8425                }
8426                // On affecte la liste d'identifiants à l'option Toutes
8427                $list_collectivites[0][0] = $id_colls ;
8428                $form->setSelect("om_collectivite", $list_collectivites);
8429            }
8430          // Affichage du formulaire          // Affichage du formulaire
8431          $form->entete();          $form->entete();
8432          $form->afficher($champs, 0, false, false);          $form->afficher($champs, 0, false, false);
8433          $form->enpied();          $form->enpied();
8434          // Affichage du bouton          // Affichage du bouton
8435          printf("\t<div class=\"formControls\">\n");          printf("\t<div class=\"formControls\">\n");
8436          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8437          printf("\t</div>\n");          printf("\t</div>\n");
8438          // Fermeture du formulaire          // Fermeture du formulaire
8439          printf("\t</form>\n");          printf("\t</form>\n");
   
8440      }      }
8441    
8442    
8443      /**      /**
8444       * VIEW - view_generate_suivi_bordereaux.       * VIEW - view_generate_suivi_bordereaux.
8445       *       *
8446       * Génère et affiche les bordereaux de suivi.       * Génère et affiche les bordereaux de suivi.
8447       *         *
8448       * @return [void]       * @return [void]
8449       */       */
8450      function view_generate_suivi_bordereaux() {      function view_generate_suivi_bordereaux() {
8451          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8452          $this->checkAccessibility();          $this->checkAccessibility();
# Line 4133  class instruction extends instruction_ge Line 8465  class instruction extends instruction_ge
8465      /**      /**
8466       * VIEW - view_suivi_envoi_lettre_rar.       * VIEW - view_suivi_envoi_lettre_rar.
8467       *       *
8468       * Vu pour imprimer les RAR.       * Vue pour imprimer les AR.
8469       *       *
8470       * @return void       * @return void
8471       */       */
# Line 4141  class instruction extends instruction_ge Line 8473  class instruction extends instruction_ge
8473          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8474          $this->checkAccessibility();          $this->checkAccessibility();
8475    
         // XXX APP  
   
         $f = $this->f;  
   
8476          //          //
8477          if ($f->get_submitted_post_value("date") !== null) {          if ($this->f->get_submitted_post_value("date") !== null) {
8478              $date = $f->get_submitted_post_value("date");              $date = $this->f->get_submitted_post_value("date");
8479          } else {          } else {
8480              $date = "";              $date = "";
8481          }          }
8482          //          //
8483          if ($f->get_submitted_post_value("liste_code_barres_instruction") !== null) {          if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8484              $liste_code_barres_instruction = $f->get_submitted_post_value("liste_code_barres_instruction");              $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8485          } else {          } else {
8486              $liste_code_barres_instruction = "";              $liste_code_barres_instruction = "";
8487          }          }
# Line 4179  class instruction extends instruction_ge Line 8507  class instruction extends instruction_ge
8507           * Validation du formulaire           * Validation du formulaire
8508           */           */
8509          // Si le formulaire a été validé          // Si le formulaire a été validé
8510          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
8511              //              //
8512              if (empty($date) || empty($liste_code_barres_instruction)) {              if (empty($date) || empty($liste_code_barres_instruction)) {
8513                  //                  //
8514                  $message_class = "error";                  $message_class = "error";
8515                  $message = _("Tous les champs doivent etre remplis.");                  $message = __("Tous les champs doivent etre remplis.");
8516              } else {              } else {
8517                  // Création d'un tableau d'instruction                  // Création d'un tableau d'instruction
8518                  $liste = explode("\r\n", $f->get_submitted_post_value("liste_code_barres_instruction"));                  $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8519                  //                  //
8520                  foreach ($liste as $code_barres) {                  foreach ($liste as $code_barres) {
8521                      // On enlève les éventuels espaces saisis                      // On enlève les éventuels espaces saisis
# Line 4196  class instruction extends instruction_ge Line 8524  class instruction extends instruction_ge
8524                      if ($code_barres != "") {                      if ($code_barres != "") {
8525                          // Si la valeur transmise est numérique                          // Si la valeur transmise est numérique
8526                          if (is_numeric($code_barres)) {                          if (is_numeric($code_barres)) {
8527                              //                              //
8528                              $sql = "SELECT count(*)                              $sql = "SELECT count(*)
8529                                      FROM ".DB_PREFIXE."instruction                                      FROM ".DB_PREFIXE."instruction
8530                                          INNER JOIN ".DB_PREFIXE."dossier                                          INNER JOIN ".DB_PREFIXE."dossier
# Line 4209  class instruction extends instruction_ge Line 8537  class instruction extends instruction_ge
8537                                              ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type                                              ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8538                                          INNER JOIN ".DB_PREFIXE."groupe                                          INNER JOIN ".DB_PREFIXE."groupe
8539                                              ON dossier_autorisation_type.groupe = groupe.groupe                                              ON dossier_autorisation_type.groupe = groupe.groupe
                                                 AND groupe.code != 'CTX'  
8540                                          WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";                                          WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8541                              $nbInstr = $f->db->getone($sql);  
8542                              $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                              // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8543                              $f->isDatabaseError($nbInstr);                              $group_clause = array();
8544                              //                              foreach ($_SESSION["groupe"] as $key => $value) {
8545                              if ($nbInstr == "1") {                                  $group_clause[$key] = "(groupe.code = '".$key."'";
8546                                    if($value["confidentiel"] !== true) {
8547                                        $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8548                                    }
8549                                    $group_clause[$key] .= ")";
8550                                }
8551                                $conditions = implode(" OR ", $group_clause);
8552                                $sql .= " AND (" . $conditions . ")";
8553    
8554                                $qres = $this->f->get_one_result_from_db_query(
8555                                    $sql,
8556                                    array(
8557                                        "origin" => __METHOD__,
8558                                    )
8559                                );
8560    
8561                                if ($qres['result'] == "1") {
8562                                  // Récupération de la date d'envoi de l'instruction bippé                                  // Récupération de la date d'envoi de l'instruction bippé
8563                                  $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY')  as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";                                  $qres = $this->f->get_all_results_from_db_query(
8564                                  $res = $f->db->query($sql);                                      sprintf(
8565                                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                                          'SELECT
8566                                  $f->isDatabaseError($res);                                              to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8567                                  $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);                                              instruction
8568                                  // Si pas de date ou correspond à la date du formulaire on                                          FROM
8569                                                %1$sinstruction
8570                                            WHERE
8571                                                code_barres = \'%2$s\'',
8572                                            DB_PREFIXE,
8573                                            $this->f->db->escapeSimple($code_barres)
8574                                        ),
8575                                        array(
8576                                            'origin' => __METHOD__
8577                                        )
8578                                    );
8579                                    $row = array_shift($qres['result']);
8580                                    // Si pas de date ou correspond à la date du formulaire on
8581                                  // effectue le traitement                                  // effectue le traitement
8582                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8583                                                                            $instr = $this->f->get_inst__om_dbform(array(
8584                                      require_once '../obj/instruction.class.php';                                          "obj" => "instruction",
8585                                      require_once '../obj/dossier.class.php';                                          "idx" => $row['instruction'],
8586                                                                ));
                                     $instr = new instruction($row['instruction'], $f->db, DEBUG);  
8587                                      $valF = array();                                      $valF = array();
8588                                      foreach($instr->champs as $id => $champ) {                                      foreach($instr->champs as $id => $champ) {
8589                                          $valF[$champ] = $instr->val[$id];                                          $valF[$champ] = $instr->val[$id];
# Line 4238  class instruction extends instruction_ge Line 8592  class instruction extends instruction_ge
8592                                      # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste                                      # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8593                                      if ($isAccredited === true                                      if ($isAccredited === true
8594                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8595                                          $dossier = new dossier($instr->getVal("dossier"));                                          $dossier = $this->f->get_inst__om_dbform(array(
8596                                                "obj" => "dossier",
8597                                                "idx" => $instr->getVal("dossier"),
8598                                            ));
8599                                          if ($dossier->is_user_from_allowed_collectivite()){                                          if ($dossier->is_user_from_allowed_collectivite()){
8600                                              $dossierTab[$instr->getVal("dossier")] = $dossier;                                              $dossierTab[$instr->getVal("dossier")] = $dossier;
8601                                          } else {                                          } else {
# Line 4290  class instruction extends instruction_ge Line 8647  class instruction extends instruction_ge
8647                                      // correspondant au code barres                                      // correspondant au code barres
8648                                      if($instr->getVal("om_final_instruction") === 't') {                                      if($instr->getVal("om_final_instruction") === 't') {
8649                                          $instr->setParameter('maj', 1);                                          $instr->setParameter('maj', 1);
8650                                          $instr->class_actions[1]["identifier"] =                                          $instr->class_actions[1]["identifier"] =
8651                                              "envoi lettre RAR (depuis le menu suivi des pièces)";                                              "envoi lettre RAR (depuis le menu suivi des pièces)";
8652                                          if ($instr->modifier($valF, $f->db, DEBUG) == true) {                                          if ($instr->modifier($valF) == true) {
8653                                              $id4Gen[] = $code_barres;                                              $id4Gen[] = $code_barres;
8654                                              $nbLettres ++;                                              $nbLettres ++;
8655                                          } else {                                          } else {
# Line 4300  class instruction extends instruction_ge Line 8657  class instruction extends instruction_ge
8657                                              if ($error != "") {                                              if ($error != "") {
8658                                                  $error .= "<br/>";                                                  $error .= "<br/>";
8659                                              }                                              }
8660                                              $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),                                              $error .= sprintf(__("Une erreur s'est produite lors de la modification de l'instruction %s."),
8661                                                  $code_barres);                                                  $code_barres);
8662                                              $error .= " ";                                              $error .= " ";
8663                                              $error .= _("Veuillez contacter votre administrateur.");                                              $error .= __("Veuillez contacter votre administrateur.");
8664                                          }                                          }
8665                                      } else {                                      } else {
8666                                          //                                          //
8667                                          if ($error != "") {                                          if ($error != "") {
8668                                              $error .= "<br/>";                                              $error .= "<br/>";
8669                                          }                                          }
8670                                          $error .= sprintf(_("Le document correspondant au                                          $error .= sprintf(__("Le document correspondant au
8671                                              code barres %s n'est pas finalise,                                              code barres %s n'est pas finalise,
8672                                              le bordereau ne sera pas genere."),                                              le bordereau ne sera pas genere."),
8673                                              $code_barres);                                              $code_barres);
8674                                      }                                      }
8675                                        
8676                                  } else {                                  } else {
8677                                      //                                      //
8678                                      if ($error != "") {                                      if ($error != "") {
8679                                          $error .= "<br/>";                                          $error .= "<br/>";
8680                                      }                                      }
8681                                      $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");                                      $error .= __("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." ".__("a deja ete envoyee, le bordereau ne sera pas genere.");
8682                                  }                                  }
8683                              } else {                              } else {
8684                                  //                                  //
8685                                  if ($error != "") {                                  if ($error != "") {
8686                                      $error .= "<br/>";                                      $error .= "<br/>";
8687                                  }                                  }
8688                                  $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");                                  $error .= __("Le numero")." ".$code_barres." ".__("ne correspond a aucun code barres d'instruction.");
8689                              }                              }
8690                          } else {                          } else {
8691                              //                              //
8692                              if ($error != "") {                              if ($error != "") {
8693                                  $error .= "<br/>";                                  $error .= "<br/>";
8694                              }                              }
8695                              $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");                              $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8696                          }                          }
8697                      }                      }
8698                  }                  }
# Line 4347  class instruction extends instruction_ge Line 8704  class instruction extends instruction_ge
8704           */           */
8705          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8706          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8707              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8708          }          }
8709          // Affichage du message d'erreur          // Affichage du message d'erreur
8710          if(!empty($error)) {          if(!empty($error)) {
8711              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
8712          }          }
8713          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
8714          if ($nbLettres > 0) {          if ($nbLettres > 0) {
# Line 4360  class instruction extends instruction_ge Line 8717  class instruction extends instruction_ge
8717              echo "\n<p>";              echo "\n<p>";
8718              echo "\n<span class=\"ui-icon ui-icon-info\"></span>";              echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8719              echo "\n<span class=\"text\">";              echo "\n<span class=\"text\">";
8720              echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");              echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8721              echo " : \n<br/><br/>";              echo " : \n<br/><br/>";
8722              echo "\n<a class='om-prev-icon pdf-16'";              echo "\n<a class='om-prev-icon pdf-16'";
8723              echo "\n title=\""._("imprimer les RAR")."\"";              echo "\n title=\"".__("imprimer les AR")."\"";
8724              echo "\n href=\"../scr/form.php?obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";              echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8725              echo "\n target='_blank'>";              echo "\n target='_blank'>";
8726              echo _("Telecharger le document pour")." ".$nbLettres." "._("RAR");              echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8727              echo "\n</a>";              echo "\n</a>";
8728              echo "\n</span>";              echo "\n</span>";
8729              echo "\n</p>";              echo "\n</p>";
# Line 4374  class instruction extends instruction_ge Line 8731  class instruction extends instruction_ge
8731              if ($isAccredited === true) {              if ($isAccredited === true) {
8732                  echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';                  echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8733                  echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";                  echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8734                  echo _('Dossiers concernés par ce traitement');                  echo __('Dossiers concernés par ce traitement');
8735                  echo "\n</legend>";                  echo "\n</legend>";
8736                  echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";                  echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8737                    
8738                  if ($hasHidden === true) {                  if ($hasHidden === true) {
8739                      echo "\n<br/>";                      echo "\n<br/>";
8740                      echo "\n<p>";                      echo "\n<p>";
8741                      echo "\n<span class='text'>";                      echo "\n<span class='text'>";
8742                      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.");                      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.");
8743                      echo "</span>";                      echo "</span>";
8744                      echo "\n</p>";                      echo "\n</p>";
8745                      echo "\n<br/>";                      echo "\n<br/>";
8746                  }                  }
8747                  foreach ($dossierTab as $dossier) {                  foreach ($dossierTab as $dossier) {
8748    
8749                        $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8750                        $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8751                        $code_datd = $inst_datd->getVal('code');
8752    
8753                        $obj = "dossier_instruction";
8754                        if ($code_datd === 'REC' || $code_datd === 'REG') {
8755                            $obj = "dossier_contentieux_tous_recours";
8756                        }
8757                        if ($code_datd === 'IN') {
8758                            $obj = "dossier_contentieux_toutes_infractions";
8759                        }
8760    
8761                      echo "\n<div class=\"bloc group\">";                      echo "\n<div class=\"bloc group\">";
8762                      echo "\n<div class=\"field field-type-text\">";                      echo "\n<div class=\"field field-type-text\">";
8763    
8764                      echo "\n<p>";                      echo "\n<p>";
8765                      echo "\n<span class='text'>";                      echo "\n<span class='text'>";
8766                      echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";                      echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . __('Consulter') . "\"";
8767                      echo "\n href=\"../scr/form.php?obj=dossier_instruction&action=3&idx=";                      echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8768                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
8769                      echo "\">";                      echo "\">";
8770                      echo "\n</a>";                      echo "\n</a>";
8771    
8772                      echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";                      echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8773                      echo " href=\"../scr/form.php?obj=dossier_instruction&action=3&idx=";                      echo " href=\"".OM_ROUTE_FORM."&obj=";
8774                        echo $obj;
8775                        echo "&action=3&idx=";
8776                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
8777                      echo "\">";                      echo "\">";
8778                      echo $dossier->getVal("dossier_libelle");                      echo $dossier->getVal("dossier_libelle");
# Line 4417  class instruction extends instruction_ge Line 8789  class instruction extends instruction_ge
8789              echo "\n</div>";              echo "\n</div>";
8790              echo "\n</div>";              echo "\n</div>";
8791          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8792          // Ouverture du formulaire          // Ouverture du formulaire
8793          echo "\t<form";          echo "\t<form";
8794          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4428  class instruction extends instruction_ge Line 8798  class instruction extends instruction_ge
8798          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8799          $champs = array("date", "liste_code_barres_instruction");          $champs = array("date", "liste_code_barres_instruction");
8800          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8801          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8802                "validation" => 0,
8803                "maj" => 0,
8804                "champs" => $champs,
8805            ));
8806          // Paramétrage du champ date du formulaire          // Paramétrage du champ date du formulaire
8807          $form->setLib("date", _("Date")."* :");          $form->setLib("date", __("Date")."* :");
8808          $form->setType("date", "date");          $form->setType("date", "date");
8809          $form->setOnchange("date", "fdate(this)");          $form->setOnchange("date", "fdate(this)");
8810          $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));          $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8811          $form->setTaille("date", 10);          $form->setTaille("date", 10);
8812          $form->setMax("date", 10);          $form->setMax("date", 10);
8813          // Paramétrage du champ liste_code_barres_instruction du formulaire          // Paramétrage du champ liste_code_barres_instruction du formulaire
8814          $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");          $form->setLib("liste_code_barres_instruction", __("Liste des codes barres d'instructions scannes")."* :");
8815          $form->setType("liste_code_barres_instruction", "textarea");          $form->setType("liste_code_barres_instruction", "textarea");
8816          $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);          $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8817          $form->setTaille("liste_code_barres_instruction", 20);          $form->setTaille("liste_code_barres_instruction", 20);
# Line 4448  class instruction extends instruction_ge Line 8822  class instruction extends instruction_ge
8822          $form->enpied();          $form->enpied();
8823          // Affichage du bouton          // Affichage du bouton
8824          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
8825          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8826          echo "\t</div>\n";          echo "\t</div>\n";
8827          // Fermeture du formulaire          // Fermeture du formulaire
8828          echo "\t</form>\n";          echo "\t</form>\n";
# Line 4465  class instruction extends instruction_ge Line 8839  class instruction extends instruction_ge
8839          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8840          $this->checkAccessibility();          $this->checkAccessibility();
8841    
         // XXX APP  
   
         $f = $this->f;  
   
8842          // Récupération des valeur passées en POST ou GET          // Récupération des valeur passées en POST ou GET
8843          if($f->get_submitted_post_value("type_mise_a_jour") !== null) {          if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8844              $type_mise_a_jour = $f->get_submitted_post_value("type_mise_a_jour");              $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8845          } elseif($f->get_submitted_get_value('type_mise_a_jour') !== null) {          } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8846              $type_mise_a_jour = $f->get_submitted_get_value('type_mise_a_jour');              $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8847          } else {          } else {
8848              $type_mise_a_jour = "";              $type_mise_a_jour = "";
8849          }          }
8850          if($f->get_submitted_post_value('date') !== null) {          if($this->f->get_submitted_post_value('date') !== null) {
8851              $date = $f->get_submitted_post_value('date');              $date = $this->f->get_submitted_post_value('date');
8852          } elseif($f->get_submitted_get_value('date') !== null) {          } elseif($this->f->get_submitted_get_value('date') !== null) {
8853              $date = $f->get_submitted_get_value('date');              $date = $this->f->get_submitted_get_value('date');
8854          } else {          } else {
8855              $date = "";              $date = "";
8856          }          }
8857          if($f->get_submitted_post_value('code_barres') !== null) {          if($this->f->get_submitted_post_value('code_barres') !== null) {
8858              $code_barres = $f->get_submitted_post_value('code_barres');              $code_barres = $this->f->get_submitted_post_value('code_barres');
8859          } elseif($f->get_submitted_get_value('code_barres') !== null) {          } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8860              $code_barres = $f->get_submitted_get_value('code_barres');              $code_barres = $this->f->get_submitted_get_value('code_barres');
8861          } else {          } else {
8862              $code_barres = "";              $code_barres = "";
8863          }          }
# Line 4499  class instruction extends instruction_ge Line 8869  class instruction extends instruction_ge
8869          $liste_champs=array();          $liste_champs=array();
8870    
8871          // Si le formulaire a été validé          // Si le formulaire a été validé
8872          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
8873              if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {              if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
8874    
8875                    // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8876                    $group_clause = array();
8877                    foreach ($_SESSION["groupe"] as $key => $value) {
8878                        $group_clause[$key] = "(groupe.code = '".$key."'";
8879                        if($value["confidentiel"] !== true) {
8880                            $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8881                        }
8882                        $group_clause[$key] .= ")";
8883                    }
8884                    $conditions = implode(" OR ", $group_clause);
8885                    $groupFilter = " AND (" . $conditions . ")";
8886    
8887                  // Vérification de l'existence de l'instruction                  $qres = $this->f->get_all_results_from_db_query(
8888                  $sql = "SELECT instruction                      sprintf(
8889                          FROM ".DB_PREFIXE."instruction                          'SELECT
8890                              INNER JOIN ".DB_PREFIXE."dossier                              instruction
8891                                  ON dossier.dossier=instruction.dossier                          FROM
8892                              INNER JOIN ".DB_PREFIXE."dossier_instruction_type                              %1$sinstruction
8893                                INNER JOIN %1$sdossier
8894                                    ON dossier.dossier = instruction.dossier
8895                                INNER JOIN %1$sdossier_instruction_type
8896                                  ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                                  ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8897                              INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                              INNER JOIN %1$sdossier_autorisation_type_detaille
8898                                  ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                                  ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8899                              INNER JOIN ".DB_PREFIXE."dossier_autorisation_type                              INNER JOIN %1$sdossier_autorisation_type
8900                                  ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type                                  ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8901                              INNER JOIN ".DB_PREFIXE."groupe                              INNER JOIN %1$sgroupe
8902                                  ON dossier_autorisation_type.groupe = groupe.groupe                                  ON dossier_autorisation_type.groupe = groupe.groupe
8903                                      AND groupe.code != 'CTX'                              WHERE
8904                              WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";                                  code_barres = \'%2$s\'
8905                  $res = $f->db->query($sql);                                  %3$s',
8906                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                          DB_PREFIXE,
8907                  $f->isDatabaseError($res);                          $this->f->db->escapeSimple($code_barres),
8908                            $groupFilter
8909                  if($res->numrows() == 1) {                      ),
8910                        array(
8911                            'origin' => __METHOD__
8912                        )
8913                    );
8914                    if($qres['row_count'] === 1) {
8915                      $liste_champs = explode(";", $type_mise_a_jour);                      $liste_champs = explode(";", $type_mise_a_jour);
8916                        $row = array_shift($qres['result']);
8917                        $instr = $this->f->get_inst__om_dbform(array(
8918                            "obj" => "instruction",
8919                            "idx" => $row['instruction'],
8920                        ));
8921                      // Mise à jour des dates après l'écran de verification                      // Mise à jour des dates après l'écran de verification
8922                      if($f->get_submitted_post_value('is_valid') !== null and $f->get_submitted_post_value('is_valid') == "true") {                      if($this->f->get_submitted_post_value('is_valid') !== null && $this->f->get_submitted_post_value('is_valid') == "true") {
                         require_once '../obj/instruction.class.php';  
                         $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);  
                         $instr = new instruction($row['instruction'], $f->db, DEBUG);  
8923                          $valF = array();                          $valF = array();
8924                          foreach($instr->champs as $id => $champ) {                          foreach($instr->champs as $id => $champ) {
8925                              $valF[$champ] = $instr->val[$id];                              $valF[$champ] = $instr->val[$id];
# Line 4565  class instruction extends instruction_ge Line 8957  class instruction extends instruction_ge
8957    
8958                          // Vérification de la finalisation du document                          // Vérification de la finalisation du document
8959                          // correspondant au code barres                          // correspondant au code barres
8960                          if($valF["om_final_instruction"] === 't' or                          if($valF["om_final_instruction"] === 't' ||
8961                              $valF["lettretype"] == '') {                              $valF["lettretype"] == '') {
8962                              $code_barres = "";                              $code_barres = "";
8963                                
8964                              //Désactivation de l'autocommit                              //Désactivation de l'autocommit
8965                              $f->db->autoCommit(false);                              $this->f->db->autoCommit(false);
8966                                
8967                              //On modifie les valeurs de l'instruction                              //On modifie les valeurs de l'instruction
8968                              $instr->setParameter('maj', 170);                              $instr->setParameter('maj', 170);
8969                              $instr->class_actions[170]["identifier"] =                              $instr->class_actions[170]["identifier"] =
8970                              "mise à jour des dates (depuis le menu suivi des pièces)";                              "mise à jour des dates (depuis le menu suivi des pièces)";
8971                              $retour = $instr->modifier($valF, $f->db, DEBUG);                              $retour = $instr->modifier($valF);
8972                                
8973                              //Si une erreur s'est produite, on défait les modifications                              //Si une erreur s'est produite, on défait les modifications
8974                              //qui ont été faites                              //qui ont été faites
8975                              if (!$retour){                              if (!$retour){
8976                                  $instr->undoValidation();                                  $instr->undoValidation();
8977                              }                              }
8978                              //Sinon, on valide en base de données les modifications                              //Sinon, on valide en base de données les modifications
8979                              else {                              else {
8980                                  $f->db->commit();                                  $this->f->db->commit();
8981                              }                              }
8982                                
8983                              // Variable correct retourné depuis la classe instruction                              // Variable correct retourné depuis la classe instruction
8984                              $correct = $instr->correct;                              $correct = $instr->correct;
8985                                
8986                              // Si la modification sur l'instruction a échoué                              // Si la modification sur l'instruction a échoué
8987                              if ($correct === false) {                              if ($correct === false) {
8988                                    
8989                                  // Message d'erreur de la classe instruction                                  // Message d'erreur de la classe instruction
8990                                  $error = $instr->msg;                                  $error = $instr->msg;
8991                              }                              }
8992                                
8993                          } else {                          } else {
8994                              // Indique que le traitement est en erreur                              // Indique que le traitement est en erreur
8995                              $correct = false;                              $correct = false;
8996                              // Message d'erreur                              // Message d'erreur
8997                              $error = sprintf(_("Le document n'est pas finalise."),                              $error = sprintf(__("Le document n'est pas finalise."),
8998                              "<span class='bold'>".$code_barres."</span>");                              "<span class='bold'>".$code_barres."</span>");
8999                          }                          }
9000                      } else {                      } else {
9001                          // Récupération des infos du dossier                          // Récupération des infos du dossier
9002                          $sqlInfo = "SELECT dossier.dossier_libelle,                          $qres = $this->f->get_all_results_from_db_query(
9003                                              evenement.libelle as evenement,                              sprintf(
9004                                              autorite_competente.code as autorite_competente_code,                                  'SELECT
9005                                              autorite_competente.libelle as autorite_competente,                                      dossier.dossier_libelle,
9006                                              evenement.type as evenement_type,                                      evenement.libelle as evenement,
9007                                              to_char(date_envoi_signature,'DD/MM/YYYY')  as date_envoi_signature,                                      autorite_competente.code as autorite_competente_code,
9008                                              to_char(date_retour_signature,'DD/MM/YYYY')  as date_retour_signature,                                      autorite_competente.libelle as autorite_competente,
9009                                              to_char(date_envoi_controle_legalite,'DD/MM/YYYY')  as date_envoi_controle_legalite,                                      evenement.type as evenement_type,
9010                                              to_char(date_retour_controle_legalite,'DD/MM/YYYY')  as date_retour_controle_legalite,                                      to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
9011                                              to_char(date_envoi_rar,'DD/MM/YYYY')  as date_envoi_rar,                                      to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
9012                                              to_char(date_retour_rar,'DD/MM/YYYY')  as date_retour_rar                                      to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
9013                                      FROM ".DB_PREFIXE."instruction                                      to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
9014                                      INNER JOIN ".DB_PREFIXE."dossier ON                                      to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
9015                                          dossier.dossier=instruction.dossier                                      to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
9016                                      LEFT JOIN ".DB_PREFIXE."autorite_competente ON                                  FROM
9017                                          dossier.autorite_competente=autorite_competente.autorite_competente                                      %1$sinstruction
9018                                      INNER JOIN ".DB_PREFIXE."evenement ON                                      INNER JOIN %1$sdossier
9019                                          instruction.evenement=evenement.evenement                                          ON dossier.dossier=instruction.dossier
9020                                      WHERE code_barres='".$code_barres."'";                                      LEFT JOIN %1$sautorite_competente
9021                          $resInfo = $f->db->query($sqlInfo);                                          ON dossier.autorite_competente=autorite_competente.autorite_competente
9022                          $f->isDatabaseError($resInfo);                                      INNER JOIN %1$sevenement
9023                          $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);                                          ON instruction.evenement=evenement.evenement
9024                                    WHERE
9025                                        code_barres = \'%2$s\'',
9026                                    DB_PREFIXE,
9027                                    $this->f->db->escapeSimple($code_barres)
9028                                ),
9029                                array(
9030                                    "origin" => __METHOD__
9031                                )
9032                            );
9033                            $infos = array_shift($qres['result']);
9034    
9035                          // Vérification de la non modification des dates de suivi                          // Vérification de la non modification des dates de suivi
9036                          foreach(explode(";", $type_mise_a_jour) as $champ) {                          foreach(explode(";", $type_mise_a_jour) as $champ) {
9037                              if($infos[$champ] != "" AND $infos[$champ] != $date) {                              if ($champ === 'date_envoi_controle_legalite') {
9038                                  $error = _("Les dates de suivis ne peuvent etre modifiees");                                  if ($instr->is_sent_to_cl() === true) {
9039                                        $error = __("Les dates de suivis ne peuvent etre modifiees");
9040                                        $date_error = true;
9041                                        break;
9042                                    }
9043                                }
9044                                if($infos[$champ] != "" && $infos[$champ] != $date) {
9045                                    $error = __("Les dates de suivis ne peuvent etre modifiees");
9046                                  $date_error = true;                                  $date_error = true;
9047                                    break;
9048                              }                              }
9049                          }                          }
9050                      }                      }
9051                  } else {                  } else {
9052                      $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");                      $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
9053                  }                  }
9054    
9055              } else {              } else {
9056                  $error = _("Tous les champs doivent etre remplis.");                  $error = __("Tous les champs doivent etre remplis.");
9057              }              }
9058          }          }
9059    
# Line 4652  class instruction extends instruction_ge Line 9062  class instruction extends instruction_ge
9062           */           */
9063          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
9064          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
9065              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
9066          }          }
9067          // Affichage du message d'erreur          // Affichage du message d'erreur
9068          if(!empty($error)) {          if(!empty($error)) {
9069              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
9070          }          }
9071    
9072          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
9073          if($correct === true) {          if($correct === true) {
9074              $f->displayMessage("ok", _("Saisie enregistree"));              $this->f->displayMessage("ok", __("Saisie enregistree"));
9075          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
9076          // Ouverture du formulaire          // Ouverture du formulaire
9077          echo "\t<form";          echo "\t<form";
9078          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4682  class instruction extends instruction_ge Line 9090  class instruction extends instruction_ge
9090              $champs = array("type_mise_a_jour", "date", "code_barres");              $champs = array("type_mise_a_jour", "date", "code_barres");
9091          }          }
9092          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
9093          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
9094                "validation" => 0,
9095                "maj" => 0,
9096                "champs" => $champs,
9097            ));
9098          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
9099          // Parametrage du champ type_mise_a_jour          // Parametrage du champ type_mise_a_jour
9100          $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");          $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
9101          if(isset($infos)) {          if(isset($infos)) {
9102              $form->setType("type_mise_a_jour", "selecthiddenstatic");              $form->setType("type_mise_a_jour", "selecthiddenstatic");
9103    
# Line 4697  class instruction extends instruction_ge Line 9109  class instruction extends instruction_ge
9109          $contenu = array();          $contenu = array();
9110    
9111          $contenu[0][0] = "date_envoi_signature";          $contenu[0][0] = "date_envoi_signature";
9112          $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");          $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
9113    
9114          $contenu[0][1] = "date_retour_signature";          $contenu[0][1] = "date_retour_signature";
9115          $contenu[1][1] = _("date de retour de signature Mairie/Prefet");          $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
9116    
9117          $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";          $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
9118          $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");          $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
9119    
9120          $contenu[0][3] = "date_envoi_controle_legalite";          $contenu[0][3] = "date_envoi_controle_legalite";
9121          $contenu[1][3] = _("date d'envoi au controle de legalite");          $contenu[1][3] = __("date d'envoi au controle de legalite");
9122    
9123          $contenu[0][4] = "date_retour_controle_legalite";          $contenu[0][4] = "date_retour_controle_legalite";
9124          $contenu[1][4] = _("date de retour de controle de legalite");          $contenu[1][4] = __("date de retour de controle de legalite");
9125    
9126          $contenu[0][5] = "date_retour_rar";          $contenu[0][5] = "date_retour_rar";
9127          $contenu[1][5] = _("date de retour de l'AR");          $contenu[1][5] = __("date de notification du correspondant");
9128    
9129          $form->setSelect("type_mise_a_jour", $contenu);          $form->setSelect("type_mise_a_jour", $contenu);
9130    
9131          // Parametrage du champ date          // Parametrage du champ date
9132          $form->setLib("date", _("Date")."* :");          $form->setLib("date", __("Date")."* :");
9133          if(isset($infos)) {          if(isset($infos)) {
9134              $form->setType("date", "hiddenstaticdate");              $form->setType("date", "hiddenstaticdate");
9135    
# Line 4729  class instruction extends instruction_ge Line 9141  class instruction extends instruction_ge
9141          $form->setMax("date", 10);          $form->setMax("date", 10);
9142    
9143          // Parametrage du champ code_barres          // Parametrage du champ code_barres
9144          $form->setLib("code_barres", _("Code barres d'instruction")."* :");          $form->setLib("code_barres", __("Code barres d'instruction")."* :");
9145          if(isset($infos)) {          if(isset($infos)) {
9146              $form->setType("code_barres", "hiddenstatic");              $form->setType("code_barres", "hiddenstatic");
9147          } else {          } else {
# Line 4758  class instruction extends instruction_ge Line 9170  class instruction extends instruction_ge
9170              }              }
9171    
9172              // Parametrage du champ dossier              // Parametrage du champ dossier
9173              $form->setLib("dossier_libelle", _("dossier_libelle")." :");              $form->setLib("dossier_libelle", __("dossier_libelle")." :");
9174              $form->setType("dossier_libelle", "static");              $form->setType("dossier_libelle", "static");
9175              $form->setVal("dossier_libelle", $infos['dossier_libelle']);              $form->setVal("dossier_libelle", $infos['dossier_libelle']);
9176    
9177              // Parametrage du champ evenement              // Parametrage du champ evenement
9178              $form->setLib("evenement", _("evenement")." :");              $form->setLib("evenement", __("evenement")." :");
9179              $form->setType("evenement", "static");              $form->setType("evenement", "static");
9180              $form->setVal("evenement", $infos['evenement']);              $form->setVal("evenement", $infos['evenement']);
9181    
9182              // Parametrage du champ autorite_competente              // Parametrage du champ autorite_competente
9183              $form->setLib("autorite_competente", _("Autorite competente")." :");              $form->setLib("autorite_competente", __("Autorite competente")." :");
9184              $form->setType("autorite_competente", "static");              $form->setType("autorite_competente", "static");
9185              $form->setVal("autorite_competente", $infos['autorite_competente']);              $form->setVal("autorite_competente", $infos['autorite_competente']);
9186    
9187              // Parametrage des libellés d'envoi avec RAR              // Parametrage des libellés d'envoi avec AR
9188              $form->setLib("date_envoi_rar", _("date_envoi_rar")." :");              $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
9189              $form->setLib("date_retour_rar", _("date_retour_rar")." :");              $form->setLib("date_retour_rar", __("date_notification")." :");
9190    
9191              $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");              $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
9192              $form->setLib("date_retour_signature", _("date_retour_signature")." :");              $form->setLib("date_retour_signature", __("date_retour_signature")." :");
9193              $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");              $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
9194              $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");              $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
9195              // Configuration des libellé en fonction de l'autorité compétente              // Configuration des libellé en fonction de l'autorité compétente
9196              if($infos['autorite_competente_code'] == 'ETAT') {              if($infos['autorite_competente_code'] == 'ETAT') {
9197                  $form->setType("date_envoi_controle_legalite", "hiddendate");                  $form->setType("date_envoi_controle_legalite", "hiddendate");
# Line 4787  class instruction extends instruction_ge Line 9199  class instruction extends instruction_ge
9199              }              }
9200    
9201              // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification              // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
9202              $form->setLib("is_valid", _("Valide")." :");              $form->setLib("is_valid", __("Valide")." :");
9203              $form->setType("is_valid", "hidden");              $form->setType("is_valid", "hidden");
9204              $form->setVal("is_valid", 'true');              $form->setVal("is_valid", 'true');
9205    
9206              $form->setFieldset('dossier_libelle','D',_('Synthese'));              $form->setFieldset('dossier_libelle','D',_('Synthese'));
9207              $form->setFieldset('is_valid','F');              $form->setFieldset('is_valid','F');
9208                
9209          }          }
9210    
9211    
# Line 4808  class instruction extends instruction_ge Line 9220  class instruction extends instruction_ge
9220          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
9221          //          //
9222          if(!$date_error) {          if(!$date_error) {
9223              $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));              $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9224          }          }
9225          // Si pas sur l'écran de validation          // Si pas sur l'écran de validation
9226          if(isset($infos)) {          if(isset($infos)) {
9227              echo "<a class=\"retour\" href=\"../scr/form.php?obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";              echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
9228                  echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;                  echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
9229              echo "\">Retour</a>";              echo "\">Retour</a>";
9230          }          }
# Line 4829  class instruction extends instruction_ge Line 9241  class instruction extends instruction_ge
9241      function view_pdf_lettre_rar() {      function view_pdf_lettre_rar() {
9242          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
9243          $this->checkAccessibility();          $this->checkAccessibility();
9244            //
9245            $this->f->disableLog();
9246    
9247          // XXX APP          if($this->f->get_submitted_get_value('liste') != null) {
9248                $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
         $f = $this->f;  
   
         $f->disableLog();  
   
         if($f->get_submitted_get_value('liste') != null) {  
             $listeCodeBarres = explode(',',$f->get_submitted_get_value('liste'));  
9249    
9250              // Classe permettant la mise en page de l'édition pdf              // Classe permettant la mise en page de l'édition pdf
9251              require_once "../obj/pdf_lettre_rar.class.php";              require_once "../obj/pdf_lettre_rar.class.php";
9252              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9253              // Initialisation de la mise en page              // Initialisation de la mise en page
9254              $pdf_lettre_rar->init($f);              $pdf_lettre_rar->init($this->f);
9255    
9256              foreach ($listeCodeBarres as $code_barres) {              foreach ($listeCodeBarres as $code_barres) {
9257    
9258                    // On récupère le dossier
9259                    $qres = $this->f->get_one_result_from_db_query(
9260                        sprintf(
9261                            'SELECT
9262                                dossier
9263                            FROM
9264                                %1$sinstruction
9265                            WHERE
9266                                code_barres = \'%2$s\'',
9267                            DB_PREFIXE,
9268                            $this->f->db->escapeSimple($code_barres)
9269                        ),
9270                        array(
9271                            "origin" => __METHOD__,
9272                        )
9273                    );
9274    
9275                    $inst_dossier = $this->f->get_inst__om_dbform(array(
9276                        "obj" => "dossier",
9277                        "idx" => $qres['result'],
9278                    ));
9279    
9280                    // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9281                    $groupe = $inst_dossier->get_type_affichage_formulaire();
9282                    switch ($groupe) {
9283                        case 'CTX IN':
9284                            $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
9285                            break;
9286                        case 'CTX RE':
9287                            $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
9288                            break;
9289                        case 'ADS':
9290                        case 'DPC':
9291                        case 'CONSULTATION ENTRANTE':
9292                        default:
9293                            $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9294                            break;
9295                    }
9296    
9297                  // Test si l'evenement est de type arrete et si un délégataire a été nommé                  // Test si l'evenement est de type arrete et si un délégataire a été nommé
9298                  $sql = "SELECT                  $qres = $this->f->get_all_results_from_db_query(
9299                        sprintf(
9300                            'SELECT
9301                              dossier.dossier_libelle,                              dossier.dossier_libelle,
9302                              evenement.type,                              evenement.type,
9303                              count(lien_dossier_demandeur) as nbdemandeur,                              count(lien_dossier_demandeur) as nbdemandeur,
9304                              CASE                              CASE
9305                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9306                                      THEN CONCAT(phase.code, ' - ', division.libelle)                                      THEN CONCAT(phase.code, \' - \', division.libelle)
9307                                  ELSE                                  ELSE
9308                                      phase.code                                      phase.code
9309                              END AS code_phase                              END AS code_phase
9310                          FROM ".DB_PREFIXE."instruction                          FROM
9311                          LEFT JOIN ".DB_PREFIXE."dossier                              %1$sinstruction
9312                              ON instruction.dossier = dossier.dossier                              LEFT JOIN %1$sdossier
9313                          LEFT JOIN ".DB_PREFIXE."division                                  ON instruction.dossier = dossier.dossier
9314                              ON dossier.division = division.division                              LEFT JOIN %1$sdivision
9315                          INNER JOIN ".DB_PREFIXE."evenement ON                                  ON dossier.division = division.division
9316                              instruction.evenement=evenement.evenement                              INNER JOIN %1$sevenement
9317                          LEFT JOIN ".DB_PREFIXE."phase                                  ON instruction.evenement=evenement.evenement
9318                              ON evenement.phase = phase.phase                              LEFT JOIN %1$sphase
9319                          inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON                                  ON evenement.phase = phase.phase
9320                              instruction.dossier=lien_dossier_demandeur.dossier                              inner JOIN %1$slien_dossier_demandeur
9321                          inner join ".DB_PREFIXE."demandeur on                                  ON instruction.dossier=lien_dossier_demandeur.dossier
9322                              demandeur.demandeur=lien_dossier_demandeur.demandeur                              inner join %1$sdemandeur
9323                          WHERE code_barres='".$code_barres."'                                  ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9324                              AND ((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire')                          WHERE
9325                              OR demandeur.type_demandeur='delegataire')                              code_barres = \'%2$s\'
9326                          GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";                              AND %3$s
9327                            GROUP BY
9328                  $res = $f->db->query($sql);                              dossier.dossier_libelle,
9329                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                              evenement.type,
9330                  $f->isDatabaseError($res);                              phase.code,
9331                  $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);                              division.libelle',
9332                                            DB_PREFIXE,
9333                            $this->f->db->escapeSimple($code_barres),
9334                            $sql_demandeur
9335                        ),
9336                        array(
9337                            "origin" => __METHOD__
9338                        )
9339                    );
9340                    $testDemandeur = array_shift($qres['result']);
9341    
                 // Recuperation de l'adresse de destination  
                 $sqlAdresse = "SELECT  
                     CASE WHEN demandeur.qualite='particulier'  
                         THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))  
                         ELSE TRIM(demandeur.personne_morale_denomination)  
                     END  as ligne1,  
                     CASE WHEN demandeur.qualite='personne_morale'  
                         THEN TRIM(demandeur.personne_morale_raison_sociale)  
                         ELSE ''  
                     END as ligne1_1,  
                     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)  
                         THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))  
                         ELSE ''  
                     END as ligne1_2,  
                     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,  
                     CASE demandeur.complement  
                     WHEN null THEN ''  
                     ELSE trim(demandeur.complement)  
                     END as ligne3,  
                     CASE demandeur.lieu_dit  
                     WHEN null THEN ''  
                     ELSE trim(demandeur.lieu_dit)  
                     END as ligne4,  
                     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,  
                         (CASE WHEN demandeur.bp IS NOT NULL  
                             THEN CONCAT_WS(' ', 'BP', demandeur.bp)  
                             ELSE ''  
                         END),  
                         (CASE WHEN demandeur.cedex IS NOT NULL  
                             THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)  
                             ELSE ''  
                         END))  
                     as ligne5,  
                     code_barres as code_barres  
                 FROM ".DB_PREFIXE."instruction  
                 INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier  
                 INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier  
                 INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur  
                 LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite  
                 WHERE instruction.code_barres ='".$code_barres."'";  
9342    
9343                    // Recuperation de l'adresse de destination
9344                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9345                  if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {                  $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9346                      $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";                  if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9347                  } else {                      $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9348                      $sqlAdresse .= " AND lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire'";                  }
9349                  }  
9350                    $qres = $this->f->get_all_results_from_db_query(
9351                  $resAdresse = $f->db->query($sqlAdresse);                      sprintf(
9352                  $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);                          'SELECT
9353                  $f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);                              CASE WHEN demandeur.qualite = \'particulier\'
9354                  $f->isDatabaseError($resAdresse);                                  THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9355                                    ELSE TRIM(demandeur.personne_morale_denomination)
9356                                END  as ligne1,
9357                                CASE WHEN demandeur.qualite = \'personne_morale\'
9358                                    THEN TRIM(demandeur.personne_morale_raison_sociale)
9359                                    ELSE \'\'
9360                                END as ligne1_1,
9361                                CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9362                                    THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9363                                    ELSE \'\'
9364                                END as ligne1_2,
9365                                trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9366                                CASE demandeur.complement
9367                                WHEN null THEN \'\'
9368                                ELSE trim(demandeur.complement)
9369                                END as ligne3,
9370                                CASE demandeur.lieu_dit
9371                                WHEN null THEN \'\'
9372                                ELSE trim(demandeur.lieu_dit)
9373                                END as ligne4,
9374                                CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9375                                    (CASE WHEN demandeur.bp IS NOT NULL
9376                                        THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9377                                        ELSE \'\'
9378                                    END),
9379                                    (CASE WHEN demandeur.cedex IS NOT NULL
9380                                        THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9381                                        ELSE \'\'
9382                                    END))
9383                                as ligne5,
9384                                code_barres as code_barres
9385                            FROM
9386                                %1$sinstruction
9387                                INNER JOIN %1$sdossier
9388                                    ON dossier.dossier = instruction.dossier
9389                                INNER JOIN %1$slien_dossier_demandeur
9390                                    ON dossier.dossier = lien_dossier_demandeur.dossier
9391                                INNER JOIN %1$sdemandeur
9392                                    ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9393                                LEFT OUTER JOIN %1$scivilite AS pc
9394                                    ON demandeur.particulier_civilite = pc.civilite
9395                                        OR demandeur.personne_morale_civilite = pc.civilite
9396                            WHERE
9397                                instruction.code_barres = \'%2$s\'
9398                                %3$s',
9399                            DB_PREFIXE,
9400                            $this->f->db->escapeSimple($code_barres),
9401                            $sqlAdresse
9402                        ),
9403                        array(
9404                            "origin" => __METHOD__
9405                        )
9406                    );
9407                    $adresse_dest = array_shift($qres['result']);
9408    
9409                  // Création adresse destinataire sans ligne vide                  // Création adresse destinataire sans ligne vide
9410                  $adresse_destinataire = array();                  $adresse_destinataire = array();
# Line 4952  class instruction extends instruction_ge Line 9423  class instruction extends instruction_ge
9423                  }                  }
9424                  if (!empty($adresse_dest['ligne4'])) {                  if (!empty($adresse_dest['ligne4'])) {
9425                      $adresse_destinataire[] = $adresse_dest['ligne4'];                      $adresse_destinataire[] = $adresse_dest['ligne4'];
9426                  }                          }
9427                  $adresse_destinataire[] = $adresse_dest['ligne5'];                  $adresse_destinataire[] = $adresse_dest['ligne5'];
9428    
9429                  // Création du champ specifique                  // Création du champ specifique
# Line 4963  class instruction extends instruction_ge Line 9434  class instruction extends instruction_ge
9434                  $specifique_content[] = $testDemandeur['dossier_libelle'];                  $specifique_content[] = $testDemandeur['dossier_libelle'];
9435                  $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";                  $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9436                  unset($adresse_dest['code_barres']);                  unset($adresse_dest['code_barres']);
   
9437                  // Ajout d'une page aux pdf                  // Ajout d'une page aux pdf
9438                  $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);                  $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9439    
9440              }              }
9441              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9442              require_once PATH_OPENMAIRIE."om_edition.class.php";              $om_edition = $this->f->get_inst__om_edition();
9443              $om_edition = new edition();              $om_edition->set_object_linked($this);
9444              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9445          }          }
9446      }      }
# Line 4981  class instruction extends instruction_ge Line 9451  class instruction extends instruction_ge
9451       * Formulaire demandant :       * Formulaire demandant :
9452       * - le code-barres de l'événement d'instruction       * - le code-barres de l'événement d'instruction
9453       * - la date d'envoi du courrier pour signature par le maire       * - la date d'envoi du courrier pour signature par le maire
9454       *       *
9455       * Lors de la validation :       * Lors de la validation :
9456       *   => met à jour cette date dans l'événement d'instruction       *   => met à jour cette date dans l'événement d'instruction
9457       *   => crée un lien permettant de générer en PDF le bordereau       *   => crée un lien permettant de générer en PDF le bordereau
# Line 5024  class instruction extends instruction_ge Line 9494  class instruction extends instruction_ge
9494                      if ($id_instruction !== null) {                      if ($id_instruction !== null) {
9495                          $ret = $this->update_date_envoi_signature($id_instruction, $date_en);                          $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9496                          // Si mise à jour réussie de la date d'envoi du courrier                          // Si mise à jour réussie de la date d'envoi du courrier
9497                          // pour signature par l'autorité compétente                          // pour signature par l'autorité compétente
9498                          if($ret === true) {                          if($ret === true) {
9499                              // Message de validation avec lien PDF                              // Message de validation avec lien PDF
9500                              $message_class = "valid";                              $message_class = "valid";
9501                              $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");                              $message = '&bullet; '.__("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9502                              $message .= " : <br/><br/>";                              $message .= " : <br/><br/>";
9503                              $message .= "<a class='om-prev-icon pdf-16'";                              $message .= "<a class='om-prev-icon pdf-16'";
9504                              $message .= " id=\"generer_bordereau_envoi_maire\"";                              $message .= " id=\"generer_bordereau_envoi_maire\"";
9505                              $message .= " title=\""._("Bordereau")."\"";                              $message .= " title=\"".__("Bordereau")."\"";
9506                              $message .= " href='../scr/form.php?obj=instruction";                              $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9507                              $message .= "&action=200";                              $message .= "&action=200";
9508                              $message .= "&idx=".$id_instruction."'";                              $message .= "&idx=".$id_instruction."'";
9509                              $message .= " target='_blank'>";                              $message .= " target='_blank'>";
9510                              $message .= _("Bordereau d'envoi au maire");                              $message .= __("Bordereau d'envoi au maire");
9511                              $message .= "</a><br/><br/>";                              $message .= "</a><br/><br/>";
9512                              $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";                              $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9513                              $message .= _("Code du courrier")." : ".$code_barres."<br/>";                              $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9514                              $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;                              $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9515                                
9516                          } else {                          } else {
9517                              // Message d'erreur                              // Message d'erreur
9518                              $message_class = "error";                              $message_class = "error";
9519                              $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),                              $message = sprintf(__("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9520                                  $code_barres);                                  $code_barres);
9521                          }                          }
9522                      }                      }
9523                      else {                      else {
9524                          $message_class = "error";                          $message_class = "error";
9525                          $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");                          $message = __("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9526                      }                      }
9527                  }                  }
9528                  else {                  else {
9529                      $message_class = "error";                      $message_class = "error";
9530                      $message = _("La date est invalide.");                      $message = __("La date est invalide.");
9531                  }                  }
9532              } else {              } else {
9533                  $message_class = "error";                  $message_class = "error";
9534                  $message = _("Tous les champs doivent etre remplis.");                  $message = __("Tous les champs doivent etre remplis.");
9535              }              }
9536          }          }
9537    
# Line 5074  class instruction extends instruction_ge Line 9544  class instruction extends instruction_ge
9544              $this->f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
9545          }          }
9546    
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
9547          // Ouverture du formulaire          // Ouverture du formulaire
9548          $datasubmit = $this->getDataSubmit();          $datasubmit = $this->getDataSubmit();
9549          echo "\n<!-- ########## START DBFORM ########## -->\n";          echo "\n<!-- ########## START DBFORM ########## -->\n";
# Line 5092  class instruction extends instruction_ge Line 9560  class instruction extends instruction_ge
9560          $champs = array("code_barres","date");          $champs = array("code_barres","date");
9561    
9562          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
9563          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
9564                "validation" => 0,
9565                "maj" => 0,
9566                "champs" => $champs,
9567            ));
9568    
9569          $template_required_label = '%s *';          $template_required_label = '%s *';
9570          // Parametrage du champ code_barres          // Parametrage du champ code_barres
# Line 5121  class instruction extends instruction_ge Line 9593  class instruction extends instruction_ge
9593          // Affichage du bouton          // Affichage du bouton
9594          printf("\t<div class=\"formControls\">\n");          printf("\t<div class=\"formControls\">\n");
9595          //          //
9596          $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9597          printf("\t</div>\n");          printf("\t</div>\n");
9598          // Fermeture du formulaire          // Fermeture du formulaire
9599          printf("\t</form>\n");          printf("\t</form>\n");
# Line 5129  class instruction extends instruction_ge Line 9601  class instruction extends instruction_ge
9601    
9602      /**      /**
9603       * VIEW - view_bordereau_envoi_maire.       * VIEW - view_bordereau_envoi_maire.
9604       *       *
9605       * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié       * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9606       *       *
9607       * @return [void]       * @return [void]
9608       */       */
9609      function view_generate_bordereau_envoi_maire() {      function view_generate_bordereau_envoi_maire() {
# Line 5145  class instruction extends instruction_ge Line 9617  class instruction extends instruction_ge
9617          $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));          $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9618          // Affichage du PDF          // Affichage du PDF
9619          $this->expose_pdf_output(          $this->expose_pdf_output(
9620              $result['pdf_output'],              $result['pdf_output'],
9621              $result['filename']              $result['filename']
9622          );          );
9623      }      }
9624    
9625      /**      /**
9626         * VIEW - view_rapport_instruction.
9627         *
9628         * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9629         * Cette action est bindée pour utiliser la fonction popUpIt.
9630         *
9631         * @return void
9632         */
9633        function view_overlay_notification_manuelle() {
9634    
9635            // Vérification de l'accessibilité sur l'élément
9636            $this->checkAccessibility();
9637    
9638            printf(
9639                '<script type="text/javascript" >
9640                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9641                </script>',
9642                'instruction_notification_manuelle',
9643                OM_ROUTE_SOUSFORM,
9644                $this->getVal($this->clePrimaire),
9645                $this->getVal('dossier')
9646            );
9647        }
9648    
9649        /**
9650         * VIEW - view_overlay_notification_service_consulte.
9651         *
9652         * Ouvre le sous-formulaire de notification des services consulte
9653         * en ajaxIt dans un overlay.
9654         * Cette action est bindée pour utiliser la fonction popUpIt.
9655         *
9656         * @return void
9657         */
9658        function view_overlay_notification_service_consulte() {
9659    
9660            // Vérification de l'accessibilité sur l'élément
9661            $this->checkAccessibility();
9662    
9663            printf(
9664                '<script type="text/javascript" >
9665                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9666                </script>',
9667                'instruction_notification_manuelle',
9668                OM_ROUTE_SOUSFORM,
9669                $this->getVal($this->clePrimaire),
9670                $this->getVal('dossier')
9671            );
9672        }
9673    
9674        /**
9675         * VIEW - overlay_notification_tiers_consulte.
9676         *
9677         * Ouvre le sous-formulaire de notification des tiers consulte
9678         * en ajaxIt dans un overlay.
9679         * Cette action est bindée pour utiliser la fonction popUpIt.
9680         *
9681         * @return void
9682         */
9683        function view_overlay_notification_tiers_consulte() {
9684    
9685            // Vérification de l'accessibilité sur l'élément
9686            $this->checkAccessibility();
9687    
9688            printf(
9689                '<script type="text/javascript" >
9690                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9691                </script>',
9692                'instruction_notification_manuelle',
9693                OM_ROUTE_SOUSFORM,
9694                $this->getVal($this->clePrimaire),
9695                $this->getVal('dossier')
9696            );
9697        }
9698    
9699        /**
9700         * VIEW - view_modale_selection_document_signe
9701         *
9702         * Ouvre le sous-formulaire de notification des services consulte
9703         * en ajaxIt dans un overlay.
9704         * Cette action est bindée pour utiliser la fonction popUpIt.
9705         *
9706         * @return void
9707         */
9708        function view_modale_selection_document_signe() {
9709    
9710            // Vérification de l'accessibilité sur l'élément
9711            $this->checkAccessibility();
9712    
9713            printf(
9714                '<script type="text/javascript" >
9715                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9716                </script>',
9717                'instruction_modale',
9718                OM_ROUTE_SOUSFORM,
9719                $this->getVal($this->clePrimaire),
9720                $this->getVal('dossier')
9721            );
9722        }
9723    
9724        /**
9725       * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre       * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9726       * pour exclure les dossiers du groupe contentieux.       * pour exclure les dossiers du groupe contentieux.
9727       *       *
9728       * @param   [string]  $barcode  numéro du code-barres       * @param   [string]  $barcode  numéro du code-barres
9729       * @return  [mixed]             ID de son instruction ou null si aucun code       * @return  [mixed]             ID de son instruction ou null si aucun code
9730       */       */
9731      function get_instruction_by_barcode($barcode) {      function get_instruction_by_barcode($barcode) {
9732          // Begin          // Begin
9733          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9734    
9735          // Vérification de l'existence de l'événement d'instruction          // Vérification de l'existence de l'événement d'instruction
9736          // pour le code-barres donné, en excluant les dossiers liés au groupe CTX          // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9737          $sql = "SELECT instruction          $qres = $this->f->get_one_result_from_db_query(
9738                  FROM ".DB_PREFIXE."instruction              sprintf(
9739                      INNER JOIN ".DB_PREFIXE."dossier                  'SELECT
9740                        instruction
9741                    FROM
9742                        %1$sinstruction
9743                        INNER JOIN %1$sdossier
9744                          ON dossier.dossier=instruction.dossier                          ON dossier.dossier=instruction.dossier
9745                      INNER JOIN ".DB_PREFIXE."dossier_instruction_type                      INNER JOIN %1$sdossier_instruction_type
9746                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9747                      INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                      INNER JOIN %1$sdossier_autorisation_type_detaille
9748                          ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                          ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9749                      INNER JOIN ".DB_PREFIXE."dossier_autorisation_type                      INNER JOIN %1$sdossier_autorisation_type
9750                          ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type                          ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9751                      INNER JOIN ".DB_PREFIXE."groupe                      INNER JOIN %1$sgroupe
9752                          ON dossier_autorisation_type.groupe = groupe.groupe                          ON dossier_autorisation_type.groupe = groupe.groupe
9753                              AND groupe.code != 'CTX'                              AND groupe.code != \'CTX\'
9754                  WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";                  WHERE
9755          $res = $this->f->db->getOne($sql);                      code_barres = \'%2$s\'',
9756          $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);                  DB_PREFIXE,
9757          $this->f->isDatabaseError($res);                  $this->f->db->escapeSimple($barcode)
9758                ),
9759                array(
9760                    "origin" => __METHOD__,
9761                )
9762            );
9763    
9764          // Retourne résultat          // Retourne résultat
9765          return $this->end_treatment(__METHOD__, $res);          return $this->end_treatment(__METHOD__, $qres['result']);
9766      }      }
9767    
9768      /**      /**
9769       * Met à jour le champ date d'envoi signature       * Met à jour le champ date d'envoi signature
9770       * avec la date fournie et pour l'instruction donnée       * avec la date fournie et pour l'instruction donnée
9771       *       *
9772       * @param   [string]   $id    ID de l'événement d'instruction       * @param   [string]   $id    ID de l'événement d'instruction
9773       * @param   [string]   $date  date au format EN       * @param   [string]   $date  date au format EN
9774       * @return  [boolean]         true si mise à jour avec succès       * @return  [boolean]         true si mise à jour avec succès
# Line 5198  class instruction extends instruction_ge Line 9780  class instruction extends instruction_ge
9780          // Begin          // Begin
9781          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9782          // Requête          // Requête
9783          $res = $this->db->autoExecute(          $res = $this->f->db->autoexecute(
9784              DB_PREFIXE.$this->table,              DB_PREFIXE.$this->table,
9785              $valF,              $valF,
9786              DB_AUTOQUERY_UPDATE,              DB_AUTOQUERY_UPDATE,
9787              $this->getCle($id)              $this->getCle($id)
9788          );          );
9789          // S'il y a eu une erreur          $this->addToLog(
9790          if (database::isError($res, true)) {              __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9791                VERBOSE_MODE
9792            );
9793            if ($this->f->isDatabaseError($res, true) !== false) {
9794              $this->end_treatment(__METHOD__, false);              $this->end_treatment(__METHOD__, false);
9795          }          }
9796          //          //
# Line 5217  class instruction extends instruction_ge Line 9802  class instruction extends instruction_ge
9802       * validation du formulaire d'ajout.       * validation du formulaire d'ajout.
9803       * @param array $val tableau des valeurs retournées par le formulaire       * @param array $val tableau des valeurs retournées par le formulaire
9804       */       */
9805      function setValFAjout($val) {      function setValFAjout($val = array()) {
9806          // Mise à jour du flag created_by_commune lors d'un changement de décision          // Mise à jour du flag created_by_commune lors d'un changement de décision
9807          // par un utilisateur de commune sur un dossier instruit par la comcom          // par un utilisateur de commune sur un dossier instruit par la comcom
9808          if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {          if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9809              $this->valF['created_by_commune'] = true;              $this->valF['created_by_commune'] = true;
9810          }          }
9811    
9812            //
9813            if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9814                if (isset($this->valF['flag_edition_integrale']) === true) {
9815                    unset($this->valF['flag_edition_integrale']);
9816                }
9817                if (isset($this->valF['signataire_arrete']) === true) {
9818                    unset($this->valF['signataire_arrete']);
9819                }
9820                if (isset($this->valF['tiers_destinataire']) === true) {
9821                    unset($this->valF['tiers_destinataire']);
9822                }
9823            }
9824      }      }
9825    
9826    
# Line 5292  class instruction extends instruction_ge Line 9890  class instruction extends instruction_ge
9890    
9891      /**      /**
9892       * Retourne le contexte de déboguage formaté en HTML.       * Retourne le contexte de déboguage formaté en HTML.
9893       *       *
9894       * @return string Une ligne par trace       * @return string Une ligne par trace
9895       */       */
9896      private function get_backtrace() {      private function get_backtrace() {
# Line 5368  class instruction extends instruction_ge Line 9966  class instruction extends instruction_ge
9966          // Cette méthode permet d'exécuter une routine en début des méthodes          // Cette méthode permet d'exécuter une routine en début des méthodes
9967          // dites de TREATMENT.          // dites de TREATMENT.
9968          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9969          // Définition des paramètres          $message = __('Erreur de paramétrage :');
9970          $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';          $erreurParametrage = false;
9971          $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';          // Récupération du paramétrage de la collectivité du dossier
         $p_courriel = 'param_courriel_de_notification_commune';  
         // Définition des variables de substitution  
9972          $id_di = $this->getVal('dossier');          $id_di = $this->getVal('dossier');
         $id_inst = $this->getVal($this->clePrimaire);  
         // Instanciation du DI  
9973          $di = $this->get_inst_dossier($id_di);          $di = $this->get_inst_dossier($id_di);
         // Récupération du paramétrage de la collectivité du dossier  
9974          $collectivite_di = $di->getVal('om_collectivite');          $collectivite_di = $di->getVal('om_collectivite');
9975          $params_mono = $this->f->getCollectivite($collectivite_di);          // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9976          // Récupération du paramétrage de la collectivité multi          $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9977          $collectivite_multi = $this->f->get_idx_collectivite_multi();          if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9978          $params_multi = $this->f->getCollectivite($collectivite_multi);              $erreurParametrage = true;
9979          // Vérification de l'objet (obligatoirement multi)              $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9980          $objet = null;          }
9981          if (isset($params_multi[$p_objet]) === true  
9982              && $params_multi[$p_objet] !== '') {          // Récupération de la liste des mails
9983              $objet = $params_multi[$p_objet];          $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9984          }          if (empty($adresses)) {
9985          // Vérification du modèle mono en priorité              $erreurParametrage = true;
9986          $modele = null;              $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9987          if (isset($params_mono[$p_modele]) === true          }
9988              && $params_mono[$p_modele] !== '') {  
9989              $modele = $params_mono[$p_modele];          // Vérification du paramétrage des mails
9990                        $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9991          }          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9992          // Sinon vérification du modèle multi              $erreurParametrage = true;
9993          if ($modele === null              $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9994              && isset($params_multi[$p_modele]) === true          }
9995              && $params_multi[$p_modele] !== '') {          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9996              $modele = $params_multi[$p_modele];              $erreurParametrage = true;
9997          }              $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9998          // Vérification des adresses de courriel mono          }
9999          $courriels_valides = array();  
10000          $courriels_invalides = array();          // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
10001          if (isset($params_mono[$p_courriel]) === true          // un message a destination de l'utilisateur est affiché
10002              && $params_mono[$p_courriel] !== '') {          if ($erreurParametrage) {
10003              // Un mail par ligne              $message .= '<br>'.__("Veuillez contacter votre administrateur.");
10004              $adresses = explode("\n", $params_mono[$p_courriel]);              $this->addToMessage($message);
10005              // Vérification de la validité de chaque mail avec preg_match              return $this->end_treatment(__METHOD__, false);
             foreach ($adresses as $adresse) {  
                 $adresse = trim($adresse);  
                 if ($this->f->checkValidEmailAddress($adresse) === 1) {  
                     $courriels_valides[] = $adresse;  
                 } else {  
                     $courriels_invalides[] = $adresse;  
                 }  
             }  
10006          }          }
10007          // Vérification du paramétrage global :  
10008          // on stoppe le traitement si au moins un paramètre est incorrect          // Création d'un notification et de sa tâche associé pour chaque mail
10009          if ($objet === null          foreach ($adresses as $adresse) {
10010              || $modele === null              // Ajout de la notif et récupération de son id
10011              || count($courriels_valides) === 0              $destinataire = array(
10012              || count($courriels_invalides) > 0) {                  'destinataire' => $adresse,
10013              // On construit le message d'erreur adéquat                  'courriel' => $adresse
10014              $this->addToMessage(_('Erreur de paramétrage :'));              );
10015              if ($objet === null) {              $idNotif = $this->ajouter_notification(
10016                  $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));                  $this->getVal($this->clePrimaire),
10017              }                  $this->f->get_connected_user_login_name(),
10018              if ($modele === null) {                  $destinataire,
10019                  $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));                  $collectivite_di
10020              }              );
10021              if (count($courriels_valides) === 0) {              if ($idNotif === false) {
10022                  $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));                  $this->addToMessage(__("Veuillez contacter votre administrateur."));
10023                    return $this->end_treatment(__METHOD__, false);
10024              }              }
10025              if (count($courriels_invalides) > 0) {              // Création de la tache en lui donnant l'id de la notification
10026                  $courriels_invalides = implode(', ', $courriels_invalides);              $notification_by_task = $this->notification_by_task(
10027                  $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);                  $idNotif,
10028                    $this->getVal('dossier'),
10029                    'mail',
10030                    'notification_commune'
10031                );
10032                if ($notification_by_task === false) {
10033                    $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
10034                    $this->addToMessage(__("Veuillez contacter votre administrateur."));
10035                    return $this->end_treatment(__METHOD__, false);
10036              }              }
             $this->addToMessage(_("Veuillez contacter votre administrateur."));  
             return $this->end_treatment(__METHOD__, false);  
         }  
         // Remplacement des variables de substitution  
         $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);  
         $modele = $this->formater_modele($modele, $id_di, $id_inst);  
         // Exécution du traitement d'envoi du/des mail(s)  
         $fails = array();  
         foreach ($courriels_valides as $email) {  
             if ($this->f->sendMail(  
                 iconv("UTF-8", "CP1252", $objet),  
                 iconv("UTF-8", "CP1252", $modele),  
                 iconv("UTF-8", "CP1252", $email)) === false) {  
                 $fails[] = $email;  
             }  
         }  
         // Si échec message d'erreur et arrêt du traitement  
         if (count($fails) > 0) {  
             $fails = implode(', ', $fails);  
             $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);  
             $this->addToMessage(_("Veuillez contacter votre administrateur."));  
             return $this->end_treatment(__METHOD__, false);  
10037          }          }
10038          // Ajout du log          $this->addToMessage(__('La commune a été notifiée.'));
         $this->setValFFromVal();  
         $val_inst = $this->valF;  
         $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);  
         if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {  
             $this->addToMessage(_("Erreur lors de la notification."));  
             $this->addToMessage(_("Veuillez contacter votre administrateur."));  
             return $this->end_treatment(__METHOD__, false);  
         }  
         // Message de validation  
         $this->addToMessage(_('La commune a été notifiée.'));  
10039          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
10040      }      }
10041    
10042      /**      /**
      * Formatte le corps du courriel notifié aux communes  
      *  
      * @param   string  $modele   template du modèle du courriel  
      * @param   string  $id_di    clé primaire du DI  
      * @param   string  $id_inst  clé primaire de l'instruction  
      * @return  string            corps du mail au format HTML  
      */  
     public function formater_modele($modele, $id_di, $id_inst) {  
         // Création du lien d'accès direct à l'instruction  
         $url_inst = PATH_BASE_URL.'spg/direct_link.php?obj=dossier_instruction&action=3'.  
             '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;  
         $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';  
         // Remplacement des champs de fusion  
         $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);  
         $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);  
         $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);  
         // Encodage HTML des sauts de ligne  
         $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);  
         //  
         return $modele;  
     }  
   
   
     /**  
10043       * Récupère l'instance de l'instructeur       * Récupère l'instance de l'instructeur
10044       *       *
10045       * @param integer $instructeur Identifiant de l'instructeur.       * @param integer $instructeur Identifiant de l'instructeur.
# Line 5581  class instruction extends instruction_ge Line 10119  class instruction extends instruction_ge
10119       * formulaire d'ajout.       * formulaire d'ajout.
10120       * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le       * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
10121       * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.       * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
10122       *       *
10123       */       */
10124      function can_user_access_dossier_contexte_ajout() {      function can_user_access_dossier_contexte_ajout() {
10125    
10126          ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =          ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
10127              $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");              $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
10128          //          //
10129          if ($id_dossier !== "") {          if ($id_dossier !== "") {
10130              require_once "../obj/dossier_instruction.class.php";              $dossier = $this->f->get_inst__om_dbform(array(
10131              $dossier = new dossier_instruction($id_dossier, $f->db, DEBUG);                  "obj" => "dossier_instruction",
10132                    "idx" => $id_dossier,
10133                ));
10134              //              //
10135              return $dossier->can_user_access_dossier();              return $dossier->can_user_access_dossier();
10136          }          }
# Line 5603  class instruction extends instruction_ge Line 10143  class instruction extends instruction_ge
10143       * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.       * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
10144       * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le       * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
10145       * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.       * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
10146       *       *
10147       */       */
10148      function can_user_access_dossier_contexte_modification() {      function can_user_access_dossier_contexte_modification() {
10149    
10150          $id_dossier = $this->getVal('dossier');          $id_dossier = $this->getVal('dossier');
10151          //          //
10152          if ($id_dossier !== "" && $id_dossier !== null) {          if ($id_dossier !== "" && $id_dossier !== null) {
10153              require_once "../obj/dossier_instruction.class.php";              $dossier = $this->f->get_inst__om_dbform(array(
10154              $dossier = new dossier_instruction($id_dossier, $f->db, DEBUG);                  "obj" => "dossier_instruction",
10155                    "idx" => $id_dossier,
10156                ));
10157              //              //
10158              return $dossier->can_user_access_dossier();              return $dossier->can_user_access_dossier();
10159          }          }
10160          return false;          return false;
10161      }      }
10162    
10163  }// fin classe      /**
10164         * TREATMENT - envoyer_a_signature_sans_relecture
10165         *
10166         * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
10167         *
10168         * @return boolean true si l'envoi a été effectué avec succès false sinon
10169         */
10170        function envoyer_a_signature_sans_relecture() {
10171            return $this->envoyer_a_signature();
10172        }
10173    
10174        /**
10175         * TREATMENT - envoyer_a_signature_avec_relecture
10176         *
10177         * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
10178         *
10179         * @return boolean true si l'envoi a été effectué avec succès false sinon
10180         */
10181        function envoyer_a_signature_avec_relecture() {
10182            $is_forced_view_files = true;
10183            return $this->envoyer_a_signature($is_forced_view_files);
10184        }
10185    
10186        /**
10187         * TREATMENT - envoyer_a_signature
10188         *
10189         * Permet d'envoyer le document de l'instruction au parapheur pour signature
10190         *
10191         * @param  boolean  $is_forced_view_files  Indique si il y a une relecture (true) ou non (false)
10192         *
10193         * @return boolean true si l'envoi a été effectué avec succès false sinon
10194         */
10195        function envoyer_a_signature($is_forced_view_files = false) {
10196            $this->begin_treatment(__METHOD__);
10197            $this->correct = true;
10198    
10199            // Instanciation de l'objet signataire_arrete
10200            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
10201                'obj' => 'signataire_arrete',
10202                'idx' => $this->getVal('signataire_arrete'),
10203            ));
10204    
10205            // Instanciation de l'objet dossier
10206            $inst_dossier = $this->f->get_inst__om_dbform(array(
10207                'obj' => 'dossier',
10208                'idx' => $this->getVal('dossier'),
10209            ));
10210    
10211            //Instanciation de la classe electronicsignature
10212            $inst_es = $this->get_electronicsignature_instance();
10213            if ($inst_es === false) {
10214                $this->correct = false;
10215                return $this->end_treatment(__METHOD__, false);
10216            }
10217    
10218            // Vérifie si la notification se fait via l'application ou via le parapheur
10219            try {
10220                $notification_required = $inst_es->signer_notification_is_delegated();
10221            } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10222                // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10223                $notification_required = false;
10224            }
10225    
10226            // Si la notification est faite par l'application vérifie que l'adresse mail du
10227            // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10228            // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10229            // notification
10230            if ($notification_required === true) {
10231                $signer_mail = $inst_signataire_arrete->getVal('email');
10232                $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10233    
10234                $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10235    
10236                if (empty($signer_mail)) {
10237                    $this->correct = false;
10238                    $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10239                    $this->addToMessage($err_msg.$err_detail);
10240                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10241                    return $this->end_treatment(__METHOD__, false);
10242                }
10243                if (! $this->f->checkValidEmailAddress($signer_mail)) {
10244                    $this->correct = false;
10245                    $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10246                    $this->addToMessage($err_msg.$err_detail);
10247                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10248                    return $this->end_treatment(__METHOD__, false);
10249                }
10250            }
10251    
10252            // Récupération du document à signer
10253            $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10254            if ($file === OP_FAILURE) {
10255                $this->correct = false;
10256                $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10257                // Termine le traitement
10258                return $this->end_treatment(__METHOD__, false);
10259            }
10260    
10261            // Initialisation des paramètre à passer pour l'envoi en signature
10262            $this->f->getUserInfos();
10263            $data = array(
10264                "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10265                "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10266                "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10267                "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10268                "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10269                // Permet d'envoyer en signature l'instruction le jour de la date limite
10270                "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10271                "dossier" => $this->getVal('dossier'),
10272                "is_forced_view_files" => $is_forced_view_files,
10273                'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10274                'instruction' => $this->getVal($this->clePrimaire),
10275                'last_statut_signature' => $this->getVal('statut_signature'),
10276                'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10277            );
10278    
10279            // Initialisation des métadonnées
10280            $metadonnee_dossier = $file['metadata'];
10281            // Récupération du libellé du document transmis au parapheur
10282            $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10283            $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10284    
10285            $metadonnee_dossier['url_di'] = sprintf(
10286                '%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',
10287                $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10288                $this->getVal('dossier')
10289            );
10290    
10291            $optional_data = null;
10292            // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10293            if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10294                $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10295                if (json_last_error() !== JSON_ERROR_NONE) {
10296                    $this->correct = false;
10297                    $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10298                    $this->addToLog(__METHOD__."(): ".
10299                        __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10300                            Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10301                    );
10302                    // Termine le traitement
10303                    return $this->end_treatment(__METHOD__, false);
10304                }
10305            }
10306    
10307            // Appel de la méthode de l'abstracteur send_for_signature()
10308            // Cette méthode doit retourner un tableau de valeur
10309            try {
10310                $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10311            }  catch (electronicsignature_exception $e) {
10312                $this->handle_electronicsignature_exception($e);
10313                return $this->end_treatment(__METHOD__, false);
10314            }
10315    
10316            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10317            $valF = array();
10318    
10319            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10320            foreach($this->champs as $identifiant => $champ) {
10321                $valF[$champ] = $this->val[$identifiant];
10322            }
10323            // On fait ensuite nos modifications spécifiques
10324            $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10325            $valF['statut_signature'] = $result['statut'];
10326            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10327            $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10328            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10329            $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10330            $this->setParameter("maj", 1);
10331            $ret = $this->modifier($valF);
10332    
10333            if ($ret === false) {
10334                $this->correct = false;
10335                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10336                // Termine le traitement
10337                return $this->end_treatment(__METHOD__, false);
10338            }
10339    
10340            // Notification du signataire
10341            if ($notification_required === true) {
10342                if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10343                    $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10344                    $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10345                    $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10346                    // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10347                    // precedemment
10348                    $this->init_record_data($this->getVal($this->clePrimaire));
10349                    $this->annuler_envoi_en_signature();
10350                    $this->correct = false;
10351                    return $this->end_treatment(__METHOD__, true);
10352                }
10353            }
10354    
10355            // Message
10356            $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10357            if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10358                && array_key_exists('signature_page_url', $result) === true) {
10359                $this->addToMessage(sprintf(
10360                    '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10361                    $result['signature_page_url'],
10362                    __("Signez directement le document")
10363                ));
10364            }
10365            if ($notification_required !== true) {
10366                $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10367            }
10368    
10369            // Tout s'est bien passé, on termine le traitement
10370            return $this->end_treatment(__METHOD__, true);
10371        }
10372    
10373        /**
10374         * Notifie le signataire d'un document à signer.
10375         * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10376         * En cas d'erreur ajoute une ligne dans les logs de l'application.
10377         *
10378         * @param  string  $signer_name         Nom du signataire
10379         * @param  string  $signer_mail         Mail du signataire
10380         * @param  string  $user_name           Nom de l'utilisateur openADS courant
10381         *
10382         * @return boolean  true si succés, false si erreur
10383         */
10384        protected function notify_signer($signer_name, $signer_mail, $user_name) {
10385            // message d'erreur
10386            $err_msg_log = sprintf(
10387                __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10388                $signer_name,
10389                $signer_mail,
10390                $this->getVal($this->clePrimaire)
10391            );
10392            $err_msg = sprintf(
10393                '%s %s (%s)"',
10394                __("Échec de la notification du signataire"),
10395                $signer_name,
10396                $signer_mail
10397            );
10398    
10399            // vérification des informations requises
10400            if (empty($signer_name)) {
10401                $err_detail = __("le nom du signataire est vide");
10402                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10403                $this->addToMessage($err_msg.', '.$err_detail);
10404                return false;
10405            }
10406            if (empty($signer_mail)) {
10407                $err_detail = __("le courriel du signataire est vide");
10408                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10409                $this->addToMessage($err_msg.', '.$err_detail);
10410                return false;
10411            }
10412            if (empty($this->getVal('dossier'))) {
10413                $err_detail = __("l'identifiant du dossier est vide");
10414                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10415                $this->addToMessage($err_msg.', '.$err_detail);
10416                return false;
10417            }
10418    
10419            // ajout de la notification à la liste des notifications de l'instruction
10420            $instruction_id = $this->getVal($this->clePrimaire);
10421            $inst_notif = $this->f->get_inst__om_dbform(array(
10422                "obj" => "instruction_notification",
10423                "idx" => "]",
10424            ));
10425            $notif_val = array(
10426                'instruction_notification' => null,
10427                'instruction' => $instruction_id,
10428                'automatique' => true,
10429                'emetteur' => $user_name,
10430                'date_envoi' => null,
10431                'destinataire' => "$signer_name <$signer_mail>",
10432                'courriel' => $signer_mail,
10433                'date_premier_acces' => null,
10434                'statut' => '',
10435                'commentaire' => ''
10436            );
10437            $add_notif = $inst_notif->ajouter($notif_val);
10438            if ($add_notif === false) {
10439                $err_detail = __("Échec de l'ajout de la notification.");
10440                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10441                $this->addToMessage($err_msg);
10442                return false;
10443            }
10444            $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10445    
10446            // ajout d'une tâche de notification (envoi du mail)
10447            $notification_task = $this->notification_by_task(
10448                $notification_id,
10449                $this->getVal('dossier'),
10450                'mail',
10451                'notification_signataire'
10452            );
10453            if ($notification_task === false) {
10454                $err_detail = sprintf(
10455                    __("Échec de l'ajout de la tâche de notification (notification %s)."),
10456                    $notification_id);
10457                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10458                $this->addToMessage($err_msg);
10459                return false;
10460            }
10461    
10462            // Vérification de la réussite de l'envoi du mail
10463            // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10464            // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10465            // qui viens d'être créée.
10466            // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10467            $qres = $this->f->get_one_result_from_db_query(
10468                sprintf(
10469                    'SELECT
10470                        state
10471                    FROM
10472                        %1$stask
10473                    WHERE
10474                        type = \'notification_signataire\'
10475                        AND category = \'mail\'
10476                        AND dossier = \'%2$s\'
10477                    ORDER BY
10478                        task DESC
10479                    LIMIT 1',
10480                    DB_PREFIXE,
10481                    $this->f->db->escapeSimple($this->getVal('dossier'))
10482                ),
10483                array(
10484                    'origin' => __METHOD__
10485                )
10486            );
10487            if ($qres['result'] === 'error') {
10488                $err_detail = sprintf(
10489                    __("Échec de l'envoi du mail de notification (notification %s)."),
10490                    $notification_id);
10491                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10492                $this->addToMessage($err_msg);
10493                return false;
10494            }
10495            // TODO gérer les autres cas (gestion d'erreur)
10496    
10497            // succès de la planification de la notification
10498            $this->addToMessage(sprintf(
10499                __('Le signataire "%s (%s)" sera notifié prochainement'),
10500                $signer_name,
10501                $signer_mail));
10502            return true;
10503        }
10504    
10505        /**
10506         * Permet de récupérer la bonne date limite en fonction de si l'instruction
10507         * est en incomplet notifié ou non.
10508         * On peut ajouter des jours à cette date grâce au paramètre "delay".
10509         * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10510         * l'instruction en signature le jour de la date limite.
10511         *
10512         * @param int $delay Le nombre de jour à ajouter à la date limite.
10513         *
10514         * @return string $date_limite la date limite calculé ou false
10515         */
10516        private function compute_date_limite($delay) {
10517            // Instanciation de l'objet dossier
10518            $inst_dossier = $this->f->get_inst__om_dbform(array(
10519                'obj' => 'dossier',
10520                'idx' => $this->getVal('dossier'),
10521            ));
10522    
10523            $date_to_compute = null;
10524            if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10525              $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10526            } else {
10527              $date_to_compute = $inst_dossier->getVal('date_limite');
10528            }
10529            if ($date_to_compute != null) {
10530                return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10531            }
10532    
10533            return null;
10534        }
10535    
10536        /**
10537         * Permet de récupérer la traduction de la valeur de statut_signature
10538         *
10539         * @return string la valeur de statut_signature traduite | false
10540         */
10541        function get_trad_for_statut($value_to_trad){
10542            $statut_signature_tab = array(
10543                'waiting' => __('en préparation'),
10544                'in_progress' => __('en cours de signature'),
10545                'canceled' => __('signature annulée'),
10546                'expired' => __('délai de signature expiré'),
10547                'finished' => __('signé')
10548            );
10549            if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10550                return $statut_signature_tab[$value_to_trad];
10551            }
10552    
10553            return false;
10554        }
10555    
10556        /**
10557         * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10558         *
10559         * @return string (json) la valeur de historique_signature mis à jour | false
10560         */
10561        function get_updated_historique_signature($historique_signature_values) {
10562    
10563            $historique_signature_value_tab = $this->get_historique_signature_decoded();
10564    
10565            if ($historique_signature_value_tab === false) {
10566                $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10567                return false;
10568            }
10569    
10570            $last_val_historique_signature = array();
10571    
10572            // Si la tableau récupéré n'est pas vide alors
10573            // on récupère la dernière ligne du tableau
10574            if (empty($historique_signature_value_tab) === false) {
10575                $last_val_historique_signature = end($historique_signature_value_tab);
10576            }
10577    
10578            $format_date = '';
10579            $format_date_hour = '';
10580            $date_converted=array();
10581    
10582            $date_to_convert = array(
10583                'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10584                'date_limite_instruction' => $this->compute_date_limite(0),
10585                'date_retour_signature' => $historique_signature_values['date_retour_signature']
10586            );
10587    
10588            // Conversion des dates en fonction de leur format
10589            foreach ($date_to_convert as $key => $value) {
10590                $date_converted[$key] = null;
10591                if ($value != null) {
10592                    $format_date = 'd/m/Y';
10593                    $format_date_hour = 'd/m/Y H:i:s';
10594                    $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10595                }
10596            }
10597    
10598            // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10599            // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10600            // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10601            $tab_for_columns_trad = array(
10602                __('entry_date'),
10603                __('id_parapheur_signature'),
10604                __('emetteur'),
10605                __('signataire'),
10606                __('date_envoi'),
10607                __('date_limite'),
10608                __('date_retour'),
10609                __('statut_signature'),
10610                __('commentaire_signature')
10611            );
10612    
10613            array_push($historique_signature_value_tab, array(
10614                'entry_date' => date('d/m/Y H:i:s'),
10615                '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'],
10616                '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'],
10617                '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'],
10618                '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'],
10619                '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'],
10620                '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'],
10621                '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']),
10622                'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10623            ));
10624    
10625            return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10626        }
10627    
10628        /**
10629         * TREATMENT - annuler_envoi_en_signature
10630         *
10631         * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10632         *
10633         * @return boolean true si l'annulation a été effectué avec succès false sinon
10634         */
10635        function annuler_envoi_en_signature() {
10636            $this->begin_treatment(__METHOD__);
10637            $this->correct = true;
10638    
10639            //Instanciation de la classe electronicsignature
10640            $inst_es = $this->get_electronicsignature_instance();
10641            if ($inst_es === false) {
10642                $this->correct = false;
10643                return $this->end_treatment(__METHOD__, false);
10644            }
10645    
10646            $data = array(
10647                'instruction' => $this->getVal($this->clePrimaire),
10648                'dossier' => $this->getVal('dossier'),
10649            );
10650            if (! empty($this->getVal('id_parapheur_signature'))) {
10651                $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10652            } else {
10653                $this->correct = false;
10654                $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10655                return $this->end_treatment(__METHOD__, false);
10656            }
10657    
10658            // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10659            // Cette méthode doit retourner un tableau de valeur
10660            try {
10661                $result = $inst_es->cancel_send_for_signature($data);
10662            }  catch (electronicsignature_exception $e) {
10663                $this->handle_electronicsignature_exception($e);
10664                return $this->end_treatment(__METHOD__, false);
10665            }
10666    
10667            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10668            $valF = array();
10669    
10670            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10671            foreach($this->champs as $identifiant => $champ) {
10672                $valF[$champ] = $this->val[$identifiant];
10673            }
10674            // On fait ensuite nos modifications spécifiques
10675            $valF['id_parapheur_signature'] = null;
10676            $valF['statut_signature'] = $result['statut'];
10677            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10678            $valF['date_envoi_signature'] = null;
10679            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10680    
10681            $this->setParameter("maj", 1);
10682            $ret = $this->modifier($valF);
10683    
10684            if ($ret === false) {
10685                $this->correct = false;
10686                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10687                // Termine le traitement
10688                return $this->end_treatment(__METHOD__, false);
10689            }
10690    
10691            // Message
10692            $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10693    
10694            // Tout s'est bien passé, on termine le traitement
10695            return $this->end_treatment(__METHOD__, true);
10696        }
10697    
10698    
10699        /**
10700         * Récupère le contenu du champ historique_signature et le converti en tableau
10701         *
10702         * @return array sinon false en cas d'erreur
10703         */
10704        protected function get_historique_signature_decoded() {
10705            $val = str_replace("'", '"', $this->getVal('historique_signature'));
10706            if ($val === '' || $val == 'false') {
10707                $val = json_encode(array());
10708            }
10709            if($this->isJson($val) === false) {
10710                return false;
10711            }
10712            return json_decode($val, true);
10713        }
10714    
10715        /**
10716         * Récupère les informations à afficher dans le tableau de suivi à l'aide
10717         * d'une requête sql. Stocke ces informations dans un tableau.
10718         * Converti le tableau au format json et renvoi le json obtenu.
10719         *
10720         * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10721         * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10722         * La clause where de la requête est construite à partir du tableau contenant les types
10723         * de tâches fourni en paramètre.
10724         * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10725         *
10726         * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10727         * la date de premier accès ne sera pas affichée.
10728         *
10729         * @param array liste des tâches permettant d'identifier quelles notification afficher
10730         * @param boolean permet d'afficher les notifications non liées à des tâches
10731         * @return json
10732         */
10733        public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10734            $whereTypeTache = '';
10735            $sqlTaskNull = 'INNER';
10736    
10737            // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10738            $listeChampsTrad = array(
10739                __('emetteur'),
10740                __('date_envoi'),
10741                __('destinataire'),
10742                __('date_premier_acces'),
10743                __('instruction'),
10744                __('annexes'),
10745                __('statut'),
10746                __('commentaire')
10747            );
10748            $listeChamps = array(
10749                'emetteur',
10750                'date_envoi',
10751                'destinataire',
10752                'date_premier_acces',
10753                'instruction',
10754                'annexes',
10755                'statut',
10756                'commentaire'
10757            );
10758    
10759            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10760            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10761            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10762            // paramétrage
10763            if(is_bool($nonLieTache) && $nonLieTache === true) {
10764                $sqlTaskNull = 'LEFT';
10765            }
10766            // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10767            // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10768            // tiers consulté
10769            if (is_array($typeTache) && $typeTache != array()) {
10770                if (is_array($typeTache)) {
10771                    $whereTypeTache = sprintf(
10772                        'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10773                        "'".implode("', '", $typeTache)."'"
10774                    );
10775                }
10776                // La date de premier accès n'a pas besoin d'être renseigné pour
10777                // les notifications des demandeurs via le portail citoyen.
10778                // Les notifications des demandeurs sont liés à 3 types de tâches
10779                // notification_recepisse, notification_instruction, notification_decision
10780                // Si le suivi de la notification concerne un de ces types de tâches on
10781                // considère que c'est une notification de demandeurs.
10782                // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10783                // via le portail. Par défaut si rien n'est paramétré on considère que la
10784                // notification est faite via le portail
10785                if ((in_array('notification_recepisse', $typeTache) ||
10786                in_array('notification_instruction', $typeTache) ||
10787                in_array('notification_decision', $typeTache))) {
10788                    $dossier = $this->getVal('dossier');
10789                    $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10790                    $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10791                    if ($modeNotification === PORTAL) {
10792                        $listeChamps = array(
10793                            'emetteur',
10794                            'date_envoi',
10795                            'destinataire',
10796                            'instruction',
10797                            'annexes',
10798                            'statut',
10799                            'commentaire'
10800                        );
10801                    }
10802                }
10803                // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10804                // de les afficher dans le suivi
10805                if (in_array('notification_depot_demat', $typeTache)) {
10806                    $listeChamps = array(
10807                        'emetteur',
10808                        'date_envoi',
10809                        'destinataire',
10810                        'instruction',
10811                        'statut',
10812                        'commentaire'
10813                    );
10814                }
10815            }
10816    
10817            $valSuivi = array();
10818            // Récupération des infos nécessaires à l'affichage du tableau
10819            $sql = sprintf(
10820                'SELECT DISTINCT
10821                    instruction_notification.instruction_notification,
10822                    -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10823                    CASE WHEN instruction_notification.automatique = TRUE
10824                        THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10825                        ELSE instruction_notification.emetteur
10826                    END as emetteur,
10827                    date_envoi,
10828                    instruction_notification.destinataire,
10829                    instruction_notification.date_premier_acces,
10830                    evenement.libelle as instruction,
10831                    instruction_notification.statut,
10832                    instruction_notification.commentaire,
10833                    annexes.instruction_annexe as annexes
10834                FROM
10835                    %1$sinstruction_notification
10836                    LEFT JOIN %1$sinstruction
10837                        ON instruction.instruction = instruction_notification.instruction
10838                    LEFT JOIN %1$sevenement
10839                        ON instruction.evenement = evenement.evenement
10840                    LEFT JOIN %1$sinstruction_notification_document
10841                        ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10842                        AND instruction_notification_document.annexe = true
10843                    -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10844                    %4$s JOIN %1$stask
10845                        ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10846                        AND task.type LIKE \'notification%%\'
10847                    -- Récupération de la liste des annexes sous la forme d une liste
10848                    LEFT JOIN (
10849                        SELECT
10850                            instruction_notification,
10851                            -- Récupère la liste des annexes de la notification
10852                            -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10853                            -- à l affichage du lien vers les annexes
10854                            CONCAT(
10855                                \'[\',
10856                                STRING_AGG(
10857                                    -- Affiche le nom du fichier selon le type de document/pièce
10858                                    CASE
10859                                        WHEN instruction_notification_document.document_type = \'instruction\'
10860                                            THEN CONCAT(
10861                                                    \'{
10862                                                        "obj" : "instruction",
10863                                                        "champs" : "om_fichier_instruction",
10864                                                        "label" : "\', evenement.libelle, \'",
10865                                                        "id" : "\', instruction.instruction,\'"
10866                                                    }\'
10867                                                )
10868                                        WHEN instruction_notification_document.document_type = \'consultation\'
10869                                            THEN CONCAT(
10870                                                    \'{
10871                                                        "obj" : "consultation",
10872                                                        "champs" : "fichier",
10873                                                        "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10874                                                        "id" : "\', consultation.consultation, \'"
10875                                                    }\'
10876                                                )
10877                                    ELSE
10878                                        CONCAT(
10879                                            \'{
10880                                                "obj" : "document_numerise",
10881                                                "champs" : "uid",
10882                                                "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10883                                                "id" : "\', document_numerise.document_numerise,\'"
10884                                            }\'
10885                                        )
10886                                    END,
10887                                    \', \'),
10888                                \']\'
10889                            ) AS instruction_annexe
10890                        FROM
10891                            %1$sinstruction_notification_document
10892                            LEFT JOIN %1$sinstruction
10893                                ON instruction_notification_document.instruction = instruction.instruction
10894                            LEFT JOIN %1$sevenement
10895                                ON instruction.evenement = evenement.evenement
10896                            LEFT JOIN %1$sconsultation
10897                                ON instruction_notification_document.document_id = consultation.consultation
10898                            LEFT JOIN %1$sservice
10899                                ON consultation.service = service.service
10900                            LEFT JOIN %1$sdocument_numerise
10901                                ON instruction_notification_document.document_id = document_numerise.document_numerise
10902                            LEFT JOIN %1$sdocument_numerise_type
10903                                ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10904                        WHERE
10905                            instruction_notification_document.annexe = \'t\'
10906                        GROUP BY
10907                            instruction_notification
10908                    ) AS annexes
10909                        ON
10910                            annexes.instruction_notification = instruction_notification.instruction_notification
10911                WHERE
10912                    instruction.instruction = %2$s
10913                    %3$s
10914                ORDER BY
10915                    date_envoi ASC, instruction_notification.destinataire ASC',
10916                DB_PREFIXE,
10917                intval($this->getVal('instruction')),
10918                $whereTypeTache,
10919                $sqlTaskNull
10920            );
10921            $qres = $this->f->get_all_results_from_db_query($sql, array(
10922                    "origin" => __METHOD__
10923                )
10924            );
10925            // Préparation du lien de téléchargement des annexes
10926            $htmlList =
10927                '<style>
10928                    #content .gridjs-td a.lien_annexe {
10929                        text-decoration : underline dotted 1px;
10930                    }
10931                    #content a.lien_annexe:hover {
10932                        text-decoration : underline solid 1px;
10933                        color : #46aede;
10934                    }
10935                    ol {padding-left : 10px;}
10936                </style>
10937                <ol>%1$s</ol>';
10938            $lienTelechargement =
10939            '<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">
10940                Annexe
10941            </a>';
10942            // Stockage des infos de chaque notification dans un tableau
10943            foreach ($qres['result'] as $row) {
10944                $valNotif = array();
10945                foreach($listeChamps as $champ) {
10946                    $valNotif[$champ] = $row[$champ];
10947                    if (($champ === 'date_envoi'
10948                        || $champ === 'date_premier_acces')
10949                        && $row[$champ] !== null
10950                        && $row[$champ] !== '') {
10951                        //
10952                        $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10953                    } else if ($champ === 'annexes') {
10954                        $listeAnnexe = '';
10955                        $infoAnnexes = json_decode($row[$champ], true);
10956                        if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10957                            // A partir des infos récupérées prépare le code html du lien vers chacune
10958                            // des annexes et ajoute un élément de liste par annexe
10959                            foreach($infoAnnexes as $annexe) {
10960                                $listeAnnexe .= sprintf(
10961                                    '<li>%s</li>',
10962                                    sprintf($lienTelechargement,
10963                                        $annexe['obj'],
10964                                        $annexe['champs'],
10965                                        $annexe['id'],
10966                                        $annexe['label']
10967                                    )
10968                                );
10969                            }
10970                            // Construction de la liste des annexes
10971                            $valNotif[$champ] = sprintf(
10972                                $htmlList,
10973                                $listeAnnexe
10974                            );
10975                        }
10976                    }
10977                }
10978                array_push($valSuivi, $valNotif);
10979            }
10980    
10981            // Passage du tableau au format json
10982            return json_encode($valSuivi, JSON_HEX_APOS);
10983        }
10984    
10985        /**
10986         * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10987         *
10988         * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10989         *
10990         * @return void
10991         */
10992        public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10993            $this->correct = false;
10994            $this->addToMessage($exception->getMessage());
10995        }
10996    
10997    
10998        /**
10999         * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
11000         *
11001         * @param  boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
11002         * @return electronicsignature        Instance de l'abstracteur.
11003         */
11004        public function get_electronicsignature_instance($with_handle_error = true) {
11005            if(isset($this->electronicsignature_instance)) {
11006                return $this->electronicsignature_instance;
11007            }
11008            // Instanciation du connecteur electronicsignature
11009            try {
11010                require_once "electronicsignature.class.php";
11011                $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
11012                $extra_params = array(
11013                    "inst_framework" => $this->f,
11014                );
11015                $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
11016            } catch (electronicsignature_exception $e) {
11017                if ($with_handle_error === true) {
11018                    $this->handle_electronicsignature_exception($e);
11019                }
11020                return false;
11021            }
11022            return $this->electronicsignature_instance;
11023        }
11024    
11025        /**
11026         * TREATMENT - envoyer_au_controle_de_legalite
11027         *
11028         * Ajoute la tâche envoi_CL.
11029         * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
11030         *
11031         * @return [type] [description]
11032         */
11033        function envoyer_au_controle_de_legalite() {
11034            $this->begin_treatment(__METHOD__);
11035            $this->correct = true;
11036    
11037            //
11038            if ($this->can_be_sent_to_cl() === true) {
11039                // Création de la task 'envoi_CL'
11040                $inst_task = $this->f->get_inst__om_dbform(array(
11041                    "obj" => "task",
11042                    "idx" => 0,
11043                ));
11044                $task_val = array(
11045                    'type' => 'envoi_CL',
11046                    'object_id' => $this->getVal('instruction'),
11047                    'dossier' => $this->getVal('dossier'),
11048                );
11049                // Change l'état de la tâche de notification en fonction de l'état de
11050                // transmission du dossier d'instruction
11051                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
11052                if ($this->f->is_option_mode_service_consulte_enabled() === false
11053                    && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
11054                    || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
11055                    //
11056                    $task_val['state'] = task::STATUS_DRAFT;
11057                }
11058                $add_task = $inst_task->add_task(array('val' => $task_val));
11059                if ($add_task === false) {
11060                    $this->addToMessage(sprintf('%s %s',
11061                        __("Une erreur s'est produite lors de la création tâche."),
11062                        __("Veuillez contacter votre administrateur.")
11063                    ));
11064                    $this->correct = false;
11065                    return $this->end_treatment(__METHOD__, false);
11066                }
11067                // Mise à jour du champs 'envoye_cl_platau'
11068                $instr_val = array(
11069                    'envoye_cl_platau' => 't',
11070                );
11071                $res = $this->f->db->autoExecute(
11072                    DB_PREFIXE.$this->table,
11073                    $instr_val,
11074                    DB_AUTOQUERY_UPDATE,
11075                    $this->getCle($this->getVal($this->clePrimaire))
11076                );
11077                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
11078                if ($this->f->isDatabaseError($res, true) === true) {
11079                    $this->addToMessage(sprintf('%s %s',
11080                        __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
11081                        __("Veuillez contacter votre administrateur.")
11082                    ));
11083                    $this->correct = false;
11084                    return $this->end_treatment(__METHOD__, false);
11085                }
11086                // Message de validation à l'utilisateur
11087                $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
11088                $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
11089            }
11090            //
11091            return $this->end_treatment(__METHOD__, true);
11092        }
11093    
11094    
11095        /**
11096         * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
11097         *
11098         * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
11099         *                     la vue 'sousformulaire'.
11100         *
11101         * @return string
11102         */
11103        function get_back_link($view = "formulaire") {
11104            //
11105            $href = parent::get_back_link($view);
11106            //
11107            $crud = $this->get_action_crud();
11108    
11109            // Redirection vers le formulaire de modification à la validation du
11110            // formulaire d'ajout si l'événement associé possède une lettre type
11111            if (($crud === 'create'
11112                    || ($crud === null
11113                        && $this->getParameter('maj') == 0))
11114                    && $this->correct == true
11115                    && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
11116    
11117                // On instancie l'instruction
11118                $inst_instruction = $this->f->get_inst__om_dbform(array(
11119                    "obj" => "instruction",
11120                    "idx" => $this->valF[$this->clePrimaire],
11121                ));
11122    
11123                // Si l'instruction n'est pas finalisée automatiquement
11124                if ($inst_instruction->getVal('om_final_instruction') !== 't') {
11125                    $href = str_replace("&action=3", "&action=1", $href);
11126                    //
11127                    if (strpos($href, "&retour=tab") !== false) {
11128                        $href = str_replace("&retour=tab", "&retour= form", $href);
11129                    } else {
11130                        $href .= "&retour=form";
11131                    }
11132                }
11133            }
11134    
11135            //
11136            return $href;
11137        }
11138    
11139        public function view_json_data() {
11140            $this->checkAccessibility();
11141            $this->f->disableLog();
11142            $view = $this->get_json_data();
11143            printf(json_encode($view));
11144        }
11145    
11146        public function get_json_data() {
11147            $val = array_combine($this->champs, $this->val);
11148            foreach ($val as $key => $value) {
11149                $val[$key] = strip_tags($value);
11150            }
11151            $val['tacite'] = 'f';
11152            $inst_ad = $this->f->get_inst__om_dbform(array(
11153                "obj" => "avis_decision",
11154                "idx" => $val['avis_decision'],
11155            ));
11156            if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
11157                $val['tacite'] = 't';
11158            }
11159            return $val;
11160        }
11161    
11162        /**
11163         * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
11164         * comme événement lié le suivant définit dans l'événement de l'instruction
11165         * instanciée.
11166         *
11167         * @param  string  $next_type   Correspond aux trois déclenchement automatique
11168         *                              de création d'instruction paramétré sur un événement.
11169         * @param  integer $instruction Identifiant de l'instruction à instancier.
11170         * @return mixed                Identifiant de l'instruction recherchée ou false.
11171         */
11172        public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
11173            if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
11174                return false;
11175            }
11176            $result = array();
11177            $evenements = array();
11178            if ($instruction === null) {
11179                $instruction = $this->getVal($this->clePrimaire);
11180                $evenement = $this->getVal('evenement');
11181                $dossier = $this->getVal('dossier');
11182            } else {
11183                $inst = $this->f->get_inst__om_dbform(array(
11184                    "obj" => "instruction",
11185                    "idx" => $instruction,
11186                ));
11187                $evenement = $inst->getVal('evenement');
11188                $dossier = $inst->getVal('dossier');
11189            }
11190            // Récupération de l'identifiant de l'événement paramétré comme suivant
11191            // sur l'instruction instanciée
11192            $qres = $this->f->get_one_result_from_db_query(
11193                sprintf(
11194                    'SELECT
11195                        evenement_%3$s
11196                    FROM
11197                        %1$sevenement
11198                    WHERE
11199                        evenement = %2$s',
11200                    DB_PREFIXE,
11201                    intval($evenement),
11202                    $next_type
11203                ),
11204                array(
11205                    "origin" => __METHOD__,
11206                    "force_return" => true,
11207                )
11208            );
11209            if ($qres["code"] !== "OK") {
11210                return false;
11211            }
11212            $ev_next = $qres["result"];
11213            // Récupération de l'instruction dans le dossier utilisant l'événement
11214            // suivant identifié dans la requête précédente
11215            $qres = $this->f->get_one_result_from_db_query(
11216                sprintf(
11217                    'SELECT
11218                        MAX(instruction.instruction) as instruction
11219                    FROM
11220                        %1$sinstruction
11221                    WHERE
11222                        dossier = \'%3$s\'
11223                        AND evenement = %2$s',
11224                    DB_PREFIXE,
11225                    intval($ev_next),
11226                    $this->f->db->escapeSimple($dossier)
11227                ),
11228                array(
11229                    "origin" => __METHOD__,
11230                    "force_return" => true,
11231                )
11232            );
11233            if ($qres["code"] !== "OK") {
11234                return false;
11235            }
11236            return $qres["result"];
11237        }
11238    
11239        public function get_related_instructions($instruction = null) {
11240            $result = array();
11241            $evenements = array();
11242            if ($instruction === null) {
11243                $instruction = $this->getVal($this->clePrimaire);
11244                $evenement = $this->getVal('evenement');
11245                $dossier = $this->getVal('dossier');
11246            } else {
11247                $inst = $this->f->get_inst__om_dbform(array(
11248                    "obj" => "instruction",
11249                    "idx" => $instruction,
11250                ));
11251                $evenement = $inst->getVal('evenement');
11252                $dossier = $inst->getVal('dossier');
11253            }
11254            //
11255            $qres = $this->f->get_one_result_from_db_query(
11256                sprintf(
11257                    'SELECT
11258                        evenement
11259                    FROM
11260                        %1$sevenement
11261                    WHERE
11262                        evenement_retour_ar = %2$s
11263                        OR evenement_retour_signature = %2$s',
11264                    DB_PREFIXE,
11265                    intval($evenement)
11266                ),
11267                array(
11268                    "origin" => __METHOD__,
11269                    "force_return" => true,
11270                )
11271            );
11272            if ($qres["code"] !== "OK") {
11273                return false;
11274            }
11275            $ev_parent = $qres["result"];
11276            //
11277            $qres = $this->f->get_one_result_from_db_query(
11278                sprintf(
11279                    'SELECT
11280                        MAX(instruction.instruction) as instruction
11281                    FROM
11282                        %1$sinstruction
11283                    WHERE
11284                        dossier = \'%3$s\'
11285                        AND evenement = %2$s',
11286                    DB_PREFIXE,
11287                    intval($ev_parent),
11288                    $this->f->db->escapeSimple($dossier)
11289                ),
11290                array(
11291                    "origin" => __METHOD__,
11292                    "force_return" => true,
11293                )
11294            );
11295            if ($qres["code"] !== "OK") {
11296                return false;
11297            }
11298            $result[] = $qres["result"];
11299            //
11300            $qres = $this->f->get_one_result_from_db_query(
11301                sprintf(
11302                    'SELECT
11303                        evenement_retour_ar
11304                    FROM
11305                        %1$sevenement
11306                    WHERE
11307                        evenement = %2$d
11308                        AND evenement_retour_ar != %3$d',
11309                    DB_PREFIXE,
11310                    intval($ev_parent),
11311                    intval($evenement)
11312                ),
11313                array(
11314                    "origin" => __METHOD__,
11315                    "force_return" => true,
11316                )
11317            );
11318            if ($qres["code"] !== "OK") {
11319                return false;
11320            }
11321            $evenements[] = $qres["result"];
11322            //
11323            $qres = $this->f->get_one_result_from_db_query(
11324                sprintf(
11325                    'SELECT
11326                        evenement_retour_signature
11327                    FROM
11328                        %1$sevenement
11329                    WHERE
11330                        evenement = %2$s
11331                        AND evenement_retour_signature != %3$s
11332                    ',
11333                    DB_PREFIXE,
11334                    intval($ev_parent),
11335                    intval($evenement)
11336                ),
11337                array(
11338                    "origin" => __METHOD__,
11339                    "force_return" => true,
11340                )
11341            );
11342            if ($qres["code"] !== "OK") {
11343                return false;
11344            }
11345            $evenements[] = $qres["result"];
11346            foreach ($evenements as $value) {
11347                if ($value !== null) {
11348                    $qres = $this->f->get_one_result_from_db_query(
11349                        sprintf(
11350                            'SELECT
11351                                MAX(instruction.instruction) as instruction
11352                            FROM
11353                                %1$sinstruction
11354                            WHERE
11355                                dossier = \'%3$s\'
11356                                AND evenement = %2$s',
11357                            DB_PREFIXE,
11358                            intval($value),
11359                            $this->f->db->escapeSimple($dossier)
11360                        ),
11361                        array(
11362                            "origin" => __METHOD__,
11363                            "force_return" => true,
11364                        )
11365                    );
11366                    if ($qres["code"] !== "OK") {
11367                        return false;
11368                    }
11369                    $result[] = $qres["result"];
11370                }
11371            }
11372            return $result;
11373        }
11374    
11375        protected function getDocumentType($champ = null) {
11376            $evenementId = $this->getVal('evenement');
11377            if (! empty($evenementId)) {
11378                $evenement = $this->f->findObjectById('evenement', $evenementId);
11379                if (! empty($evenement)) {
11380                    return __("Instruction").':'.$evenement->getVal('libelle');
11381                }
11382            }
11383            return parent::getDocumentType();
11384        }
11385    
11386        /**
11387         * Récupère à l'aide d'une requête sql la liste des demandeurs
11388         * pouvant être notifié. C'est à dire les demandeurs acceptant
11389         * les notifications et pour lesquels une adresse mail existe.
11390         *
11391         * Dans le cas, d'une notification pour le portail citoyen, seul
11392         * le pétitionnaire principal doit être notifier et uniquement si
11393         * il a une adress mail et qu'il accepte les notifications.
11394         *
11395         * @param string identifiant du dossier
11396         * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11397         * pour une notification de categorie portail
11398         * @return array liste des demandeurs pouvant être notifié
11399        */
11400        public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11401            if ($idDossier === null) {
11402                $idDossier = $this->getVal('dossier');
11403            }
11404            // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11405            // pour une notification depuis le portail citoyen
11406            $sqlPetitionnairePrincipal = '';
11407            // Gestion des champs nécessaires pour la notification d'un demandeur
11408            $condition_demandeur = "AND demandeur.notification = 't'
11409                AND demandeur.courriel IS NOT NULL";
11410            if ($portail === true) {
11411                $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11412                $condition_demandeur = "AND (
11413                        (notification = 't' AND courriel IS NOT NULL)
11414                        OR demande.source_depot = 'portal'
11415                    )";
11416            }
11417    
11418            $listeDemandeursNotifiable = array();
11419    
11420            // Requête de récupération des demandeurs
11421            $qres = $this->f->get_all_results_from_db_query(
11422                sprintf(
11423                    'SELECT
11424                        demandeur.demandeur,
11425                        CASE
11426                            WHEN demandeur.qualite=\'particulier\'
11427                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11428                        ELSE
11429                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11430                        END AS destinataire,
11431                        demandeur.courriel,
11432                        petitionnaire_principal
11433                    FROM
11434                        %1$sdossier
11435                        INNER JOIN %1$slien_dossier_demandeur
11436                            ON dossier.dossier = lien_dossier_demandeur.dossier
11437                        INNER JOIN %1$sdemandeur
11438                            ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11439                        -- Récupération de la plus ancienne demande associée au dossier (la demande
11440                        -- de création du dossier)
11441                        INNER JOIN (
11442                            SELECT
11443                                demande,
11444                                dossier_instruction,
11445                                source_depot
11446                            FROM
11447                                %1$sdemande
11448                            WHERE
11449                                dossier_instruction = \'%2$s\'
11450                            ORDER BY
11451                                demande ASC
11452                            LIMIT 1
11453                        ) as demande
11454                            ON dossier.dossier = demande.dossier_instruction
11455                    WHERE
11456                        dossier.dossier = \'%2$s\'
11457                        %3$s
11458                        %4$s',
11459                    DB_PREFIXE,
11460                    $this->f->db->escapeSimple($idDossier),
11461                    $condition_demandeur,
11462                    $sqlPetitionnairePrincipal
11463                ),
11464                array(
11465                    "origin" => __METHOD__
11466                )
11467            );
11468            // Récupération des infos des demandeurs et stockage dans un tableau
11469            // ayant pour clé les id des demandeurs
11470            foreach ($qres['result'] as $row) {
11471                $listeDemandeursNotifiable[$row['demandeur']] = $row;
11472            }
11473    
11474  ?>          return $listeDemandeursNotifiable;
11475        }
11476    
11477        /**
11478         * Renvoie la liste des notifications liées à l'instruction
11479         *
11480         * @param integer id de l'instruction dont on cherche les notifications
11481         * @return array liste des instruction_notification liés à l'instruction
11482         */
11483        public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11484            // Compose la clause définissant dans la requête le type de tâche attendus
11485            $clause_type_tache = '';
11486            if ($typeNotification != null) {
11487                if (is_array($typeNotification)) {
11488                    $clause_type_tache = sprintf(
11489                        'AND task.type IN (\'%1$s\')',
11490                        implode("', '", $typeNotification),
11491                    );
11492                } else {
11493                    $clause_type_tache = sprintf(
11494                        'AND task.type = \'%1$s\'',
11495                        $typeNotification
11496                    );
11497                }
11498            }
11499    
11500            // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11501            $qres = $this->f->get_all_results_from_db_query(
11502                sprintf('
11503                    SELECT
11504                        instruction_notification.instruction_notification
11505                    FROM
11506                        %1$sinstruction_notification
11507                        INNER JOIN %1$stask
11508                            ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11509                               %3$s
11510                    WHERE
11511                        instruction = %2$s',
11512                    DB_PREFIXE,
11513                    intval($id_instruction),
11514                    $clause_type_tache
11515                ),
11516                array(
11517                    "origin" => __METHOD__,
11518                    'log_level' => DEBUG_MODE
11519                )
11520            );
11521            $listeInstrNotif = array();
11522            foreach ($qres['result'] as $row) {
11523                $listeInstrNotif[] = $row['instruction_notification'];
11524            }
11525    
11526            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11527            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11528            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11529            // paramétrage
11530            if(is_bool($nonLieTache) && $nonLieTache === true) {
11531                $qres = $this->f->get_all_results_from_db_query(
11532                    sprintf('
11533                        SELECT
11534                            instruction_notification.instruction_notification
11535                        FROM
11536                            %1$sinstruction_notification
11537                            LEFT JOIN %1$stask
11538                                ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11539                                   AND task.type LIKE \'%%notification%%\'
11540                        WHERE
11541                            instruction = %2$s
11542                            AND task.task IS NULL',
11543                        DB_PREFIXE,
11544                        intval($id_instruction)
11545                    ),
11546                    array(
11547                        "origin" => __METHOD__
11548                    )
11549                );
11550    
11551                foreach ($qres['result'] as $row) {
11552                    $listeInstrNotif[] = $row['instruction_notification'];
11553                }
11554            }
11555    
11556            return $listeInstrNotif;
11557        }
11558    
11559        /**
11560         * Crée une clé d'accès unique permettant à un utilisateur
11561         * anonyme de récupérer le document.
11562         *
11563         * @return string clé d'accès du document
11564         */
11565        function getCleAccesDocument() {
11566            // Initialisation d'un tableau
11567            $number_list = array();
11568    
11569            // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11570            for ($i = 0; $i < 4; $i++) {
11571                $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11572            }
11573    
11574            // Transformation en chaîne tout en séparant les nombres par un "-"
11575            $result = implode('-', $number_list);
11576    
11577            // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11578            if ($this->getUidDocumentInstructionWithKey($result) != null) {
11579                return $this->getCleAccesDocument();
11580            }
11581    
11582            //
11583            return $result;
11584        }
11585    
11586        /**
11587         * Récupère une clé et renvoie l'uid du document liée à cette
11588         * clé. Si la clé n'existe pas renvoie null.
11589         *
11590         * @param string $cleGen clé dont on cherche l'instruction
11591         * @return integer|null
11592         */
11593        protected function getUidDocumentInstructionWithKey($cleGen) {
11594            $qres = $this->f->get_one_result_from_db_query(
11595                sprintf(
11596                    'SELECT
11597                        instruction.om_fichier_instruction
11598                    FROM
11599                        %1$sinstruction_notification_document
11600                        LEFT JOIN %1$sinstruction
11601                            ON instruction_notification_document.instruction = instruction.instruction
11602                    WHERE
11603                        instruction_notification_document.cle = \'%2$s\'',
11604                    DB_PREFIXE,
11605                    $this->f->db->escapeSimple($cleGen)
11606                ),
11607                array(
11608                    "origin" => __METHOD__,
11609                )
11610            );
11611    
11612            return $qres['result'];
11613        }
11614    
11615        /**
11616         * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11617         * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11618         *
11619         * @param string $cleGen
11620         * @return instruction_notification
11621         */
11622        protected function getInstanceNotificationWithKey($key) {
11623            $qres = $this->f->get_one_result_from_db_query(
11624                sprintf(
11625                    'SELECT
11626                        instruction_notification
11627                    FROM
11628                        %1$sinstruction_notification_document
11629                    WHERE
11630                        cle = \'%2$s\'',
11631                    DB_PREFIXE,
11632                    $this->f->db->escapeSimple($key)
11633                ),
11634                array(
11635                    "origin" => __METHOD__,
11636                )
11637            );
11638    
11639            // Récupération de l'instance de notification
11640            $instNotif = $this->f->get_inst__om_dbform(array(
11641                "obj" => "instruction_notification",
11642                "idx" => $qres['result'],
11643            ));
11644            return $instNotif;
11645        }
11646    
11647    
11648        /**
11649         * Affiche la page de téléchargement du document de la notification.
11650         *
11651         * @param boolean $content_only Affiche le contenu seulement.
11652         *
11653         * @return void
11654         */
11655        public function view_telecharger_document_anonym() {
11656            // Par défaut on considère qu'on va afficher le formulaire
11657            $idx = 0;
11658            // Flag d'erreur
11659            $error = false;
11660            // Message d'erreur
11661            $message = '';
11662    
11663            // Paramètres GET : récupération de la clé d'accès
11664            $cle_acces_document = $this->f->get_submitted_get_value('key');
11665            $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11666            // Vérification de l'existence de la clé et récupération de l'uid du fichier
11667            $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11668            if ($uidFichier != null) {
11669                // Récupération du document
11670                $file = $this->f->storage->get($uidFichier);
11671    
11672                // Headers
11673                header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11674                header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11675                header("Content-Type: ".$file['metadata']['mimetype']);
11676                header("Accept-Ranges: bytes");
11677                header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11678                // Affichage du document
11679                echo $file['file_content'];
11680    
11681                // Récupération de la date de premier accès et maj du suivi uniquement
11682                // si la date de 1er accès n'a pas encore été remplis
11683                $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11684                if ($inst_notif->getVal('date_premier_acces') == null ||
11685                    $inst_notif->getVal('date_premier_acces') == '') {
11686                    $notif_val = array();
11687                    foreach ($inst_notif->champs as $champ) {
11688                        $notif_val[$champ] = $inst_notif->getVal($champ);
11689                    }
11690                    $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11691                    $notif_val['statut'] = 'vu';
11692                    $notif_val['commentaire'] = 'Le document a été vu';
11693                    $suivi_notif = $inst_notif->modifier($notif_val);
11694                }
11695    
11696            } else {
11697                // Page vide 404
11698                printf('Ressource inexistante');
11699                header('HTTP/1.0 404 Not Found');
11700            }
11701        }
11702    
11703        /**
11704         * Récupère le titre du document envoyé au parapheur
11705         */
11706        protected function getDocumentTitre($champ = null) {
11707            $title = $this->getTitle();
11708            $dossier = $this->getDossier();
11709            return $dossier.' '.$title;
11710        }
11711    
11712        /**
11713         * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11714         * l'overlay de notification des demandeurs.
11715         */
11716        function getSubFormTitle($ent) {
11717            $actionSansPath = array('411', '420', '430');
11718            if (in_array($this->getParameter('maj'), $actionSansPath)) {
11719                return '';
11720            }
11721            return parent::getSubFormTitle($ent);
11722        }
11723    
11724        /**
11725         * Traitement de la notification automatique des tiers consulté.
11726         *
11727         * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11728         * récupérées ajoute une notification et une tâche de notification par mail.
11729         * La création de la tâche de notification par mail déclenchera l'envoi du mail
11730         * et la mise à jour du suivi.
11731         *
11732         * Les tiers notifiables sont ceux :
11733         *   - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11734         *   - ayant une habilitation dont le type est listé dans les paramètres de
11735         *     notification de l’événement,
11736         *   - intervenant sur la commune ou le département du dossier
11737         *   - ayant au moins une adresse mail valide
11738         *
11739         * @param evenement instance de l'événement associée à l'instruction
11740         * @param dossier instance du dossier de l'instruction
11741         * @return boolean indique si le traitement à réussi
11742         */
11743        public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11744            // Récupération de l'identifiant plat'au du service consultant
11745            $consultationEntrante = $dossier->get_inst_consultation_entrante();
11746            // Récupération de la liste des types d'habilitations autorisées pour
11747            // cette notification
11748            $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11749            // Récupération du département et de la commune du dossier
11750            $commune = $dossier->getVal('commune');
11751            // Le département est récupéré à partir de la commune du dossier donc si la
11752            // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11753            $idDepartement = null;
11754            if (! empty($commune)) {
11755                $departement = $dossier->get_inst_departement_dossier();
11756                $idDepartement = $departement->getVal($departement->clePrimaire);
11757            }
11758            // Récupération des courriels des tiers notifiables
11759            $tiersANotifier = $this->get_courriels_tiers_notifiable(
11760                $typesHabilitationsNotifiable,
11761                $consultationEntrante->getVal('service_consultant_id'),
11762                $commune,
11763                $idDepartement
11764            );
11765            // Traitement de chacune des listes de diffusion pour extraire les
11766            // courriels, vérifier la validité des courriels et envoyer la
11767            // notification
11768            $notificationSend = false;
11769            if (empty($tiersANotifier)) {
11770                $this->addToLog(
11771                    sprintf(
11772                        '%s() : %s %s : %s',
11773                        __METHOD__,
11774                        __("La récupération des tiers à échoué."),
11775                        __('Paramétrage'),
11776                        var_export(
11777                            array(
11778                                'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11779                                'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11780                                'id_commune' => $commune,
11781                                'id_departement' => $idDepartement
11782                            ),
11783                            true
11784                        )
11785                    ),
11786                    DEBUG_MODE
11787                );
11788                return false;
11789            }
11790            foreach($tiersANotifier as $tierANotifier) {
11791                // Découpe la liste de diffusion pour stocker les adresses mails
11792                // des tiers dans un tableau
11793                $courriels =
11794                    array_filter(
11795                        array_map(
11796                            'trim',
11797                            preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11798    
11799                foreach ($courriels as $courriel) {
11800                    // Pour chaque adresse mail vérifie si l'adresse est valide
11801                    if (! $this->f->checkValidEmailAddress($courriel)) {
11802                        continue;
11803                    }
11804                    $destinataire = array(
11805                        'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11806                        'courriel' => $courriel
11807                    );
11808                    // Si l'adresse est valide ajoute une nouvelle notification
11809                    // et une tâche d'envoi de mails
11810                    $idNotif = $this->ajouter_notification(
11811                        $this->getVal($this->clePrimaire),
11812                        $this->f->get_connected_user_login_name(),
11813                        $destinataire,
11814                        $this->get_dossier_instruction_om_collectivite(),
11815                        array(),
11816                        true
11817                    );
11818                    if ($idNotif === false) {
11819                        $this->addToLog(
11820                            __METHOD__.
11821                            __("L'ajout de la notification a échoué."),
11822                            DEBUG_MODE
11823                        );
11824                        return false;
11825                    }
11826                    // Création de la tache en lui donnant l'id de la notification
11827                    $notification_by_task = $this->notification_by_task(
11828                        $idNotif,
11829                        $dossier->getVal('dossier'),
11830                        'mail',
11831                        'notification_tiers_consulte'
11832                    );
11833                    if ($notification_by_task === false) {
11834                        $this->addToLog(
11835                            __METHOD__.
11836                            __("L'ajout de la tâche de notification a échoué."),
11837                            DEBUG_MODE
11838                        );
11839                        $this->addToMessage(
11840                            __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11841                        );
11842                        return false;
11843                    }
11844                    $notificationSend = true;
11845                }
11846            }
11847            // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11848            // valide, affiche un message dans les logs pour avoir un suivi.
11849            if (! $notificationSend) {
11850                $this->addToLog(
11851                    sprintf(
11852                        '%s %s : %s %s : %s',
11853                        __METHOD__,
11854                        __("Il n'y a pas de tiers notifiable pour l'instruction"),
11855                        $evenement->getVal('libelle'),
11856                        __("du dossier"),
11857                        $this->getVal('dossier')
11858                    ),
11859                    DEBUG_MODE
11860                );
11861            }
11862            return true;
11863        }
11864    
11865        /**
11866         * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11867         * respectant les conditions suvantes :
11868         *   - le tiers consulté dois accepté les notifications
11869         *   - la liste de diffusion ne dois pas être vide
11870         *   - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11871         *     si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11872         *     du tiers
11873         *   - le type d'habilitation des tiers dois appartenir à la liste
11874         *     fournie en paramètre
11875         *   - le tiers dois être associé à la commune ou au département passé
11876         *     en paramètre
11877         *
11878         * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11879         *              pouvant être notifiée
11880         * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11881         * @param integer $commune identifiant de la commune du dossier
11882         * @param integer $departement identifiant du département du dossier
11883         *
11884         * @return array listes de diffusion des tiers notifiable
11885         */
11886        public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11887            // Si paramètre non renseigné alors ne renvoie rien
11888            if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11889                return false;
11890            }
11891            // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11892            $filtreServiceConsulteDI = '';
11893            if (! empty($idPlatau)) {
11894                $filtreServiceConsulteDI = sprintf(
11895                    "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11896                    -- en charge du dossier
11897                    AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11898                        OR tiers_consulte.uid_platau_acteur IS NULL)",
11899                    $this->f->db->escapeSimple($idPlatau)
11900                );
11901            }
11902            $rst = $this->f->get_all_results_from_db_query(
11903                sprintf(
11904                    'SELECT
11905                        -- Tiers notifiables lié à la commune du dossier
11906                        tiers_consulte.liste_diffusion,
11907                        tiers_consulte.libelle
11908                    FROM
11909                        %1$shabilitation_tiers_consulte
11910                        LEFT JOIN %1$stiers_consulte
11911                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11912                        LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11913                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11914                        -- Conservation uniquement des tiers acteur de dossiers
11915                        JOIN %1$slien_dossier_tiers
11916                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11917                    WHERE
11918                        tiers_consulte.accepte_notification_email IS TRUE
11919                        AND tiers_consulte.liste_diffusion IS NOT NULL
11920                        %3$s
11921                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11922                        AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11923                        -- Filtre sur les tiers acteur du dossier
11924                        AND lien_dossier_tiers.dossier = \'%6$s\'
11925                    UNION
11926                    SELECT
11927                        -- Tiers notifiables lié au département du dossier
11928                        tiers_consulte.liste_diffusion,
11929                        tiers_consulte.libelle
11930                    FROM
11931                        %1$shabilitation_tiers_consulte
11932                        LEFT JOIN %1$stiers_consulte
11933                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11934                        LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11935                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11936                        -- Conservation uniquement des tiers acteur de dossiers
11937                        JOIN %1$slien_dossier_tiers
11938                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11939                    WHERE
11940                        tiers_consulte.accepte_notification_email IS TRUE
11941                        AND tiers_consulte.liste_diffusion IS NOT NULL
11942                        %3$s
11943                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11944                        AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11945                        -- Filtre sur les tiers acteur du dossier
11946                        AND lien_dossier_tiers.dossier = \'%6$s\'',
11947                    DB_PREFIXE,
11948                    implode(', ', $typesHabilitations),
11949                    $filtreServiceConsulteDI,
11950                    intval($commune),
11951                    intval($departement),
11952                    $this->f->db->escapeSimple($this->getVal('dossier'))
11953                ),
11954                array(
11955                    "origin" => __METHOD__
11956                )
11957            );
11958            // Faire un order by sur un union ne fonctionne pas. A la place
11959            // c'est le tableau des résultats qui est ordonné.
11960            usort($rst['result'], function($a, $b) {
11961                return strcmp($a['libelle'], $b['libelle']);
11962            });
11963            return $rst['result'];
11964        }
11965    
11966        /**
11967         * Gestion spécifique de l'affichage des documents dans le tableau des
11968         * documents d'instruction.
11969         * Prend en compte qu'une instruction peut également avoir un document lié
11970         * dans la table storage.
11971         *
11972         * @return void
11973         */
11974        public function view_telecharger_editions() {
11975            // Récupère l'identifiant du document dans l'URL appelant l'action
11976            $idx = $this->f->get_submitted_get_value('idx');
11977            $obj = $this->table;
11978            $champ = 'om_fichier_instruction';
11979            // Cas d'un document historisé (dans la table storage)
11980            if (strpos($idx, 'STORAGE_') !== false) {
11981                 $idx = substr($idx, 8);
11982                 $obj = 'storage';
11983                 $champ = 'uid';
11984            }
11985            // Ouvre le document
11986            $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11987            header("Location: ".$lien);
11988        }
11989    }

Legend:
Removed from v.6565  
changed lines
  Added in v.19592

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26