/[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 7685 by softime, Thu Jan 11 15:26:41 2018 UTC revision 18876 by softime, Tue Oct 8 08:41:06 2024 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    
26  //  //
27  class instruction extends instruction_gen {  class instruction extends instruction_gen {
# Line 27  class instruction extends instruction_ge Line 30  class instruction extends instruction_ge
30      var $abstract_type = array(      var $abstract_type = array(
31          "om_fichier_instruction" => "file",          "om_fichier_instruction" => "file",
32      );      );
33        
     var $retourformulaire;   // specific  
     var $idxformulaire;      // specific  
34      var $valEvenement;      var $valEvenement;
35      var $restriction_valid = null;      var $restriction_valid = null;
36      // 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 70  class instruction extends instruction_ge
70              "groupeInstruction" => 'getGroupeInstruction',              "groupeInstruction" => 'getGroupeInstruction',
71              "title" => 'getTitle',              "title" => 'getTitle',
72              'concerneERP' => 'get_concerne_erp',              'concerneERP' => 'get_concerne_erp',
73    
74                'date_cloture_metier' => 'getDossierDateDecision',
75                'type' => 'getDocumentType',
76                'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
77                'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
78                'region' => 'getDossierRegion',
79                'departement' => 'getDossierDepartement',
80                'commune' => 'getDossierCommune',
81                'annee' => 'getDossierAnnee',
82                'division' => 'getDossierDivision',
83                'collectivite' => 'getDossierServiceOrCollectivite',
84          ),          ),
85          "arrete" => array(          "arrete" => array(
86              "numArrete" => "getNumArrete",              "numArrete" => "getNumArrete",
# Line 85  class instruction extends instruction_ge Line 97  class instruction extends instruction_ge
97              "ap_ville" => "getAp_ville",              "ap_ville" => "getAp_ville",
98              "activite" => "getActivite",              "activite" => "getActivite",
99              "dateControleLegalite" => "getDateControleLegalite",              "dateControleLegalite" => "getDateControleLegalite",
100          ),          )
101      );      );
102    
103      function __construct($id, &$db, $debug) {      /**
104          $this->constructeur($id, $db, $debug);       * Flag pour identifier la reprise de l'instruction d'un dossier.
105         * Le statut de l'état passe de "cloture" à "encours".
106         *
107         * @var boolean
108         */
109        var $di_reopened = null;
110    
111        /**
112         * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
113         * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
114         *
115         * @param  bool  $only_for_class   Ne renvoie que les modules pour la classe de l'objet
116         *
117         * @return array  Liste de modules supplémentaires pour cet objet
118         */
119        public function get_modules_append(bool $only_for_class = false) {
120            $modules = array();
121    
122            // si on est sur un dossier d'instruction
123            if ($this->f->contexte_dossier_instruction()) {
124                $idx = $this->f->get_submitted_get_value('idxformulaire');
125    
126                $object_id = $this->getVal($this->clePrimaire);
127    
128                $evenements_ids = array();
129    
130                // Dans le cas ou on a un identifiant de dossier et que
131                // l'objet courant n'a pas de cle primaire définie
132                // ou qu'on est dans le contexte d'une classe d'objet
133                if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
134    
135                    // Utilise la valeur evenement si elle est déterminé,
136                    $evenement = $this->f->get_submitted_post_value('evenement');
137                    if (! empty($evenement)) $evenements_ids = array($evenement);
138                    if (empty($evenements_ids)){
139                        // si on est dans le cadre de l'affichage d'une nouvelle instruction
140                        $action = $this->f->get_submitted_get_value('action');
141    
142                        if ($action == '0') {
143    
144                            // ajoute les modules des évènements possible sur le dossier courant
145                            $evenements_data = $this->get_var_sql_forminc__sql_evenement();
146                            $evenements_ids = array_column($evenements_data, 'evenement');
147                        }
148    
149                        // si on est dans le cadre d'un listing
150                        else if (is_null($action) || $action === '') {
151    
152                            // récupère la liste des évènements d'instructions du dossier d'instruction
153                            $sql = sprintf("
154                                SELECT
155                                    evenement
156                                FROM
157                                    ".DB_PREFIXE."instruction
158                                WHERE
159                                    dossier = '%s'
160                                ", $this->f->db->escapeSimple($idx));
161                            $qres = $this->f->get_all_results_from_db_query(
162                                $sql, array('origin' => __METHOD__));
163                            if ($qres['code'] !== 'OK') {
164                                $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
165                                $this->f->log(__METHOD__, $err_msg, 'ERROR');
166                                throw new RuntimeException($err_msg);
167                            }
168    
169                            // ajoute les modules des évènements des instructions du dossier courant
170                            $evenements_ids = array_column($qres['result'], 'evenement');
171                        }
172                    }
173                }
174                if (!empty($evenements_ids)){
175                    $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
176                    $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
177                        'evenement', $evenements_ids, $this, false);
178                }
179            }
180            return $modules;
181      }      }
182    
183      // {{{ Gestion de la confidentialité des données spécifiques      // {{{ Gestion de la confidentialité des données spécifiques
# Line 113  class instruction extends instruction_ge Line 201  class instruction extends instruction_ge
201              "is_editable",              "is_editable",
202              "is_finalizable_without_bypass",              "is_finalizable_without_bypass",
203              "can_user_access_dossier_contexte_modification",              "can_user_access_dossier_contexte_modification",
204                "is_evenement_modifiable",
205          );          );
206          $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");          $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
207                    
208          // ACTION - 002 - supprimer          // ACTION - 002 - supprimer
209          // Modifie la condition et le libellé du bouton supprimer          // Modifie la condition et le libellé du bouton supprimer
210          $this->class_actions[2]["condition"] = array(          $this->class_actions[2]["condition"] = array(
211              "is_deletable",              "is_deletable",
212              "is_finalizable_without_bypass",              "is_finalizable_without_bypass",
213              "can_user_access_dossier_contexte_modification"              "can_user_access_dossier_contexte_modification",
214                "is_evenement_supprimable",
215          );          );
216          $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");          $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
217    
218          // ACTION - 003 - consulter          // ACTION - 003 - consulter
219          //          //
# Line 135  class instruction extends instruction_ge Line 225  class instruction extends instruction_ge
225              "identifier" => "finaliser",              "identifier" => "finaliser",
226              "portlet" => array(              "portlet" => array(
227                  "type" => "action-direct",                  "type" => "action-direct",
228                  "libelle" => _("Finaliser le document"),                  "libelle" => __("Finaliser le document"),
229                  "order" => 110,                  "order" => 110,
230                  "class" => "finalise",                  "class" => "finalise",
231              ),              ),
# Line 157  class instruction extends instruction_ge Line 247  class instruction extends instruction_ge
247              "identifier" => "definaliser",              "identifier" => "definaliser",
248              "portlet" => array(              "portlet" => array(
249                  "type" => "action-direct",                  "type" => "action-direct",
250                  "libelle" => _("Reprendre la redaction du document"),                  "libelle" => __("Reprendre la redaction du document"),
251                  "order" => 110,                  "order" => 110,
252                  "class" => "definalise",                  "class" => "definalise",
253              ),              ),
# Line 169  class instruction extends instruction_ge Line 259  class instruction extends instruction_ge
259                  "is_unfinalizable",                  "is_unfinalizable",
260                  "is_unfinalizable_without_bypass",                  "is_unfinalizable_without_bypass",
261                  "can_user_access_dossier_contexte_modification",                  "can_user_access_dossier_contexte_modification",
262                    "is_not_sent_for_signature",
263                    "is_not_signed",
264                ),
265            );
266    
267            // ACTION - 115 - Modification d'un document généré par une instruction
268            // Permet à un instructeur de modifier un document généré par une instruction
269            $this->class_actions[115] = array(
270                "identifier" => "modale_selection_document_signe",
271                "portlet" => array(
272                    "type" => "action-self",
273                    "libelle" => __("Remplacer par le document signé"),
274                    "order" => 115,
275                    "class" => "selection-document-signé",
276                ),
277                "view" => "view_modale_selection_document_signe",
278                "permission_suffix" => "selection_document_signe",
279                "condition" => array(
280                    "is_finalized",
281                    "is_not_date_retour_signature_set",
282              ),              ),
283          );          );
284    
# Line 178  class instruction extends instruction_ge Line 288  class instruction extends instruction_ge
288              "identifier" => "edition",              "identifier" => "edition",
289              "portlet" => array(              "portlet" => array(
290                  "type" => "action-blank",                  "type" => "action-blank",
291                  "libelle" => _("Edition"),                  "libelle" => __("Edition"),
292                  "order" => 100,                  "order" => 100,
293                  "class" => "pdf-16",                  "class" => "pdf-16",
294              ),              ),
# Line 193  class instruction extends instruction_ge Line 303  class instruction extends instruction_ge
303              "identifier" => "modifier_suivi",              "identifier" => "modifier_suivi",
304              "portlet" => array(              "portlet" => array(
305                  "type" => "action-self",                  "type" => "action-self",
306                  "libelle" => _("Suivi des dates"),                  "libelle" => __("Suivi des dates"),
307                  "order" => 125,                  "order" => 125,
308                  "class" => "suivi-dates-16",                  "class" => "suivi-dates-16",
309              ),              ),
# Line 242  class instruction extends instruction_ge Line 352  class instruction extends instruction_ge
352              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
353          );          );
354    
355            // ACTION - 175 - edit_by_notification_task
356            // Action à utiliser lors de la mise à jour des instructions par notification
357            $this->class_actions[175] = array(
358                "identifier" => "edit_by_notification_task",
359                "view" => "formulaire",
360                "permission_suffix" => "modifier",
361                "crud" => "update",
362            );
363    
364            // ACTION - 176 - add_by_evenement_retour_after_notification_task
365            // Action à utiliser lors de l'ajout des instructions par événement suivant
366            // suite à une notification par tâche (donc notification dématerialisée)
367            $this->class_actions[176] = array(
368                "identifier" => "add_by_evenement_retour_after_notification_task",
369                "view" => "formulaire",
370                "permission_suffix" => "ajouter",
371                "crud" => "create",
372            );
373    
374          // ACTION - 180 - pdf_lettre_rar          // ACTION - 180 - pdf_lettre_rar
375          // Génère PDF sur bordereaux de lettres RAR          // Génère PDF sur bordereaux de lettres AR
376          $this->class_actions[180] = array(          $this->class_actions[180] = array(
377              "identifier" => "pdf_lettre_rar",              "identifier" => "pdf_lettre_rar",
378              "view" => "view_pdf_lettre_rar",              "view" => "view_pdf_lettre_rar",
# Line 273  class instruction extends instruction_ge Line 402  class instruction extends instruction_ge
402              "identifier" => "notifier_commune",              "identifier" => "notifier_commune",
403              "portlet" => array(              "portlet" => array(
404                  "type" => "action-direct-with-confirmation",                  "type" => "action-direct-with-confirmation",
405                  "libelle" => _("Notifier la commune par courriel"),                  "libelle" => __("Notifier la commune par courriel"),
406                  "order" => 210,                  "order" => 210,
407                  "class" => "notifier_commune-16",                  "class" => "notifier_commune-16",
408              ),              ),
# Line 299  class instruction extends instruction_ge Line 428  class instruction extends instruction_ge
428              "permission_suffix" => "modifier",              "permission_suffix" => "modifier",
429              "condition" => array("can_user_access_dossier_contexte_modification"),              "condition" => array("can_user_access_dossier_contexte_modification"),
430          );          );
     }  
   
431    
432      /**          // ACTION - 701
433       * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier          $this->class_actions[701] = array(
434       */              "identifier" => "enable-edition-integrale",
435      function getNumDemandeAutorFromDossier($id) {              "portlet" => array(
436          //                  "type" => "action-direct-with-confirmation",
437          if (!isset($id)) {                  "libelle" => __("Rédaction libre"),
438              return NULL;                  "order" => 50,
439          }                  "class" => "redac-libre-16",
440          //              ),
441          $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";              "view" => "formulaire",
442          $sql .= " where dossier='".$id."'";              "method" => "enable_edition_integrale",
443                "permission_suffix" => "modifier",
444                "condition" => array(
445                    "is_editable",
446                    "is_finalizable_without_bypass",
447                    "can_user_access_dossier_contexte_modification",
448                    "is_edition_integrale_not_enabled",
449                    "is_option_redaction_libre_enabled",
450                    "has_an_edition",
451                ),
452            );
453            // ACTION - 702
454            $this->class_actions[702] = array(
455                "identifier" => "disable-edition-integrale",
456                "portlet" => array(
457                    "type" => "action-direct-with-confirmation",
458                    "libelle" => __("Rédaction par compléments"),
459                    "order" => 50,
460                    "class" => "redac-complement-16",
461                ),
462                "view" => "formulaire",
463                "method" => "disable_edition_integrale",
464                "permission_suffix" => "modifier",
465                "condition" => array(
466                    "is_editable",
467                    "is_finalizable_without_bypass",
468                    "can_user_access_dossier_contexte_modification",
469                    "is_edition_integrale_enabled",
470                    "is_option_redaction_libre_enabled",
471                    "has_an_edition",
472                ),
473            );
474            // ACTION - 300 - evenement_has_an_edition_json
475          //          //
476          $dossier_autorisation = $this->db->getOne($sql);          $this->class_actions[300] = array(
477          $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);              "identifier" => "evenement_has_an_edition_json",
478          database::isError($dossier_autorisation);              "view" => "view_evenement_has_an_edition_json",
479                "permission_suffix" => "consulter",
480            );
481    
482            // ACTION - 301 - evenement_has_a_commentaire
483          //          //
484          return $dossier_autorisation;          $this->class_actions[301] = array(
485      }              "identifier" => "evenement_has_a_commentaire_json",
486                "view" => "view_evenement_has_a_commentaire_json",
487                "permission_suffix" => "consulter",
488            );
489    
490      // }}}          // ACTION - 400 - Envoyer en signature
491            // Cet évenement permet d'envoyer le document au parapheur pour signature
492            $this->class_actions[400] = array(
493                "identifier" => "envoyer_a_signature",
494                "portlet" => array(
495                    "libelle" => __("Envoyer à signature"),
496                    "type" => "action-direct-with-confirmation",
497                    "class" => "envoyer_a_signature-16",
498                ),
499                "view" => "formulaire",
500                "method" => "envoyer_a_signature_sans_relecture",
501                "condition" => array(
502                    "can_be_signed",
503                ),
504                "permission_suffix" => "envoyer_a_signature",
505            );
506    
507            // ACTION - 402 - Envoyer en signature avec relecture
508            // Cet évenement permet d'envoyer le document au parapheur pour signature
509            $this->class_actions[402] = array(
510                "identifier" => "envoyer_a_signature_relecture",
511                "portlet" => array(
512                    "libelle" => __("Envoyer à signature avec relecture"),
513                    "type" => "action-direct-with-confirmation",
514                    "class" => "envoyer_a_signature-16",
515                ),
516                "view" => "formulaire",
517                "method" => "envoyer_a_signature_avec_relecture",
518                "condition" => array(
519                    "can_be_signed",
520                    "is_parapheur_relecture_parameter_enabled"
521                ),
522                "permission_suffix" => "envoyer_a_signature",
523            );
524    
525            // ACTION - 404 - Annuler l'envoi en signature
526            // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
527            $this->class_actions[404] = array(
528                "identifier" => "annuler_envoi_signature",
529                "portlet" => array(
530                    "libelle" => __("Annuler l'envoi en signature"),
531                    "type" => "action-direct-with-confirmation",
532                    "class" => "annuler_envoi_signature-16",
533                ),
534                "view" => "formulaire",
535                "method" => "annuler_envoi_en_signature",
536                "condition" => array(
537                    "is_sent_for_signature",
538                    "is_parapheur_annulation_parameter_enabled"
539                ),
540                "permission_suffix" => "envoyer_a_signature",
541            );
542    
     function setType(&$form, $maj) {  
         //  
         parent::setType($form, $maj);  
         // On cache tous les champs  
         // XXX  
         $form->setType('complement5_om_html', 'hidden');  
         $form->setType('bible5', 'hidden');  
         $form->setType('complement6_om_html', 'hidden');  
         $form->setType('bible6', 'hidden');  
         $form->setType('complement7_om_html', 'hidden');  
         $form->setType('bible7', 'hidden');  
         $form->setType('complement8_om_html', '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');  
543          //          //
544          $form->setType('numero_arrete', 'hidden');          $this->class_actions[401] = array(
545                "identifier" => "preview_edition",
546                "view" => "formulaire",
547                "permission_suffix" => "tab",
548            );
549    
550          //          //
551          $form->setType('code_barres', 'hidden');          $this->class_actions[405] = array(
552                        "identifier" => "telecharger_editions",
553                "view" => "view_telecharger_editions",
554                "permission_suffix" => "om_fichier_instruction_telecharger",
555            );
556    
557            // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
558            $this->class_actions[410] = array(
559                "identifier" => "overlay_notification_manuelle",
560                "portlet" => array(
561                    "libelle" => __("Notifier les pétitionnaires"),
562                    "type" => "action-self",
563                    "class" => "notifier_commune-16",
564                ),
565                "condition" => array(
566                    "is_notifiable_by_task_manual",
567                    "is_not_portail_notification_sans_annexe"
568                ),
569                "view" => "view_overlay_notification_manuelle",
570                "permission_suffix" => "modifier",
571            );
572    
573            // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
574            $this->class_actions[411] = array(
575                "identifier" => "notification_manuelle_portal",
576                "portlet" => array(
577                    "libelle" => __("Notifier les pétitionnaires"),
578                    "type" => "action-direct-with-confirmation",
579                    "class" => "notifier_commune-16",
580                ),
581                "condition" => array(
582                    "is_notifiable_by_task_manual",
583                    "is_portail_notification_sans_annexe"
584                ),
585                "method" => "notifier_demandeur_principal_via_portal",
586                "permission_suffix" => "modifier",
587            );
588    
589            // ACTION - 412 - Vérifie le dépassement de la date limite de notification
590            $this->class_actions[412] = array(
591                "identifier" => "is_date_limite_notification_dossier_depasse",
592                "view" => "is_date_limite_notification_dossier_depasse",
593                "permission_suffix" => "modifier",
594            );
595    
596            // ACTION - 420 - Notifier les services consultés (mail)
597            $this->class_actions[420] = array(
598                "identifier" => "overlay_notification_service_consulte",
599                "portlet" => array(
600                    "libelle" => __("Notifier les services consultés"),
601                    "type" => "action-self",
602                    "class" => "notifier_commune-16",
603                ),
604                "condition" => array(
605                    "is_service_notifiable"
606                ),
607                "view" => "view_overlay_notification_service_consulte",
608                "permission_suffix" => "tab",
609            );
610    
611            // ACTION - 430 - Notifier les tiers consultés (mail)
612            $this->class_actions[430] = array(
613                "identifier" => "overlay_notification_tiers_consulte",
614                "portlet" => array(
615                    "libelle" => __("Notifier les tiers consultés"),
616                    "type" => "action-self",
617                    "class" => "notifier_commune-16",
618                ),
619                "condition" => array(
620                    "is_tiers_notifiable"
621                ),
622                "view" => "view_overlay_notification_tiers_consulte",
623                "permission_suffix" => "tab",
624            );
625    
626          //          //
627          $form->setType('archive_incompletude','hidden');          $this->class_actions[403] = array(
628          $form->setType('archive_incomplet_notifie','hidden');              "identifier" => "envoyer_au_controle_de_legalite",
629          $form->setType('archive_evenement_suivant_tacite','hidden');              "portlet" => array(
630          $form->setType('archive_evenement_suivant_tacite_incompletude','hidden');                  "libelle" => __("Envoyer au contrôle de légalité"),
631          $form->setType('archive_etat_pendant_incompletude','hidden');                  "type" => "action-direct-with-confirmation",
632          $form->setType('archive_date_limite_incompletude','hiddendate');                  "class" => "envoyer_au_controle_de_legalite-16",
633          $form->setType('archive_delai_incompletude','hidden');              ),
634                "view" => "formulaire",
635                "method" => "envoyer_au_controle_de_legalite",
636                "condition" => array(
637                    "can_be_sent_to_cl"
638                ),
639                "permission_suffix" => "envoyer_au_controle_de_legalite",
640            );
641    
642          //          //
643          $form->setType('archive_date_cloture_instruction','hidden');          $this->class_actions[998] = array(
644          $form->setType('archive_date_premiere_visite','hidden');              "identifier" => "json_data",
645          $form->setType('archive_date_derniere_visite','hidden');              "view" => "view_json_data",
646          $form->setType('archive_date_contradictoire','hidden');              "permission_suffix" => "consulter",
647          $form->setType('archive_date_retour_contradictoire','hidden');          );
648          $form->setType('archive_date_ait','hiddendate');      }
649          $form->setType('archive_date_transmission_parquet','hidden');  
650        /**
651         * Clause select pour la requête de sélection des données de l'enregistrement.
652         *
653         * @return array
654         */
655        function get_var_sql_forminc__champs() {
656            return array(
657                "instruction",
658                "destinataire",
659                "instruction.evenement",
660                "instruction.commentaire",
661                "date_evenement",
662                "document_type_instruction",
663                "fichier_instruction_name",
664                "instruction.lettretype",
665                "signataire_arrete",
666                "flag_edition_integrale",
667                "om_final_instruction_utilisateur",
668                "date_finalisation_courrier",
669                "date_envoi_signature",
670                "date_retour_signature",
671                "date_envoi_rar",
672    
673                "date_retour_rar",
674                "date_envoi_controle_legalite",
675                "date_retour_controle_legalite",
676    
677                "numero_arrete",
678    
679                "complement_om_html",
680                "'' as bible_auto",
681                "'' as bible",
682                "complement2_om_html",
683                "'' as bible2",
684                "complement3_om_html",
685                "'' as bible3",
686                "complement4_om_html",
687                "'' as bible4",
688    
689                "titre_om_htmletat",
690                "corps_om_htmletatex",
691    
692                "'' as btn_preview",
693                "'' as btn_redaction",
694    
695                "'' as btn_refresh",
696                "'' as live_preview",
697    
698                "dossier",
699                "instruction.action",
700                "instruction.delai",
701                "instruction.etat",
702                "instruction.autorite_competente",
703                "instruction.accord_tacite",
704                "instruction.delai_notification",
705                "instruction.avis_decision",
706                "archive_delai",
707                "archive_accord_tacite",
708                "archive_etat",
709                "archive_avis",
710                "archive_date_complet",
711                "archive_date_rejet",
712                "archive_date_limite",
713                "archive_date_notification_delai",
714                "archive_date_decision",
715                "archive_date_validite",
716                "archive_date_achevement",
717                "archive_date_conformite",
718                "archive_date_chantier",
719                "archive_date_dernier_depot",
720                "date_depot",
721                "date_depot_mairie",
722                "complement5_om_html",
723                "'' as bible5",
724                "complement6_om_html",
725                "'' as bible6",
726                "complement7_om_html",
727                "'' as bible7",
728                "complement8_om_html",
729                "'' as bible8",
730                "complement9_om_html",
731                "'' as bible9",
732                "complement10_om_html",
733                "'' as bible10",
734                "complement11_om_html",
735                "'' as bible11",
736                "complement12_om_html",
737                "complement13_om_html",
738                "complement14_om_html",
739                "complement15_om_html",
740                "archive_incompletude",
741                "archive_incomplet_notifie",
742                "archive_evenement_suivant_tacite",
743                "archive_evenement_suivant_tacite_incompletude",
744                "archive_etat_pendant_incompletude",
745                "archive_date_limite_incompletude",
746                "archive_delai_incompletude",
747                "archive_autorite_competente",
748                "code_barres",
749                "om_fichier_instruction",
750                "om_final_instruction",
751                "om_fichier_instruction_dossier_final",
752                "document_numerise",
753                "duree_validite_parametrage",
754                "duree_validite",
755                "created_by_commune",
756                "archive_date_cloture_instruction",
757                "archive_date_premiere_visite",
758                "archive_date_derniere_visite",
759                "archive_date_contradictoire",
760                "archive_date_retour_contradictoire",
761                "archive_date_ait",
762                "archive_date_transmission_parquet",
763                "archive_dossier_instruction_type",
764                "archive_date_affichage",
765                "pec_metier",
766                "archive_pec_metier",
767                "archive_a_qualifier",
768                "id_parapheur_signature",
769                "statut_signature",
770                "commentaire_signature",
771                "historique_signature",
772                "'' as suivi_notification",
773                "'' as suivi_notification_service",
774                "'' as suivi_notification_tiers",
775                "'' as suivi_notification_commune",
776    
777                "'' as preview_edition",
778                "envoye_cl_platau",
779                "'' as log_instruction",
780                "parapheur_lien_page_signature"
781            );
782        }
783    
784        /**
785         * CONDITION - is_edition_integrale_enabled
786         *
787         * Vérifie que la rédaction libre est activée sur l'instruction en cours.
788         *
789         * @return boolean
790         */
791        function is_edition_integrale_enabled() {
792            if ($this->getVal("flag_edition_integrale") == 't') {
793                return true;
794            }
795            return false;
796        }
797    
798        /**
799         * CONDITION - is_edition_integrale_not_enabled
800         *
801         * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
802         *
803         * @return boolean
804         */
805        function is_edition_integrale_not_enabled() {
806            return !$this->is_edition_integrale_enabled();
807        }
808    
809        /**
810         * CONDITION - is_option_redaction_libre_enabled
811         *
812         * Vérifie que l'option de rédaction libre est activée.
813         *
814         * @return boolean
815         */
816        function is_option_redaction_libre_enabled() {
817            $collectivite_di = $this->get_dossier_instruction_om_collectivite();
818            return $this->f->is_option_redaction_libre_enabled($collectivite_di);
819        }
820    
821        /**
822         * CONDITION - is_option_parapheur_relecture_enabled
823         *
824         * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
825         *
826         * @return boolean
827         */
828        function is_parapheur_relecture_parameter_enabled() {
829            //Instanciation de la classe electronicsignature
830            $inst_es = $this->get_electronicsignature_instance();
831            if ($inst_es === false) {
832                return false;
833            }
834    
835            if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
836                return false;
837            }
838    
839            return true;
840        }
841    
842        /**
843         * CONDITION - is_parapheur_annulation_parameter_enabled
844         *
845         * Vérifie que l'option d'annulation de l'envoi en signature est activée.
846         *
847         * @return boolean
848         */
849        function is_parapheur_annulation_parameter_enabled() {
850            //Instanciation de la classe electronicsignature
851            $inst_es = $this->get_electronicsignature_instance();
852            if ($inst_es === false) {
853                return false;
854            }
855    
856            if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
857                return false;
858            }
859    
860            return true;
861        }
862    
863    
864        /**
865         * CONDITION - is_sent_for_signature
866         *
867         * Vérifie que l'instruction a été envoyé à signature
868         *
869         * @return boolean
870         */
871        function is_sent_for_signature() {
872            // Si un parapheur a été configuré
873            // et que le champ id_parapheur_signature n'est pas vide
874            // que le status est différent de "canceled" ou "expired"
875            // alors l'évènement a été envoyé en signature
876            if ($this->has_connector_electronicsignature() === true
877                && empty($this->getVal("id_parapheur_signature")) === false
878                && ($this->getVal("statut_signature") != "canceled"
879                && $this->getVal("statut_signature") != "expired"
880                && $this->getVal("statut_signature") != "finished")) {
881                //
882                return true;
883            }
884    
885            return false;
886        }
887    
888        /**
889         * CONDITION - is_not_sent_for_signature
890         *
891         * Vérifie que l'instruction n'a pas été envoyé à signature
892         *
893         * @return boolean
894         */
895        function is_not_sent_for_signature() {
896            // Contrôle si l'utilisateur possède un bypass
897            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
898            if ($bypass == true) {
899                return true;
900            }
901    
902            return !$this->is_sent_for_signature();
903        }
904    
905    
906        /**
907         * CONDITION - is_signed
908         *
909         * Vérifie que l'instruction a été signé
910         *
911         * @return boolean
912         */
913        function is_signed() {
914            // Si un parapheur a été configuré
915            // et que le champ id_parapheur_signature n'est pas vide
916            //  et que le statut est égal à "finished"
917            // alors le document de l'instruciton à été signé
918            if ($this->has_connector_electronicsignature() === true
919                && empty($this->getVal("id_parapheur_signature")) === false
920                && $this->getVal("statut_signature") == "finished") {
921                //
922                return true;
923            }
924    
925            return false;
926        }
927    
928        /**
929         * CONDITION - is_signed
930         *
931         * Vérifie que l'instruction n'a pas été signée
932         *
933         * @return boolean
934         */
935        function is_not_signed() {
936            // Contrôle si l'utilisateur possède un bypass
937            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
938            if ($bypass == true) {
939                return true;
940            }
941    
942            return !$this->is_signed();
943        }
944    
945    
946        /**
947         * is_sent_to_cl
948         *
949         * Vérifie que l'instruction a été envoyé au contrôle de légalité
950         *
951         * @return boolean
952         */
953        function is_sent_to_cl() {
954            // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
955            if ($this->getVal('envoye_cl_platau') === 't') {
956                //
957                return true;
958            }
959          //          //
960          $form->setType('duree_validite','hidden');          return false;
961          $form->setType('duree_validite_parametrage','hidden');      }
962    
963        /**
964         * CONDITION - is_portail_notification
965         *
966         * Vérifie si la notification est une notification de catégorie portail
967         *
968         * @return boolean
969         */
970        function is_portail_notification_sans_annexe() {
971            $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
972            $ev = $this->get_inst_evenement($this->getVal('evenement'));
973            if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
974                && $ev->getVal('notification') != 'notification_manuelle_annexe'
975                && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
976            ) {
977                return true;
978            }
979            return false;
980        }
981    
982        /**
983         * CONDITION - is_not_portail_notification
984         *
985         * Vérifie si la notification n'est pas une notification de catégorie portail
986         *
987         * @return boolean
988         */
989        function is_not_portail_notification_sans_annexe() {
990            return (! $this->is_portail_notification_sans_annexe());
991        }
992    
993        /**
994         * CONDITION - can_be_signed
995         *
996         * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
997         *
998         * @return boolean
999         */
1000        function can_be_signed() {
1001            // Instanciation de l'objet signataire_arrete
1002            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1003                "obj" => "signataire_arrete",
1004                "idx" => $this->getVal("signataire_arrete"),
1005            ));
1006            // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1007            // possède une adresse email, on vérifie le champ id_parapheur_signature
1008            // S'il est vide l'évènement peut être envoyé en signature
1009            // S'il ne l'est pas, alors on vérifie le champ statut_signature
1010            // Si la valeur de ce champ est égal à "canceled" ou "expired"
1011            // alors l'évènement peut être envoyé en signature
1012            if ($this->has_connector_electronicsignature() === true
1013                && $this->getVal("om_final_instruction") == 't'
1014                && empty($inst_signataire_arrete->getVal('email')) === false) {
1015                //
1016                if (empty($this->getVal("id_parapheur_signature")) === true
1017                    || $this->getVal("statut_signature") == "canceled"
1018                    || $this->getVal("statut_signature") == "expired") {
1019                    //
1020                    return true;
1021                }
1022            }
1023    
1024            $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1025            $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1026            $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1027            $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1028            $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1029    
1030            return false;
1031        }
1032    
1033        /**
1034         * CONDITION - has_connector_electronicsignature
1035         *
1036         * Vérifie qu'un parapheur est paramétré
1037         *
1038         * @return boolean
1039         */
1040        function has_connector_electronicsignature() {
1041            $inst_es = $this->get_electronicsignature_instance(false);
1042            if ($inst_es === false) {
1043                return false;
1044            }
1045            return true;
1046        }
1047    
1048        /**
1049         * CONDITION - can_display_parapheur
1050         *
1051         * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1052         *
1053         * @return boolean
1054         */
1055        function can_display_parapheur() {
1056            $evenement_id = $this->getVal("evenement");
1057            $inst_evenement = $this->get_inst_evenement($evenement_id);
1058            if ($this->has_connector_electronicsignature() === true
1059                && $inst_evenement->getVal('lettretype') !== ''
1060                && $inst_evenement->getVal('lettretype') !== null
1061                && (empty($this->getVal("id_parapheur_signature")) === false
1062                    || empty($this->getVal("historique_signature")) === false)) {
1063                //
1064                return true;
1065            }
1066    
1067            return false;
1068        }
1069    
1070        /**
1071         * CONDITION - can_display_notification
1072         *
1073         * Vérifie que le champs "Suivi notification" est affichable
1074         *
1075         * @return boolean
1076         */
1077        function can_display_notification_demandeur() {
1078            // Le suivi des notification est affiché si l'instruction a
1079            // des notifications de demandeurs associées
1080            $idsNotifs = $this->get_instruction_notification(
1081                $this->getVal($this->clePrimaire),
1082                array(
1083                    'notification_recepisse',
1084                    'notification_instruction',
1085                    'notification_decision',
1086                ),
1087                true
1088            );
1089            return isset($idsNotifs) && $idsNotifs !== array();
1090        }
1091    
1092        /**
1093         * CONDITION - can_display_notification
1094         *
1095         * Vérifie que le champs "suivi_notification_service" est affichable
1096         *
1097         * @return boolean
1098         */
1099        function can_display_notification_service() {
1100            // Le suivi des notification est affiché si l'événement est notifiable
1101            // et si des notifications ont été envoyées
1102            $evenement_id = $this->getVal("evenement");
1103            $inst_evenement = $this->get_inst_evenement($evenement_id);
1104            if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1105                // Des notifications ont été envoyé si il existe au moins une notification
1106                // de type notification_service_consulte liées à l'instruction
1107                $idsNotifs = $this->get_instruction_notification(
1108                    $this->getVal($this->clePrimaire),
1109                    'notification_service_consulte'
1110                );
1111                if (isset($idsNotifs) && $idsNotifs !== array()) {
1112                    return true;
1113                }
1114            }
1115            return false;
1116        }
1117    
1118    
1119        /**
1120         * CONDITION - can_display_notification_tiers
1121         *
1122         * Vérifie que le champs "suivi_notification_tiers" est affichable
1123         *
1124         * @return boolean
1125         */
1126        function can_display_notification_tiers() {
1127            // Le suivi des notification est affiché si l'instruction a
1128            // des notifications de tiers associées
1129            $idsNotifs = $this->get_instruction_notification(
1130                $this->getVal($this->clePrimaire),
1131                'notification_tiers_consulte'
1132            );
1133            return isset($idsNotifs) && $idsNotifs !== array();
1134        }
1135    
1136        /**
1137         * CONDITION - can_display_notification_commune
1138         *
1139         * Vérifie que le champs "suivi_notification_commune" est affichable
1140         *
1141         * @return boolean
1142         */
1143        function can_display_notification_commune() {
1144            // Le suivi des notification si il existe au moins une notification
1145            // de type notification_depot_demat liées à l'instruction
1146            $idsNotifs = $this->get_instruction_notification(
1147                $this->getVal($this->clePrimaire),
1148                array('notification_depot_demat', 'notification_commune')
1149            );
1150            if (isset($idsNotifs) && $idsNotifs !== array()) {
1151                return true;
1152            }
1153            return false;
1154        }
1155    
1156        /**
1157         * TREATMENT - disable_edition_integrale.
1158         *
1159         * Cette methode permet de passer la consultation en "lu"
1160         *
1161         * @return boolean true si maj effectué false sinon
1162         */
1163        function disable_edition_integrale() {
1164            // Cette méthode permet d'exécuter une routine en début des méthodes
1165            // dites de TREATMENT.
1166            $this->begin_treatment(__METHOD__);
1167            $this->correct = true;
1168            $valF = array(
1169                "flag_edition_integrale" => false,
1170                "titre_om_htmletat" => null,
1171                "corps_om_htmletatex" => null,
1172            );
1173            $res = $this->f->db->autoExecute(
1174                DB_PREFIXE.$this->table,
1175                $valF,
1176                DB_AUTOQUERY_UPDATE,
1177                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1178            );
1179            if ($this->f->isDatabaseError($res, true)) {
1180                // Appel de la methode de recuperation des erreurs
1181                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1182                $this->correct = false;
1183                // Termine le traitement
1184                return $this->end_treatment(__METHOD__, false);
1185            } else {
1186                $this->addToMessage(__("Rédaction par compléments activé."));
1187                return $this->end_treatment(__METHOD__, true);
1188            }
1189    
1190            // Termine le traitement
1191            return $this->end_treatment(__METHOD__, false);
1192        }
1193    
1194        /**
1195         * TREATMENT - enable_edition_integrale.
1196         *
1197         * Cette methode permet de passer la consultation en "lu"
1198         *
1199         * @return boolean true si maj effectué false sinon
1200         */
1201        function enable_edition_integrale() {
1202            // Cette méthode permet d'exécuter une routine en début des méthodes
1203            // dites de TREATMENT.
1204            $this->begin_treatment(__METHOD__);
1205            $this->correct = true;
1206    
1207            // Récupère la collectivite du dossier d'instruction
1208            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1209            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1210          //          //
1211          $form->setType('created_by_commune','hidden');          $params = array(
1212                "specific" => array(
1213                    "corps" => array(
1214                        "mode" => "get",
1215                    )
1216                ),
1217            );
1218            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1219            $corps = $result['pdf_output'];
1220          //          //
1221          // gestion du champ "finalisé par"          $params = array(
1222          if ($this->getVal("om_final_instruction") == 't') {              "specific" => array(
1223              $form->setType('om_final_instruction_utilisateur', 'static');                  "titre" => array(
1224                        "mode" => "get",
1225                    )
1226                ),
1227            );
1228            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1229            $titre = $result['pdf_output'];
1230            //
1231            $valF = array(
1232                "flag_edition_integrale" => true,
1233                "titre_om_htmletat" => $titre,
1234                "corps_om_htmletatex" => $corps,
1235            );
1236            $res = $this->f->db->autoExecute(
1237                DB_PREFIXE.$this->table,
1238                $valF,
1239                DB_AUTOQUERY_UPDATE,
1240                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1241            );
1242            if ($this->f->isDatabaseError($res, true)) {
1243                // Appel de la methode de recuperation des erreurs
1244                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1245                $this->correct = false;
1246                // Termine le traitement
1247                return $this->end_treatment(__METHOD__, false);
1248          } else {          } else {
1249              $form->setType('om_final_instruction_utilisateur', 'hidden');              $this->addToMessage(__("Rédaction libre activé."));
1250                return $this->end_treatment(__METHOD__, true);
1251            }
1252    
1253            // Termine le traitement
1254            return $this->end_treatment(__METHOD__, false);
1255        }
1256    
1257        /**
1258         * Cette méthode instancie le dossier à partir de l'identifiant passé
1259         * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1260         * associé au dossier.
1261         * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1262         * renverra NULL
1263         *
1264         * @param string identifiant du dossier
1265         * @return null|string null ou identifiant du DA
1266         */
1267        function getNumDemandeAutorFromDossier($id) {
1268            if (!isset($id)) {
1269                return NULL;
1270          }          }
1271    
1272            $dossier = $this->f->get_inst__om_dbform(array(
1273                'obj' => 'dossier',
1274                'idx' => $id,
1275            ));
1276    
1277            return $dossier->getVal('dossier_autorisation');
1278        }
1279    
1280    
1281        /**
1282         * Cette méthode permet de récupérer le libelle du type de document
1283         * en instanciant l'objet document_type.
1284         *
1285         * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1286         * on le récupère pour l'afficher.
1287         *
1288         * @return string|NULL Retourne le libelle du type de document ou vide
1289         */
1290        function get_type_document_linked_with_instruction(){
1291          //          //
1292          if ($maj < 2 || $maj == 125) { //ajouter, modifier et suivi des dates          $document_type = $this->f->get_inst__om_dbform(array(
1293              $form->setType('destinataire', 'hidden');              'obj' => 'document_type',
1294              $form->setType('lettretype', 'hiddenstatic');              'idx' => $this->getVal("document_type_instruction"),
1295              $form->setType('complement_om_html', 'html');          ));
1296              $form->setType('complement2_om_html', 'html');          if ($document_type->exists() === true) {
1297              $form->setType('complement3_om_html', 'html');             return $document_type->getVal("libelle");
1298              $form->setType('complement4_om_html', 'html');          }
1299              $form->setType('bible_auto', 'httpclick');          return NULL;
1300              $form->setType('bible', 'httpclick');      }
             $form->setType('bible2', 'httpclick');  
             $form->setType('bible3', 'httpclick');  
             $form->setType('bible4', 'httpclick');  
             $form->setType('btn_refresh', 'hidden');  
             $form->setType('live_preview', 'hidden');  
             $form->setType('dossier', 'hidden');  
             $form->setType('libelle', 'hiddenstatic');  
             $form->setType('signataire_arrete','select');  
             $form->setType('date_envoi_signature','datedisabled');  
             $form->setType('date_retour_signature','datedisabled');  
             $form->setType('date_envoi_rar','datedisabled');  
             $form->setType('date_retour_rar','datedisabled');  
             $form->setType('date_envoi_controle_legalite','datedisabled');  
             $form->setType('date_retour_controle_legalite','datedisabled');  
             $form->setType('date_finalisation_courrier','datedisabled');  
   
             if($maj==0){ // ajouter  
                 $form->setType('instruction', 'hidden');  
                 $form->setType('lettretype', 'hidden');  
                 $form->setType('evenement', 'select');  
                 $form->setType('date_evenement', 'date2');  
             }else{ // modifier et suivi des dates  
                 $form->setType('instruction', 'hiddenstatic');  
                 $form->setType('evenement', 'selecthiddenstatic');  
                 //$form->setType('date_evenement', 'hiddenstaticdate');  
                 $form->setType('date_evenement', 'date2');  
1301    
1302                  // Récupère la collectivité du dossier d'instruction      
1303                  $collectivite_di = $this->get_dossier_instruction_om_collectivite();      function setType(&$form, $maj) {
1304            $data = array('form' => &$form, 'maj' => &$maj);
1305            $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1306    
1307                  //          // Récupération du mode de l'action
1308                  if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true          $crud = $this->get_action_crud($maj);
1309                      && $this->has_an_edition() === true) {          // Récupère la collectivité du dossier d'instruction
1310                      $form->setType('btn_refresh', 'httpclick');          $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1311                      $form->setType('live_preview', 'pdf');  
1312            // Cache tous les champs
1313            foreach ($this->champs as $value) {
1314                $form->setType($value, 'hidden');
1315            }
1316    
1317            // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1318            if ($this->can_display_parapheur() === true && $maj == 3) {
1319                $form->setType('statut_signature', 'selectstatic');
1320                $form->setType('historique_signature', 'jsontotab');
1321                if ($this->getVal('commentaire_signature') == null) {
1322                    $form->setType('commentaire_signature', 'hidden');
1323                } else {
1324                    $form->setType('commentaire_signature', 'hiddenstatic');
1325                }
1326            }
1327    
1328            // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1329            if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1330                $form->setType('suivi_notification', 'jsontotab');
1331            }
1332            // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1333            if ($maj == 3 && $this->can_display_notification_service() === true) {
1334                $form->setType('suivi_notification_service', 'jsontotab');
1335            }
1336            // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1337            if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1338                $form->setType('suivi_notification_tiers', 'jsontotab');
1339            }
1340            // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1341            if ($maj == 3 && $this->can_display_notification_commune() === true) {
1342                $form->setType('suivi_notification_commune', 'jsontotab');
1343            }
1344    
1345            // MODE AJOUTER
1346            if ($this->getParameter('maj') == 0) {
1347                $form->setType('commentaire', 'textareahidden');
1348                // Si l'option est active passage du champ date en lecture seule
1349                if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1350                    $form->setType("date_evenement", "hiddenstaticdate");
1351                } else {
1352                    $form->setType("date_evenement", "date");
1353                }
1354                if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1355                    $form->setType("evenement", "selecthiddenstatic");
1356                } else {
1357                    $form->setType("evenement", "select");
1358                }
1359                if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1360                    $form->setType("signataire_arrete", "selecthiddenstatic");
1361                } else {
1362                    $form->setType("signataire_arrete", "select");
1363                }
1364                if ($this->is_option_redaction_libre_enabled() === true) {
1365                    $form->setType("flag_edition_integrale", "select");
1366                }
1367            }
1368    
1369            // MODE MODIFIER
1370            if ($this->getParameter('maj') == 1) {
1371                // Si l'option est active passage du champ date en lecture seule
1372                if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1373                    $form->setType("date_evenement", "hiddenstaticdate");
1374                } else {
1375                    $form->setType("date_evenement", "date");
1376                }
1377                $form->setType("evenement", "selecthiddenstatic");
1378                if ($this->has_an_edition() === true) {
1379                    $form->setType('document_type_instruction', 'selecthiddenstatic');
1380                    $form->setType('lettretype', 'hiddenstatic');
1381                    if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1382                        $form->setType("signataire_arrete", "selecthiddenstatic");
1383                    } else {
1384                        $form->setType("signataire_arrete", "select");
1385                  }                  }
1386                    if ($this->getVal("flag_edition_integrale") == "t") {
1387                        $form->setType("titre_om_htmletat", "htmlEtat");
1388                        $form->setType("corps_om_htmletatex", "htmlEtatEx");
1389                    } else {
1390                        $form->setType("complement_om_html", "html");
1391                        $form->setType("complement2_om_html", "html");
1392                        $form->setType("complement3_om_html", "html");
1393                        $form->setType("complement4_om_html", "html");
1394                        $form->setType('bible_auto', 'httpclick');
1395                        $form->setType('bible', 'httpclick');
1396                        $form->setType('bible2', 'httpclick');
1397                        $form->setType('bible3', 'httpclick');
1398                        $form->setType('bible4', 'httpclick');
1399                    }
1400                    if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1401                        //
1402                        $form->setType('btn_refresh', 'httpclickbutton');
1403                        $form->setType('btn_preview', 'httpclickbutton');
1404                        $form->setType('btn_redaction', 'httpclickbutton');
1405                        // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1406                        // pour identifiant le champ de prévisualisation et régler sa taille à
1407                        // l'affichage du champ. En cas de modification, le selecteur doit également
1408                        // être mis à jour
1409                        $form->setType('live_preview', 'previsualiser_pdf');
1410                    }
1411    
1412                  // necessaire pour calcul de date en modification                  // necessaire pour calcul de date en modification
1413                  //$form->setType('delai', 'hiddenstatic');                  //$form->setType('delai', 'hiddenstatic');
1414                  // les administrateurs technique et fonctionnel peuvent                  // les administrateurs technique et fonctionnel peuvent
1415                  // modifier tous les champs de date                  // modifier tous les champs de date
1416                  // 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
1417                  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")
1418                          || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))                          || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1419                      && $this->getVal("date_finalisation_courrier") != '') {                      && $this->getVal("date_finalisation_courrier") != '') {
1420                        //
1421                      $form->setType('date_envoi_signature', 'date');                      $form->setType('date_envoi_signature', 'date');
1422                      $form->setType('date_retour_signature', 'date');                      $form->setType('date_retour_signature', 'date');
1423                        if ($this->is_sent_for_signature() === true
1424                            && $this->is_signed() === true) {
1425                            //
1426                            $form->setType("date_envoi_signature", "datereadonly");
1427                            $form->setType("date_retour_signature", "datereadonly");
1428                        }
1429                      $form->setType('date_envoi_rar', 'date');                      $form->setType('date_envoi_rar', 'date');
1430                      $form->setType('date_retour_rar', 'date');                      $form->setType('date_retour_rar', 'date');
1431                      $form->setType('date_envoi_controle_legalite', 'date');                      $form->setType('date_envoi_controle_legalite', 'date');
1432                        if ($this->is_sent_to_cl() === true) {
1433                            $form->setType("date_envoi_controle_legalite", "datedisabled");
1434                        }
1435                      $form->setType('date_retour_controle_legalite', 'date');                      $form->setType('date_retour_controle_legalite', 'date');
1436                      $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('live_preview', 'hidden');  
                         $form->setType('signataire_arrete','selecthiddenstatic');  
                         $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');  
                     }  
1437                  }                  }
1438              }              }
1439          } elseif($maj==2){          }
1440              $form->setType('dossier', 'hidden');  
1441              $form->setType('bible_auto', 'hidden');          // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1442              $form->setType('bible', 'hidden');          if ($this->getParameter('maj') == 3
1443              $form->setType('bible2', 'hidden');              || $this->getParameter('maj') == 2
1444              $form->setType('bible3', 'hidden');              || $this->getParameter('maj') == 125
1445              $form->setType('bible4', 'hidden');              || $this->getParameter('maj') == 410) {
1446              $form->setType('btn_refresh', 'hidden');              //
1447              $form->setType('live_preview', 'hidden');              $form->setType("date_evenement", "datestatic");
1448          }else {              $form->setType("evenement", "selecthiddenstatic");
1449              $form->setType('destinataire', 'hidden');              if ($this->has_an_edition() === true) {
1450              $form->setType('dossier', 'hidden');                  $form->setType("document_type_instruction", "selecthiddenstatic");
1451              $form->setType('bible_auto', 'hidden');                  $form->setType('lettretype', 'hiddenstatic');
1452              $form->setType('bible', 'hidden');                  $form->setType("signataire_arrete", "selecthiddenstatic");
1453              $form->setType('bible2', 'hidden');                  if ($this->getVal("om_final_instruction") == 't') {
1454              $form->setType('bible3', 'hidden');                      $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1455              $form->setType('bible4', 'hidden');                  } else {
1456              $form->setType('btn_refresh', 'hidden');                      $form->setType('om_final_instruction_utilisateur', 'hidden');
1457              $form->setType('live_preview', 'hidden');                  }
1458          }              }
1459                if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1460          //Cache les champs pour la finalisation                  $form->setType('commentaire', 'textareastatic');
1461          $form->setType('om_fichier_instruction', 'hidden');              }
1462          $form->setType('om_final_instruction', 'hidden');          }
1463          // Cache le document arrêté  
1464          $form->setType('document_numerise', 'hidden');          // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1465                    if ($this->getParameter('maj') == 3
1466          //Masquer les champs date_envoi_controle_legalite et              || $this->getParameter('maj') == 2
1467          //date_retour_controle_legalite si ce n'est pas un arrêté et si ce n'est              || $this->getParameter('maj') == 410) {
1468          //pas un utilisateur ayant le droit spécifique              // Si il n'y a pas de lettre type (edition) associé à l'événement
1469          if ( !is_numeric($this->getVal("avis_decision"))&&              // les dates de suivi ne sont pas affichée
1470              !$this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")){              if ($this->has_an_edition() === true) {
1471                    $form->setType('date_envoi_signature', 'datestatic');
1472                    $form->setType('date_retour_signature', 'datestatic');
1473                    $form->setType('date_envoi_rar', 'datestatic');
1474                    $form->setType('date_retour_rar', 'datestatic');
1475                    $form->setType('date_envoi_controle_legalite', 'datestatic');
1476                    $form->setType('date_retour_controle_legalite', 'datestatic');
1477                    $form->setType('date_finalisation_courrier', 'datestatic');
1478                    if ($this->getVal("flag_edition_integrale") == "t") {
1479                        $form->setType("titre_om_htmletat", "htmlstatic");
1480                        $form->setType("corps_om_htmletatex", "htmlstatic");
1481                    } else {
1482                        $form->setType("complement_om_html", "htmlstatic");
1483                        $form->setType("complement2_om_html", "htmlstatic");
1484                        $form->setType("complement3_om_html", "htmlstatic");
1485                        $form->setType("complement4_om_html", "htmlstatic");
1486                    }
1487                }
1488            }
1489    
1490            // MODE SUIVI DES DATES 125
1491            if ($this->getParameter('maj') == 125) {
1492                $form->setType("date_evenement", "hiddenstaticdate");
1493                $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1494                $form->setType('date_envoi_signature', 'date');
1495                $form->setType('date_retour_signature', 'date');
1496                if ($this->is_sent_for_signature() === true
1497                    || $this->is_signed() === true) {
1498                    //
1499                    $form->setType("date_envoi_signature", "datereadonly");
1500                    $form->setType("date_retour_signature", "datereadonly");
1501                }
1502                $form->setType('date_envoi_rar', 'date');
1503                $form->setType('date_retour_rar', 'date');
1504                $form->setType('date_envoi_controle_legalite', 'date');
1505                if ($this->is_sent_to_cl() === true) {
1506                    $form->setType("date_envoi_controle_legalite", "datedisabled");
1507                }
1508                $form->setType('date_retour_controle_legalite', 'date');
1509                $form->setType('date_finalisation_courrier', 'date');
1510            }
1511    
1512            if ($maj == 401) {
1513                foreach ($this->champs as $champ) {
1514                    $form->setType($champ, 'hidden');
1515                }
1516                $form->setType('preview_edition', 'previsualiser');
1517            }
1518    
1519            // Si l'instruction a été envoyé au contrôle de légalité et que la
1520            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1521            // l'utilisateur que l'envoi au cl est en cours de traitement.
1522            if ($this->is_sent_to_cl() === true
1523                && $maj == 3) {
1524                    $form->setType("date_envoi_controle_legalite", "datestatic");
1525                if (empty($this->getVal('date_envoi_controle_legalite'))) {
1526                    $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1527                }
1528            }
1529            $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1530            $this->f->module_manager->run_hooks('setType_post', $this, $data);
1531        }
1532    
1533        function setOnchange(&$form,$maj){
1534            $this->f->log(__METHOD__, 'BEGIN');
1535            $data = array('form' => &$form, 'maj' => &$maj);
1536            $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1537    
1538            parent::setOnchange($form,$maj);
1539    
1540            // MODE AJOUTER
1541            if ($this->getParameter('maj') == 0) {
1542                $form->setOnchange(
1543                    "evenement",
1544                    "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1545                    manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1546                );
1547            }
1548    
1549            $data = array('form' => &$form, 'maj' => &$maj);
1550            $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1551            $this->f->log(__METHOD__, 'END');
1552        }
1553    
1554        function evenement_has_an_edition($evenement_id) {
1555            $evenement = $this->get_inst_evenement($evenement_id);
1556            $lettretype = $evenement->getVal('lettretype');
1557            if ($lettretype !== '' && $lettretype !== null) {
1558                return true;
1559            }
1560            return false;
1561        }
1562    
1563        function view_evenement_has_an_edition_json() {
1564            $json_return = array(
1565                "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1566                "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1567            );
1568            echo json_encode($json_return);
1569        }
1570    
1571        function evenement_has_a_commentaire($evenement_id) {
1572            $evenement = $this->get_inst_evenement($evenement_id);
1573            return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1574        }
1575    
1576        function view_evenement_has_a_commentaire_json() {
1577            $json_return = array(
1578                "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1579            );
1580            echo json_encode($json_return);
1581        }
1582    
1583    
1584        /**
1585         * CONDITION - can_be_sent_to_cl
1586         *
1587         * Vérifie que le contrôle de légalité est disponible
1588         *
1589         * @return boolean
1590         */
1591        function can_be_sent_to_cl() {
1592            $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1593    
1594            // Si événement est paramétré pour envoyer le contrôle de légalité
1595            // par Plat'AU
1596            if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1597                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1598                            
1599              $form->setType("date_envoi_controle_legalite", "hiddendate");              // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1600              $form->setType("date_retour_controle_legalite", "hiddendate");              // Que le type de dossier d'autorisation est transmissible à Plat'AU
1601                // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1602                if ($this->getVal('envoye_cl_platau') === 'f'
1603                    && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1604                    && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1605                    
1606                    // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL    
1607                    if ($this->has_an_edition() === false) {
1608                        return true;
1609                    }
1610    
1611                    // Si l'instruction a une édition et que la date de retour signature est renseignée
1612                    // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1613                    // envoyer l'instruction au CL
1614                    if ($this->has_an_edition() === true
1615                        && empty($this->getVal('date_retour_signature')) === false
1616                        && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1617    
1618                        return true;
1619                    }
1620                }
1621          }          }
1622            //
1623            return false;
1624        }
1625    
1626          // Pour les actions finalize, unfinalize et notifier_commune      /**
1627          if($maj == 100 || $maj == 110 || $maj == 210) {       *
1628              //       * @return string
1629              foreach ($this->champs as $value) {       */
1630                  // Cache tous les champs      function get_var_sql_forminc__sql_signataire_arrete() {
1631                  $form->setType($value, 'hidden');          return sprintf(
1632                "SELECT
1633                    signataire_arrete.signataire_arrete,
1634                    CONCAT_WS(
1635                        ' - ',
1636                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1637                        signataire_habilitation.libelle,
1638                        signataire_arrete.description
1639                    )
1640                FROM
1641                    %1\$ssignataire_arrete
1642                    LEFT JOIN %1\$ssignataire_habilitation
1643                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1644                WHERE
1645                    ((signataire_arrete.om_validite_debut IS NULL
1646                        AND (signataire_arrete.om_validite_fin IS NULL
1647                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1648                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1649                            AND (signataire_arrete.om_validite_fin IS NULL
1650                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1651                ORDER BY
1652                    signataire_arrete.prenom,
1653                    signataire_arrete.nom",
1654                DB_PREFIXE
1655            );
1656        }
1657    
1658        /**
1659         *
1660         * @return string
1661         */
1662        function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1663            return sprintf(
1664                "SELECT
1665                    signataire_arrete.signataire_arrete,
1666                    CONCAT_WS(
1667                        ' - ',
1668                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1669                        signataire_habilitation.libelle,
1670                        signataire_arrete.description
1671                    )
1672                FROM
1673                    %1\$ssignataire_arrete
1674                    LEFT JOIN %1\$ssignataire_habilitation
1675                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1676                WHERE
1677                    signataire_arrete.signataire_arrete = <idx>",
1678                DB_PREFIXE
1679            );
1680        }
1681    
1682        /**
1683         *
1684         * @return string
1685         */
1686        function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1687            return sprintf(
1688                "SELECT
1689                    signataire_arrete.signataire_arrete,
1690                    CONCAT_WS(
1691                        ' - ',
1692                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1693                        signataire_habilitation.libelle,
1694                        signataire_arrete.description
1695                    )
1696                FROM
1697                    %1\$ssignataire_arrete
1698                    LEFT JOIN %1\$som_collectivite
1699                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1700                    LEFT JOIN %1\$ssignataire_habilitation
1701                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1702                WHERE
1703                    ((signataire_arrete.om_validite_debut IS NULL
1704                        AND (signataire_arrete.om_validite_fin IS NULL
1705                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1706                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1707                            AND (signataire_arrete.om_validite_fin IS NULL
1708                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1709                    AND (om_collectivite.niveau = '2'
1710                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1711                ORDER BY
1712                    signataire_arrete.prenom, signataire_arrete.nom",
1713                DB_PREFIXE
1714            );
1715        }
1716    
1717        /**
1718         *
1719         * @return string
1720         */
1721        function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1722            return sprintf(
1723                "SELECT
1724                    signataire_arrete.signataire_arrete,
1725                    CONCAT_WS(
1726                        ' - ',
1727                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1728                        signataire_habilitation.libelle,
1729                        signataire_arrete.description
1730                    )
1731                FROM
1732                    %1\$ssignataire_arrete
1733                    LEFT JOIN %1\$ssignataire_habilitation
1734                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1735                WHERE
1736                    ((signataire_arrete.om_validite_debut IS NULL
1737                        AND (signataire_arrete.om_validite_fin IS NULL
1738                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1739                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1740                            AND (signataire_arrete.om_validite_fin IS NULL
1741                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1742                    AND signataire_arrete.defaut IS TRUE
1743                ORDER BY
1744                    signataire_arrete.prenom, signataire_arrete.nom",
1745                DB_PREFIXE
1746            );
1747        }
1748    
1749        /**
1750         *
1751         * @return string
1752         */
1753        function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1754            return sprintf(
1755                "SELECT
1756                    signataire_arrete.signataire_arrete,
1757                        CONCAT_WS(
1758                            ' - ',
1759                            CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1760                            signataire_habilitation.libelle,
1761                            signataire_arrete.description
1762                        )
1763                FROM
1764                    %1\$ssignataire_arrete
1765                    LEFT JOIN %1\$ssignataire_habilitation
1766                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1767                    LEFT JOIN %1\$som_collectivite
1768                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1769                WHERE
1770                    ((signataire_arrete.om_validite_debut IS NULL
1771                        AND (signataire_arrete.om_validite_fin IS NULL
1772                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1773                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1774                            AND (signataire_arrete.om_validite_fin IS NULL
1775                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1776                    AND signataire_arrete.defaut IS TRUE
1777                    AND (om_collectivite.niveau = '2'
1778                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1779                ORDER BY
1780                    signataire_arrete.prenom,
1781                    signataire_arrete.nom",
1782                DB_PREFIXE
1783            );
1784        }
1785    
1786        /**
1787         * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1788         * dont l'identifiant a été passé en paramètre dans l'url.
1789         *
1790         * @return array
1791         */
1792        function get_var_sql_forminc__sql_evenement() {
1793            // Récupération du numéro de dossier
1794            $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1795            $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1796            // Si changement de décision par instructeur commune
1797            $filter = '';
1798            if ($this->f->isUserInstructeur() === true
1799                // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1800                && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1801                && $this->isInstrCanChangeDecision($dossier) === true) {
1802                $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1803            }
1804            // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1805            // de déterminer si il s'agit d'évènements suggérés.
1806            $qres = $this->f->get_all_results_from_db_query(
1807                sprintf(
1808                    'SELECT
1809                        DISTINCT(evenement.evenement),
1810                        evenement.libelle,
1811                        -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1812                        CASE WHEN evenement_suggere_dossier.evenement IS NULL
1813                            THEN FALSE
1814                            ELSE TRUE
1815                        END AS is_suggested
1816                    FROM
1817                        -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1818                        -- selon le type de dossier et l état du dossier.
1819                        %1$sevenement
1820                        JOIN %1$slien_dossier_instruction_type_evenement
1821                            ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1822                        JOIN %1$stransition
1823                            ON evenement.evenement = transition.evenement
1824                        JOIN %1$sdossier
1825                            ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1826                                AND transition.etat = dossier.etat
1827                        -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1828                        LEFT JOIN (
1829                            SELECT
1830                                lien_sig_contrainte_evenement.evenement,
1831                                dossier.dossier
1832                            FROM
1833                                %1$slien_sig_contrainte_evenement
1834                                JOIN %1$ssig_contrainte
1835                                    ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1836                                JOIN %1$slien_sig_contrainte_dossier_instruction_type
1837                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1838                                JOIN %1$slien_sig_contrainte_om_collectivite
1839                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1840                                JOIN %1$scontrainte
1841                                    ON sig_contrainte.libelle = contrainte.libelle
1842                                JOIN %1$sdossier_contrainte
1843                                    ON contrainte.contrainte = dossier_contrainte.contrainte
1844                                JOIN %1$sdossier
1845                                    ON dossier_contrainte.dossier = dossier.dossier
1846                                        AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1847                                JOIN %1$som_collectivite
1848                                    ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1849                                        AND (dossier.om_collectivite = om_collectivite.om_collectivite
1850                                            OR om_collectivite.niveau = \'2\')
1851                        ) AS evenement_suggere_dossier
1852                            ON evenement.evenement = evenement_suggere_dossier.evenement
1853                                AND dossier.dossier = evenement_suggere_dossier.dossier
1854                    WHERE
1855                        dossier.dossier = \'%2$s\'
1856                        %3$s
1857                    ORDER BY
1858                        is_suggested DESC,
1859                        evenement.libelle',
1860                    DB_PREFIXE,
1861                    $this->f->db->escapeSimple($dossier),
1862                    $filter
1863                ),
1864                array(
1865                    "origin" => __METHOD__
1866                )
1867            );
1868            return $qres['result'];
1869        }
1870    
1871        /**
1872         * Récupère un tableau contenant des évènements de la forme :
1873         * $events = array(
1874         *      1 => array(
1875         *         'libelle' => 'evenement_libelle',
1876         *         'evenement' => 'identifiant_evenement',
1877         *         'is_suggested' => true/false   -> booleen indiquant si c'est un événement suggéré
1878         *         ))
1879         * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1880         *
1881         * Le format de sorti est le suivant :
1882         * $select = array(
1883         *      0 => array( -> liste des id des événements
1884         *          '0' => '',
1885         *          '1' => array(
1886         *              '0' => array(), -> liste des id des événements suggérés
1887         *              '1' => array(), -> liste des libelles des événements suggérés
1888         *          ),
1889         *          ...,
1890         *          n => 'id_evenement_n'
1891         *      ),
1892         *      1 => array(
1893         *          '0' => '__('choisir')." ".__('evenement')',
1894         *          '1' => '💡 Suggestions',
1895         *          ...,
1896         *          'n' => 'libelle_evenement_n',
1897         *      )
1898         * )
1899         *
1900         * @param array tableau des événements
1901         * @return array
1902         */
1903        protected function convert_events_array_to_select_format($events) {
1904            // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1905            $contenu = array(
1906                0 => array("",),
1907                1 => array(__('choisir')." ".__('evenement'),)
1908            );
1909    
1910            if (! empty($events)) {
1911                // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1912                $suggested_event_group = array_filter($events, function($a) {
1913                        return $a['is_suggested'] === 't';
1914                });
1915                if (! empty($suggested_event_group)) {
1916                    // Prépare les données qui permettront d'afficher le groupe des événements
1917                    // suggérés.
1918                    $values = array();
1919                    $labels = array();
1920                    foreach ($suggested_event_group as $index => $suggested_event) {
1921                        $values[] = $suggested_event['evenement'];
1922                        $labels[] = $suggested_event['libelle'];
1923                        // Supprime les évènements suggérés de la liste des évènements
1924                        unset($events[$index]);
1925                    }
1926                    // Remplissage du select pour le groupe
1927                    $contenu[0][] = array($values, $labels);
1928                    $contenu[1][] = __('💡 Suggestions');
1929                }
1930        
1931                // Remplissage du select
1932                foreach ($events as $event) {
1933                    $contenu[0][] = $event['evenement'];
1934                    $contenu[1][] = $event['libelle'];
1935              }              }
1936          }          }
1937            return $contenu;
1938      }      }
1939    
1940      function setSelect(&$form, $maj, &$db = null, $debug = null) {      /**
1941         * SETTER_FORM - setSelect.
1942         *
1943         * @return void
1944         */
1945        function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1946            //parent::setSelect($form, $maj);
1947          /**          /**
1948           * 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
1949           * dossier est mauvaise pour les performances, car la requête qui           * dossier est mauvaise pour les performances, car la requête qui
# Line 545  class instruction extends instruction_ge Line 1951  class instruction extends instruction_ge
1951           * 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
1952           * select           * select
1953           */           */
         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");  
   
1954          //// action          //// action
1955          //$this->init_select($form, $db, $maj, $debug, "action",          //$this->init_select($form, $this->f->db, $maj, null, "action",
1956          //                   $sql_action, $sql_action_by_id, false);          //                   $sql_action, $sql_action_by_id, false);
1957    
1958          //// avis_decision          //// avis_decision
1959          //$this->init_select($form, $db, $maj, $debug, "avis_decision",          //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1960          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);
1961    
1962          //// dossier          //// dossier
1963          //$this->init_select($form, $db, $maj, $debug, "dossier",          //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1964          //                   $sql_dossier, $sql_dossier_by_id, false);          //                   $sql_dossier, $sql_dossier_by_id, false);
1965    
1966          //// etat          //// etat
1967          //$this->init_select($form, $db, $maj, $debug, "etat",          //$this->init_select($form, $this->f->db, $maj, null, "etat",
1968          //                   $sql_etat, $sql_etat_by_id, false);          //                   $sql_etat, $sql_etat_by_id, false);
1969    
1970          //// evenement          //// evenement
1971          //$this->init_select($form, $db, $maj, $debug, "evenement",          //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1972          //                   $sql_evenement, $sql_evenement_by_id, false);          //                   $sql_evenement, $sql_evenement_by_id, false);
1973    
1974          // signataire_arrete          // signataire_arrete
1975          // si contexte DI          // si contexte DI
1976          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
1977                  || $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") {  
1978              // 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
1979              require_once "../obj/dossier_instruction.class.php";              $di = $this->f->get_inst__om_dbform(array(
1980              $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, $debug);                  "obj" => "dossier_instruction",
1981              $sql_signataire_arrete_by_di = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_by_di);                  "idx" => $this->getParameter('idxformulaire'),
1982              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              ));
1983                  $sql_signataire_arrete_by_di, $sql_signataire_arrete_by_id, true);              $sql_signataire_arrete_by_di = str_replace(
1984                    '<collectivite_di>',
1985                    $di->getVal("om_collectivite"),
1986                    $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1987                );
1988                $this->init_select(
1989                    $form,
1990                    $this->f->db,
1991                    $maj,
1992                    null,
1993                    "signataire_arrete",
1994                    $sql_signataire_arrete_by_di,
1995                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1996                    true
1997                );
1998          } else {          } else {
1999              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              $this->init_select(
2000                  $sql_signataire_arrete, $sql_signataire_arrete_by_id, true);                  $form,
2001                    $this->f->db,
2002                    $maj,
2003                    null,
2004                    "signataire_arrete",
2005                    $this->get_var_sql_forminc__sql("signataire_arrete"),
2006                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2007                    true
2008                );
2009          }          }
2010    
2011          /**          /**
# Line 600  class instruction extends instruction_ge Line 2015  class instruction extends instruction_ge
2015           * événements disponibles.           * événements disponibles.
2016           */           */
2017          if ($maj == 0) {          if ($maj == 0) {
2018              // Récupération des événements par une jointure entre la table dossier              $evenements = $this->get_var_sql_forminc__sql_evenement();
2019              // 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);  
2020          } else {          } else {
2021              $sql = "SELECT              // Instanciation de l'événement pour récupérer son libellé
2022              evenement.libelle as lib              $evenement = $this->f->get_inst__om_dbform(array(
2023              FROM ".DB_PREFIXE."evenement                  "obj" => "evenement",
2024              WHERE evenement.evenement=".$this->getVal("evenement")."";                  "idx" => $this->getVal("evenement"),
2025              $res = $db->getone($sql);              ));
2026              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);  
             if (database::isError($res)) {  
                 die($res->getMessage());  
             }  
             //  
2027              $contenu = array(              $contenu = array(
2028                  0 => array($this->getVal("evenement"),),                  0 => array($this->getVal("evenement"),),
2029                  1 => array($res,)                  1 => array($evenement->getVal('libelle'),)
2030              );              );
2031              $form->setSelect("evenement", $contenu);              $form->setSelect("evenement", $contenu);
2032          }          }
# Line 661  class instruction extends instruction_ge Line 2035  class instruction extends instruction_ge
2035           * Gesion des liens vers la bible           * Gesion des liens vers la bible
2036           */           */
2037          // lien bible_auto          // lien bible_auto
2038          $contenu = array(_("automatique"));          $contenu = array(__("automatique"));
2039          $form->setSelect("bible_auto",$contenu);          $form->setSelect("bible_auto",$contenu);
2040          // lien bible1          // lien bible1
2041          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2042          $form->setSelect("bible",$contenu);          $form->setSelect("bible",$contenu);
2043          // lien bible2          // lien bible2
2044          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2045          $form->setSelect("bible2",$contenu);          $form->setSelect("bible2",$contenu);
2046          // lien bible3          // lien bible3
2047          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2048          $form->setSelect("bible3",$contenu);          $form->setSelect("bible3",$contenu);
2049          // lien bible4          // lien bible4
2050          $contenu = array(_("bible"));          $contenu = array(__("bible"));
2051          $form->setSelect("bible4",$contenu);          $form->setSelect("bible4",$contenu);
2052    
2053          if ($maj == 1) {          if ($maj == 1) {
2054              $base64 = $this->init_pdf_temp();              $base64 = $this->init_pdf_temp();
2055              $form->setSelect('live_preview', array('base64'=>$base64));              $form->setSelect('live_preview', array('base64'=>$base64));
2056              $form->setSelect("btn_refresh", array(_('Actualiser')));              $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2057                $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2058                $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2059          }          }
2060    
2061            // Selection du type de rédaction à l'ajout
2062            $content = array(
2063                0 => array('f', 't', ),
2064                1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2065            );
2066            $form->setSelect('flag_edition_integrale', $content);
2067    
2068            $contenu = array();
2069            foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2070                $contenu[0][] = $value;
2071                $contenu[1][] = $this->get_trad_for_statut($value);
2072            }
2073            $form->setSelect('statut_signature', $contenu);
2074    
2075    
2076            if ($maj == 401) {
2077                $idx = $this->getParameter("idx");
2078                $dossier = $this->getParameter("idxformulaire");
2079                if ( strpos($idx, 'STORAGE_') !== FALSE) {
2080                    $idx = substr($idx, 8);
2081                    $model = 'storage';
2082                    $champ = 'uid';
2083                    $object = $this->f->get_inst__om_dbform(array(
2084                        "obj" => $model,
2085                        "idx" => $idx,
2086                    ));
2087                
2088                    $file = $this->f->storage->get($object->getVal($champ));
2089                    $label = $file['metadata']['filename'];
2090                    $href =sprintf(
2091                        '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2092                        $idx
2093                    );
2094                    $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2095                    $this->val['preview_edition'] = '';
2096                }else{
2097                    $label = $this->getVal("fichier_instruction_name");
2098                    $href =sprintf(
2099                        '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2100                        $this->getVal($this->clePrimaire)
2101                    );
2102                    $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2103                }
2104    
2105                $form->setSelect('preview_edition', array(
2106                    'base64' => base64_encode($file['file_content']),
2107                    'mimetype' => $file['metadata']['mimetype'],
2108                    'label' => $label,
2109                    'href' => $href
2110                ));
2111            }
2112            // document_type_instruction
2113            $this->init_select(
2114                $form,
2115                $this->f->db,
2116                $maj,
2117                null,
2118                "document_type_instruction",
2119                $this->get_var_sql_forminc__sql("document_type_instruction"),
2120                $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2121                true
2122            );
2123      }      }
2124    
2125      function cleSecondaire($id, &$db = null, $val = array(), $DEBUG = null) {      function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2126          //          //
2127          parent::cleSecondaire($id, $db, $val, $DEBUG);          // Vérifie uniquementla cle secondaire : demande
2128            $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2129                    
2130          $id = $this->getVal($this->clePrimaire);          $id = $this->getVal($this->clePrimaire);
2131    
           
2132          //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é
2133          //à la création d'un dossier d'instruction          //à la création d'un dossier d'instruction
2134          $sql = "SELECT demande_type.dossier_instruction_type          $qres = $this->f->get_one_result_from_db_query(
2135              FROM ".DB_PREFIXE."demande_type              sprintf(
2136              LEFT JOIN ".DB_PREFIXE."demande                  'SELECT
2137              ON demande.demande_type = demande_type.demande_type                      demande_type.dossier_instruction_type
2138              WHERE demande.instruction_recepisse = ".$id;                  FROM
2139          $res = $this->db->getOne($sql);                      %1$sdemande_type
2140          $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdemande
2141          if (database::isError($res)) {                          ON demande.demande_type = demande_type.demande_type
2142              die($res->getMessage());                  WHERE
2143          }                      demande.instruction_recepisse = \'%2$d\'',
2144                    DB_PREFIXE,
2145                    intval($id)
2146                ),
2147                array(
2148                    "origin" => __METHOD__,
2149                )
2150            );
2151    
2152          // 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
2153          //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
2154          //supprimé          //supprimé
2155          if ( $this->correct !== false || $res == null || $res == ""){          if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
   
2156              // 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é
2157              // à une demande              // à une demande
2158              $sql = "SELECT demande              $qres = $this->f->get_one_result_from_db_query(
2159                  FROM ".DB_PREFIXE."demande                  sprintf(
2160                  WHERE instruction_recepisse = ".$id;                      'SELECT
2161              $res = $this->db->getOne($sql);                          demande
2162              $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      FROM
2163              if (database::isError($res)) {                          %1$sdemande
2164                  die($res->getMessage());                      WHERE
2165              }                          instruction_recepisse = \'%2$d\'',
2166                        DB_PREFIXE,
2167                        intval($id)
2168                    ),
2169                    array(
2170                        "origin" => __METHOD__,
2171                    )
2172                );
2173    
2174              //Si c'est un événement d'instruction lié à une demande              //Si c'est un événement d'instruction lié à une demande
2175              if ($res != null || $res != ""){              if ($qres['result'] != null || $qres['result'] != ""){
2176                                    $demande = $this->f->get_inst__om_dbform(array(
2177                  require_once "../obj/demande.class.php";                      "obj" => "demande",
2178                  $demande = new demande($res, $this->db, DEBUG);                      "idx" => $qres['result'],
2179                    ));
2180    
2181                  //On met à jour la demande en supprimant la liaison vers                  //On met à jour la demande en supprimant la liaison vers
2182                  //l'événement d'instruction                  //l'événement d'instruction
2183                  $demande->setParameter("maj", 1);                  $demande->setParameter("maj", 1);
2184                  $valF = array();                  $valF = array();
# Line 734  class instruction extends instruction_ge Line 2187  class instruction extends instruction_ge
2187                  }                  }
2188                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2189                  $valF['instruction_recepisse']=NULL;                  $valF['instruction_recepisse']=NULL;
2190                  $ret = $demande->modifier($valF, $this->db, DEBUG);                  $ret = $demande->modifier($valF);
2191              }              }
2192                                    
2193              /**              /**
2194               * Vérification que l'élément supprimé est le dernier pour pouvoir               * Vérification que l'élément supprimé est le dernier pour pouvoir
2195               * remodifier les données de manière itérative.               * remodifier les données de manière itérative.
2196               */               */
2197              // Initialisation              $qres = $this->f->get_one_result_from_db_query(
2198              $dernierevenement = "";                  sprintf(
2199              // Récupération du dernier élément de la table d'instruction qui                      'SELECT
2200              // concerne le dossier en cours                          max(instruction)
2201              $sql = "SELECT max(instruction)                      FROM
2202              FROM ".DB_PREFIXE."instruction                          %1$sinstruction
2203              WHERE dossier ='".$this->idxformulaire."'";                      WHERE
2204              $dernierevenement = $db->getOne($sql);                          dossier = \'%2$s\'',
2205              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      DB_PREFIXE,
2206              if (database::isError($dernierevenement)) {                      $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2207                  die($dernierevenement->getMessage());                  ),
2208              }                  array(
2209                        "origin" => __METHOD__,
2210                    )
2211                );
2212    
2213              // Si on se trouve effectivement sur le dernier evenement d'instruction              // Si on se trouve effectivement sur le dernier evenement d'instruction
2214              if ($dernierevenement == $id) {              // alors on valide la suppression sinon on l'annule
2215                $this->correct = false;
2216                $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2217                if ($qres['result'] == $id) {
2218                  // Alors on valide la suppression                  // Alors on valide la suppression
2219                  $this->correct = true;                  $this->correct = true;
2220                  $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."));  
2221              }              }
2222                $this->addToMessage($message);
2223          }          }
2224      }      }
2225    
# Line 774  class instruction extends instruction_ge Line 2231  class instruction extends instruction_ge
2231                    
2232          //Si le retourformulaire est "dossier_instruction"          //Si le retourformulaire est "dossier_instruction"
2233          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
2234                  || $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") {  
2235    
2236              // 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
2237              if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {              if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2238                  // si l'utilisateur n'est pas un admin                  // si l'utilisateur n'est pas un admin
2239                  if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {                  if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2240                      $this->correct = false;  
2241                      $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));                      // si le champ concerné est 'date_envoi_signature'
2242                        // et que le statut du parapheur est 'expired'
2243                        // alors on autorise le changement de la date
2244                        // pour tous les autres cas, on ne peut modifier la date
2245                        if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2246                            $this->correct = false;
2247                            $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2248                        }
2249                  }                  }
2250              }              }
2251          }          }
# Line 798  class instruction extends instruction_ge Line 2254  class instruction extends instruction_ge
2254          return true;          return true;
2255      }      }
2256    
2257      /*Met des valeurs par défaut dans certains des sous-formulaire*/      /**
2258      function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$db = null, $DEBUG = null) {       * SETTER_FORM - setValsousformulaire (setVal).
2259         *
2260         * @return void
2261         */
2262        function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2263            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2264            $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2265    
2266            // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2267            //
2268            $this->retourformulaire = $retourformulaire;
2269          //          //
         $this->retourformulaire=$retourformulaire;  
         $this->idxformulaire=$idxformulaire;  
         // Ajout  
2270          if ($maj == 0) {          if ($maj == 0) {
2271              $form->setVal("destinataire", $idxformulaire);              $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2272              $form->setVal("dossier", $idxformulaire);              $form->setVal("dossier", $this->getParameter("idxformulaire"));
2273            }
2274    
2275            // Si l'instruction a été envoyé au contrôle de légalité et que la
2276            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2277            // l'utilisateur que l'envoi au cl est en cours de traitement.
2278            if ($this->is_sent_to_cl() === true
2279                && empty($this->getVal('date_envoi_controle_legalite'))
2280                && $maj == 3) {
2281                $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2282          }          }
2283          //          //
2284          $this->set_form_default_values($form, $maj, $validation);          $this->set_form_default_values($form, $maj, $validation);
2285    
2286            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2287            $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2288      }      }
2289    
2290      /**      /**
2291       *  Permet de pré-remplir les valeurs des formulaires.       * SETTER_FORM - set_form_default_values (setVal).
2292       *         *
2293       * @param [object]   $form        formulaire       * @return void
      * @param [integer]  $maj         mode  
      * @param [integer]  $validation  validation  
2294       */       */
2295      function set_form_default_values(&$form, $maj, $validation) {      function set_form_default_values(&$form, $maj, $validation) {
2296            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2297            $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2298    
         // Ajout  
2299          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");  
2300              // si contexte DI              // si contexte DI
2301              if ($this->getParameter("retourformulaire") == "dossier"              if ($this->getParameter("retourformulaire") == "dossier"
2302                  || $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") {  
2303                  // 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
2304                  require_once "../obj/dossier_instruction.class.php";                  $di = $this->f->get_inst__om_dbform(array(
2305                  $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, DEBUG);                      "obj" => "dossier_instruction",
2306                  $sql = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_defaut_by_di);                      "idx" => $this->getParameter("idxformulaire"),
2307                    ));
2308                    $sql = str_replace(
2309                        "<collectivite_di>",
2310                        $di->getVal("om_collectivite"),
2311                        $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2312                    );
2313              } else {              } else {
2314                  $sql = $sql_signataire_arrete_defaut;                  $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
             }  
             // Date du jour  
             $form->setVal("date_evenement", date('Y-m-d'));  
   
             // Exécution de la requête  
             $res = $this->f->db->query($sql);  
             $this->f->addToLog("setVal(): db->query(\"".$sql."\");", VERBOSE_MODE);  
             if ( database::isError($res)){  
                 die();  
2315              }              }
           
             $row = $res->fetchrow(DB_FETCHMODE_ASSOC);  
2316                            
2317              if (isset($row['signataire_arrete']) && is_numeric($row['signataire_arrete'])){              $qres = $this->f->get_all_results_from_db_query($sql, array(
2318                  $form->setVal("signataire_arrete",$row['signataire_arrete']);                      "origin" => __METHOD__));
2319                $row = array_shift($qres['result']);
2320                if (isset($row["signataire_arrete"])
2321                    && is_numeric($row["signataire_arrete"])) {
2322                    //
2323                    $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2324              }              }
2325                // Date du jour
2326                $form->setVal("date_evenement", date("Y-m-d"));
2327          }          }
2328            //
         // Ajout et modification  
2329          if ($maj == 0 || $maj == 1 || $maj == 125) {          if ($maj == 0 || $maj == 1 || $maj == 125) {
2330              $form->setVal("bible_auto","bible_auto()");              $form->setVal("bible_auto", "bible_auto()");
2331              $form->setVal("bible","bible(1)");              $form->setVal("bible", "bible(1)");
2332              $form->setVal("bible2","bible(2)");              $form->setVal("bible2", "bible(2)");
2333              $form->setVal("bible3","bible(3)");              $form->setVal("bible3", "bible(3)");
2334              $form->setVal("bible4","bible(4)");              $form->setVal("bible4", "bible(4)");
2335          }          }
2336            // 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 !
         // Récupère la collectivité du dossier d'instruction  
2337          $collectivite_di = $this->get_dossier_instruction_om_collectivite();          $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2338            if ($maj == 1
2339          // Modification              && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
         if ($maj == 1 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true  
2340              && $this->has_an_edition() === true) {              && $this->has_an_edition() === true) {
2341              $form->setVal("live_preview",$this->getVal($this->clePrimaire));              //
2342              $form->setVal("btn_refresh","reload_pdf_viewer()");              $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2343                $form->setVal("btn_refresh", "reload_pdf_viewer()");
2344                $form->setVal("btn_preview", "show_instr_preview()");
2345                $form->setVal("btn_redaction", "show_instr_redaction()");
2346          }          }
     }  
2347    
2348            // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2349            // des communes
2350            if ($maj == 3) {
2351                if ($this->can_display_notification_demandeur()) {
2352                    $typeNotification = array(
2353                        'notification_recepisse',
2354                        'notification_instruction',
2355                        'notification_decision',
2356                    );
2357                    $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2358                }
2359                if ($this->can_display_notification_service()) {
2360                    $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2361                }
2362                if ($this->can_display_notification_tiers()) {
2363                    $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2364                }
2365                if ($this->can_display_notification_commune()) {
2366                    $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2367                }
2368                if ($this->getVal('flag_edition_integrale') == 't') {
2369                    $message = __("Aucun contenu à afficher.");
2370                    if (empty($this->getVal('titre_om_htmletat'))) {
2371                        $form->setVal("titre_om_htmletat", $message);
2372                    }
2373                    if (empty($this->getVal('corps_om_htmletatex'))) {
2374                        $form->setVal("corps_om_htmletatex", $message);
2375                    }
2376                }
2377            }
2378            $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2379            $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2380        }
2381    
2382      function setLayout(&$form, $maj){      function setLayout(&$form, $maj){
2383          if ( $maj < 2 OR $maj == 3 OR $maj == 125 ) {          $data = array('form' => &$form, 'maj' => &$maj);
2384                          /*Champ sur lequel s'ouvre le bloc 1 */          $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
             $form->setBloc('evenement','D',"","col_12");  
   
             $form->setFieldset('evenement','D',_('Evenement'));  
             $form->setFieldset('om_final_instruction_utilisateur','F','');  
               
             $form->setBloc('om_final_instruction_utilisateur','F');  
2385    
2386              $form->setBloc('date_finalisation_courrier','D',"","col_12");          $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2387    
2388              $form->setFieldset('date_finalisation_courrier','D',_('Dates'));          $form->setFieldset('evenement','D',_('Evenement'));
2389              $form->setBloc('date_finalisation_courrier','D',"","col_6");          $form->setFieldset('om_final_instruction_utilisateur','F','');
2390              $form->setBloc('date_envoi_controle_legalite','F');          
2391            $form->setBloc('om_final_instruction_utilisateur','F');
2392            // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2393            // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2394            $form->setBloc('om_final_instruction_utilisateur','F');
2395            $form->setBloc('parapheur_lien_page_signature','D');
2396    
2397            $form->setBloc('date_finalisation_courrier','D',"","");
2398    
2399            $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2400            $form->setBloc('date_finalisation_courrier','D');
2401            $form->setBloc('date_envoi_rar','F');
2402    
2403            $form->setBloc('date_retour_rar','D');
2404            $form->setBloc('date_retour_controle_legalite','F');
2405            $form->setFieldset('date_retour_controle_legalite','F','');
2406            
2407            $form->setBloc('date_retour_controle_legalite','F');
2408    
2409              $form->setBloc('signataire_arrete','D',"","col_6");          $form->setBloc('statut_signature','D');
2410              $form->setBloc('date_retour_controle_legalite','F');          $form->setFieldset('statut_signature','D','Suivi Parapheur');
2411              $form->setFieldset('date_retour_controle_legalite','F','');          $form->setBloc('commentaire_signature','F');
2412                        $form->setBloc('historique_signature','D');
2413              $form->setBloc('date_retour_controle_legalite','F');          $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2414            $form->setBloc('historique_signature','F');
2415            $form->setFieldset('historique_signature','F');
2416    
2417            $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2418            $form->setFieldset('suivi_notification','F');
2419            $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2420            $form->setFieldset('suivi_notification_service','F');
2421            $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2422            $form->setFieldset('suivi_notification_tiers','F');
2423            $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2424            $form->setFieldset('suivi_notification_commune','F');
2425    
2426              if ($maj == 1) {          if ($maj == 1) {
2427                  // Récupère la collectivité du dossier d'instruction              // Récupère la collectivité du dossier d'instruction
2428                  $collectivite_di = $this->get_dossier_instruction_om_collectivite();              $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2429    
2430                //
2431                if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2432                    && $this->has_an_edition() === true) {
2433                  //                  //
2434                  if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true                  $form->setBloc('complement_om_html','D',"","container_instr_edition");
2435                      && $this->has_an_edition() === true) {                  $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2436                      $form->setBloc('complement_om_html','D',"","col_12 container_preview_pdf");                  $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2437                      $form->setBloc('complement_om_html','D',"","col_6 hidelabel");                  $form->setFieldset('complement_om_html','D',_('Complement'));
2438                      $form->setFieldset('complement_om_html','D',_('Complement'));                  $form->setFieldset('bible','F','');
2439                      $form->setFieldset('bible','F','');                  $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2440                      $form->setFieldset('complement2_om_html','D',_('Complement 2'));                  $form->setFieldset('bible2','F','');
2441                      $form->setFieldset('bible2','F','');                  $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2442                      $form->setFieldset('complement3_om_html','D',_('Complement 3'));                  $form->setFieldset('bible3','F','');
2443                      $form->setFieldset('bible3','F','');                  $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2444                      $form->setFieldset('complement4_om_html','D',_('Complement 4'));                  $form->setFieldset('bible4','F','');
2445                      $form->setFieldset('bible4','F','');                  $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2446                      $form->setBloc('bible4','F');                  $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2447                      $form->setBloc('btn_refresh','D',"","col_6 hidelabel");                  $form->setBloc('corps_om_htmletatex','F');
2448                      $form->setFieldset('btn_refresh','D',_('Prévisualisation'));                  $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2449                      $form->setFieldset('live_preview','F');                  $form->setBloc('btn_preview','F');
2450                      $form->setBloc('live_preview','F');                  $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2451                      $form->setBloc('live_preview','F');                  $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2452                  } else {                  $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2453                      $form->setBloc('complement_om_html','D',"","col_12 hidelabel");                  $form->setFieldset('live_preview','F');
2454                      $form->setFieldset('complement_om_html','D',_('Complement'));                  $form->setBloc('live_preview','F');
2455                      $form->setFieldset('bible','F','');                  $form->setBloc('live_preview','F');
                     $form->setFieldset('complement2_om_html','D',_('Complement 2'));  
                     $form->setFieldset('bible2','F','');  
                     $form->setFieldset('complement3_om_html','D',_('Complement 3'));  
                     $form->setFieldset('bible3','F','');  
                     $form->setFieldset('complement4_om_html','D',_('Complement 4'));  
                     $form->setFieldset('bible4','F','');  
                     $form->setBloc('bible4','F');  
                 }  
2456              } else {              } else {
2457                  $form->setBloc('complement_om_html','D',"","col_12 hidelabel");                  $form->setBloc('complement_om_html','D',"","hidelabel");
2458                  $form->setFieldset('complement_om_html','D',_('Complement'));                  $form->setFieldset('complement_om_html','D',_('Complement'));
2459                  $form->setFieldset('bible','F','');                  $form->setFieldset('bible','F','');
2460                  $form->setFieldset('complement2_om_html','D',_('Complement 2'));                  $form->setFieldset('complement2_om_html','D',_('Complement 2'));
# Line 951  class instruction extends instruction_ge Line 2463  class instruction extends instruction_ge
2463                  $form->setFieldset('bible3','F','');                  $form->setFieldset('bible3','F','');
2464                  $form->setFieldset('complement4_om_html','D',_('Complement 4'));                  $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2465                  $form->setFieldset('bible4','F','');                  $form->setFieldset('bible4','F','');
2466                  $form->setBloc('bible4','F');                  $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2467                    $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2468                    $form->setBloc('corps_om_htmletatex','F');
2469              }              }
2470            } else {
2471                $form->setBloc('complement_om_html','D',"","hidelabel");
2472                $form->setFieldset('complement_om_html','D',_('Complement'));
2473                $form->setFieldset('bible','F','');
2474                $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2475                $form->setFieldset('bible2','F','');
2476                $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2477                $form->setFieldset('bible3','F','');
2478                $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2479                $form->setFieldset('bible4','F','');
2480                $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2481                $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2482                $form->setBloc('corps_om_htmletatex','F');
2483          }          }
2484            $data = array('form' => &$form, 'maj' => &$maj);
2485            $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2486      }      }
2487            
2488      function setLib(&$form, $maj) {      function setLib(&$form, $maj) {
2489            $data = array('form' => &$form, 'maj' => &$maj);
2490            $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2491          //          //
2492          parent::setLib($form, $maj);          parent::setLib($form, $maj);
2493          //          //
# Line 966  class instruction extends instruction_ge Line 2497  class instruction extends instruction_ge
2497          $form->setLib('bible3', "");          $form->setLib('bible3', "");
2498          $form->setLib('bible4', "");          $form->setLib('bible4', "");
2499          $form->setLib('btn_refresh', "");          $form->setLib('btn_refresh', "");
2500            $form->setLib('btn_preview', "");
2501            $form->setLib('btn_redaction', "");
2502          $form->setLib('live_preview', "");          $form->setLib('live_preview', "");
2503          $form->setLib('om_final_instruction_utilisateur', _("finalise par"));          $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2504            $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2505            $form->setLib('date_retour_rar', __("date_notification"));
2506            $form->setLib('statut_signature', __("statut"));
2507            $form->setLib('commentaire_signature', __("commentaire"));
2508            $form->setLib('historique_signature', '');
2509            $form->setLib('suivi_notification', '');
2510            $form->setLib('suivi_notification_service', '');
2511            $form->setLib('suivi_notification_tiers', '');
2512            $form->setLib('suivi_notification_commune', '');
2513            $form->setLib('preview_edition', "");
2514            $form->setLib('document_type_instruction', __("Type de document"));
2515    
2516            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2517            // ajout et que l'option de rédaction libre est activée sur la
2518            // collectivité du dossier
2519            if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2520                //
2521                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2522                $help_text = __("Attention: le passage du mode 'Rédaction libre' à celui de 'Rédaction par compléments' fait perdre toute la rédaction manuelle effectuée.");
2523                $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2524            }
2525            else {
2526                $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2527            }
2528    
2529            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2530            // modification et que l'option de prévisualisation de l'édition est
2531            // activée sur la collectivité du dossier
2532            if ($maj === '1'
2533                && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2534                //
2535                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2536                $help_text = __("Attention la modification de la valeur de ce champ n'est pas prise en compte dans la prévisualisation. Pour que cette valeur soit mise à jour, il suffit de valider le formulaire.");
2537                $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2538                $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2539            }
2540            $data = array('form' => &$form, 'maj' => &$maj);
2541            $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2542        }
2543    
2544        /**
2545         * Surcharge om_dbform::set_form_specificity()
2546         *
2547         * Traitements spécifiques lié à l'affichage des formulaires.
2548         * Les traitements gérés ici sont les suivants :
2549         *   - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2550         *     pu être récupérée.
2551         *   - Affichage d'un message d'information à l'attention de l'utilisateur si
2552         *     la notification est activée mais qu'elle n'est pas possible à cause du
2553         *     paramètrage.
2554         *
2555         * @param formulaire $form Instance formulaire.
2556         * @param string $maj
2557         *
2558         * @return void
2559         */
2560        function set_form_specificity(&$form, $maj) {
2561            parent::set_form_specificity($form, $maj);
2562            
2563            // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2564            // Si ce n'est pas le cas affiche un message d'erreur.
2565            if ((! empty($maj) && $maj == 3)) {
2566                if (! empty($this->getVal('lettretype'))) {
2567    
2568                    $om_edition = $this->f->get_inst__om_edition();
2569                    $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2570                    $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2571                    $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2572    
2573                    if (empty($edition)) {
2574                        $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2575                    }
2576                }
2577            }
2578    
2579            $this->display_notification_info($maj);
2580        }
2581    
2582        /**
2583         * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2584         * citoyen, si la notification des demandeurs est activée sur l'évenement
2585         * d'instruction et que le paramétrage du demandeur principal n'est pas
2586         * correct alors un message a destination de l'instructeur est affiché.
2587         *
2588         * @param string $maj
2589         *
2590         * @return void
2591         */
2592        public function display_notification_info($maj) {
2593            if ((! empty($maj) && $maj == 3)) {
2594                // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2595                // la requête permettant de savoir le type de demande à échouée) et si
2596                // la notification se fait par mail vérifie si il y a des erreurs de
2597                // paramétrage et si c'est le cas on affiche un message d'information
2598                if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2599                    $erreurParam = $this->get_info_notification_fail();
2600                    // Récupération de l'évenement d'instruction
2601                    $instEV = $this->get_inst_evenement();
2602                    if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2603                        $class = 'text-info ui-state-highlight ui-state-info';
2604                        $message = __("La notification n'est pas possible.");
2605                        $this->f->display_panel_information(
2606                            $class,
2607                            $message,
2608                            $erreurParam,
2609                            __('Les données suivantes doivent être modifiées'),
2610                            'erreur_param_notif'
2611                        );
2612                    }
2613                }
2614            }
2615        }
2616    
2617        /**
2618         * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2619         */
2620        public function display_error_message($msg) {
2621            $this->correct = false;
2622            $this->msg = $msg;
2623      }      }
2624    
2625      function triggerajouter($id, &$db = null, $val = array(), $DEBUG = null) {      /**
2626         * TRIGGER - triggerajouter.
2627         * Réalise différents traitements avant d'ajouter l'instruction en base.
2628         *
2629         * Les traitements réalisés sont les suivant :
2630         *  - TODO : documenter les traietements existant
2631         *  - Intégre les bibles pré-chargé aux compléments de l'instruction.
2632         *    Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2633         *
2634         * @return boolean
2635         */
2636        function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2637            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2638            $parent_res = parent::triggerajouter($id, $dnu1, $val);
2639            if ($parent_res === false) return $parent_res;
2640    
2641            $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2642            $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data);
2643          /**          /**
2644           * 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
2645           * et dossier pour les stocker dans l'instruction :           * et dossier pour les stocker dans l'instruction :
# Line 983  class instruction extends instruction_ge Line 2652  class instruction extends instruction_ge
2652           * - delai_notification           * - delai_notification
2653           * - lettretype           * - lettretype
2654           * - autorite_competente           * - autorite_competente
2655             * - pec_metier
2656           * - complement_om_html           * - complement_om_html
2657           * - complement2_om_html           * - complement2_om_html
2658           * - complement3_om_html           * - complement3_om_html
# Line 1005  class instruction extends instruction_ge Line 2675  class instruction extends instruction_ge
2675           * - avis_decision           * - avis_decision
2676           */           */
2677          // 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é
2678          $sql = "SELECT * FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
2679          WHERE evenement=".$this->valF['evenement'];              "obj" => "evenement",
2680          $res = $db->query($sql);              "idx" => intval($this->valF['evenement']),
2681          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);          ));
2682          if (database::isError($res)) {          if ($evenement->exists() === true) {
             die($res->getMessage());  
         }  
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {  
2683              // Récupération de l'identifiant de l'action              // Récupération de l'identifiant de l'action
2684              // si une action est paramétrée dans l'événement              // si une action est paramétrée dans l'événement
2685              $this->valF['action'] = NULL;              $this->valF['action'] = NULL;
2686              if (isset($row['action']) and !empty($row['action'])) {              if (!empty($evenement->getVal('action'))) {
2687                  $this->valF['action']=$row['action'];                  $this->valF['action']=$evenement->getVal('action');
2688              }              }
2689              // Récupération de la valeur du délai              // Récupération de la valeur du délai
2690              $this->valF['delai'] = $row['delai'];              $this->valF['delai'] = $evenement->getVal('delai');
2691              // Récupération de l'identifiant de l'état              // Récupération de l'identifiant de l'état
2692              // si un état est paramétré dans l'événement              // si un état est paramétré dans l'événement
2693              $this->valF['etat']=NULL;              $this->valF['etat']=NULL;
2694              if (isset($row['etat']) and !empty($row['etat'])) {              if (!empty($evenement->getVal('etat'))) {
2695                  $this->valF['etat']=$row['etat'];                  $this->valF['etat']=$evenement->getVal('etat');
2696              }              }
2697              // Récupération de la valeur d'accord tacite              // Récupération de la valeur d'accord tacite
2698              $this->valF['accord_tacite']=$row['accord_tacite'];              $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2699              // Récupération de la valeur du délai de notification              // Récupération de la valeur du délai de notification
2700              $this->valF['delai_notification']=$row['delai_notification'];              $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2701              // Récupération de l'identifiant de l'avis              // Récupération de l'identifiant de l'avis
2702              // si un avis est paramétré dans l'événement              // si un avis est paramétré dans l'événement
2703              $this->valF['avis_decision'] = NULL;              $this->valF['avis_decision'] = NULL;
2704              if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {              if(!empty($evenement->getVal('avis_decision'))) {
2705                  $this->valF['avis_decision']=$row['avis_decision'];                  $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2706              }              }
2707              // Récupération de la valeur de l'autorité compétente              // Récupération de la valeur de l'autorité compétente
2708              // si l'autorité compétente est paramétré dans l'événement              // si l'autorité compétente est paramétré dans l'événement
2709              $this->valF['autorite_competente'] = NULL;              $this->valF['autorite_competente'] = NULL;
2710              if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {              if(!empty($evenement->getVal('autorite_competente'))) {
2711                  $this->valF['autorite_competente']=$row['autorite_competente'];                  $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2712              }              }
2713              // Récupération de la valeur de la lettre type              // Récupération de la valeur de la lettre type
2714              $this->valF['lettretype']=$row['lettretype'];              $this->valF['lettretype']=$evenement->getVal('lettretype');
2715    
2716                // Récupération de la valeur du document_type
2717                if(!empty($evenement->getVal('document_type'))){
2718                    $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2719                }
2720                // Récupération de la valeur de la prise en compte métier
2721                // si la prise en compte métier est paramétrée dans l'événement
2722                $this->valF['pec_metier'] = NULL;
2723                if(!empty($evenement->getVal('pec_metier'))) {
2724                    $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2725                }
2726          }          }
2727          // 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
2728          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par l'instanciation de l'objet
2729          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
2730          $res = $db->query($sql);              sprintf(
2731          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
2732          if (database::isError($res)) {                      *
2733              die($res->getMessage());                  FROM
2734          }                      %1$sdossier
2735          $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);                  WHERE
2736                    dossier = \'%2$s\'',
2737                    DB_PREFIXE,
2738                    $this->f->db->escapeSimple($this->valF['dossier'])
2739                ),
2740                array(
2741                    "origin" => __METHOD__,
2742                )
2743            );
2744            $row = array_shift($qres['result']);
2745          $this->updateArchiveData($row);          $this->updateArchiveData($row);
2746                    
2747          // Récupération de la duree de validite du dossier d'autorisation          // Récupération de la duree de validite du dossier d'autorisation
2748          $sql = "SELECT duree_validite_parametrage          $qres = $this->f->get_one_result_from_db_query(
2749                  FROM ".DB_PREFIXE."dossier_autorisation_type_detaille              sprintf(
2750                  LEFT JOIN ".DB_PREFIXE."dossier_autorisation                  'SELECT
2751                      ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                      duree_validite_parametrage
2752                  LEFT JOIN ".DB_PREFIXE."dossier                  FROM
2753                      ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                      %1$sdossier_autorisation_type_detaille
2754          WHERE dossier.dossier='".$this->valF['dossier']."'";                      LEFT JOIN %1$sdossier_autorisation
2755          $duree_validite_parametrage = $db->getOne($sql);                          ON  dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2756          $this->addToLog("triggerajouter(): db->getOne(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdossier
2757          database::isError($duree_validite_parametrage);                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2758          if ($duree_validite_parametrage != '') {                  WHERE
2759              $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;                      dossier.dossier = \'%2$s\'',
2760                    DB_PREFIXE,
2761                    $this->f->db->escapeSimple($this->valF['dossier'])
2762                ),
2763                array(
2764                    "origin" => __METHOD__,
2765                )
2766            );
2767    
2768            if ($qres['result'] != '') {
2769                $this->valF['duree_validite_parametrage'] = $qres['result'];
2770          }          }
2771    
2772          // Identifiant du type de courrier          // Identifiant du type de courrier
# Line 1077  class instruction extends instruction_ge Line 2774  class instruction extends instruction_ge
2774          $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);          $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2775          // Code barres          // Code barres
2776          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2777    
2778            // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2779            // à l'ajout de l'instruction.
2780            // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2781            if (! empty($this->valF['lettretype'])) {
2782                $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2783            }
2784    
2785            $res = true;
2786            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2787            $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data);
2788            return $res;
2789      }      }
2790    
2791        /**
2792         * Récupère pour chaque champ complementX_om_html le complément correspondant
2793         * et set l'entrée correspondante de valF avec.
2794         *
2795         * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2796         * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2797         * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2798         * aura donc un impact sur cette méthode.
2799         *
2800         * @param string dossier : identifiant du dossier de l'instruction
2801         * @param int    evenement : identifiant de l'évènement d'instruction
2802         *
2803         * @return void
2804         */
2805        public function set_precharge_complement($evenement, $dossier) {
2806            // Récupération des bibles et chargement dans les compléments
2807            for ($i = 1; $i <= 15; $i++) {
2808                // Constitution de l'id du champs.
2809                // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2810                $field = "complement".($i === 1 ? '' : $i)."_om_html";
2811                // Récupération des compléments correspondant en fonction de l'évènement
2812                // et du dossier puis insertion dans la champs voulu
2813                $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2814            }
2815        }
2816    
2817        
2818            
2819      // Test si une restriction est valide      /**
2820      // return boolean       * Test si une restriction est valide.
2821         *
2822         * @return boolean
2823         */
2824      function restrictionIsValid($restriction){      function restrictionIsValid($restriction){
2825          if($this->restriction_valid != null) {          if($this->restriction_valid != null) {
2826              return $this->restriction_valid;              return $this->restriction_valid;
# Line 1165  class instruction extends instruction_ge Line 2905  class instruction extends instruction_ge
2905                              $res[] = $this->getRestrictionValue($value);                              $res[] = $this->getRestrictionValue($value);
2906                          } else {                          } else {
2907                              // Message d'erreur                              // Message d'erreur
2908                              $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");                              $error_message = sprintf(__("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2909                              $this->addToMessage($error_message);                              $this->addToMessage($error_message);
2910                              // Arrête le traitement                              // Arrête le traitement
2911                              return false;                              return false;
# Line 1241  class instruction extends instruction_ge Line 2981  class instruction extends instruction_ge
2981          } else {          } else {
2982    
2983              // Message d'erreur              // Message d'erreur
2984              $error_message = _("Mauvais parametrage de la restriction.")." ".              $error_message = __("Mauvais parametrage de la restriction.")." ".
2985                  _("Contactez votre administrateur");                  __("Contactez votre administrateur");
2986              $this->addToMessage($error_message);              $this->addToMessage($error_message);
2987              // Arrête le traitement              // Arrête le traitement
2988              return false;              return false;
# Line 1262  class instruction extends instruction_ge Line 3002  class instruction extends instruction_ge
3002          if(empty($evenement) || !is_numeric($evenement)) {          if(empty($evenement) || !is_numeric($evenement)) {
3003              return "";              return "";
3004          }          }
3005          $sql = "SELECT retour  
3006              FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
3007              WHERE evenement = ".$evenement;              "obj" => "evenement",
3008          $retour = $this->db->getOne($sql);              "idx" => $evenement,
3009          $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);          ));
3010          if (database::isError($retour)) {          
3011              die($retour->getMessage());          return $evenement->getVal('retour') == 't';
         }  
         if ($retour == 't') {  
             return true;  
         } else {  
             return false;  
         }  
3012      }      }
3013    
3014      /**      /**
# Line 1289  class instruction extends instruction_ge Line 3023  class instruction extends instruction_ge
3023              return "";              return "";
3024          }          }
3025          //Récupère la restriction          //Récupère la restriction
3026          $sql= "SELECT          $evenement = $this->f->get_inst__om_dbform(array(
3027                    restriction              "obj" => "evenement",
3028                FROM              "idx" => $evenement,
3029                    ".DB_PREFIXE."evenement          ));
3030                WHERE          
3031                    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;  
3032      }      }
3033    
3034      /**      /**
# Line 1332  class instruction extends instruction_ge Line 3059  class instruction extends instruction_ge
3059    
3060    
3061      /**      /**
3062         * Calcul une regle à partir des données de l'url et affiche son
3063         * résultat au format json
3064         */
3065        public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3066            // Récupération de la date limite
3067            $dossier = $this->f->get_inst__om_dbform(array(
3068                'obj' => 'dossier',
3069                'idx' => $this->getVal('dossier')
3070            ));
3071            $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3072                $dossier->getVal('date_limite') :
3073                $dossier->getVal('date_limite_incompletude');
3074            // Ajout d'un jour à la date limite (reglementaire lors de la notification
3075            // par demat)
3076            $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3077            // Compare la date limite à j+1 et la date du jour
3078            // La date du jour est récupérée via la fonction date pour pouvoir comparer
3079            // des timestamps de début de journée
3080            if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3081            echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3082        }
3083    
3084        /**
3085         * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3086         *
3087         * @param  object $ev Instance de l'événement associé à l'instruction
3088         * @param  array  $params Types d'événements autorisés
3089         * @return boolean
3090         */
3091        public function is_type_evenement_autorise($ev, $params = array()) {
3092            $type_evenement = $ev->getVal('type');
3093            if (isset($params["types_evenements_autorises"])
3094                && ! empty($params["types_evenements_autorises"])
3095                && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3096                return true;
3097            }
3098            return false;
3099        }
3100    
3101        /**
3102         * Vérifie si la date limite de notification au demandeur est dépassée.
3103         *
3104         * @param  boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3105         * @return boolean
3106         */
3107        public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3108            $dln = $this->getVal('archive_date_notification_delai');
3109            if ($dln === ''
3110                || $dln === null) {
3111                //
3112                $dossier = $this->f->get_inst__om_dbform(array(
3113                    'obj' => 'dossier',
3114                    'idx' => $this->getVal('dossier')
3115                ));
3116                $dln = $dossier->getVal('date_notification_delai');
3117            }
3118            if ($dln === ''
3119                || $dln === null) {
3120                //
3121                return false;
3122            }
3123            // Ajout d'un jour à la date limite de notification
3124            if ($add_one_day === true) {
3125                $dln = $this->f->mois_date($dln, "1", "+", "jour");
3126            }
3127            // Compare la date limite de notification et la date du jour
3128            return strtotime($dln) <= strtotime(date("Y-m-d"));
3129        }
3130    
3131        /**
3132       * Calcul des règle d'action selon leur type.       * Calcul des règle d'action selon leur type.
3133       *       *
3134       * Types de règle :       * Types de règle :
# Line 1352  class instruction extends instruction_ge Line 3149  class instruction extends instruction_ge
3149    
3150          // Supprime tous les espaces de la chaîne de caractère          // Supprime tous les espaces de la chaîne de caractère
3151          $rule = str_replace(' ', '', $rule);          $rule = str_replace(' ', '', $rule);
3152            // On force les minuscules
3153            $rule = strtolower($rule);
3154          // Coupe la chaîne au niveau de l'opérateur          // Coupe la chaîne au niveau de l'opérateur
3155          $operands = explode ("+", $rule);          $operands = explode ("+", $rule);
3156          // Nombre d'opérande          // Nombre d'opérande
# Line 1382  class instruction extends instruction_ge Line 3181  class instruction extends instruction_ge
3181              "regle_date_retour_contradictoire",              "regle_date_retour_contradictoire",
3182              "regle_date_ait",              "regle_date_ait",
3183              "regle_date_transmission_parquet",              "regle_date_transmission_parquet",
3184                "regle_date_affichage",
3185                "duree_validite",
3186                "duree_validite_parametrage",
3187          );          );
3188          // Tableau des champs de type numérique          // Tableau des champs de type numérique
3189          $rule_type_numeric = array(          $rule_type_numeric = array(
3190            );
3191            // Tableau des champs de type text
3192            $rule_type_time_delai = array(
3193              "regle_delai",              "regle_delai",
3194              "regle_delai_incompletude",              "regle_delai_incompletude",
3195          );          );
# Line 1393  class instruction extends instruction_ge Line 3198  class instruction extends instruction_ge
3198          );          );
3199          // Tableau des champs de type booléen          // Tableau des champs de type booléen
3200          $rule_type_bool = array(          $rule_type_bool = array(
3201                "regle_a_qualifier",
3202                "regle_incompletude",
3203                "regle_incomplet_notifie",
3204                "regle_evenement_suivant_tacite_incompletude",
3205          );          );
3206          // Tableau des champs spécifiques          // Tableau des champs spécifiques
3207          $rule_type_specific = array(          $rule_type_specific = array(
# Line 1400  class instruction extends instruction_ge Line 3209  class instruction extends instruction_ge
3209              "regle_etat",              "regle_etat",
3210              "regle_accord_tacite",              "regle_accord_tacite",
3211              "regle_avis",              "regle_avis",
3212                "regle_pec_metier",
3213                "regle_etat_pendant_incompletude",
3214          );          );
3215          // Tableau des champs de données techniques          // Tableau des champs de données techniques
3216          $rule_type_technical_data = array(          $rule_type_technical_data = array(
# Line 1409  class instruction extends instruction_ge Line 3220  class instruction extends instruction_ge
3220              'regle_donnees_techniques4',              'regle_donnees_techniques4',
3221              'regle_donnees_techniques5',              'regle_donnees_techniques5',
3222          );          );
3223            // Tableau des champs simple
3224            $rule_type_simple = array(
3225                "regle_dossier_instruction_type",
3226            );
3227    
3228          // Définit le type du champ          // Définit le type du champ
3229          if (in_array($rule_name, $rule_type_date) == true) {          if (in_array($rule_name, $rule_type_date) == true) {
# Line 1427  class instruction extends instruction_ge Line 3242  class instruction extends instruction_ge
3242              $type = "specific";              $type = "specific";
3243          }          }
3244          if (in_array($rule_name, $rule_type_technical_data) === true) {          if (in_array($rule_name, $rule_type_technical_data) === true) {
3245              $type = 'text';              $type = 'technical_text';
3246            }
3247            if (in_array($rule_name, $rule_type_simple) === true) {
3248                $type = 'simple';
3249            }
3250            if (in_array($rule_name, $rule_type_time_delai) === true) {
3251                $type = "time_delai";
3252          }          }
3253    
3254          // 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
3255          // Récupère directement la valeur de l'opérande          // Récupère directement la valeur de l'opérande
3256          if ($type === 'specific' || $type === 'bool') {          if ($type === 'specific') {
3257              //              //
3258              return $this->get_value_for_rule($rule);              return $this->get_value_for_rule($rule);
3259          }          }
3260    
3261          // Initialisation des variables          // Initialisation des variables
         $key_date = 0;  
3262          $total_numeric = 0;          $total_numeric = 0;
3263          $res_text = '';          $res_text = '';
3264            $final_date = null;
3265    
3266          // Pour chaque opérande          // Pour chaque opérande
3267          foreach ($operands as $key => $operand) {          foreach ($operands as $key => $operand) {
   
3268              // Si c'est une règle de type date              // Si c'est une règle de type date
3269              if ($type == 'date') {              if ($type == 'date') {
3270                  // Vérifie si au moins une des opérandes est une date                  if (is_numeric($operand) === false){
3271                  if (is_numeric($operand) === false                      $rule_value = $this->get_value_for_rule($operand);
3272                      && $this->get_value_for_rule($operand) !== null                      if (
3273                      && $this->f->check_date($this->get_value_for_rule($operand)) == true) {                          $rule_value !== null
3274                      // Récupère la position de la date                          && (
3275                      $key_date = $key;                              strpos($operand, 'mois') !== false
3276                                || strpos($operand, 'jour') !== false
3277                            )
3278                        ){
3279                            $rule_value = $operand;
3280                        }
3281                        if ($rule_value !== null){
3282                            // Vérifie si l'opérande est une date
3283                            if ($this->f->check_date($rule_value) == true) {
3284                                // Affecte la date
3285                                $final_date = $rule_value;
3286                            }else{
3287                                // Gère les opérandes
3288                                preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3289    
3290                                // Ajoute l'opérande au total
3291                                foreach ($matches[1] as $matche_key => $matche_value) {
3292                                    $timelength = $matches[1][$matche_key][0];
3293                                    $timetype = 'mois';
3294                                    if ( $matches[2][$matche_key][0] != ''){
3295                                        $timetype = $matches[2][$matche_key][0];
3296                                    }
3297                                    // Ajout au calcul de la date
3298                                    $final_date = $this->f->mois_date(
3299                                        $final_date,
3300                                        $timelength,
3301                                        "+",
3302                                        $timetype
3303                                    );
3304                                }
3305                            }
3306                        }
3307                  }                  }
3308                  // Les autres opérandes doivent être que des numériques                  // Les autres opérandes doivent être que des numériques
3309                  if (is_numeric($operand) == true) {                  if (is_numeric($operand) == true) {
3310                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
3311                      $total_numeric += $operand;                      // Ajout au calcul de la date
3312                  }                      $final_date = $this->f->mois_date($final_date,
3313                  if (is_numeric($operand) === false                              $operand, "+");
                     && $this->get_value_for_rule($operand) !== null  
                     && is_numeric($this->get_value_for_rule($operand)) == true) {  
                     // Ajoute l'opérande au total  
                     $total_numeric += $this->get_value_for_rule($operand);  
3314                  }                  }
3315              }              }
3316    
# Line 1483  class instruction extends instruction_ge Line 3330  class instruction extends instruction_ge
3330              }              }
3331    
3332              // Si c'est une règle de type text              // Si c'est une règle de type text
3333              if ($type === 'text') {              if ($type === 'text' || $type === 'technical_text') {
3334                  // Concatène toutes les chaînes de caractère                  // Concatène toutes les chaînes de caractère
3335                  $res_text .= $this->get_value_for_rule($operand);                  $res_text .= $this->get_value_for_rule($operand);
3336              }              }
3337    
3338                // Si c'est une règle de type time_delai
3339                if ($type === 'time_delai') {
3340                    $rule_value = $this->get_value_for_rule($operand);
3341                    if ( strlen($res_text) != 0) {
3342                        $res_text .= "+";
3343                    }
3344                    if ($rule_value != null && $rule_value != ''){
3345                        // Supprime tous les espaces de la chaîne de caractère
3346                        // Concatène toutes les chaînes de caractère
3347                        $res_text .= $rule_value;
3348                    } else {
3349                        $res_text .= $operand;
3350                    }
3351                }
3352    
3353          }          }
3354    
3355          // Résultat pour une règle de type date          // Résultat pour une règle de type date
3356          if ($type == 'date') {          if ($type == 'date') {
3357              // Retourne le calcul de la date              // Retourne la date
3358              return $this->f->mois_date($this->valF[$operands[$key_date]],              return $final_date;
                 $total_numeric, "+");  
3359          }          }
3360    
3361          // Résultat pour une règle de type numérique          // Résultat pour une règle de type numérique
# Line 1503  class instruction extends instruction_ge Line 3365  class instruction extends instruction_ge
3365          }          }
3366    
3367          // Résultat pour une règle de type text          // Résultat pour une règle de type text
3368          if ($type === 'text') {          if (in_array($type, array('text', 'technical_text')) === true) {
3369              // Retourne la chaîne de caractère              // Retourne la chaîne de caractère
3370              return $res_text;              return $res_text;
3371          }          }
3372    
3373            // Résultat pour une règle de type text
3374            if (in_array($type, array('time_delai')) === true) {
3375                // Traitement de la valeur à afficher
3376                $res_text = str_replace(' ', '', $res_text);
3377                $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3378                $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3379                $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3380                return $res_text;
3381            }
3382    
3383            if ($type === 'simple' || $type === 'bool') {
3384                // Retourne la valeur du champs rule
3385                return $rule;
3386            }
3387      }      }
3388    
3389    
# Line 1534  class instruction extends instruction_ge Line 3411  class instruction extends instruction_ge
3411    
3412    
3413      /**      /**
3414         * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3415         * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3416         *
3417         * Pour générer le nom du fichier, si le type de document en lien avec l'évènement existe, on récupère son libellé
3418         * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3419         *
3420         * @return string : le nom du fichier générer
3421         */
3422        function determinate_name_doc_pdf(){
3423            $id_DI = $this->getVal("dossier");
3424            $date = date('Ymd');
3425            $data = "";
3426    
3427            // Récupération de l'id de la lettre type associée à l'instruction
3428            $data = $this->getVal("lettretype");
3429    
3430            // Récupération de l'id de l'instruction
3431            $id_instr = $this->getVal("instruction");
3432    
3433            // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3434            if(!empty($this->get_type_document_linked_with_instruction())){
3435                $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3436            }
3437    
3438            // On retourne le nom du fichier généré
3439            return $this->f->normalize_string(
3440                sprintf(
3441                    "%s_%s_%s_%s",
3442                    $id_DI,
3443                    $id_instr,
3444                    $date,
3445                    $data
3446                )
3447            );
3448        }
3449    
3450    
3451        /**
3452       * [get_inst_donnees_techniques description]       * [get_inst_donnees_techniques description]
3453       *       *
3454       * @param [type] $donnees_techniques [description]       * @param [type] $donnees_techniques [description]
# Line 1542  class instruction extends instruction_ge Line 3457  class instruction extends instruction_ge
3457       */       */
3458      function get_inst_donnees_techniques($donnees_techniques = null) {      function get_inst_donnees_techniques($donnees_techniques = null) {
3459          //          //
3460          if (isset($this->inst_donnees_techniques) === false or          if (isset($this->inst_donnees_techniques) === false ||
3461              $this->inst_donnees_techniques === null) {              $this->inst_donnees_techniques === null) {
3462              //              //
3463              if (is_null($donnees_techniques)) {              if (is_null($donnees_techniques)) {
3464                  $donnees_techniques = $this->getDonneesTechniques();                  $donnees_techniques = $this->getDonneesTechniques();
3465              }              }
3466              //              //
3467              require_once "../obj/donnees_techniques.class.php";              $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3468              $this->inst_donnees_techniques = new donnees_techniques($donnees_techniques);                  "obj" => "donnees_techniques",
3469                    "idx" => $donnees_techniques,
3470                ));
3471          }          }
3472          //          //
3473          return $this->inst_donnees_techniques;          return $this->inst_donnees_techniques;
# Line 1562  class instruction extends instruction_ge Line 3479  class instruction extends instruction_ge
3479       * @return string L'identifiant des données techniques liées du dossier       * @return string L'identifiant des données techniques liées du dossier
3480       */       */
3481      function getDonneesTechniques() {      function getDonneesTechniques() {
3482        
3483            $qres = $this->f->get_one_result_from_db_query(
3484                sprintf(
3485                    'SELECT
3486                        donnees_techniques
3487                    FROM
3488                        %1$sdonnees_techniques
3489                    WHERE
3490                        dossier_instruction = \'%2$s\'',
3491                    DB_PREFIXE,
3492                    $this->f->db->escapeSimple($this->valF["dossier"])
3493                ),
3494                array(
3495                    "origin" => __METHOD__,
3496                )
3497            );
3498                    
3499          $donnees_techniques = '';          return $qres['result'];
   
         $sql = "SELECT donnees_techniques  
             FROM ".DB_PREFIXE."donnees_techniques  
             WHERE dossier_instruction ='".$this->valF["dossier"]."'";  
         $donnees_techniques = $this->db->getOne($sql);  
         $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);  
         if ( database::isError($donnees_techniques)){  
             die();  
         }  
   
         return $donnees_techniques;  
3500      }      }
3501    
   
3502      /**      /**
3503       * TRIGGER - triggerajouterapres.       * TRIGGER - triggerajouterapres.
3504       *       *
# Line 1588  class instruction extends instruction_ge Line 3509  class instruction extends instruction_ge
3509       *       *
3510       * @return boolean       * @return boolean
3511       */       */
3512      function triggerajouterapres($id, &$db = null, $val = array(), $DEBUG = null) {      function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3513            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3514    
3515            $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3516            if ($parent_res === false) return $parent_res;
3517    
3518            $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3519            $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data);
3520    
3521          // 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
3522          $inst_di = $this->get_inst_dossier($this->valF['dossier']);          $inst_di = $this->get_inst_dossier($this->valF['dossier']);
   
3523          // Instance de la classe evenement          // Instance de la classe evenement
3524          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3525            // Instance de l'état courant du dossier d'instruction
3526            $inst_current_etat = $this->f->get_inst__om_dbform(array(
3527                "obj" => "etat",
3528                "idx" => $inst_di->get_id_etat(),
3529            ));
3530    
3531          /**          /**
3532           * 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 1602  class instruction extends instruction_ge Line 3534  class instruction extends instruction_ge
3534           */           */
3535          // état de complétude actuel du dossier          // état de complétude actuel du dossier
3536          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3537            // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3538            $ev_suiv_tacite_incompletude = false;
3539          // Initialisation          // Initialisation
3540          $valF = "";          $valF = array();
3541          $valF_dt = "";          $valF_dt = array();
3542          //          //
         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;  
             }  
         }  
3543          // Récupération des paramètres de l'action          // Récupération des paramètres de l'action
3544          $sql = "SELECT * FROM ".DB_PREFIXE."action          // TODO : remplacer cette requête par l'instanciation de l'action
3545          WHERE action='".$this->valF['action']."'";          $qres = $this->f->get_all_results_from_db_query(
3546          $res = $db->query($sql);              sprintf(
3547          $this->addToLog("triggerajouterapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
3548          if (database::isError($res)) {                      *
3549              die($res->getMessage());                  FROM
3550          }                      %1$saction
3551          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  WHERE
3552                        action = \'%2$s\'',
3553                    DB_PREFIXE,
3554                    $this->f->db->escapeSimple($this->valF['action'])
3555                ),
3556                array(
3557                    "origin" => __METHOD__
3558                )
3559            );
3560            foreach ($qres['result'] as $row) {
3561    
3562              // pour chacune des regles, on applique la regle              // pour chacune des regles, on applique la regle
3563              if ($row['regle_delai'] != '') {              if ($row['regle_delai'] != '') {
# Line 1696  class instruction extends instruction_ge Line 3609  class instruction extends instruction_ge
3609                  $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');                  $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3610              }              }
3611              if ($row['regle_etat'] != '') {              if ($row['regle_etat'] != '') {
3612                  // 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');  
                 }  
3613              }              }
3614              if ($row['regle_date_cloture_instruction'] !== '') {              if ($row['regle_date_cloture_instruction'] !== '') {
3615                  $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 1741  class instruction extends instruction_ge Line 3647  class instruction extends instruction_ge
3647              if ($row['regle_date_transmission_parquet'] !== '') {              if ($row['regle_date_transmission_parquet'] !== '') {
3648                  $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');
3649              }              }
3650                if ($row['regle_dossier_instruction_type'] !== '') {
3651                    $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3652                }
3653                // La date d'affichage est modifiée seulement si le champ n'est pas
3654                // renseigné
3655                if ($row['regle_date_affichage'] !== ''
3656                    && ($inst_di->getVal('date_affichage') === ''
3657                        || $inst_di->getVal('date_affichage') === null)) {
3658                    //
3659                    $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3660                }
3661                //
3662                if ($row['regle_pec_metier'] != '') {
3663                    $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3664                }
3665                if ($row['regle_a_qualifier'] != '') {
3666                    $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3667                }
3668                //
3669                if ($row['regle_incompletude'] != '') {
3670                    $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3671                }
3672                if ($row['regle_incomplet_notifie'] != '') {
3673                    $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3674                }
3675                if ($row['regle_etat_pendant_incompletude'] != '') {
3676                    $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3677                }
3678                if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3679                    $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3680                    if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3681                        $ev_suiv_tacite_incompletude = true;
3682                    }
3683                }
3684          }          }
3685    
3686          // Si l'événement a un événement suivant tacite          // Si l'événement a un événement suivant tacite
3687          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3688              // 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
3689              // dans le champ evenement_suivant_tacite du dossier              // pas associé de le même façon au dossier d'instruction
3690              if ($incompletude == false OR $inst_evenement->getVal('type') != "incompletude") {              if ($ev_suiv_tacite_incompletude === false) {
                 //  
3691                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3692              } else {              }
3693                  // Sinon l'événement tacite est stocké dans le champ              if ($ev_suiv_tacite_incompletude === true) {
                 // evenement_suivant_tacite_incompletude du dossier  
3694                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3695              }              }
3696          }          }
3697          // 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
3698          if ($valF_dt != "") {          if (count($valF_dt) > 0) {
3699              $dt_id = $this->getDonneesTechniques();              $dt_id = $this->getDonneesTechniques();
3700              // On met à jour le dossier              // On met à jour le dossier
3701              $cle = " donnees_techniques='".$dt_id."'";              $cle = " donnees_techniques='".$dt_id."'";
3702              $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);
3703              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);              $this->addToLog(
3704              if (database::isError($res1)) {                  __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3705                  die($res->getMessage());                  VERBOSE_MODE
3706              }              );
3707                $this->f->isDatabaseError($res1);
3708              // Affichage d'informations à l'utilisateur              // Affichage d'informations à l'utilisateur
3709              $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')."]");
3710          }          }
3711          // 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
3712          if ($valF != "") {          if (count($valF) > 0) {
3713              // On met à jour le dossier              //
3714              $cle = " dossier='".$this->valF['dossier']."'";              $inst_dossier = $this->f->get_inst__om_dbform(array(
3715              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);                  "obj" => "dossier",
3716              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);                  "idx" => $this->valF['dossier'],
3717              if (database::isError($res1)) {              ));
3718                  die($res->getMessage());              $valF['instruction'] = $id;
3719                $valF['crud'] = 'create';
3720                $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3721                if ($update_by_instruction === false) {
3722                    $this->cleanMessage();
3723                    $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3724                    return false;
3725              }              }
3726              // Affichage d'informations à l'utilisateur              // Affichage d'informations à l'utilisateur
3727              $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')."]");
3728          }          }
3729    
3730          /**          /**
# Line 1809  class instruction extends instruction_ge Line 3754  class instruction extends instruction_ge
3754              $ret = $this->f->send_message_to_referentiel_erp(105, $infos);              $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3755              if ($ret !== true) {              if ($ret !== true) {
3756                  $this->cleanMessage();                  $this->cleanMessage();
3757                  $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."));
3758                    return false;
3759                }
3760                $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3761            }
3762    
3763            // Si le mode en rédaction intégrale est activé
3764            if (isset($this->valF['flag_edition_integrale']) === true
3765                && $this->valF['flag_edition_integrale'] === true) {
3766                $redactionIntegraleValF = array();
3767    
3768                // Récupère la collectivite du dossier d'instruction
3769                $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3770                $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3771                // Récupère le corps de la lettre type
3772                $params = array(
3773                    "specific" => array(
3774                        "corps" => array(
3775                            "mode" => "get",
3776                        )
3777                    ),
3778                );
3779                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3780                $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3781                // Récupère le titre de la lettre type
3782                $params = array(
3783                    "specific" => array(
3784                        "titre" => array(
3785                            "mode" => "get",
3786                        )
3787                    ),
3788                );
3789                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3790                $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3791    
3792                // mise à jour en base de données
3793                $res = $this->f->db->autoExecute(
3794                    DB_PREFIXE.$this->table,
3795                    $redactionIntegraleValF,
3796                    DB_AUTOQUERY_UPDATE,
3797                    $this->clePrimaire."=".$id
3798                );
3799                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3800                if ($this->f->isDatabaseError($res, true) === true) {
3801                  return false;                  return false;
3802              }              }
             $this->addToMessage(_("Notification (105) du référentiel ERP OK."));  
3803          }          }
3804    
3805          /**          /**
3806           * Mise à jour des données du DA.           * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3807           */           */
3808          //          // Si la finalisation automatique de l'événement est activée
3809          $inst_da = $inst_di->get_inst_dossier_autorisation();          // ET si l'instruction n'a pas déjà été finalisée
3810          //          // ET s'il existe une lettre type associée
3811          if ($inst_da->majDossierAutorisation() === false) {          if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3812              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              && $inst_evenement->getVal('om_final_instruction') !== 't'
3813              $this->correct = false;              && $inst_evenement->getVal('lettretype') !== ''
3814              return false;              && $inst_evenement->getVal('lettretype') !== null) {
3815    
3816                 // On instancie l'instruction
3817                $inst_instruction = $this->f->get_inst__om_dbform(array(
3818                    "obj" => "instruction",
3819                    "idx" => $this->valF[$this->clePrimaire],
3820                ));
3821    
3822                // On finalise l'instruction dans le contexte de finalisation : action 100
3823                $inst_instruction->setParameter('maj', 100);
3824                $finalize = $inst_instruction->finalize($inst_instruction->valF);
3825    
3826                // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3827                // et dans le message d'erreur
3828                if ($finalize === false) {
3829                    $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3830                    $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3831                    return false;
3832                }
3833          }          }
3834    
3835          /**          /**
# Line 1845  class instruction extends instruction_ge Line 3850  class instruction extends instruction_ge
3850              // retour              // retour
3851              // OU l'événement d'instruction est l'événement suivant tacite du              // OU l'événement d'instruction est l'événement suivant tacite du
3852              // dossier d'instruction (incomplétude prise en compte)              // dossier d'instruction (incomplétude prise en compte)
3853              if ($inst_evenement->getVal("retour") === 't'              // ET l'événement d'instruction n'a pas déjà été finalisé
3854                if (($inst_evenement->getVal("retour") === 't'
3855                  || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id                  || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3856                      || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id)) {                      || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3857                        && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3858    
3859                  // Finalise l'instruction                  // Finalise l'instruction
3860                  $inst_instruction = new instruction($this->valF[$this->clePrimaire], $this->f->db, 0);                  $inst_instruction = $this->f->get_inst__om_dbform(array(
3861                        "obj" => "instruction",
3862                        "idx" => $this->valF[$this->clePrimaire],
3863                    ));
3864                  $inst_instruction->setParameter('maj', 100);                  $inst_instruction->setParameter('maj', 100);
3865                  $finalize = $inst_instruction->finalize($inst_instruction->valF);                  $finalize = $inst_instruction->finalize($inst_instruction->valF);
3866                  if ($finalize === false) {                  if ($finalize === false) {
# Line 1861  class instruction extends instruction_ge Line 3871  class instruction extends instruction_ge
3871          }          }
3872    
3873          /**          /**
3874           * Historisation de la vie du DI.           * Mise à jour de la version de clôture *version_clos* du dossier si et
3875             * seulement si l'instruction met à jour l'état du dossier.
3876           */           */
3877          //          if (isset($valF['etat']) === true
3878          return $this->add_log_to_dossier($id, array_merge($val, $this->valF));              && $valF['etat'] !== null
3879      }              && $valF['etat'] !== '') {
3880                // Instanciation de l'état appliqué sur le dossier par l'instruction
3881                $inst_etat = $this->f->get_inst__om_dbform(array(
3882                    "obj" => "etat",
3883                    "idx" => $valF['etat'],
3884                ));
3885                //
3886                $update_version_clos = null;
3887                // En cas d'instruction qui clôture le dossier
3888                if ($inst_etat->getVal('statut') === 'cloture') {
3889                    $update_version_clos = $inst_di->update_version_clos('up');
3890                }
3891                // En cas d'instruction qui rouvre le dossier
3892                if ($inst_current_etat->getVal('statut') === 'cloture'
3893                    && $inst_etat->getVal('statut') !== 'cloture') {
3894                    //
3895                    $update_version_clos = $inst_di->update_version_clos('down');
3896                    //
3897                    $params = array(
3898                        'di_reopened' => true,
3899                    );
3900                }
3901                //
3902                if ($update_version_clos === false) {
3903                    $this->f->addToLog(sprintf(
3904                        "%s() : ERREUR - %s %s",
3905                        __METHOD__,
3906                        sprintf(
3907                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3908                            $inst_di->getVal($inst_di->clePrimaire)
3909                        ),
3910                        sprintf(
3911                            __("L'instruction tente d'appliquer l'état %s."),
3912                            $inst_etat->getVal($inst_etat->clePrimaire)
3913                        )
3914                    ));
3915                    $this->addToMessage(sprintf(
3916                        "%s %s",
3917                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3918                        __("Veuillez contacter votre administrateur.")
3919                    ));
3920                    return false;
3921                }
3922            }
3923    
     function triggermodifierapres($id, &$db = null, $val = array(), $DEBUG = null) {  
3924          /**          /**
3925           * L'objectif ici est d'effectuer les recalculs de date dans le dossier           * Notification automatique
3926           * si la date de l'evenement est modifiee           */
3927           */          // Notification automatique à l'ajout de l'instruction si la notification
3928          // Initialisation          // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3929          $valF = "";          if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3930          $valF_dt = "";              ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
3931          // Initialisation du type d'événement  
3932          $type_evmt = "";              // Message à afficher dans les logs pour indiquer quelle notification a échouée
3933          // Récupération de l'action correspondante à l'événement              $msgLog = sprintf(
3934          $sql = "SELECT action                  '%s %s : %d',
3935          FROM ".DB_PREFIXE."evenement                  __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3936          WHERE evenement=".$this->valF['evenement'];                  __('Instruction notifiée'),
3937          $action = $db->getOne($sql);                  $id
3938          $this->addToLog("triggermodifierapres(): db->getone(\"".$sql."\");", VERBOSE_MODE);              );
         if (database::isError($action)) {  
             die($action->getMessage());  
         }  
3939    
3940          // Récupération des paramètres de l'action              // Récupération de la liste des demandeurs à notifier et de la catégorie
3941          $sql = "SELECT * FROM ".DB_PREFIXE."action              $categorie = $this->f->get_param_option_notification($collectivite_di);
3942          WHERE action='".$action."'";              $isPortal = $categorie === PORTAL;
3943          $res = $db->query($sql);              $demandeursANotifie = $this->get_demandeurs_notifiable(
3944          $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                  $this->valF['dossier'],
3945          if (database::isError($res)) {                  $isPortal
3946              die($res->getMessage());              );
3947          }  
3948          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){              //
3949              // application des regles sur le courrier + delai              $msg_notif = '';
3950              if(preg_match("/date_evenement/",$row['regle_date_limite'])){  
3951                  $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');              // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3952              }              $demandeurPrincipalNotifie = false;
3953              if(preg_match("/date_evenement/",$row['regle_date_complet'])){              foreach ($demandeursANotifie as $demandeur) {
3954                  $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');                  // Identifie si le demandeur principal a été notifié ou pas
3955              }                  // et récupère ses informations
3956              if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){                  if ($demandeur['petitionnaire_principal'] == 't') {
3957                  $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');                      $demandeurPrincipalNotifie = true;
3958              }                      // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3959              if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){                      // son paramétrage, on effectue pas le traitement et on passe à l'itération
3960                  $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');                      // suivante. On le considère également comme non notifié pour gérer l'envoie
3961              }                      // des messages d'erreurs
3962              if(preg_match("/date_evenement/",$row['regle_date_decision'])){                      // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3963                  $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');                      // d'impact sur la notification
3964              }                      $erreursParam = $this->get_info_notification_fail($val['dossier']);
3965              if(preg_match("/date_evenement/",$row['regle_date_rejet'])){                      if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3966                  $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');                          $demandeurPrincipalNotifie = false;
3967              }                          continue;
3968              if(preg_match("/date_evenement/",$row['regle_date_validite'])){                      }
3969                  $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');                  }
3970                    // Récupération du contenu de l'option option_bloquer_notif_auto_dln
3971                    $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
3972                    // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
3973                    // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
3974                    if (! empty($option_bloquer_notif_auto_dln_types_evenements)
3975                        && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
3976                        && $this->is_date_limite_notification_premier_mois_depasee() === true) {
3977                        // Ajout de la notif et récupération de son id
3978                        $idNotif = $this->ajouter_notification(
3979                            $this->valF[$this->clePrimaire],
3980                            $this->f->get_connected_user_login_name(),
3981                            $demandeur,
3982                            $collectivite_di,
3983                            array(),
3984                            true,
3985                            'Echec',
3986                            __('La date limite de notification au demandeur est dépassée')
3987                        );
3988                        if ($idNotif === false) {
3989                            // Termine le traitement
3990                            $this->addToLog(
3991                                sprintf('%s() : %s', __METHOD__, $msgLog),
3992                                DEBUG_MODE
3993                            );
3994                            return $this->end_treatment(__METHOD__, false);
3995                        }
3996                        $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
3997                    }
3998                    else {
3999                        // Ajout de la notif et récupération de son id
4000                        $idNotif = $this->ajouter_notification(
4001                            $this->valF[$this->clePrimaire],
4002                            $this->f->get_connected_user_login_name(),
4003                            $demandeur,
4004                            $collectivite_di,
4005                            array(),
4006                            true
4007                        );
4008                        if ($idNotif === false) {
4009                            $this->addToLog(
4010                                sprintf('%s() : %s', __METHOD__, $msgLog),
4011                                DEBUG_MODE
4012                            );
4013                            return false;
4014                        }
4015                        // Création de la tache en lui donnant l'id de la notification
4016                        $notification_by_task = $this->notification_by_task(
4017                            $idNotif,
4018                            $this->valF['dossier'],
4019                            $categorie
4020                        );
4021                        if ($notification_by_task === false) {
4022                            $this->addToLog(
4023                                sprintf('%s() : %s', __METHOD__, $msgLog),
4024                                DEBUG_MODE
4025                            );
4026                            $this->addToMessage(
4027                                __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4028                            );
4029                            return false;
4030                        }
4031                        $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4032                    }
4033              }              }
4034              if(preg_match("/date_evenement/",$row['regle_date_chantier'])){              // Pour la notification par mail ou la notification via portal si le dossier a
4035                  $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');              // été déposés via portal, si le demandeur principal n'est pas notifiable,
4036                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4037                // laquelle le demandeur principal n'a pas pu être notifié
4038                $depotPortal = $this->dossier_depose_sur_portail();
4039                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4040                    // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4041                    // ' ' permet de mettre un espace entre les 2 msg de log.
4042                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4043                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4044                    $erreursParam = $this->get_info_notification_fail($val['dossier']);
4045                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4046                    // Ajout de la notif et récupération de son id
4047                    $idNotif = $this->ajouter_notification(
4048                        $this->valF[$this->clePrimaire],
4049                        $this->f->get_connected_user_login_name(),
4050                        $demandeurPrincipal,
4051                        $collectivite_di,
4052                        array(),
4053                        true,
4054                        'Echec',
4055                        implode(' ', $erreursParam)
4056                    );
4057                    if ($idNotif === false) {
4058                        $this->addToLog(
4059                            sprintf('%s() : %s', __METHOD__, $msgLog),
4060                            DEBUG_MODE
4061                        );
4062                        $this->addToMessage(
4063                            __('Erreur : la création de la notification a échouée.').
4064                            __("Veuillez contacter votre administrateur.")
4065                        );
4066                        return false;
4067                    }
4068                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4069                    // de l'échec de la notification
4070                    $dossier_message = $this->get_inst_dossier_message(0);
4071                    $dossier_message_val = array(
4072                        'dossier' => $val['dossier'],
4073                        'type' => __('erreur expedition'),
4074                        'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4075                        'login' => $_SESSION['login'],
4076                        'date_emission' => date('Y-m-d H:i:s'),
4077                        'contenu' => __('Échec lors de la notification de l\'instruction ').
4078                            $inst_evenement->getVal('libelle').
4079                            '.<br>'.
4080                            implode("\n", $erreursParam).
4081                            '<br>'.
4082                            __('Veuillez corriger ces informations avant de renvoyer la notification.')
4083                    );
4084                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
4085                    // Si une erreur se produit pendant l'ajout
4086                    if ($add !== true) {
4087                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4088                        return false;
4089                    }
4090              }              }
4091              if(preg_match("/date_evenement/",$row['regle_date_achevement'])){              $this->addToMessage($msg_notif);
4092                  $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');          }
4093    
4094            // Notification automatique en cas de dépôt de dossier dématérialisé
4095            // Vérifie si l'option de notification est active et si il s'agit bien d'une
4096            // instruction de récépissé
4097            if (
4098                $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4099                && $this->is_instruction_recepisse()
4100            ) {
4101                // Message à afficher dans les logs pour indiquer quelle notification a échouée
4102                $msgLog = sprintf(
4103                    __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4104                    $val['dossier']
4105                );
4106                // Récupère l'instance de la demande
4107                $demande = $inst_di->get_inst_demande();
4108                // Vérifie que le dossier a été déposé via platau ou portal
4109                if (
4110                    ($demande->getVal('source_depot') == PLATAU ||
4111                    $demande->getVal('source_depot') == PORTAL)
4112                ) {
4113                    // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4114                    // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4115                    $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4116                    if (empty($listeEmails)) {
4117                        $this->addToLog(
4118                            sprintf(
4119                                '%s(): %s %s',
4120                                __METHOD__,
4121                                $msgLog,
4122                                __('Aucun courriel paramétré.')
4123                            ),
4124                            DEBUG_MODE
4125                        );
4126                    } else {
4127                        foreach ($listeEmails as $email) {
4128                            // Ajout de la notif et récupération de son id
4129                            $destinataire = array(
4130                                'destinataire' => $email,
4131                                'courriel' => $email
4132                            );
4133                            $idNotif = $this->ajouter_notification(
4134                                $this->valF[$this->clePrimaire],
4135                                $this->f->get_connected_user_login_name(),
4136                                $destinataire,
4137                                $collectivite_di,
4138                                array(),
4139                                true
4140                            );
4141                            if ($idNotif === false) {
4142                                $this->addToLog(
4143                                    sprintf('%s(): %s', __METHOD__, $msgLog),
4144                                    DEBUG_MODE
4145                                );
4146                                return false;
4147                            }
4148                            // Création de la tache en lui donnant l'id de la notification
4149                            $notification_by_task = $this->notification_by_task(
4150                                $idNotif,
4151                                $this->valF['dossier'],
4152                                'mail',
4153                                'notification_depot_demat'
4154                            );
4155                            if ($notification_by_task === false) {
4156                                $this->addToMessage(
4157                                    __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4158                                );
4159                                $this->addToLog(
4160                                    sprintf('%s(): %s', __METHOD__, $msgLog),
4161                                    DEBUG_MODE
4162                                );
4163                                return false;
4164                            }
4165                        }
4166                    }
4167              }              }
4168              if(preg_match("/date_evenement/",$row['regle_date_conformite'])){          }
4169                  $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');  
4170            /**
4171             * Mise à jour de la date de dernière modification du dossier
4172             */
4173            $inst_di->update_last_modification_date();
4174    
4175            /**
4176             * Mise à jour des données du DA.
4177             */
4178            $inst_da = $inst_di->get_inst_dossier_autorisation();
4179            $params['di_id'] = $this->valF['dossier'];
4180            if ($inst_da->majDossierAutorisation($params) === false) {
4181                $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4182                $this->correct = false;
4183                return false;
4184            }
4185    
4186            /**
4187             * Historisation de la vie du DI.
4188             */
4189    
4190            $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4191    
4192            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4193            $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data);
4194            return $res;
4195        }
4196    
4197        /**
4198         * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4199         * sont remplies.
4200         * Les conditions vérifiées sont les suivantes :
4201         *  - L'option de notification *option_notification* doit être définie
4202         *  - Le petitionnaire principal doit accepter les notifications
4203         *  - Le pétitionnaire principal doit avoir une adresse mail renseignée
4204         *  - Le pétitionnaire principal doit avoir une adresse mail correcte
4205         * Pour chaque vérification effectué un message d'erreur est ajouté si la
4206         * condition n'est pas remplie.
4207         * Renvoie le message d'erreur en sortie.
4208         *
4209         * @param string identifiant du dossier sur lequel les notifications ont échouée
4210         * @return string
4211         */
4212        public function get_info_notification_fail($dossier = null) {
4213            // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4214            // utilise celui associé à l'instruction
4215            if ($dossier == null) {
4216                $dossier = $this->getVal('dossier');
4217            }
4218            // Tableau contenant la liste des messages d'erreur
4219            $errorMessage = array();
4220            // Récupère l'option de notification
4221            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4222            $option_notification = $this->f->get_param_option_notification($collectivite_di);
4223            if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4224                $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4225            }
4226            // Récupère les informations du demandeurs principal
4227            $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4228            // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4229            if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4230                $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4231            }
4232            // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4233            if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4234                // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4235                // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4236                if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4237                    $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4238                        $infoPetitionnaire['courriel'].
4239                        '.';
4240              }              }
4241              if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){          } else {
4242                  $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');              // Si le courriel du pétitionnaire principal
4243                $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4244            }
4245    
4246            return $errorMessage;
4247        }
4248    
4249        /**
4250         * Méthode servant à vérifier si un dossier a été déposé sur
4251         * le portail citoyen ou pas.
4252         * La verification se fait via une requête sql dans laquelle
4253         * on va chercher un dossier ayant pour id l'identifiant de
4254         * dossier associé à l'instruction et pour lequel la demande
4255         * associée la plus ancienne est une demande de création de
4256         * dossier via portail
4257         *
4258         * @param string identifiant du dossier. Si non renseigné c'est le dossier
4259         * associé à l'instruction qui est utilisé
4260         * @return boolean|void true : dossier déposé via portail, false : dossier
4261         * non déposé via portail et null : erreur de base de données.
4262         */
4263        protected function dossier_depose_sur_portail($dossier = null) {
4264            if (empty($dossier)) {
4265                $dossier = $this->getVal('dossier');
4266            }
4267            $qres = $this->f->get_one_result_from_db_query(
4268                sprintf(
4269                    'SELECT
4270                        dossier
4271                    FROM
4272                        %1$sdossier
4273                        -- Récuperation de la première demande associée au dossier
4274                        LEFT JOIN (
4275                            SELECT
4276                                demande,
4277                                dossier_instruction,
4278                                source_depot
4279                            FROM
4280                                %1$sdemande
4281                            WHERE
4282                               dossier_instruction = \'%2$s\'
4283                            ORDER BY
4284                               demande ASC
4285                            LIMIT 1
4286                        ) AS demande
4287                            ON dossier.dossier = demande.dossier_instruction
4288                    WHERE
4289                        dossier.dossier = \'%2$s\'
4290                        AND demande.source_depot = \'portal\'',
4291                    DB_PREFIXE,
4292                    $this->f->db->escapeSimple($dossier)
4293                ),
4294                array(
4295                    "origin" => __METHOD__,
4296                    "force_return" => true,
4297                )
4298            );
4299            if ($qres["code"] !== "OK") {
4300                $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4301                return;
4302            }
4303            // Si on a un résultat c'est que le dossier a été déposé via le portail
4304            return ! empty($qres["result"]);
4305        }
4306    
4307        public function is_service_notifiable() {
4308            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4309    
4310            // Si l'instruction a une édition non finalisé quel que soit
4311            // le type de notification, il n'est pas notifiable
4312            if ($this->has_an_edition() === true) {
4313                if ($this->is_unfinalizable_without_bypass() === false) {
4314                    return false;
4315              }              }
4316              if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){          }
4317                  $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
4318            return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4319        }
4320    
4321        public function is_tiers_notifiable() {
4322            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4323    
4324            // Si l'instruction a une édition non finalisé quel que soit
4325            // le type de notification, il n'est pas notifiable
4326            if ($this->has_an_edition() === true) {
4327                if ($this->is_unfinalizable_without_bypass() === false) {
4328                    return false;
4329              }              }
4330              if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){          }
4331                  $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
4332            return ! empty($evenement->getVal('notification_tiers'));
4333        }
4334    
4335        /**
4336         * Méthode permettant de savoir si une instruction peut
4337         * être notifiée manuellement selon les différents types
4338         * de notification.
4339         *
4340         * Si l'instruction a une édition non finalisée alors elle n'est pas
4341         * manuellement notifiable.
4342         * Si l'instruction est associé à un événement de notification pour
4343         * lequel un retour signature est recquis, elle n'est notifiable que
4344         * si la date de retour de signature est remplie.
4345         * Par défaut si le type de notification n'est pas connu alors l'instruction
4346         * n'est pas notifiable.
4347         * Pour tous les autres cas l'instruction est manuellement notifiable.
4348         *
4349         * @return boolean true : notifiable | false : non notifiable
4350         */
4351        public function is_notifiable_by_task_manual() {
4352            $ev = $this->get_inst_evenement($this->getVal('evenement'));
4353    
4354            // Si l'instruction a une édition non finalisé quel que soit
4355            // le type de notification, il n'est pas notifiable
4356            if ($this->has_an_edition() === true) {
4357                if ($this->is_unfinalizable_without_bypass() === false) {
4358                    return false;
4359              }              }
4360              if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){          }
4361                  $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');  
4362            // Gestion des différents cas selon la valeur du champs notification
4363            if ($ev->getVal('notification') == 'notification_manuelle' ||
4364                $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4365                $ev->getVal('notification') == 'notification_automatique'
4366            ) {
4367                return true;
4368            } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4369                $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4370                $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4371                $this->getVal('date_retour_signature') != null &&
4372                $this->getVal('date_retour_signature') != ''
4373            ) {
4374                return true ;
4375            }
4376            return false;
4377        }
4378    
4379        /**
4380         * Crée une instance de notification et une tache notification_instruction de catégorie portal
4381         * pour le demandeur principal.
4382         *
4383         * @return boolean true si le traitement à réussi
4384         */
4385        protected function notifier_demandeur_principal_via_portal() {
4386            $this->begin_treatment(__METHOD__);
4387            $message = '';
4388            // Récupération des informations concernant le demandeur
4389            $dossier = $this->getVal('dossier');
4390            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4391            $demandeur = $this->get_demandeurs_notifiable(
4392                $dossier,
4393                true
4394            );
4395            if ($demandeur !== array()) {
4396                $destinataire = array_values($demandeur);
4397                // Ajout de la notif et récupération de son id
4398                $idNotification = $this->ajouter_notification(
4399                    $this->getVal($this->clePrimaire),
4400                    $this->f->get_connected_user_login_name(),
4401                    $destinataire[0],
4402                    $collectivite_di,
4403                    array(),
4404                    true
4405                );
4406                if ($idNotification === false) {
4407                    return $this->end_treatment(__METHOD__, false);
4408              }              }
4409              if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){              // Création de la tâche en lui donnant l'id de la notification
4410                  $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);
4411                if ($notification_by_task === false) {
4412                    $this->addToMessage(
4413                        __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4414                    );
4415                    return $this->end_treatment(__METHOD__, false);
4416              }              }
4417              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.")));
4418                  $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');              return $this->end_treatment(__METHOD__, true);
4419            }
4420            $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4421            return $this->end_treatment(__METHOD__, false);
4422        }
4423    
4424        public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4425            // Si le type n'est pas correctement spécifié, alors il est calculé
4426            if ($type !== 'notification_recepisse'
4427                && $type !== 'notification_instruction'
4428                && $type !== 'notification_decision'
4429                && $type !== 'notification_service_consulte'
4430                && $type !== 'notification_tiers_consulte'
4431                && $type !== 'notification_depot_demat'
4432                && $type !== 'notification_commune'
4433                && $type !== 'notification_signataire') {
4434                //
4435                $type = 'notification_instruction';
4436                // Vérifie si l'instruction est un récépissé
4437                if ($this->is_instruction_recepisse()) {
4438                    $type = 'notification_recepisse';
4439    
4440                }
4441                // Vérifie si l'instruction est une décision
4442                if ($type !== 'notification_recepisse') {
4443                    $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4444                    if ($avis_decision !== null && $avis_decision !== '') {
4445                        $type = 'notification_decision';
4446                    }
4447              }              }
4448              if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){          }
4449                  $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');          // Préparation des valeurs de la tâche
4450            $task_val = array(
4451                'type' => $type,
4452                'object_id' => $object_id,
4453                'dossier' => $dossier,
4454                'category' => $category,
4455            );
4456            // Préparation de la tache de notification
4457            $inst_task = $this->f->get_inst__om_dbform(array(
4458                "obj" => "task",
4459                "idx" => 0,
4460            ));
4461    
4462            $add_task = $inst_task->add_task(array('val' => $task_val));
4463            if ($add_task === false) {
4464                $this->addToLog(
4465                    sprintf(
4466                        '%s(): %s %s : %s',
4467                        __METHOD__,
4468                        __('Echec de l\'ajout de la tâche de notification.'),
4469                        __('Paramétrage de la tâche'),
4470                        var_export($task_val, true)
4471                    ),
4472                    DEBUG_MODE
4473                );
4474                return false;
4475            }
4476    
4477            return true;
4478        }
4479    
4480        /**
4481         * Cette méthode permet de savoir si l'instruction est une instruction
4482         * de recepisse (instruction lié à l'ajout du dossier).
4483         *
4484         * Pour cela, on récupère la liste des actions qui ont menées à la création
4485         * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4486         * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4487         * l'instruction et donc qu'il s'agit d'un recepisse.
4488         *
4489         * @return boolean
4490         */
4491        protected function is_instruction_recepisse() {
4492            // Récupère la liste des actions qui ont mené à la création de
4493            // l'instruction
4494            $trace = debug_backtrace();
4495            // Parcours la liste des actions et si une de ces actions est lié
4496            // à la classe demande on cosidère que l'instruction est un recepisse
4497            foreach ($trace as $key => $value) {
4498                if (isset($trace[$key]['class']) === true
4499                    && empty($trace[$key]['class']) === false) {
4500                    if (strtolower($trace[$key]['class']) === 'demande') {
4501                        return true;
4502                    }
4503              }              }
4504              if ($row['regle_donnees_techniques1'] !== '') {          }
4505                  $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');          return false;
4506        }
4507    
4508        /**
4509         * A partir des informations passée en argument ajoute un nouvel élément
4510         * dans la table instruction_notification.
4511         * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4512         * paramètre si le paramétrage attendus est ok.
4513         * Ajoute également un nouvel élement dans instruction_notification_document
4514         * si l'instruction possède une lettretype.
4515         * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4516         * élement dans la table instruction_notification_document qui correspondra
4517         * à l'annexe de la notification.
4518         *
4519         * @param integer identifiant de l'instruction notifiée
4520         * @param string information concernant l'emetteur
4521         * @param array tableau contenant 2 entrées
4522         *  - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4523         *  - courriel : adresse mail de la personne à notifier
4524         * @param integer identifiant de la collectivité permettant de récupèrer les
4525         * paramètres à valider
4526         * @param boolean indique si la notification est automatique ou manuelle
4527         * @param integer identifiant d'une instruction dont l'édition sera annexé
4528         * à la notification
4529         *
4530         * @return integer|boolean identifiant de la notification créée si le traitement
4531         * a réussie, false sinon.
4532         */
4533        protected function ajouter_notification(
4534            $idInstruction,
4535            $emetteur,
4536            $destinataire,
4537            $collectiviteId,
4538            $annexes = array(),
4539            $demandeAuto = false,
4540            $statut = 'en cours d\'envoi',
4541            $commentaire = 'Notification en cours de traitement'
4542        ) {
4543            // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4544            // de créer la notification
4545            if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4546                $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4547                $this->addToMessage($msgErreur);
4548                $this->addToLog(
4549                    sprintf('%s() : %s', __METHOD__, $msgErreur),
4550                    DEBUG_MODE
4551                );
4552                return false;
4553            }
4554            // Préparation de la notification
4555            $inst_notif = $this->f->get_inst__om_dbform(array(
4556                "obj" => "instruction_notification",
4557                "idx" => "]",
4558            ));
4559            $notif_val = array(
4560                'instruction_notification' => null,
4561                'instruction' => $idInstruction,
4562                'automatique' => $demandeAuto,
4563                'emetteur' => $emetteur,
4564                'date_envoi' => null,
4565                'destinataire' => $destinataire['destinataire'],
4566                'courriel' => $destinataire['courriel'],
4567                'date_premier_acces' => null,
4568                'statut' => $statut,
4569                'commentaire' => $commentaire
4570            );
4571    
4572            // Création de la notification
4573            $add_notif = $inst_notif->ajouter($notif_val);
4574            if ($add_notif === false) {
4575                $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4576                $this->addToLog(
4577                    sprintf(
4578                        '%s() : %s %s : %s',
4579                        __METHOD__,
4580                        __("Echec de l'ajout de la notification en base de données."),
4581                        __('Paramétrage de la notification'),
4582                        var_export($notif_val, true)
4583                    ),
4584                    DEBUG_MODE
4585                );
4586                return false;
4587            }
4588    
4589            // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4590            if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4591                $add_notif_doc = $this->ajouter_notification_document(
4592                    $inst_notif->getVal($inst_notif->clePrimaire),
4593                    $this->getVal($this->clePrimaire),
4594                    'instruction'
4595                );
4596                if ($add_notif_doc === false) {
4597                    $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4598                    return false;
4599              }              }
4600              if ($row['regle_donnees_techniques2'] !== '') {          }
4601                  $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
4602            if (! empty($annexes) && is_array($annexes)) {
4603                $add_notif_annexe = $this->ajouter_notification_document_multiple(
4604                    $inst_notif->getVal($inst_notif->clePrimaire),
4605                    $annexes
4606                );
4607                if ($add_notif_annexe === false) {
4608                    $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4609                    return false;
4610              }              }
4611              if ($row['regle_donnees_techniques3'] !== '') {          }
4612                  $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');  
4613            // Renvoie l'id de la nouvelle instance de instruction_notification
4614            return $inst_notif->getVal($inst_notif->clePrimaire);
4615        }
4616    
4617        /**
4618         * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4619         * instance dans la table instruction_notification_document lié a la
4620         * notification dont l'id est passé en paramètre.
4621         *
4622         * @param array tableau contenant les informations nécessaires pour créer les annexes
4623         *
4624         * @return integer|boolean identifiant de la notification créée si le traitement
4625         * a réussie, false sinon.
4626         */
4627        protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4628            foreach ($listeDocument as $paramDoc) {
4629                if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4630                    $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4631                    return false;
4632              }              }
4633              if ($row['regle_donnees_techniques4'] !== '') {          }
4634                  $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');          return true;
4635        }
4636    
4637        /**
4638         * Ajoute un élément dans la table instruction_notification_document en utilisant
4639         * les éléments fourni en paramètre
4640         *
4641         * @param integer $idNotification : id de la notification à laquelle on associe le document
4642         * @param integer $idDocument : id de l'objet auquel est rattaché le document
4643         * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4644         * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4645         *
4646         * @return boolean indique si le traitement a réussi
4647         */
4648        protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4649            $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4650                "obj" => "instruction_notification_document",
4651                "idx" => "]",
4652            ));
4653            // l'attribut instruction doit obligatoirement être renseigné
4654            // pour éviter toutes confusion avec d'autres instruction l'id
4655            // 0 est donné au document n'appartenant pas aux instructions
4656            $notif_doc_val = array(
4657                'instruction_notification_document' => null,
4658                'instruction_notification' => $idNotification,
4659                'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4660                'document_type' => $tableDocument,
4661                'document_id' => $idDocument,
4662                'cle' => $this->getCleAccesDocument(),
4663                'annexe' => $isAnnexe
4664            );
4665    
4666            $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4667            if ($add_notif_doc === false) {
4668                $this->addToLog(
4669                    sprintf(
4670                        '%s() : %s %s : %s',
4671                        __METHOD__,
4672                        __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4673                        __('Paramétrage du document'),
4674                        var_export($notif_doc_val, true)
4675                    ),
4676                    DEBUG_MODE
4677                );
4678                return false;
4679            }
4680            return true;
4681        }
4682    
4683        /**
4684         * Récupère via une requête la liste des identifiants des éléments de la table
4685         * parametrage_annexe liés à une instruction.
4686         * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4687         * et lui appliquer le traitement de suppression.
4688         *
4689         * @param integer identifiant d'une instruction
4690         * @return boolean état du traitement. True : OK, False : Echec
4691         */
4692        function supprimer_parametrage_annexe($id_instruction) {
4693            // Récupère la liste des parametrage_annexe associés à l'instruction
4694            $qres = $this->f->get_all_results_from_db_query(sprintf(
4695                'SELECT parametrage_annexe
4696                FROM %sparametrage_annexe
4697                WHERE parametrage_annexe.instruction = %d',
4698                DB_PREFIXE,
4699                intval($id_instruction)),
4700                array('origin' => __METHOD__));
4701            // Instancie puis supprime chacun des éléments de la liste
4702            foreach ($qres['result'] as $res) {
4703                $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4704                    'obj' => 'parametrage_annexe',
4705                    'idx' => $res['parametrage_annexe']
4706                ));
4707                foreach ($parametrage_annexe->champs as $champ) {
4708                    $val[$champ] = $parametrage_annexe->getVal($champ);
4709              }              }
4710              if ($row['regle_donnees_techniques5'] !== '') {              $suppression = $parametrage_annexe->supprimer($val);
4711                  $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
4712                if ($suppression === false) {
4713                    return false;
4714              }              }
4715          }          }
4716          // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement          return true;
4717          if ($valF_dt != "") {      }
4718              $dt_id = $this->getDonneesTechniques();  
4719              // On met à jour le dossier      /**
4720              $cle = " donnees_techniques='".$dt_id."'";       * Vérifie si le paramétrage de la notification des demandeurs est correct.
4721              $res1 = $db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);       *
4722              $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é
4723              if (database::isError($res1)) {       * @return boolean
4724                  die($res->getMessage());       */
4725              }      protected function is_parametrage_notification_correct($collectiviteId) {
4726              // Affichage d'informations à l'utilisateur          $categorie = $this->f->get_param_option_notification($collectiviteId);
4727              $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");          $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4728            if ($categorie === 'mail' && $urlAccesNotif === null) {
4729                return false;
4730          }          }
4731          // Si des valeurs ont été calculées alors on met à jour l'enregistrement          return true;
4732          if ($valF != "") {      }
4733              // On met à jour le dossier  
4734              $cle = " dossier='".$this->valF['dossier']."'";      /**
4735              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);       * TRIGGER - triggermodifierapres.
4736              $this->addToLog("triggermodifierapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);       *
4737              if (database::isError($res1)) {       * @return boolean
4738                  die($res->getMessage());       */
4739        function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4740            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4741            $data = array('val' => &$val, 'id' => $id);
4742            $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4743            $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4744            $message = '';
4745            $res = true;
4746            // Définit si le dossier d'instruction doit être mis à jour
4747            $update_dossier = true;
4748            // Les actions de mise à jour des dates ne doivent pas appliquer
4749            // l'action de l'événement et donc ne pas mettre à jour le dossier
4750            if ($this->getParameter("maj") == 125
4751                || $this->getParameter("maj") == 170
4752                || $this->getParameter("maj") == 175) {
4753                $update_dossier = false;
4754            }
4755    
4756            // Traitement en cas de mise à jour du dossier
4757            if ($update_dossier === true) {
4758                /**
4759                 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4760                 * si la date de l'evenement est modifiee
4761                 */
4762                // Initialisation
4763                $valF = array();
4764                $valF_dt = array();
4765                // Initialisation du type d'événement
4766                $type_evmt = "";
4767                // Récupération de l'action correspondante à l'événement
4768                $evenement = $this->f->get_inst__om_dbform(array(
4769                    "obj" => "evenement",
4770                    "idx" => $this->valF['evenement']
4771                ));
4772    
4773                // Récupération des paramètres de l'action
4774                // TODO : remplacer cette requête par l'instanciation de l'action
4775                $qres = $this->f->get_all_results_from_db_query(
4776                    sprintf(
4777                        'SELECT
4778                            *
4779                        FROM
4780                            %1$saction
4781                        WHERE
4782                            action = \'%2$s\'',
4783                        DB_PREFIXE,
4784                        $this->f->db->escapeSimple($evenement->getVal('action'))
4785                    ),
4786                    array(
4787                        "origin" => __METHOD__
4788                    )
4789                );
4790                foreach ($qres['result'] as $row) {
4791                    // application des regles sur le courrier + delai
4792                    if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4793                        $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4794                    }
4795                    if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4796                        $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4797                    }
4798                    if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4799                        $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4800                    }
4801                    if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4802                        $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4803                    }
4804                    if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4805                        $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4806                    }
4807                    if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4808                        $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4809                    }
4810                    if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4811                        $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4812                    }
4813                    if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4814                        $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4815                    }
4816                    if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4817                        $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4818                    }
4819                    if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4820                        $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4821                    }
4822                    if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4823                        $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4824                    }
4825                    if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4826                        $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4827                    }
4828                    if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4829                        $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4830                    }
4831                    if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4832                        $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4833                    }
4834                    if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4835                        $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4836                    }
4837                    if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4838                        $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4839                    }
4840                    if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4841                        $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4842                    }
4843                    if ($row['regle_donnees_techniques1'] !== '') {
4844                        $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4845                    }
4846                    if ($row['regle_donnees_techniques2'] !== '') {
4847                        $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4848                    }
4849                    if ($row['regle_donnees_techniques3'] !== '') {
4850                        $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4851                    }
4852                    if ($row['regle_donnees_techniques4'] !== '') {
4853                        $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4854                    }
4855                    if ($row['regle_donnees_techniques5'] !== '') {
4856                        $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4857                    }
4858                    if ($row['regle_dossier_instruction_type'] !== '') {
4859                        $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4860                    }
4861                }
4862                // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4863                if (count($valF_dt) > 0) {
4864                    $dt_id = $this->getDonneesTechniques();
4865                    // On met à jour le dossier
4866                    $cle = " donnees_techniques='".$dt_id."'";
4867                    $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4868                    $this->addToLog(
4869                        __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4870                        VERBOSE_MODE
4871                    );
4872                    $this->f->isDatabaseError($res1);
4873                    // Affichage d'informations à l'utilisateur
4874                    $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4875                }
4876                // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4877                if (count($valF) > 0) {
4878                    $inst_dossier = $this->f->get_inst__om_dbform(array(
4879                        "obj" => "dossier",
4880                        "idx" => $this->valF['dossier'],
4881                    ));
4882                    $valF['instruction'] = $id;
4883                    $valF['crud'] = 'update';
4884                    $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4885                    if ($update_by_instruction === false) {
4886                        $this->cleanMessage();
4887                        $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4888                        return false;
4889                    }
4890                    // Affichage d'informations à l'utilisateur
4891                    $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4892              }              }
             // Affichage d'informations à l'utilisateur  
             $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");  
4893          }          }
4894    
4895            // Par défaut les instructions à ajouter suite à la saisie d'une date
4896            // de retour signature ou de notification, utilisent l'action 0
4897            // Si la création d'événement d'instruction suivant est déclenchée par
4898            // une notification suite au traitement d'une tâche (démat') alors l'ajout
4899            // de la nouvelle instruction se fait avec l'action 176
4900            // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4901            // nouvelle instruction, depuis la méthode verifier()
4902            $code_action_add = 0;
4903            if ($this->getParameter("maj") == 175) {
4904                $code_action_add = 176;
4905            }
4906          $restriction = $this->get_restriction($val['evenement']);          $restriction = $this->get_restriction($val['evenement']);
4907          $this->restriction_valid = $this->restrictionIsValid($restriction);          $this->restriction_valid = $this->restrictionIsValid($restriction);
4908    
4909          if($restriction == "" || $this->restriction_valid ){          if($restriction == "" || $this->restriction_valid ){
4910              // 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é
4911              $sql = "SELECT * FROM ".DB_PREFIXE."evenement              // TODO : remplacer cette requête par l'instanciation de l'evenement
4912              WHERE evenement=".$this->valF['evenement'];              $qres = $this->f->get_all_results_from_db_query(
4913              $res = $db->query($sql);                  sprintf(
4914              $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                      'SELECT
4915              if (database::isError($res)) {                          *
4916                  die($res->getMessage());                      FROM
4917              }                          %1$sevenement
4918                        WHERE
4919                            evenement = %2$d',
4920                        DB_PREFIXE,
4921                        intval($this->valF['evenement'])
4922                    ),
4923                    array(
4924                        "origin" => __METHOD__
4925                    )
4926                );
4927              $current_id = $this->getVal($this->clePrimaire);              $current_id = $this->getVal($this->clePrimaire);
4928              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
4929                  // 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
4930                  if ($this->getVal('date_retour_signature') == "" AND                  if (
4931                      $this->valF['date_retour_signature'] != "" AND                      $this->getVal('date_retour_signature') == "" &&
4932                      $row['evenement_retour_signature'] != "") {                      $this->valF['date_retour_signature'] != ""
4933                      $new_instruction = new instruction("]", $db, $DEBUG);                  ){
4934                      // Création d'un tableau avec la liste des champs de l'instruction                      // On Lance le hook
4935                      foreach($new_instruction->champs as $champ) {                      $data = array('val' => $this->valF);
4936                          $valNewInstr[$champ] = "";                      $data['dossier'] = $this->valF['dossier'];
4937                      }                      $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
4938                      // Définition des valeurs de la nouvelle instruction  
4939                      $valNewInstr["evenement"] = $row['evenement_retour_signature'];                      // On vérifie si il existe un événement automatique
4940                      $valNewInstr["destinataire"] = $this->valF['destinataire'];                      if (
4941                      $valNewInstr["dossier"] = $this->valF['dossier'];                          $row['evenement_retour_signature'] != ""
4942                      $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);                      ) {
4943                      $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);                          $new_instruction = $this->f->get_inst__om_dbform(array(
4944                      $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);                              "obj" => "instruction",
4945                      $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);                              "idx" => "]",
4946                      $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                          ));
4947                      $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
4948                      $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);                          foreach($new_instruction->champs as $champ) {
4949                      $new_instruction->setParameter("maj", 0);                              $valNewInstr[$champ] = "";
4950                      $new_instruction->class_actions[0]["identifier"] =                          }
4951                          "retour signature de l'instruction $current_id";                          // Définition des valeurs de la nouvelle instruction
4952                      $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                          $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4953                                                $valNewInstr["destinataire"] = $this->valF['destinataire'];
4954                      //Si une erreur s'est produite et qu'il s'agit d'un problème                          $valNewInstr["dossier"] = $this->valF['dossier'];
4955                      //de restriction                          $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4956                      if ($retour == false && !$new_instruction->restriction_valid){                          $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4957                          $error_message = $this->get_restriction_error_message($restriction);                          $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4958                          $this->f->displayMessage("error", $error_message);                          $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4959                          $this->addToLog("triggermodifierapres() : evenement retour ".                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4960                              "instruction ".$this->valF[$this->clePrimaire]." : ".                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4961                              $new_instruction->msg);                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4962                      }                          $new_instruction->setParameter("maj", $code_action_add);
4963                      //Si une erreur s'est produite après le test de la restriction                          $new_instruction->class_actions[$code_action_add]["identifier"] =
4964                      elseif ($retour == false && $new_instruction->restriction_valid){                              sprintf(
4965                          $this->correct = false ;                                  __("Ajout suite au retour signature de l'instruction %s"),
4966                          $this->msg .= $new_instruction->msg;                                  $current_id
4967                          return false;                              );
4968                            $retour = $new_instruction->ajouter($valNewInstr);
4969                            
4970                            //Si une erreur s'est produite et qu'il s'agit d'un problème
4971                            //de restriction
4972                            if ($retour == false && !$new_instruction->restriction_valid){
4973                                $error_message = $this->get_restriction_error_message($restriction);
4974                                $this->f->displayMessage("error", $error_message);
4975                                $this->addToLog(__METHOD__."(): evenement retour ".
4976                                    "instruction ".$this->valF[$this->clePrimaire]." : ".
4977                                    $new_instruction->msg);
4978                            }
4979                            //Si une erreur s'est produite après le test de la restriction
4980                            elseif ($retour == false && $new_instruction->restriction_valid){
4981                                $this->correct = false ;
4982                                $this->msg .= $new_instruction->msg;
4983                                return false;
4984                            }
4985                      }                      }
4986    
4987                        $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
4988                  }                  }
4989                  // Si la date de retour AR est éditée on vérifie si il existe un événement automatique  
4990                  if ($this->getVal('date_retour_rar') == "" AND                  // Si la date de retour AR est éditée
4991                      $this->valF['date_retour_rar'] != "") {                  if (
4992                                            $this->getVal('date_retour_rar') == "" &&
4993                      if($row['evenement_retour_ar'] != "") {                      $this->valF['date_retour_rar'] != ""
4994                          $new_instruction = new instruction("]", $db, $DEBUG);                  ){
4995                        // On Lance le hook Notification/Date retour Accusée Reception
4996                        $data = array('val' => $this->valF);
4997                        $data['dossier'] = $this->valF['dossier'];
4998                        $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
4999    
5000                        // On vérifie si il existe un événement automatique
5001                        if ( $row['evenement_retour_ar'] != "" ) {
5002                            $new_instruction = $this->f->get_inst__om_dbform(array(
5003                                "obj" => "instruction",
5004                                "idx" => "]",
5005                            ));
5006                          // 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
5007                          foreach($new_instruction->champs as $champ) {                          foreach($new_instruction->champs as $champ) {
5008                              $valNewInstr[$champ] = "";                              $valNewInstr[$champ] = "";
# Line 2066  class instruction extends instruction_ge Line 5018  class instruction extends instruction_ge
5018                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5019                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);                          $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5020                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);                          $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5021                          $new_instruction->setParameter("maj", 0);                          $new_instruction->setParameter("maj", $code_action_add);
5022                          $new_instruction->class_actions[0]["identifier"] =                          $new_instruction->class_actions[$code_action_add]["identifier"] =
5023                              "retour RAR de l'instruction $current_id";                              sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5024                          $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                          $retour = $new_instruction->ajouter($valNewInstr);
5025    
5026                          //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
5027                          //de restriction                          //de restriction
# Line 2077  class instruction extends instruction_ge Line 5029  class instruction extends instruction_ge
5029                              $error_message = $this->get_restriction_error_message($restriction);                              $error_message = $this->get_restriction_error_message($restriction);
5030                              $this->f->displayMessage("error", $error_message);                              $this->f->displayMessage("error", $error_message);
5031                              $this->addToLog(                              $this->addToLog(
5032                                  "triggermodifierapres() : evenement retour instruction ".                                  __METHOD__."(): evenement retour instruction ".
5033                                  $this->valF[$this->clePrimaire]." : ".                                  $this->valF[$this->clePrimaire]." : ".
5034                                  $new_instruction->msg                                  $new_instruction->msg
5035                              );                              );
# Line 2089  class instruction extends instruction_ge Line 5041  class instruction extends instruction_ge
5041                              return false;                              return false;
5042                          }                          }
5043                      }                      }
5044                      // Mise à jour du flag incomplet_notifie dans dossier si la                      $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5045                      // date limite d'instruction n'est pas dépassée                  }
5046                      if($row['type']=='incompletude' &&  
5047                          ($this->valF['archive_date_notification_delai'] >= $this->valF['date_retour_rar'] ||                  // Si la date_envoi_signature est éditée
5048                          $this->valF['archive_date_notification_delai'] == "")) {                  if (
5049                          $valFIncomp['incomplet_notifie'] = true;                      $this->getVal('date_envoi_signature') == "" &&
5050                          $cle = " dossier='".$val['dossier']."'";                      $this->valF['date_envoi_signature'] != ""
5051                          $resIncomp = $db->autoExecute(                  ){
5052                              DB_PREFIXE.'dossier',                      // On Lance le hook
5053                              $valFIncomp,                      $data = array('val' => $this->valF);
5054                              DB_AUTOQUERY_UPDATE,                      $data['dossier'] = $this->valF['dossier'];
5055                              $cle                      $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5056                    }
5057                    // Si la date de envoi AR est éditée
5058                    if (
5059                        $this->getVal('date_envoi_rar') == "" &&
5060                        $this->valF['date_envoi_rar'] != ""
5061                    ){
5062                        // On Lance le hook
5063                        $data = array('val' => $this->valF);
5064                        $data['dossier'] = $this->valF['dossier'];
5065                        $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5066                    }
5067                    // Si la date de envoi controle legalite est éditée
5068                    if (
5069                        $this->getVal('date_envoi_controle_legalite') == "" &&
5070                        $this->valF['date_envoi_controle_legalite'] != ""
5071                    ){
5072                        // On Lance le hook
5073                        $data = array('val' => $this->valF);
5074                        $data['dossier'] = $this->valF['dossier'];
5075                        $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5076                    }
5077                    // Si la date de retour controle legalite est éditée
5078                    if (
5079                        $this->getVal('date_retour_controle_legalite') == "" &&
5080                        $this->valF['date_retour_controle_legalite'] != ""
5081                    ){
5082                        // On Lance le hook
5083                        $data = array('val' => $this->valF);
5084                        $data['dossier'] = $this->valF['dossier'];
5085                        $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5086                    }
5087                }
5088            }
5089    
5090            // Traitement en cas de mise à jour du dossier
5091            if ($update_dossier === true) {
5092                /**
5093                 * Mise à jour de la date de dernière modification du dossier
5094                 * d'instruction
5095                 */
5096                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5097                $inst_di->update_last_modification_date();
5098    
5099                // Mise à jour des données du dossier d'autorisation
5100                $da = $this->f->get_inst__om_dbform(array(
5101                    "obj" => "dossier_autorisation",
5102                    "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5103                ));
5104                $params = array(
5105                    'di_id' => $this->getVal('dossier'),
5106                );
5107                if($da->majDossierAutorisation($params) === false) {
5108                    $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5109                    $this->correct = false;
5110                    return false;
5111                }
5112            }
5113    
5114            // mise à jour des métadonnées issues des dates de suivi
5115            $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5116            $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5117            if ($dateRetourSignatureModified || $dateRetourRARModified) {
5118    
5119                // Calculs des nouvelles métadonnées
5120                $metadata = $this->getMetadata("om_fichier_instruction");
5121    
5122                // On vérifie si l'instruction à finaliser a un événement de type arrete
5123                // TODO : A voir pour remplacer par une instanciation de l'événement.
5124                //        Voir également si l'événement ne dois pas être instancié en début de
5125                //        méthode pour pouvoir être réutilisé.
5126                $qres = $this->f->get_one_result_from_db_query(
5127                    sprintf(
5128                        'SELECT
5129                            type
5130                        FROM
5131                            %1$sevenement
5132                        WHERE
5133                            evenement = \'%2$d\'',
5134                        DB_PREFIXE,
5135                        intval($this->getVal("evenement"))
5136                    ),
5137                    array(
5138                        "origin" => __METHOD__,
5139                        "force_return" => true,
5140                    )
5141                );
5142    
5143                if ($qres["code"] !== "OK") {
5144                    $this->correct = false;
5145                    $this->addToMessage(__("Erreur de traitement de fichier."));
5146                    $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
5147                    return false;
5148                }
5149    
5150                // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5151                if ($qres['result'] == 'arrete'){
5152                    $metadata = array_merge($metadata, $this->getMetadata("arrete"));
5153                }
5154    
5155                // Filtre pour conserver uniquement les métadonnées liées aux dates
5156                $metadataToKeep = array(
5157                    "statutAutorisation",
5158                    "dateEvenementDocument",
5159                    'date_cloture_metier',
5160                    "NotificationArrete",
5161                    "dateNotificationArrete",
5162                    "controleLegalite",
5163                    "dateSignature",
5164                    "nomSignataire",
5165                    "qualiteSignataire",
5166                    "dateControleLegalite",
5167                );
5168                $metadata = array_filter(
5169                    $metadata,
5170                    function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5171                    ARRAY_FILTER_USE_KEY
5172                );
5173    
5174                // Mise à jour des métadonnées du document en GED
5175                $docUid = $this->getVal("om_fichier_instruction");
5176                $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5177                if ($operationOrUID == 'OP_FAILURE') {
5178                    $this->correct = false;
5179                    $this->addToMessage(__("Erreur de traitement de fichier."));
5180                    $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5181                    return false;
5182                }
5183    
5184                // mise à jour de l'UID du document en BDD
5185                else {
5186                    $valF = array('om_fichier_instruction' => $operationOrUID);
5187                    $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5188                    $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5189                    if ($this->f->isDatabaseError($res, true) === true) {
5190                        $this->correct = false;
5191                        $this->addToMessage(__("Erreur de traitement de fichier."));
5192                        $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5193                        return false;
5194                    }
5195                    $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5196                }
5197            }
5198    
5199            // Déclenchement des notifications automatique après finalisation et
5200            // retour de signature
5201            if ($dateRetourSignatureModified === true
5202                && $this->valF['date_retour_signature'] !== ''
5203                && $this->valF['date_retour_signature'] !== null) {
5204    
5205                // Message à afficher dans les logs pour indiquer quelle notification a échouée
5206                $msgLog = sprintf(
5207                    '%s %s : %d',
5208                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5209                    __('Instruction notifiée'),
5210                    $id
5211                );
5212    
5213                // Récupération de l'instance de l'événement pour accéder au paramètrage
5214                // des notifications
5215                $ev = $this->get_inst_evenement($this->valF['evenement']);
5216                // Si la notification automatique des tiers consulté est active
5217                // déclenche le traitement de notification.
5218                // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5219                $typeNotifTiers = $ev->getVal('notification_tiers');
5220                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5221                if ($typeNotifTiers === 'notification_automatique') {
5222                    if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5223                        $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5224                        $this->correct = false;
5225                    }
5226                }
5227    
5228                if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5229                    // Récupération de la liste des demandeurs à notifier et de la catégorie
5230                    $categorie = $this->f->get_param_option_notification($collectivite_di);
5231                    $isPortal = $categorie === PORTAL;
5232                    $demandeursANotifie = $this->get_demandeurs_notifiable(
5233                        $this->valF['dossier'],
5234                        $isPortal
5235                    );
5236    
5237                    //
5238                    $msg_notif = '';
5239    
5240                    // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5241                    $demandeurPrincipalNotifie = false;
5242                    foreach ($demandeursANotifie as $demandeur) {
5243                        // Identifie si le demandeur principal a été notifié ou pas
5244                        // et récupère ses informations
5245                        if ($demandeur['petitionnaire_principal'] == 't') {
5246                            $demandeurPrincipalNotifie = true;
5247                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5248                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
5249                            // suivante. On le considère également comme non notifié pour gérer l'envoie
5250                            // des messages d'erreurs
5251                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5252                            // d'impact sur la notification
5253                            $erreursParam = $this->get_info_notification_fail();
5254                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5255                                $demandeurPrincipalNotifie = false;
5256                                continue;
5257                            }
5258                        }
5259                        // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5260                        $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
5261                        // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5262                        // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5263                        if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5264                            && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5265                            && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5266                                // Ajout de la notif et récupération de son id
5267                                $idNotif = $this->ajouter_notification(
5268                                    $this->valF[$this->clePrimaire],
5269                                    $this->f->get_connected_user_login_name(),
5270                                    $demandeur,
5271                                    $collectivite_di,
5272                                    array(),
5273                                    true,
5274                                    'Echec',
5275                                    __('La date limite de notification au demandeur est dépassée')
5276                                );
5277                                if ($idNotif === false) {
5278                                    // Termine le traitement
5279                                    $this->addToLog(
5280                                        sprintf('%s() : %s', __METHOD__, $msgLog),
5281                                        DEBUG_MODE
5282                                    );
5283                                    return $this->end_treatment(__METHOD__, false);
5284                                }
5285                                $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5286                        }
5287                        else {
5288                            // Ajout de la notif et récupération de son id
5289                            $idNotif = $this->ajouter_notification(
5290                                $this->valF[$this->clePrimaire],
5291                                $this->f->get_connected_user_login_name(),
5292                                $demandeur,
5293                                $collectivite_di,
5294                                array(),
5295                                true
5296                            );
5297                            if ($idNotif === false) {
5298                                $this->addToLog(
5299                                    sprintf('%s() : %s',__METHOD__, $msgLog),
5300                                    DEBUG_MODE
5301                                );
5302                                return false;
5303                            }
5304                            // Création de la tache en lui donnant l'id de la notification
5305                            $notification_by_task = $this->notification_by_task(
5306                                $idNotif,
5307                                $this->valF['dossier'],
5308                                $categorie
5309                            );
5310                            if ($notification_by_task === false) {
5311                                $this->addToLog(
5312                                    sprintf('%s() : %s',__METHOD__, $msgLog),
5313                                    DEBUG_MODE
5314                                );
5315                                $this->addToMessage(
5316                                    __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5317                                );
5318                                return false;
5319                            }
5320                            $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5321                        }
5322                    }
5323    
5324                    // Pour la notification par mail ou la notification via portal si le dossier a
5325                    // été déposés via portal, si le demandeur principal n'est pas notifiable,
5326                    // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5327                    // laquelle le demandeur principal n'a pas pu être notifié
5328                    $depotPortal = $this->dossier_depose_sur_portail();
5329                    if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5330                        // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5331                        $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5332                        // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5333                        $erreursParam = $this->get_info_notification_fail();
5334                        $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5335                        // Ajout de la notif et récupération de son id
5336                        $idNotif = $this->ajouter_notification(
5337                            $this->valF[$this->clePrimaire],
5338                            $this->f->get_connected_user_login_name(),
5339                            $demandeurPrincipal,
5340                            $collectivite_di,
5341                            array(),
5342                            true,
5343                            'Echec',
5344                            implode(' ', $erreursParam)
5345                        );
5346                        if ($idNotif === false) {
5347                            $this->addToLog(
5348                                sprintf('%s() : %s', __METHOD__, $msgLog),
5349                                DEBUG_MODE
5350                          );                          );
5351                            $this->addToMessage(
5352                                __('Erreur : la création de la notification a échouée.').
5353                                __("Veuillez contacter votre administrateur.")
5354                            );
5355                            return false;
5356                        }
5357                        // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5358                        // de l'échec de la notification
5359                        $dossier_message = $this->get_inst_dossier_message(0);
5360                        $dossier_message_val = array(
5361                            'dossier' => $this->getVal('dossier'),
5362                            'type' => __('erreur expedition'),
5363                            'emetteur' => $this->f->get_connected_user_login_name(),
5364                            'login' => $_SESSION['login'],
5365                            'date_emission' => date('Y-m-d H:i:s'),
5366                            'contenu' => __('Échec lors de la notification de l\'instruction ').
5367                                $ev->getVal('libelle').
5368                                '.<br>'.
5369                                implode("\n", $erreursParam).
5370                                '<br>'.
5371                                __('Veuillez corriger ces informations avant de renvoyer la notification.')
5372                        );
5373                        $add = $dossier_message->add_notification_message($dossier_message_val, true);
5374                        // Si une erreur se produit pendant l'ajout
5375                        if ($add !== true) {
5376                          $this->addToLog(                          $this->addToLog(
5377                              "triggersupprimer(): db->autoexecute(\"".                              sprintf(
5378                                  DB_PREFIXE."dossier\", ".print_r($valFIncomp, true).                                  '%s() : %s',
5379                                  ", DB_AUTOQUERY_UPDATE, \"".$cle."\");",                                  __METHOD__,
5380                              VERBOSE_MODE                                  __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5381                                ),
5382                                DEBUG_MODE
5383                          );                          );
5384                          if (database::isError($resIncomp)) {                          return false;
                             die($resIncomp->getMessage());  
                         }  
5385                      }                      }
5386                  }                  }
5387                    $this->addToMessage($msg_notif);
5388              }              }
5389          }          }
5390            // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5391          // Mise à jour des données du dossier d'autorisation          if ($res !== false) {
5392          require_once "../obj/dossier_autorisation.class.php";              foreach($this->champs as $index => $champ) {
5393          $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($this->valF['dossier']), $this->db, DEBUG);                  // if (get_class($this) == 'instruction') {
5394          if($da->majDossierAutorisation() === false) {                      $this->f->log(__METHOD__, "[".var_export(get_class($this), true)."] this->valF[$champ]): ".var_export($this->valF[$champ] ?? null, true).", this->val[$index]: ".var_export($this->val[$index] ?? null, true), 'DEBUG', 'seb');
5395              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));                  // }
5396              $this->correct = false;                  $this->val[$index] = $this->valF[$champ] ?? null;
5397              return false;              }
5398          }          }
5399          return $this->add_log_to_dossier($id, $val);          $res = $this->add_log_to_dossier($id, $val);
5400            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5401            $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5402            return $res;
5403      }      }
5404    
5405      function triggersupprimer($id, &$db = null, $val = array(), $DEBUG = null) {      /**
5406         * TRIGGER - triggersupprimer.
5407         *
5408         * @return boolean
5409         */
5410        function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5411            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5412            $data = array('val' => &$val, 'id' => $id);
5413            $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5414          /**          /**
5415           * 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
5416           * archive dans le dossier d'instruction avant de supprimer l'événement           * archive dans le dossier d'instruction avant de supprimer l'événement
5417           * d'instruction           * d'instruction si les valeurs du dossier sont différentes
5418           */           */
5419                    $valF = array();
5420          // Mise à jour des 4 valeurs modifiées par l'action          $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5421          $valF['delai'] = $val['archive_delai'];          foreach ($inst_di->champs as $key => $champ) {
5422          $valF['accord_tacite'] = $val['archive_accord_tacite'];              // Si le champ du DI à une archive dans l'instruction
5423          $valF['etat'] = $val['archive_etat'];              if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5424          if ($val['archive_avis'] != '') {                  // Si la valeur entre le champ du DI et son archive dans instruction
5425              $valF['avis_decision'] = $val['archive_avis'];                  // est différente
5426          } else {                  if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5427              $valF['avis_decision'] = null;                      $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5428          }                      // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur '   ' (3 espaces vides) au lieu de null
5429          // Mise à jour des dates avec la valeur présente dans le formulaire                      // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou '   '
5430          // de suppression. Si la valeur de la date est vide alors on fixe                      if ($champ === "accord_tacite" && $valF[$champ] === null) {
5431          // à la valeur null                          $valF[$champ] = '   ';
5432          if ($val['archive_date_complet'] != '') {                      }
5433              $valF['date_complet'] = $val['archive_date_complet'];                  }
5434          } 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;  
5435          }          }
5436          if ($val['archive_autorite_competente'] != '') {          // Spécificité du champ avis_decision dont le champ archive est nommé
5437              $valF['autorite_competente'] = $val['archive_autorite_competente'];          // différemment
5438          } else {          if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5439              $valF['autorite_competente'] = null;              $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5440            }
5441            // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5442            // par l'archive
5443            unset($valF['date_affichage']);
5444    
5445            /**
5446             * Mise à jour de la version de clôture *version_clos* du dossier si et
5447             * seulement si l'instruction met à jour l'état du dossier.
5448             */
5449            if (isset($valF['etat']) === true
5450                && $valF['etat'] !== null
5451                && $valF['etat'] !== '') {
5452                // Récupère l'état actuel du dossier d'instruction
5453                $inst_current_etat = $this->f->get_inst__om_dbform(array(
5454                    "obj" => "etat",
5455                    "idx" => $inst_di->get_id_etat(),
5456                ));
5457                // Instanciation de l'état archivé appliqué sur le dossier
5458                $inst_etat = $this->f->get_inst__om_dbform(array(
5459                    "obj" => "etat",
5460                    "idx" => $valF['etat'],
5461                ));
5462                //
5463                $update_version_clos = null;
5464                // En cas de clôture du dossier par l'état archivé
5465                if ($inst_etat->getVal('statut') === 'cloture') {
5466                    $update_version_clos = $inst_di->update_version_clos('up');
5467                }
5468                // En cas de réouverture du dossier par l'état archivé
5469                if ($inst_current_etat->getVal('statut') === 'cloture'
5470                    && $inst_etat->getVal('statut') !== 'cloture') {
5471                    //
5472                    $update_version_clos = $inst_di->update_version_clos('down');
5473                    //
5474                    $this->set_att_di_reopened(true);
5475                }
5476                //
5477                if ($update_version_clos === false) {
5478                    $this->f->addToLog(sprintf(
5479                        "%s() : ERREUR - %s %s",
5480                        __METHOD__,
5481                        sprintf(
5482                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5483                            $inst_di->getVal($inst_di->clePrimaire)
5484                        ),
5485                        sprintf(
5486                            __("L'instruction tente d'appliquer l'état %s."),
5487                            $inst_etat->getVal($inst_etat->clePrimaire)
5488                        )
5489                    ));
5490                    $this->addToMessage(sprintf(
5491                        "%s %s",
5492                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5493                        __("Veuillez contacter votre administrateur.")
5494                    ));
5495                    return false;
5496                }
5497          }          }
5498          $valF['date_cloture_instruction'] = null;          // On supprime toutes les notications liées à l'instruction
5499          if ($val['archive_date_cloture_instruction'] !== '') {          $notifASupprimer = $this->get_instruction_notification(
5500              $valF['date_cloture_instruction'] = $val['archive_date_cloture_instruction'];              $this->getVal($this->clePrimaire),
5501                array(
5502                    'notification_recepisse',
5503                    'notification_instruction',
5504                    'notification_decision',
5505                    'notification_service_consulte',
5506                    'notification_tiers_consulte',
5507                    'notification_depot_demat',
5508                    'notification_commune',
5509                    'notification_signataire'
5510                ),
5511                true
5512            );
5513                
5514            foreach ($notifASupprimer as $idNotif) {
5515                $inst_notif = $this->f->get_inst__om_dbform(array(
5516                    "obj" => "instruction_notification",
5517                    "idx" => $idNotif,
5518                ));
5519                $val_notif = array();
5520                foreach ($inst_notif->champs as $champ) {
5521                    $val_notif[$champ] = $inst_notif->getVal($champ);
5522                }
5523                // La suppression des notifications entrainera la suppression des tâches qui y sont
5524                // liées
5525                $supprNotif = $inst_notif->supprimer($val_notif);
5526                if ($supprNotif == false) {
5527                    $this->addToMessage(sprintf(
5528                        "%s %s",
5529                        __("Erreur lors de la suppression des notifications de l'instruction."),
5530                        __("Veuillez contacter votre administrateur.")
5531                    ));
5532                    return false;
5533                }
5534          }          }
5535          // Dates concernant les dossiers contentieux  
5536          // Date de première visite          // Suppression du paramétrage de l'annexe lié à l'évènement
5537          $valF['date_premiere_visite'] = null;          if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5538          if ($val['archive_date_premiere_visite'] !== '') {              $this->addToLog(sprintf(
5539              $valF['date_premiere_visite'] = $val['archive_date_premiere_visite'];                  "%s %s",
5540          }                  __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5541          // Date de dernière visite                  __("Veuillez contacter votre administrateur.")
5542          $valF['date_derniere_visite'] = null;              ), DEBUG_MODE);
5543          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'];  
5544          }          }
5545    
5546          // On met à jour le dossier          // On met à jour le dossier
5547          $cle = " dossier='".$val['dossier']."'";          $valF['instruction'] = $id;
5548          $res = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);          $valF['crud'] = 'delete';
5549          $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);
5550          if (database::isError($res)) {          if ($update_by_instruction === false) {
5551              die($res->getMessage());              $this->cleanMessage();
5552                $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5553                return false;
5554          }          }
5555    
5556          // Affichage d'informations à l'utilisateur          // Affichage d'informations à l'utilisateur
5557          $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')."]");
5558    
5559          // 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
5560    
5561            $res = true;
5562            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5563            $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5564            return $res;
5565      }      }
5566    
5567      function triggersupprimerapres($id, &$db = null, $val = array(), $DEBUG = null) {      /**
5568         * TRIGGER - triggersupprimerapres.
5569         *
5570         * @return boolean
5571         */
5572        function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5573            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5574            $data = array('val' => &$val, 'id' => $id);
5575            $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5576            /**
5577             * Mise à jour de la date de dernière modification du dossier
5578             * d'instruction
5579             */
5580            $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5581            $inst_di->update_last_modification_date();
5582    
5583          // Mise à jour des données du dossier d'autorisation          /**
5584          require_once "../obj/dossier_autorisation.class.php";           * Mise à jour des données du dossier d'autorisation
5585          $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($val["dossier"]), $this->db, DEBUG);           */
5586          if($da->majDossierAutorisation() === false) {          $da = $this->f->get_inst__om_dbform(array(
5587              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              "obj" => "dossier_autorisation",
5588                "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5589            ));
5590            $params = array(
5591                'di_id' => $this->getVal('dossier'),
5592                'di_reopened' => $this->get_att_di_reopened(),
5593            );
5594            if($da->majDossierAutorisation($params) === false) {
5595                $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5596              $this->correct = false;              $this->correct = false;
5597              return false;              return false;
5598          }          }
5599    
5600            /**
5601             * Gestion des tâches pour la dématérialisation
5602             */
5603            $inst_task_empty = $this->f->get_inst__om_dbform(array(
5604                "obj" => "task",
5605                "idx" => 0,
5606            ));
5607            foreach ($inst_di->task_types as $task_type) {
5608                $task_exists = $inst_task_empty->task_exists($task_type, $id);
5609                if ($task_exists !== false) {
5610                    $inst_task = $this->f->get_inst__om_dbform(array(
5611                        "obj" => "task",
5612                        "idx" => $task_exists,
5613                    ));
5614                    if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5615                        $task_val = array(
5616                            'state' => task::STATUS_CANCELED,
5617                        );
5618                        $update_task = $inst_task->update_task(array('val' => $task_val));
5619                        if ($update_task === false) {
5620                            $this->addToMessage(sprintf('%s %s',
5621                                sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5622                                __("Veuillez contacter votre administrateur.")
5623                            ));
5624                            $this->correct = false;
5625                            return false;
5626                        }
5627                    }
5628                }
5629            }
5630    
5631            //
5632          $val['evenement'] = $this->getVal('evenement');          $val['evenement'] = $this->getVal('evenement');
5633          return $this->add_log_to_dossier($id, $val);          $res = $this->add_log_to_dossier($id, $val);
5634            $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5635            $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5636            return $res;
5637        }
5638    
5639        /**
5640         * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5641         * "di_reopened".
5642         *
5643         * @param boolean $val
5644         */
5645        function set_att_di_reopened($val) {
5646            $this->di_reopened = $val;
5647        }
5648    
5649        /**
5650         * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5651         *
5652         * @return boolean
5653         */
5654        function get_att_di_reopened() {
5655            return $this->di_reopened;
5656      }      }
5657    
5658      /**      /**
# Line 2310  class instruction extends instruction_ge Line 5666  class instruction extends instruction_ge
5666      function get_restriction_error_message($restriction) {      function get_restriction_error_message($restriction) {
5667          // Affichage du message si la restriction s'applique          // Affichage du message si la restriction s'applique
5668          // Contexte du suivi des dates (message simple)          // Contexte du suivi des dates (message simple)
5669          $message_restrict = _("Probleme de dates :");          $message_restrict = __("Probleme de dates :");
5670          // Split restriction          // Split restriction
5671          $champs_restrict = preg_split(          $champs_restrict = preg_split(
5672                  '/(\W+)/',                  '/(\W+)/',
# Line 2321  class instruction extends instruction_ge Line 5677  class instruction extends instruction_ge
5677          $formated_restrict = "";          $formated_restrict = "";
5678          // Ajout des chaînes à traduire          // Ajout des chaînes à traduire
5679          foreach ($champs_restrict as $value) {          foreach ($champs_restrict as $value) {
5680              $formated_restrict .= _($value)." ";              $formated_restrict .= __($value)." ";
5681          }          }
5682          $formated_restrict = substr($formated_restrict, 0, -1);          $formated_restrict = substr($formated_restrict, 0, -1);
5683          // Message d'erreur dans le contexte du suivi des dates          // Message d'erreur dans le contexte du suivi des dates
5684          if($this->getParameter("maj") == 170) {          if($this->getParameter("maj") == 170) {
5685              $message_restrict .= " "._("contactez l'instructeur du dossier");              $message_restrict .= " ".__("contactez l'instructeur du dossier");
5686              $message_restrict .= "<br/>(".$formated_restrict.")";              $message_restrict .= "<br/>(".$formated_restrict.")";
5687          } else {          } else {
5688              // Affichage du message si la restriction s'applique              // Affichage du message si la restriction s'applique
# Line 2338  class instruction extends instruction_ge Line 5694  class instruction extends instruction_ge
5694      }      }
5695    
5696      /**      /**
5697       * Vérifie la restriction sur l'événement.       * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5698       *       * les vérifications suivantes :
5699       * @param array    $val   valeurs du formulaire       *   - Si l'instruction à un événement associé et que cet événement à des restrictions :
5700       * @param database $db    handler database       *       1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5701       * @param boolean  $DEBUG NA       *          le message d'erreur associé à la restriction
5702         *       2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5703         *          et / ou la modification et affiche un message d'erreur
5704         *   -
5705         *   -
5706         *   -
5707         *   -
5708         *   -
5709         *   -
5710         *
5711         * @param array val : tableau contenant les valeurs issues du formulaire.
5712         * @param - dnu1 : Paramètre déprécié et non utilisé.
5713         * @param - dnu2 : Paramètre déprécié et non utilisé.
5714       *       *
5715       * @return [type] [description]       * @return void
5716       */       */
5717      function verifier($val = array(), &$db = null, $DEBUG = null) {      function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5718          parent::verifier($val, $db, $DEBUG);          parent::verifier($val);
5719            //
5720          if ( isset($val['evenement']) && is_numeric($val['evenement'])){          if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5721              $restriction = $this->get_restriction($val['evenement']);              $restriction = $this->get_restriction($val['evenement']);
5722            
5723              //Test qu'une restriction est présente              //Test qu'une restriction est présente
5724              if ($restriction != "" ){              if ($restriction != "" ){
5725                                    
5726                  //Test si la restriction est valide                  // Vérifie le contexte de la modification et test si la restriction est valide.
5727                    // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5728                    // Il n'est donc pas nécessaire de vérifier les restrictions.
5729                  $this->restriction_valid = $this->restrictionIsValid($restriction);                  $this->restriction_valid = $this->restrictionIsValid($restriction);
5730                  if ( !$this->restriction_valid ){                  if ($this->getParameter("maj") != 176
5731                        && !$this->restriction_valid) {
5732    
5733                      // Affichage du message si la restriction s'applique                      // Affichage du message si la restriction s'applique
5734                      $this->addToMessage(                      $this->addToMessage(
# Line 2392  class instruction extends instruction_ge Line 5763  class instruction extends instruction_ge
5763                      $string_error_fields = implode(", ", $check_field_exist);                      $string_error_fields = implode(", ", $check_field_exist);
5764    
5765                      // Message d'erreur                      // Message d'erreur
5766                      $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");
5767                      if (count($check_field_exist) > 1) {                      if (count($check_field_exist) > 1) {
5768                          $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");
5769                      }                      }
5770    
5771                      // Affiche l'erreur                      // Affiche l'erreur
5772                      $this->correct=false;                      $this->correct=false;
5773                      $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));                      $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
5774                      $this->addToMessage(_("Veuillez contacter votre administrateur."));                      $this->addToMessage(__("Veuillez contacter votre administrateur."));
5775                  }                  }
5776              }              }
5777    
# Line 2425  class instruction extends instruction_ge Line 5796  class instruction extends instruction_ge
5796          }          }
5797    
5798      }      }
5799    
5800        /**
5801         * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5802         * principal du dossier auquel appartiens l'instruction.
5803         * Renvoie un tableau contenant les informations du pétitionnaire principal.
5804         *
5805         * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5806         * et affiche un message dans les logs.
5807         * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5808         *
5809         * @param string identifiant du dossier
5810         * @return array|boolean
5811         */
5812        public function get_info_petitionnaire_principal_dossier($dossier = null) {
5813            // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5814            // l'objet courant
5815            if (empty($dossier)) {
5816                $dossier = $this->getVal('dossier');
5817                // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5818                // false et on affiche un message d'erreur dans les logs
5819                if (empty($dossier)) {
5820                    $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5821                    return false;
5822                }
5823            }
5824    
5825            // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5826            // principal
5827            $qres = $this->f->get_all_results_from_db_query(
5828                sprintf(
5829                    'SELECT
5830                        -- Récupère toutes les informations du demandeur principal
5831                        demandeur.*,
5832                        CASE
5833                            WHEN demandeur.qualite=\'particulier\'
5834                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5835                        ELSE
5836                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5837                        END AS destinataire
5838                    FROM
5839                        %1$sdossier
5840                        LEFT JOIN %1$slien_dossier_demandeur
5841                            ON lien_dossier_demandeur.dossier = dossier.dossier
5842                        LEFT JOIN %1$sdemandeur
5843                            ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5844                    WHERE
5845                        dossier.dossier = \'%2$s\'
5846                        AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5847                    DB_PREFIXE,
5848                    $this->f->db->escapeSimple($dossier)
5849                ),
5850                array(
5851                    "origin" => __METHOD__,
5852                )
5853            );
5854            if (is_array($qres["result"]) === true
5855                && array_key_exists(0, $qres["result"]) === true) {
5856                //
5857                return $qres["result"][0];
5858            }
5859            return null;
5860        }
5861    
5862    
5863            
5864      /**      /**
5865       * Finalisation des documents.       * Finalisation des documents.
# Line 2440  class instruction extends instruction_ge Line 5875  class instruction extends instruction_ge
5875          $id_inst = $this->getVal($this->clePrimaire);          $id_inst = $this->getVal($this->clePrimaire);
5876    
5877          //          //
5878          $admin_msg_error = _("Veuillez contacter votre administrateur.");          $admin_msg_error = __("Veuillez contacter votre administrateur.");
5879          $file_msg_error = _("Erreur de traitement de fichier.")          $file_msg_error = __("Erreur de traitement de fichier.")
5880              ." ".$admin_msg_error;              ." ".$admin_msg_error;
5881          $bdd_msg_error = _("Erreur de base de données.")          $bdd_msg_error = __("Erreur de base de données.")
5882              ." ".$admin_msg_error;              ." ".$admin_msg_error;
5883          $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";
5884    
5885          // Si on finalise le document          // Si on finalise le document
5886          if ($mode == "finalize"){          if ($mode == "finalize"){
5887              //              //
5888              $etat = _('finalisation');              $etat = __('finalisation');
5889    
5890              // Récupère la collectivite du dossier d'instruction              // Récupère la collectivite du dossier d'instruction
5891              $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();              $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5892    
5893              //              //
5894              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5895                
5896                //
5897                $params = array(
5898                    "specific" => array(),
5899                );
5900                // Si la rédaction libre est activée sur l'instruction
5901                if ($this->getVal("flag_edition_integrale") == 't') {
5902                    $params["specific"]["corps"] = array(
5903                        "mode" => "set",
5904                        "value" => $this->getVal("corps_om_htmletatex"),
5905                    );
5906                    $params["specific"]["titre"] = array(
5907                        "mode" => "set",
5908                        "value" => $this->getVal("titre_om_htmletat"),
5909                    );
5910                }
5911              // Génération du PDF              // Génération du PDF
5912              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite);              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5913              $pdf_output = $result['pdf_output'];              $pdf_output = $result['pdf_output'];
5914                
5915              //Métadonnées du document              //Métadonnées du document
5916              $metadata = array(              $metadata = array(
5917                  'filename' => 'instruction_'.$id_inst.'.pdf',                  'filename' => $this->determinate_name_doc_pdf().'.pdf',
5918                  'mimetype' => 'application/pdf',                  'mimetype' => 'application/pdf',
5919                  'size' => strlen($pdf_output)                  'size' => strlen($pdf_output)
5920              );              );
# Line 2473  class instruction extends instruction_ge Line 5923  class instruction extends instruction_ge
5923              $spe_metadata = $this->getMetadata("om_fichier_instruction");              $spe_metadata = $this->getMetadata("om_fichier_instruction");
5924    
5925              //On vérifie si l'instruction à finaliser a un événement de type arrete              //On vérifie si l'instruction à finaliser a un événement de type arrete
5926              $sql = "SELECT type              // TODO : A voir pour remplacer par une instanciation de l'événement.
5927                  FROM ".DB_PREFIXE."evenement              //        Voir également si l'événement ne dois pas être instancié en début de
5928                  WHERE evenement = ".$this->getVal("evenement");              //        méthode pour pouvoir être réutilisé.
5929              $typeEvenement = $this->db->getOne($sql);              $qres = $this->f->get_one_result_from_db_query(
5930              $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);                  sprintf(
5931              if ($this->f->isDatabaseError($typeEvenement, true) === true) {                      'SELECT
5932                            type
5933                        FROM
5934                            %1$sevenement
5935                        WHERE
5936                            evenement = \'%2$d\'',
5937                        DB_PREFIXE,
5938                        intval($this->getVal("evenement"))
5939                    ),
5940                    array(
5941                        "origin" => __METHOD__,
5942                        "force_return" => true,
5943                    )
5944                );
5945    
5946                if ($qres["code"] !== "OK") {
5947                  $this->correct = false;                  $this->correct = false;
5948                  $this->addToMessage($bdd_msg_error);                  $this->addToMessage($bdd_msg_error);
5949                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
# Line 2487  class instruction extends instruction_ge Line 5952  class instruction extends instruction_ge
5952              //Initialisation de la variable              //Initialisation de la variable
5953              $arrete_metadata = array();              $arrete_metadata = array();
5954              // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques              // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5955              if ( $typeEvenement === 'arrete' ){              if ($qres['result'] === 'arrete'){
5956                  $arrete_metadata = $this->getMetadata("arrete");                  $arrete_metadata = $this->getMetadata("arrete");
5957              }              }
5958    
5959              $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);              $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5960    
5961                // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5962                $res = $this->f->db->autoExecute(
5963                    DB_PREFIXE.$this->table,
5964                    ['fichier_instruction_name' => $metadata['filename']],
5965                    DB_AUTOQUERY_UPDATE,
5966                    "instruction='".$this->getVal("instruction")."'"
5967                );
5968    
5969              // Si le document a déjà été finalisé on le met à jour              // Si le document a déjà été finalisé on le met à jour
5970              // en conservant son UID              // en conservant son UID
5971              if ($this->getVal("om_fichier_instruction") != ''){              if ($this->getVal("om_fichier_instruction") != ''){
5972                  $uid = $this->f->storage->update(                  $uid = $this->f->storage->update(
5973                      $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);                      $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
5974                    );
5975              }              }
5976              // 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
5977              else {              else {
5978                  $uid = $this->f->storage->create($pdf_output, $metadata);                  $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5979              }              }
5980          }          }
5981    
5982          // Si on définalise le document          // Si on définalise le document
5983          if ($mode == "unfinalize") {          if ($mode == "unfinalize") {
5984              //              //
5985              $etat = _('définalisation');              $etat = __('définalisation');
5986              // Récupération de l'uid du document finalisé              // Récupération de l'uid du document finalisé
5987              $uid = $this->getVal("om_fichier_instruction");              $uid = $this->getVal("om_fichier_instruction");
5988          }          }
# Line 2518  class instruction extends instruction_ge Line 5992  class instruction extends instruction_ge
5992          if ($uid == '' || $uid == 'OP_FAILURE' ) {          if ($uid == '' || $uid == 'OP_FAILURE' ) {
5993              $this->correct = false;              $this->correct = false;
5994              $this->addToMessage($file_msg_error);              $this->addToMessage($file_msg_error);
5995              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5996              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
5997          }          }
5998    
# Line 2555  class instruction extends instruction_ge Line 6029  class instruction extends instruction_ge
6029          $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);          $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6030          $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);          $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6031          $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);          $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6032            $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6033          $this->setvalF($val);          $this->setvalF($val);
6034    
6035          // Verification de la validite des donnees          // Verification de la validite des donnees
6036          $this->verifier($this->val, $this->db, DEBUG);          $this->verifier($this->val);
6037          // Si les verifications precedentes sont correctes, on procede a          // Si les verifications precedentes sont correctes, on procede a
6038          // la modification, sinon on ne fait rien et on retourne une erreur          // la modification, sinon on ne fait rien et on retourne une erreur
6039          if ($this->correct === true) {          if ($this->correct === true) {
# Line 2592  class instruction extends instruction_ge Line 6067  class instruction extends instruction_ge
6067    
6068              // Execution de la requête de modification des donnees de l'attribut              // Execution de la requête de modification des donnees de l'attribut
6069              // valF de l'objet dans l'attribut table de l'objet              // valF de l'objet dans l'attribut table de l'objet
6070              $res = $this->db->autoExecute(DB_PREFIXE.$this->table, $valF,              $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6071                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6072               $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);               $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6073              //              //
# Line 2603  class instruction extends instruction_ge Line 6078  class instruction extends instruction_ge
6078              }              }
6079    
6080              //              //
6081              $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));
6082              //              //
6083              if ($this->add_log_to_dossier($id_inst, $val) === false) {              if ($this->add_log_to_dossier($id_inst, $val) === false) {
6084                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
# Line 2613  class instruction extends instruction_ge Line 6088  class instruction extends instruction_ge
6088          }          }
6089          // L'appel de verifier() a déjà positionné correct à false          // L'appel de verifier() a déjà positionné correct à false
6090          // et défini un message d'erreur.          // et défini un message d'erreur.
6091          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6092          return $this->end_treatment(__METHOD__, false);          return $this->end_treatment(__METHOD__, false);
6093      }      }
6094    
# Line 2621  class instruction extends instruction_ge Line 6096  class instruction extends instruction_ge
6096       * 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
6097       * @return string numéro de dossier d'instruction       * @return string numéro de dossier d'instruction
6098       */       */
6099      protected function getDossier() {      protected function getDossier($champ = null) {
6100          if(empty($this->specificMetadata)) {          if(empty($this->specificMetadata)) {
6101              $this->getSpecificMetadata();              $this->getSpecificMetadata();
6102          }          }
# Line 2711  class instruction extends instruction_ge Line 6186  class instruction extends instruction_ge
6186      protected function getTitle() {      protected function getTitle() {
6187    
6188          // Récupère le champ événement          // Récupère le champ événement
6189          if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {          if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6190              $evenement = $this->valF["evenement"];              $evenement = $this->valF["evenement"];
6191          } else {          } else {
6192              $evenement = $this->getVal("evenement");              $evenement = $this->getVal("evenement");
6193          }          }
6194    
6195          // Requête sql          // Requête sql
6196          $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
6197                  WHERE evenement=".$evenement;              "obj" => "evenement",
6198          $evenement_libelle = $this->db->getOne($sql);              "idx" => $evenement
6199          $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);          ));
         if (database::isError($evenement_libelle)) {  
             die();  
         }  
6200    
6201          // Retourne le libelle de l'événement          // Retourne le libelle de l'événement
6202          return $evenement_libelle;          return $evenement->getVal('libelle');
6203      }      }
6204    
6205    
# Line 2751  class instruction extends instruction_ge Line 6223  class instruction extends instruction_ge
6223       * nécessaire à l'ajout d'un document.       * nécessaire à l'ajout d'un document.
6224       */       */
6225      public function getSpecificMetadata() {      public function getSpecificMetadata() {
6226          if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {          if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6227              $dossier = $this->valF["dossier"];              $dossier = $this->valF["dossier"];
6228          } else {          } else {
6229              $dossier = $this->getVal("dossier");              $dossier = $this->getVal("dossier");
6230          }          }
6231          //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
6232          $sql = "SELECT dossier.dossier as dossier,          $qres = $this->f->get_all_results_from_db_query(
6233                          dossier_autorisation.dossier_autorisation as dossier_autorisation,              sprintf(
6234                          to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,                  'SELECT
6235                          dossier_instruction_type.code as dossier_instruction_type,                      dossier.dossier AS dossier,
6236                          etat_dossier_autorisation.libelle as statut,                      dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6237                          dossier_autorisation_type.code as dossier_autorisation_type,                      to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6238                          groupe.code as groupe_instruction,                      dossier_instruction_type.code AS dossier_instruction_type,
6239                          CASE WHEN dossier.erp IS TRUE                      etat_dossier_autorisation.libelle AS statut,
6240                              THEN 'true'                      dossier_autorisation_type.code AS dossier_autorisation_type,
6241                              ELSE 'false'                      groupe.code AS groupe_instruction,
6242                          END as erp                      CASE WHEN dossier.erp IS TRUE
6243                  FROM ".DB_PREFIXE."dossier                          THEN \'true\'
6244                      LEFT JOIN ".DB_PREFIXE."dossier_instruction_type                            ELSE \'false\'
6245                        END AS erp
6246                    FROM
6247                        %1$sdossier
6248                        LEFT JOIN %1$sdossier_instruction_type  
6249                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6250                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation                      LEFT JOIN %1$sdossier_autorisation
6251                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6252                      LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation                      LEFT JOIN %1$setat_dossier_autorisation
6253                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6254                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                      LEFT JOIN %1$sdossier_autorisation_type_detaille
6255                          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
6256                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type                      LEFT JOIN %1$sdossier_autorisation_type
6257                          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
6258                      LEFT JOIN ".DB_PREFIXE."groupe                      LEFT JOIN %1$sgroupe
6259                          ON dossier_autorisation_type.groupe = groupe.groupe                          ON dossier_autorisation_type.groupe = groupe.groupe
6260                  WHERE dossier.dossier = '".$dossier."'";                  WHERE
6261          $res = $this->db->query($sql);                      dossier.dossier = \'%2$s\'',
6262          $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);                  DB_PREFIXE,
6263          if ( database::isError($res)){                  $this->f->db->escapeSimple($dossier)
6264              die();              ),
6265          }              array(
6266                            "origin" => __METHOD__,
6267          //Le résultat est récupéré dans un objet              )
6268          $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);          );
6269            $row = array_shift($qres['result']);
6270    
6271          //Si il y a un résultat          //Si il y a un résultat
6272          if ($row !== null) {          if (! empty($row)) {
6273    
6274              // Instrance de la classe dossier              // Instrance de la classe dossier
6275              $inst_dossier = $this->get_inst_dossier($dossier);              $inst_dossier = $this->get_inst_dossier($dossier);
6276                // TODO : améliorer ce code
6277                //
6278                // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6279                // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6280                // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6281                // valeurs issues de la requête en objet.
6282                $metadata = (object)$row;
6283              // Insère l'attribut version à l'objet              // Insère l'attribut version à l'objet
6284              $row->version = $inst_dossier->get_dossier_instruction_version();              $metadata->version = $inst_dossier->get_di_numero_suffixe();
6285    
6286              //Alors on créé l'objet dossier_instruction              //Alors on créé l'objet dossier_instruction
6287              $this->specificMetadata = $row;              $this->specificMetadata = $metadata;
6288    
6289          }          }
6290      }      }
# Line 2820  class instruction extends instruction_ge Line 6303  class instruction extends instruction_ge
6303                            
6304              //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
6305              //dossier              //dossier
6306              $sql = "SELECT etat.statut              $qres = $this->f->get_one_result_from_db_query(
6307                  FROM ".DB_PREFIXE."dossier                  sprintf(
6308                  LEFT JOIN                      'SELECT
6309                      ".DB_PREFIXE."etat                          etat.statut
6310                      ON                      FROM
6311                          dossier.etat = etat.etat                          %1$sdossier
6312                  WHERE dossier ='".$idx."'";                          LEFT JOIN
6313              $statut = $this->db->getOne($sql);                              %1$setat
6314              $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                              ON
6315              if ( database::isError($statut)){                                  dossier.etat = etat.etat
6316                  die();                      WHERE
6317              }                          dossier = \'%2$s\'',
6318                        DB_PREFIXE,
6319                        $this->f->db->escapeSimple($idx)
6320                    ),
6321                    array(
6322                        "origin" => __METHOD__,
6323                    )
6324                );
6325          }          }
6326          return $statut;  
6327            return $qres['result'];
6328      }      }
6329    
6330      /**      /**
# Line 2846  class instruction extends instruction_ge Line 6337  class instruction extends instruction_ge
6337          $return = array();          $return = array();
6338    
6339          // 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
6340          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par une instanciation de l'objet
6341          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
6342          $res = $this->db->query($sql);              sprintf(
6343          $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
6344          $this->f->isDatabaseError($res);                      *
6345                    FROM
6346                        %1$sdossier
6347                    WHERE
6348                        dossier = \'%2$s\'',
6349                    DB_PREFIXE,
6350                    $this->f->db->escapeSimple($this->valF['dossier'])
6351                ),
6352                array(
6353                    'origin' => __METHOD__
6354                )
6355            );
6356    
6357          //          foreach ($qres['result'] as $row) {
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {  
6358    
6359              // 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,
6360              // de l'état et de l'avis du dossier d'instruction              // de l'état et de l'avis du dossier d'instruction
# Line 2881  class instruction extends instruction_ge Line 6382  class instruction extends instruction_ge
6382              $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];              $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6383              $return['archive_delai_incompletude'] = $row['delai_incompletude'];              $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6384              $return['archive_autorite_competente'] = $row['autorite_competente'];              $return['archive_autorite_competente'] = $row['autorite_competente'];
6385                $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6386              $return['duree_validite'] = $row['duree_validite'];              $return['duree_validite'] = $row['duree_validite'];
6387              $return['date_depot'] = $row['date_depot'];              $return['date_depot'] = $row['date_depot'];
6388                $return['date_depot_mairie'] = $row['date_depot_mairie'];
6389              $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];              $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6390              $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];              $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6391              $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];              $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
# Line 2890  class instruction extends instruction_ge Line 6393  class instruction extends instruction_ge
6393              $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];              $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6394              $return['archive_date_ait'] = $row['date_ait'];              $return['archive_date_ait'] = $row['date_ait'];
6395              $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];              $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6396                $return['archive_date_affichage'] = $row['date_affichage'];
6397                $return['archive_pec_metier'] = $row['pec_metier'];
6398                $return['archive_a_qualifier'] = $row['a_qualifier'];
6399          }          }
6400    
6401          // Retour de la fonction          // Retour de la fonction
# Line 2903  class instruction extends instruction_ge Line 6409  class instruction extends instruction_ge
6409       * @return boolean                 * @return boolean          
6410       */       */
6411      function checkEvenementNonVerrouillable($idx) {      function checkEvenementNonVerrouillable($idx) {
   
         // Initialisation du résultat  
         $non_verrouillable = false;  
   
6412          // Si la condition n'est pas vide          // Si la condition n'est pas vide
6413          if ($idx != "") {          if ($idx != "") {
6414    
6415              // Requête SQL              // Requête SQL
6416              $sql = "SELECT evenement.non_verrouillable              $qres = $this->f->get_one_result_from_db_query(
6417                      FROM ".DB_PREFIXE."evenement                  sprintf(
6418                      LEFT JOIN ".DB_PREFIXE."instruction                      'SELECT
6419                          ON instruction.evenement = evenement.evenement                          evenement.non_verrouillable
6420                      WHERE instruction.instruction = $idx";                      FROM
6421              $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                          %1$sevenement
6422              $res = $this->db->getOne($sql);                          LEFT JOIN %1$sinstruction
6423              $this->f->isDatabaseError($res);                              ON instruction.evenement = evenement.evenement
6424                        WHERE
6425              // Si le retour de la requête est true                          instruction.instruction = \'%2$s\'',
6426              if ($res == 't') {                      DB_PREFIXE,
6427                  //                      intval($idx)
6428                  $non_verrouillable = true;                  ),
6429              }                  array(
6430                        "origin" => __METHOD__,
6431                    )
6432                );
6433          }          }
6434    
6435          // Retourne résultat          // Si on a un résultat et que ce résultat indique que l'événement n'est
6436          return $non_verrouillable;          // pas vérrouillable renvoie true, sinon renvoie false
6437            return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6438      }      }
6439            
6440      /**      /**
# Line 3005  class instruction extends instruction_ge Line 6511  class instruction extends instruction_ge
6511          if ($row['date_depot'] != '') {          if ($row['date_depot'] != '') {
6512              $this->valF['date_depot']= $row['date_depot'];                $this->valF['date_depot']= $row['date_depot'];  
6513          }          }
6514            if ($row['date_depot_mairie'] != '') {
6515                $this->valF['date_depot_mairie']= $row['date_depot_mairie'];  
6516            }
6517          // Dates concernant les dossiers contentieux          // Dates concernant les dossiers contentieux
6518          if ($row['date_cloture_instruction'] != '') {          if ($row['date_cloture_instruction'] != '') {
6519              $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];                $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];  
# Line 3027  class instruction extends instruction_ge Line 6536  class instruction extends instruction_ge
6536          if ($row['date_transmission_parquet'] != '') {          if ($row['date_transmission_parquet'] != '') {
6537              $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];                $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];  
6538          }          }
6539            //
6540            if ($row['dossier_instruction_type'] != '') {
6541                $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];  
6542            }
6543            if ($row['date_affichage'] != '') {
6544                $this->valF['archive_date_affichage']= $row['date_affichage'];  
6545            }
6546            if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6547                $this->valF['archive_pec_metier']= $row['pec_metier'];  
6548            }
6549            if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6550                $this->valF['archive_a_qualifier']= $row['a_qualifier'];  
6551            }
6552      }      }
6553    
6554      // {{{      // {{{
# Line 3152  class instruction extends instruction_ge Line 6674  class instruction extends instruction_ge
6674       */       */
6675      function getArreteMetadata() {      function getArreteMetadata() {
6676    
6677      //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'
6678      $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",          $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6679          "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",              "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6680          "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",              "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6681          "ap_codepostal"=>"", "ap_ville"=>"");              "ap_codepostal"=>"", "ap_ville"=>"");
6682    
6683          $sqlArrete = "SELECT    signataire_arrete.nom as \"nomsignataire\",          $qres = $this->f->get_all_results_from_db_query(
6684                  signataire_arrete.qualite as \"qualitesignataire\",              sprintf(
6685                  instruction.etat as \"decisionarrete\",                  'SELECT
6686                  instruction.date_retour_rar as \"datenotification\",                      signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6687                  instruction.date_retour_signature as \"datesignaturearrete\",                      signataire_arrete.qualite as qualitesignataire,
6688                  instruction.date_retour_controle_legalite as \"datecontrolelegalite\",                      instruction.etat as decisionarrete,
6689                  dossier.terrain_adresse_voie_numero as \"ap_numrue\",                      instruction.date_retour_rar as datenotification,
6690                  dossier.terrain_adresse_voie as \"ap_nomdelavoie\",                      instruction.date_retour_signature as datesignaturearrete,
6691                  dossier.terrain_adresse_code_postal as \"ap_codepostal\",                      instruction.date_retour_controle_legalite as datecontrolelegalite,
6692                  dossier.terrain_adresse_localite as \"ap_ville\"                      dossier.terrain_adresse_voie_numero as ap_numrue,
6693              FROM ".DB_PREFIXE."instruction                      dossier.terrain_adresse_voie as ap_nomdelavoie,
6694              LEFT JOIN ".DB_PREFIXE."signataire_arrete ON                      dossier.terrain_adresse_code_postal as ap_codepostal,
6695                  instruction.signataire_arrete = signataire_arrete.signataire_arrete                      dossier.terrain_adresse_localite as ap_ville
6696              LEFT JOIN ".DB_PREFIXE."dossier ON                  FROM
6697                  instruction.dossier = dossier.dossier                      %1$sinstruction
6698              LEFT JOIN ".DB_PREFIXE."donnees_techniques ON                      LEFT JOIN %1$ssignataire_arrete
6699                      donnees_techniques.dossier_instruction = dossier.dossier                          ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6700              WHERE instruction.instruction = ".$this->getVal("instruction");                      LEFT JOIN %1$sdossier
6701          $resArrete = $this->db->query($sqlArrete);                          ON instruction.dossier = dossier.dossier
6702          $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdonnees_techniques
6703          if ( database::isError($resArrete)){                          ON donnees_techniques.dossier_instruction = dossier.dossier
6704              die();                  WHERE
6705          }                      instruction.instruction = %2$d',
6706                    DB_PREFIXE,
6707          $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);                  intval($this->getVal('instruction'))
6708                ),
6709                array(
6710                    'origin' => __METHOD__
6711                )
6712            );
6713            $this->metadonneesArrete = array_shift($qres['result']);
6714      }      }
6715    
6716      /**      /**
# Line 3206  class instruction extends instruction_ge Line 6734  class instruction extends instruction_ge
6734      }      }
6735    
6736      /**      /**
6737         * CONDITION - is_modifiable.
6738         *
6739         * Controle si l'évenement est modifiable.
6740         *
6741         * @return boolean
6742         */
6743        function is_evenement_modifiable() {
6744            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6745            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6746        }
6747    
6748        /**
6749       * CONDITION - is_editable.       * CONDITION - is_editable.
6750       *       *
6751       * Condition pour la modification.       * Condition pour la modification.
# Line 3213  class instruction extends instruction_ge Line 6753  class instruction extends instruction_ge
6753       * @return boolean       * @return boolean
6754       */       */
6755      function is_editable() {      function is_editable() {
6756    
6757            // XXX
6758            // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6759            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6760    
6761          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6762          $bypass = $this->f->isAccredited(get_class($this)."_modifier_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6763          //          //
6764          if ($bypass == true) {          if ($bypass == true) {
6765              //              //
# Line 3237  class instruction extends instruction_ge Line 6782  class instruction extends instruction_ge
6782              return true;              return true;
6783          }          }
6784    
         // 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;  
         }  
   
6785          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
6786          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
6787          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
6788              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
6789              return true;              return true;
6790          }          }
# Line 3256  class instruction extends instruction_ge Line 6794  class instruction extends instruction_ge
6794      }      }
6795    
6796      /**      /**
6797         * Vérifie si l'événement est supprimable ou pas.
6798         *
6799         * @return boolean
6800         */
6801        function is_evenement_supprimable() {
6802            // Controle si l'évenement est supprimable
6803            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6804            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6805        }
6806    
6807        /**
6808       * CONDITION - is_deletable.       * CONDITION - is_deletable.
6809       *       *
6810       * Condition pour la suppression.       * Condition pour la suppression.
# Line 3263  class instruction extends instruction_ge Line 6812  class instruction extends instruction_ge
6812       * @return boolean       * @return boolean
6813       */       */
6814      function is_deletable() {      function is_deletable() {
6815    
6816            // XXX
6817            // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6818            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6819    
6820          // Contrôle si l'utilisateur possède un bypass intégral          // Contrôle si l'utilisateur possède un bypass intégral
6821          $bypass = $this->f->isAccredited(get_class($this)."_supprimer_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6822          //          //
6823          if ($bypass == true) {          if ($bypass == true) {
6824    
# Line 3276  class instruction extends instruction_ge Line 6830  class instruction extends instruction_ge
6830          // division du dossier et si l'utilisateur n'a pas la permission bypass          // division du dossier et si l'utilisateur n'a pas la permission bypass
6831          // de la division          // de la division
6832          if ($this->is_instructeur_from_division_dossier() === false          if ($this->is_instructeur_from_division_dossier() === false
6833              && $this->f->isAccredited(get_class()."_supprimer_bypass_division") === false) {              && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6834    
6835              //              //
6836              return false;              return false;
# Line 3285  class instruction extends instruction_ge Line 6839  class instruction extends instruction_ge
6839          // l'événement est-il le dernier ?          // l'événement est-il le dernier ?
6840          $dernier_evenement = false;          $dernier_evenement = false;
6841          // instanciation dossier          // instanciation dossier
6842          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
6843          $dossier = new dossier($this->getVal('dossier'), $this->db, DEBUG);              "obj" => "dossier",
6844                "idx" => $this->getVal('dossier'),
6845            ));
6846          // récupération dernier événement          // récupération dernier événement
6847          $id_dernier_evenement = $dossier->get_dernier_evenement();          $id_dernier_evenement = $dossier->get_dernier_evenement();
6848          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
# Line 3321  class instruction extends instruction_ge Line 6877  class instruction extends instruction_ge
6877       * @return,  boolean true/false       * @return,  boolean true/false
6878       */       */
6879      function is_instructeur_from_collectivite_dossier() {      function is_instructeur_from_collectivite_dossier() {
6880          if ($this->f->isUserInstructeur() === true and          if ($this->f->isUserInstructeur() === true &&
6881              $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {              $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6882              return true;              return true;
6883          }          }
# Line 3337  class instruction extends instruction_ge Line 6893  class instruction extends instruction_ge
6893       */       */
6894      function is_addable() {      function is_addable() {
6895          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6896          $bypass = $this->f->isAccredited(get_class($this)."_ajouter_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6897          //          //
6898          if ($bypass == true) {          if ($bypass == true) {
6899    
# Line 3346  class instruction extends instruction_ge Line 6902  class instruction extends instruction_ge
6902          }          }
6903          // Si l'utilisateur est un intructeur qui correspond à la          // Si l'utilisateur est un intructeur qui correspond à la
6904          // division du dossier ou qu'il peut changer la décision          // division du dossier ou qu'il peut changer la décision
6905          if ($this->is_instructeur_from_division_dossier() === true or          if ($this->is_instructeur_from_division_dossier() === true ||
6906              $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {              $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6907              //              //
6908              return true;              return true;
# Line 3365  class instruction extends instruction_ge Line 6921  class instruction extends instruction_ge
6921       */       */
6922      function is_finalizable() {      function is_finalizable() {
6923          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6924          $bypass = $this->f->isAccredited(get_class($this)."_finaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6925          //          //
6926          if ($bypass == true) {          if ($bypass == true) {
6927              //              //
# Line 3388  class instruction extends instruction_ge Line 6944  class instruction extends instruction_ge
6944              return true;              return true;
6945          }          }
6946    
         // 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;  
         }  
   
6947          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
6948          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
6949          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
6950              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
6951              return true;              return true;
6952          }          }
# Line 3437  class instruction extends instruction_ge Line 6986  class instruction extends instruction_ge
6986       */       */
6987      function is_unfinalizable(){      function is_unfinalizable(){
6988          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6989          $bypass = $this->f->isAccredited(get_class($this)."_definaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6990          //          //
6991          if ($bypass == true) {          if ($bypass == true) {
6992              //              //
# Line 3460  class instruction extends instruction_ge Line 7009  class instruction extends instruction_ge
7009              return true;              return true;
7010          }          }
7011    
         // 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;  
         }  
   
7012          // Si l'utilisateur est instructeur de la commune du dossier et que          // Si l'utilisateur est instructeur de la commune du dossier et que
7013          // l'instruction est créée par un instructeur de la commune          // l'instruction est créée par un instructeur de la commune
7014          if ($this->is_instructeur_from_collectivite_dossier() === true and          if ($this->is_instructeur_from_collectivite_dossier() === true &&
7015              $this->getVal('created_by_commune') === 't') {              $this->getVal('created_by_commune') === 't') {
7016              return true;              return true;
7017          }          }
# Line 3507  class instruction extends instruction_ge Line 7049  class instruction extends instruction_ge
7049       */       */
7050      function isInstrCanChangeDecision($idx) {      function isInstrCanChangeDecision($idx) {
7051                    
7052          if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or          if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7053              $this->f->isUserInstructeur() !== true) {              $this->f->isUserInstructeur() !== true) {
7054              return false;              return false;
7055          }          }
# Line 3515  class instruction extends instruction_ge Line 7057  class instruction extends instruction_ge
7057                    
7058    
7059          // 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
7060          $sql =          // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7061              "SELECT          // de décision :
7062            //   * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7063            //   * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7064            $sql = sprintf(
7065                'SELECT
7066                  dossier.dossier                  dossier.dossier
7067              FROM              FROM
7068                  ".DB_PREFIXE."dossier                  %1$sdossier
7069              JOIN ".DB_PREFIXE."instruction ON instruction.instruction = (                  JOIN %1$setat
7070                  SELECT instruction                      ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7071                  FROM ".DB_PREFIXE."instruction                  JOIN %1$slien_dossier_demandeur
7072                  JOIN ".DB_PREFIXE."evenement on instruction.evenement=evenement.evenement                      ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7073                  WHERE instruction.dossier = dossier.dossier                  JOIN %1$sdossier_instruction_type
7074                  AND evenement.retour IS FALSE                      ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7075                  ORDER BY date_evenement DESC, instruction DESC                  JOIN %1$sinstruction
7076                  LIMIT 1                      -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7077              )                      ON instruction.instruction = (
7078              JOIN ".DB_PREFIXE."evenement ON instruction.evenement=evenement.evenement                              SELECT instruction
7079              JOIN ".DB_PREFIXE."instructeur ON dossier.instructeur=instructeur.instructeur                              FROM %1$sinstruction
7080              JOIN ".DB_PREFIXE."om_utilisateur ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur                              JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7081              JOIN ".DB_PREFIXE."om_collectivite ON om_collectivite.om_collectivite=om_utilisateur.om_collectivite                              AND evenement.retour IS FALSE
7082              JOIN ".DB_PREFIXE."etat ON dossier.etat = etat.etat                              WHERE instruction.dossier = dossier.dossier
7083                                ORDER BY date_evenement DESC, instruction DESC
7084                                LIMIT 1
7085                            )
7086                            -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7087                            -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7088                            -- non signée, non notifié, etc.
7089                            AND (instruction.om_final_instruction IS TRUE
7090                                OR instruction.created_by_commune IS TRUE)
7091                            AND instruction.date_retour_signature IS NULL
7092                            AND instruction.date_envoi_rar IS NULL
7093                            AND instruction.date_retour_rar IS NULL
7094                            AND instruction.date_envoi_controle_legalite IS NULL
7095                            AND instruction.date_retour_controle_legalite IS NULL
7096                    -- On vérifie que l instruction soit un arrêté ou un changement de décision
7097                    JOIN %1$sevenement
7098                        ON instruction.evenement=evenement.evenement
7099                            AND (evenement.type = \'arrete\'
7100                                OR evenement.type = \'changement_decision\')
7101                    -- Recherche les informations du pétitionnaire principal pour l affichage
7102                    JOIN %1$sdemandeur
7103                        ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7104                    -- Recherche la collectivité rattachée à l instructeur
7105                    JOIN %1$sinstructeur
7106                        ON dossier.instructeur=instructeur.instructeur
7107                    JOIN %1$sdivision
7108                        ON instructeur.division=division.division
7109                    JOIN %1$sdirection
7110                        ON division.direction=direction.direction
7111                    JOIN %1$som_collectivite
7112                        ON direction.om_collectivite=om_collectivite.om_collectivite
7113              WHERE              WHERE
7114                                    -- Vérification que la décision a été prise par l agglo
7115                      (                  om_collectivite.niveau = \'2\'
7116                          evenement.type = 'arrete' AND                  AND dossier.dossier = \'%2$s\'
7117                          (              ',
7118                              instruction.om_final_instruction IS TRUE              DB_PREFIXE,
7119                              OR instruction.created_by_commune IS TRUE              $this->f->db->escapeSimple($idx)
7120                          ) 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'  
             ";  
7121    
7122    
7123          // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci          // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7124          if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {          if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7125              $sql .= " AND dossier.om_collectivite=".$_SESSION['collectivite'];              $sql .= sprintf(
7126          }                  ' AND dossier.om_collectivite = %1$d',
7127          $res = $this->db->getone($sql);                  intval($_SESSION['collectivite'])
7128          if (database::isError($res)) {              );
             die();  
         }  
         // Si le dossier n'est pas sujet au changement de decision  
         if($res == null) {  
             return false;  
7129          }          }
7130          return true;          $qres = $this->f->get_one_result_from_db_query(
7131                $sql,
7132                array(
7133                    "origin" => __METHOD__,
7134                )
7135            );
7136    
7137            return $qres['result'] !== null;
7138      }      }
7139    
7140    
# Line 3590  class instruction extends instruction_ge Line 7156  class instruction extends instruction_ge
7156          }          }
7157    
7158          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
7159          $bypass = $this->f->isAccredited(get_class($this)."_modification_dates_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7160          if ($bypass === true) {          if ($bypass === true) {
7161              return true;              return true;
7162          }          }
7163    
7164          // 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
7165            // un utilisateur lié à un instructeur
7166            $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7167    
7168            // On vérifie en premier lieu que le DI n'est pas clôturé et que
7169            // l'utilisateur ne possède pas la permission de modifier le suivi des
7170            // dates sur un dossier clôturé
7171          $inst_dossier = $this->get_inst_dossier();          $inst_dossier = $this->get_inst_dossier();
7172          if ($inst_dossier->getStatut() === 'cloture') {          if ($inst_dossier->getStatut() === 'cloture'
7173                && $perm_moni_dates_d_closed === false) {
7174              //              //
7175              return false;              return false;
7176          }          }
# Line 3646  class instruction extends instruction_ge Line 7219  class instruction extends instruction_ge
7219    
7220    
7221      /**      /**
7222         * CONDITION - is_finalized.
7223         *
7224         * Condition pour vérifier si une instruction est finalisée.
7225         *
7226         * @return boolean
7227         */
7228        public function is_finalized() {
7229    
7230            return $this->getVal('om_final_instruction') === "t";
7231        }
7232    
7233        /**
7234         * CONDITION - is_not_date_retour_signature_set.
7235         *
7236         * Condition pour vérifier si une date de retour signature n'est pas définie.
7237         *
7238         * @return boolean
7239         */
7240        public function is_not_date_retour_signature_set() {
7241    
7242            return $this->getVal('date_retour_signature') == null;
7243    
7244        }
7245    
7246    
7247        /**
7248       * TREATMENT - finalize.       * TREATMENT - finalize.
7249       *       *
7250       * Permet de finaliser un enregistrement.       * Permet de finaliser un enregistrement.
# Line 3655  class instruction extends instruction_ge Line 7254  class instruction extends instruction_ge
7254       * @return boolean       * @return boolean
7255       */       */
7256      function finalize($val = array()) {      function finalize($val = array()) {
   
7257          // 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
7258          // dites de TREATMENT.          // dites de TREATMENT.
7259          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
7260            $message = '';
7261            $ev = $this->get_inst_evenement($this->getVal('evenement'));
7262    
7263            $this->f->log(__METHOD__, 'BEGIN');
7264            $collectivite_di = null;
7265            $data = array('val' => &$val);
7266            $data['ev'] = $ev;
7267            $data['collectivite_di'] = $collectivite_di;
7268            $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7269    
7270            // Controle du signataire
7271            if (! $this->controle_signataire($ev)) {
7272                $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7273                // Termine le traitement
7274                return $this->end_treatment(__METHOD__, false);
7275            }
7276    
7277          // Traitement de la finalisation          // Traitement de la finalisation
7278          $ret = $this->manage_finalizing("finalize", $val);          $ret = $this->manage_finalizing("finalize", $val);
# Line 3670  class instruction extends instruction_ge Line 7284  class instruction extends instruction_ge
7284              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
7285          }          }
7286    
7287            // Envoi des notifications aux demandeurs si la notification est automatique
7288            // et que la signature n'est pas requise
7289            if ($ev->getVal('notification') === 'notification_automatique') {
7290                // Préparation du message de log en cas d'erreur de notification
7291                $msgLog = sprintf(
7292                    '%s %s : %d',
7293                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7294                    __('Instruction notifiée'),
7295                    $this->getVal($this->clePrimaire)
7296                );
7297                // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7298                $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7299                // Récupération de la liste des demandeurs à notifier et de la catégorie
7300                $categorie = $this->f->get_param_option_notification($collectivite_di);
7301                $isPortal = $categorie === PORTAL;
7302                $demandeursANotifie = $this->get_demandeurs_notifiable(
7303                    $this->getVal('dossier'),
7304                    $isPortal
7305                );
7306    
7307                // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7308                $demandeurPrincipalNotifie = false;
7309                if (count($demandeursANotifie) > 0) {
7310                    foreach ($demandeursANotifie as $demandeur) {
7311                        // Identifie si le demandeur principal a été notifié ou pas
7312                        // et récupère ses informations
7313                        if ($demandeur['petitionnaire_principal'] == 't') {
7314                            $demandeurPrincipalNotifie = true;
7315                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7316                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
7317                            // suivante. On le considère également comme non notifié pour gérer l'envoie
7318                            // des messages d'erreurs
7319                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7320                            // d'impact sur la notification
7321                            $erreursParam = $this->get_info_notification_fail();
7322                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7323                                $demandeurPrincipalNotifie = false;
7324                                continue;
7325                            }
7326                        }
7327                        //
7328                        $msg_notif = '';
7329    
7330                        $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
7331                        // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7332                        // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7333                        if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7334                            && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7335                            && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7336                            // Ajout de la notif et récupération de son id
7337                            $idNotif = $this->ajouter_notification(
7338                                $this->getVal($this->clePrimaire),
7339                                $this->f->get_connected_user_login_name(),
7340                                $demandeur,
7341                                $collectivite_di,
7342                                array(),
7343                                true,
7344                                'Echec',
7345                                __('La date limite de notification au demandeur est dépassée')
7346                            );
7347                            if ($idNotif === false) {
7348                                // Termine le traitement
7349                                $this->addToLog(
7350                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7351                                    DEBUG_MODE
7352                                );
7353                                return $this->end_treatment(__METHOD__, false);
7354                            }
7355                            $msg_notif = sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7356                        }
7357                        else {
7358                            // Ajout de la notif et récupération de son id
7359                            $idNotif = $this->ajouter_notification(
7360                                $this->getVal($this->clePrimaire),
7361                                $this->f->get_connected_user_login_name(),
7362                                $demandeur,
7363                                $collectivite_di,
7364                                array(),
7365                                true
7366                            );
7367                            if ($idNotif === false) {
7368                                // Termine le traitement
7369                                $this->addToLog(
7370                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7371                                    DEBUG_MODE
7372                                );
7373                                return $this->end_treatment(__METHOD__, false);
7374                            }
7375                            $notification_by_task = $this->notification_by_task(
7376                                $idNotif,
7377                                $this->getVal('dossier'),
7378                                $categorie
7379                            );
7380                            if ($notification_by_task === false) {
7381                                $this->addToLog(
7382                                    sprintf('%s() : %s', __METHOD__, $msgLog),
7383                                    DEBUG_MODE
7384                                );
7385                                $this->addToMessage(
7386                                    __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7387                                );
7388                                // Termine le traitement
7389                                return $this->end_treatment(__METHOD__, false);
7390                            }
7391                            $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7392                        }
7393                    }
7394                    $this->addToMessage($message .= $msg_notif);
7395                }
7396                // Pour la notification par mail ou la notification via portal si le dossier a
7397                // été déposés via portal, si le demandeur principal n'est pas notifiable,
7398                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7399                // laquelle le demandeur principal n'a pas pu être notifié
7400                $depotPortal = $this->dossier_depose_sur_portail();
7401                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7402                    // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7403                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7404                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7405                    $erreursParam = $this->get_info_notification_fail();
7406                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7407                    // Ajout de la notif et récupération de son id
7408                    $idNotif = $this->ajouter_notification(
7409                        $this->valF[$this->clePrimaire],
7410                        $this->f->get_connected_user_login_name(),
7411                        $demandeurPrincipal,
7412                        $collectivite_di,
7413                        array(),
7414                        true,
7415                        'Echec',
7416                        implode(' ', $erreursParam)
7417                    );
7418                    if ($idNotif === false) {
7419                        $this->addToMessage(
7420                            __('Erreur : la création de la notification a échouée.').
7421                            __("Veuillez contacter votre administrateur.")
7422                        );
7423                        $this->addToLog(
7424                            sprintf('%s() : %s', __METHOD__, $msgLog),
7425                            DEBUG_MODE
7426                        );
7427                        return false;
7428                    }
7429                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7430                    // de l'échec de la notification
7431                    $dossier_message = $this->get_inst_dossier_message(0);
7432                    $dossier_message_val = array(
7433                        'dossier' => $this->getVal('dossier'),
7434                        'type' => __('erreur expedition'),
7435                        'emetteur' => $this->f->get_connected_user_login_name(),
7436                        'login' => $_SESSION['login'],
7437                        'date_emission' => date('Y-m-d H:i:s'),
7438                        'contenu' => __('Échec lors de la notification de l\'instruction ').
7439                            $ev->getVal('libelle').
7440                            '.<br>'.
7441                            implode("\n", $erreursParam).
7442                            '<br>'.
7443                            __('Veuillez corriger ces informations avant de renvoyer la notification.')
7444                    );
7445                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
7446                    // Si une erreur se produit pendant l'ajout
7447                    if ($add !== true) {
7448                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7449                        return false;
7450                    }
7451                }
7452            }
7453    
7454          // Termine le traitement          // Termine le traitement
7455            // Événement
7456            $data['ev'] = $ev;
7457            $data['collectivite_di'] = $collectivite_di;
7458            $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7459            $this->f->log(__METHOD__, 'END');
7460    
7461          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
7462      }      }
7463    
7464      /**      /**
7465         * Récupère l'instance de dossier message.
7466         *
7467         * @param string $dossier_message Identifiant du message.
7468         *
7469         * @return object
7470         */
7471        private function get_inst_dossier_message($dossier_message = null) {
7472            //
7473            return $this->get_inst_common("dossier_message", $dossier_message);
7474        }
7475    
7476        /**
7477         * Vérifie si le signataire est obligatoire pour finaliser
7478         * le document apartir du paramétrage de l'événement.
7479         * Si c'est le cas, vérifie si il y a bien un signataire
7480         * renseigné.
7481         * Si c'est le cas renvoie true, sinon renvoie false.
7482         *
7483         * @param evenement évenement de l'instruction permettant de
7484         * récupérer le paramétrage
7485         * @return boolean
7486         */
7487        protected function controle_signataire($evenement) {
7488            // Vérifie si le signataire est obligatoire et si c'est le cas
7489            // vérifie si il y a bien un signataire pour le document
7490            if ($evenement->is_signataire_obligatoire() &&
7491                ($this->getVal('signataire_arrete') === null ||
7492                $this->getVal('signataire_arrete') === '')) {
7493                return false;
7494            }
7495            return true;
7496        }
7497    
7498        /**
7499       * TREATMENT - unfinalize.       * TREATMENT - unfinalize.
7500       *       *
7501       * Permet de définaliser un enregistrement.       * Permet de définaliser un enregistrement.
# Line 3717  class instruction extends instruction_ge Line 7538  class instruction extends instruction_ge
7538              && $this->getVal("om_final_instruction") != null) {              && $this->getVal("om_final_instruction") != null) {
7539    
7540              // Ouvre le document              // Ouvre le document
7541              $lien = '../spg/file.php?obj='.$this->table.'&'.              $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7542                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7543              //              //
7544              header("Location: ".$lien);              header("Location: ".$lien);
# Line 3736  class instruction extends instruction_ge Line 7557  class instruction extends instruction_ge
7557                      "mode" => "previsualisation",                      "mode" => "previsualisation",
7558                  ),                  ),
7559              );              );
7560                // Si la rédaction libre est activée sur l'instruction
7561                if ($this->getVal("flag_edition_integrale") == 't') {
7562                    $params["specific"]["corps"] = array(
7563                        "mode" => "set",
7564                        "value" => $this->getVal("corps_om_htmletatex"),
7565                    );
7566                    $params["specific"]["titre"] = array(
7567                        "mode" => "set",
7568                        "value" => $this->getVal("titre_om_htmletat"),
7569                    );
7570                }
7571    
7572              // Génération du PDF              // Génération du PDF
7573              $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);              $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7574                $result['filename'] = $this->determinate_name_doc_pdf();
7575              // Affichage du PDF              // Affichage du PDF
7576              $this->expose_pdf_output(              $this->expose_pdf_output(
7577                  $result['pdf_output'],                  $result['pdf_output'],
# Line 3758  class instruction extends instruction_ge Line 7591  class instruction extends instruction_ge
7591    
7592          // Si l'identifiant n'est pas renseigné          // Si l'identifiant n'est pas renseigné
7593          if ($dossier_instruction_id === null) {          if ($dossier_instruction_id === null) {
7594              // Récupère la valeur en base de données              // Récupère la valeur
7595              $dossier_instruction_id = $this->getVal('dossier');              if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7596                    $dossier_instruction_id = $this->getVal('dossier');
7597                } elseif ($this->getParameter('idxformulaire') !== null
7598                    && $this->getParameter('idxformulaire') !== '') {
7599                    //
7600                    $dossier_instruction_id = $this->getParameter('idxformulaire');
7601                } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7602                    && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7603                    //
7604                    $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7605                }
7606          }          }
7607    
7608          //          //
7609          require_once "../obj/dossier_instruction.class.php";          $dossier_instruction = $this->f->get_inst__om_dbform(array(
7610          $dossier_instruction = new dossier_instruction($dossier_instruction_id, $this->f->db, false);              "obj" => "dossier_instruction",
7611                "idx" => $dossier_instruction_id,
7612            ));
7613    
7614          //          //
7615          return $dossier_instruction->getVal('om_collectivite');          return $dossier_instruction->getVal('om_collectivite');
# Line 3781  class instruction extends instruction_ge Line 7626  class instruction extends instruction_ge
7626          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7627          $this->checkAccessibility();          $this->checkAccessibility();
7628    
         // XXX APP  
   
         $f = $this->f;  
   
7629          /**          /**
7630           * Affichage de la structure HTML           * Affichage de la structure HTML
7631           */           */
7632          //          //
7633          if ($f->isAjaxRequest()) {          if ($this->f->isAjaxRequest()) {
7634              //              //
7635              header("Content-type: text/html; charset=".HTTPCHARSET."");              header("Content-type: text/html; charset=".HTTPCHARSET."");
7636          } else {          } else {
7637              //              //
7638              $f->setFlag("htmlonly");              $this->f->setFlag("htmlonly");
7639              $f->display();              $this->f->display();
7640          }          }
7641          //          //
7642          $f->displayStartContent();          $this->f->displayStartContent();
7643          //          //
7644          $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"));
7645          $f->displayTitle();          $this->f->displayTitle();
7646    
7647          /**          /**
7648           *           *
7649           */           */
7650          //          //
7651          ($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 = "");
7652          $evenement = intval($evenement);          $evenement = intval($evenement);
7653          //          //
7654          ($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 = "");
7655          // Récupération du code du type de DA          // Récupération du code du type de DA
7656          $code_da_type = '';          $code_da_type = '';
7657          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7658              $code_da_type = $matches[0];              $code_da_type = $matches[0];
7659          }          }
7660          //          //
7661          ($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");
7662    
7663          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
7664          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
7665          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
7666                "idx" => $idx,
7667          /**          ));
7668           *  
7669           */          $qres = $this->f->get_all_results_from_db_query(
7670          //              sprintf(
7671          $sql = "SELECT *, bible.libelle as bible_lib                  'SELECT
7672          FROM ".DB_PREFIXE."bible                      *,
7673          LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type                      bible.libelle as bible_lib
7674              ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type                  FROM
7675          LEFT JOIN ".DB_PREFIXE."om_collectivite                      %1$sbible
7676              ON bible.om_collectivite = om_collectivite.om_collectivite                      LEFT OUTER JOIN %1$sdossier_autorisation_type
7677          WHERE (evenement=".$evenement." OR evenement IS NULL)                          ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7678              AND complement=".$complement."                      LEFT JOIN %1$som_collectivite
7679              AND (bible.dossier_autorisation_type IS NULL                          ON bible.om_collectivite = om_collectivite.om_collectivite
7680                  OR dossier_autorisation_type.code ='".$code_da_type."')                  WHERE
7681              AND (om_collectivite.niveau = '2'                      (evenement = %2$d
7682                  OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")                          OR evenement IS NULL)
7683          ORDER BY bible_lib ASC";                      AND (complement = %3$d
7684          $res = $f->db->query($sql);                          OR complement IS NULL)
7685          $f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);                      AND (bible.dossier_autorisation_type IS NULL
7686          $f->isDatabaseError($res);                          OR dossier_autorisation_type.code = \'%4$s\')
7687                        AND (om_collectivite.niveau = \'2\'
7688                            OR bible.om_collectivite = %5$d)
7689                    ORDER BY
7690                        bible_lib ASC',
7691                    DB_PREFIXE,
7692                    intval($evenement),
7693                    intval($complement),
7694                    $this->f->db->escapeSimple($code_da_type),
7695                    intval($dossier->getVal("om_collectivite"))
7696                ),
7697                array(
7698                    'origin' => __METHOD__
7699                )
7700            );
7701          //          //
7702          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7703          //          //
7704          if ($res->numrows() > 0) {          if ($qres['row_count'] > 0) {
7705              //              //
7706              echo "\t<table id='tab-bible' width='100%'>\n";              echo "\t<table id='tab-bible' width='100%'>\n";
7707              //              //
7708              echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";              echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7709              echo "<th>"._("Choisir")."</th>";              echo "<th>".__("Choisir")."</th>";
7710              echo "<th>"._("Libelle")."</th>";              echo "<th>".__("Libelle")."</th>";
7711              echo "</tr>\n";              echo "</tr>\n";
7712              //              //
7713              $i = 0;              $i = 0;
7714              //              //
7715              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
7716                  //                  //
7717                  echo "\t\t<tr";                  echo "\t\t<tr";
7718                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
# Line 3874  class instruction extends instruction_ge Line 7729  class instruction extends instruction_ge
7729              echo "\t</table>\n";              echo "\t</table>\n";
7730              //              //
7731              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
7732              $f->layout->display_form_button(array(              $this->f->layout->display_form_button(array(
7733                  "value" => _("Valider"),                  "value" => __("Valider"),
7734                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7735              ));              ));
7736              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
7737              echo "</div>\n";              echo "</div>\n";
7738    
7739          } else {          } else {
7740              //              //
7741              $message_class = "error";              $message_class = "error";
7742              $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;              $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7743              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
7744              //              //
7745              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
7746              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
7747              echo "</div>\n";              echo "</div>\n";
7748          }          }
7749          //          //
# Line 3898  class instruction extends instruction_ge Line 7753  class instruction extends instruction_ge
7753           * Affichage de la structure HTML           * Affichage de la structure HTML
7754           */           */
7755          //          //
7756          $f->displayEndContent();          $this->f->displayEndContent();
7757      }      }
7758    
7759      /**      /**
# Line 3911  class instruction extends instruction_ge Line 7766  class instruction extends instruction_ge
7766      function view_bible_auto() {      function view_bible_auto() {
7767          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7768          $this->checkAccessibility();          $this->checkAccessibility();
   
         // XXX APP  
   
         $f = $this->f;  
   
7769          //          //
7770          $f->disableLog();          $this->f->disableLog();
7771    
7772          $formatDate="AAAA-MM-JJ";          $formatDate="AAAA-MM-JJ";
7773    
7774          // Récupération des paramètres          // Récupération des paramètres
7775          $idx = $f->get_submitted_get_value('idx');          $idx = $this->f->get_submitted_get_value('idx');
7776          $evenement = $f->get_submitted_get_value('ev');          $evenement = $this->f->get_submitted_get_value('ev');
7777    
7778          // Initialisation de la variable de retour          // Initialisation de la variable de retour
7779          $retour['complement_om_html'] = '';          $retour['complement_om_html'] = '';
7780          $retour['complement2_om_html'] = '';          $retour['complement2_om_html'] = '';
7781          $retour['complement3_om_html'] = '';          $retour['complement3_om_html'] = '';
7782          $retour['complement4_om_html'] = '';          $retour['complement4_om_html'] = '';
7783    
7784          // Vérification d'une consultation liée à l'événement          // Vérification d'une consultation liée à l'événement
7785          $consultation = $f->db->getOne(          $instEvenement = $this->f->get_inst__om_dbform(array(
7786              "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement              "obj" => "evenement",
7787          );              "idx" => $evenement,
7788          $f->isDatabaseError($consultation);          ));
7789    
7790          // Si consultation liée, récupération du retour d'avis          // Si consultation liée, récupération du retour d'avis
7791          if($consultation=='Oui'){          if($instEvenement->getVal('consultation') == 'Oui'){
7792              $sql="select date_retour,avis_consultation.libelle as avis_consultation,  
7793                    service.libelle as service              $qres = $this->f->get_all_results_from_db_query(
7794                    from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service                  sprintf(
7795                    on consultation.service =service.service                      'SELECT
7796                    left join ".DB_PREFIXE."avis_consultation on                          date_retour,
7797                      consultation.avis_consultation = avis_consultation.avis_consultation                          avis_consultation.libelle as avis_consultation,
7798                    where dossier ='".$idx."'";                          COALESCE(service.libelle, tiers_consulte.libelle) as service
7799              $res = $f->db->query($sql);                      FROM
7800              $f->isDatabaseError($res);                          %1$sconsultation
7801                            LEFT JOIN %1$stiers_consulte
7802                                ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7803                            LEFT JOIN %1$sservice
7804                                ON consultation.service = service.service
7805                            LEFT JOIN %1$savis_consultation
7806                                ON consultation.avis_consultation = avis_consultation.avis_consultation
7807                        WHERE
7808                            dossier = \'%2$s\'
7809                            AND consultation.visible',
7810                        DB_PREFIXE,
7811                        $this->f->db->escapeSimple($idx)
7812                    ),
7813                    array(
7814                        'origin' => __METHOD__
7815                    )
7816                );
7817              // Récupération des consultations              // Récupération des consultations
7818              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){              foreach ($qres['result'] as $row) {
7819                  $correct=false;                  $correct=false;
7820                  // date retour                  // date retour
7821                  if ($row['date_retour']<>""){                  if ($row['date_retour']<>""){
7822                      if ($formatDate=="AAAA-MM-JJ"){                      if ($formatDate=="AAAA-MM-JJ"){
7823                          $date = explode("-", $row['date_retour']);                          $date = explode("-", $row['date_retour']);
7824                          // controle de date                          // controle de date
7825                          if (count($date) == 3 and                          if (count($date) == 3 &&
7826                                  checkdate($date[1], $date[2], $date[0])) {                                  checkdate($date[1], $date[2], $date[0])) {
7827                              $date_retour_f= $date[2]."/".$date[1]."/".$date[0];                              $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7828                              $correct=true;                              $correct=true;
# Line 3975  class instruction extends instruction_ge Line 7843  class instruction extends instruction_ge
7843                            
7844          } // consultation          } // consultation
7845          // Récupération des bibles automatiques pour le champ complement_om_html          // Récupération des bibles automatiques pour le champ complement_om_html
7846          $retour['complement_om_html'] .= $this->getBible($f, $evenement, $idx, '1');          $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7847          // Récupération des bibles automatiques pour le champ complement2_om_html          // Récupération des bibles automatiques pour le champ complement2_om_html
7848          $retour['complement2_om_html'] .= $this->getBible($f, $evenement, $idx, '2');          $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7849          // Récupération des bibles automatiques pour le champ complement3_om_html          // Récupération des bibles automatiques pour le champ complement3_om_html
7850          $retour['complement3_om_html'] .= $this->getBible($f, $evenement, $idx, '3');          $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7851          // Récupération des bibles automatiques pour le champ complement4_om_html          // Récupération des bibles automatiques pour le champ complement4_om_html
7852          $retour['complement4_om_html'] .= $this->getBible($f, $evenement, $idx, '4');          $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7853    
7854    
7855    
# Line 3995  class instruction extends instruction_ge Line 7863  class instruction extends instruction_ge
7863       */       */
7864      function view_pdf_temp() {      function view_pdf_temp() {
7865          $this->checkAccessibility();          $this->checkAccessibility();
7866            // Utilisation de $_POST pour ne pas que les textes soient altérés.
7867          $this->f->set_submitted_value();          $this->f->set_submitted_value();
7868          $merge_fields = array(          $merge_fields = array();
7869              '[complement_instruction]' => urldecode($_POST['c1']),          //
7870              '[complement1_instruction]' => urldecode($_POST['c1']),          if (array_key_exists('c1', $_POST) === true) {
7871              '[complement2_instruction]' => urldecode($_POST['c2']),              $merge_fields['[complement_instruction]'] = $_POST['c1'];
7872              '[complement3_instruction]' => urldecode($_POST['c3']),              $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7873              '[complement4_instruction]' => urldecode($_POST['c4']),          }
7874          );          if (array_key_exists('c2', $_POST) === true) {
7875                $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7876            }
7877            if (array_key_exists('c3', $_POST) === true) {
7878                $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7879            }
7880            if (array_key_exists('c4', $_POST) === true) {
7881                $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7882            }
7883          $params = array(          $params = array(
7884              "watermark" => true,              "watermark" => true,
7885              "specific" => array(              "specific" => array(
7886                  "merge_fields" => $merge_fields,                  "merge_fields" => $merge_fields,
7887              ),              ),
7888          );          );
7889            //
7890            if (array_key_exists('corps', $_POST) === true) {
7891                $params["specific"]["corps"] = array(
7892                    "mode" => "set",
7893                    "value" => $_POST['corps'],
7894                );
7895            }
7896            if (array_key_exists('titre', $_POST) === true) {
7897                $params["specific"]["titre"] = array(
7898                    "mode" => "set",
7899                    "value" => $_POST['titre'],
7900                );
7901            }
7902          $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();          $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7903          $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);          $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7904          $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);          $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
# Line 4029  class instruction extends instruction_ge Line 7919  class instruction extends instruction_ge
7919          $params = array(          $params = array(
7920              "watermark" => true,              "watermark" => true,
7921          );          );
7922            // Si la rédaction libre est activée sur l'instruction
7923            if ($this->getVal("flag_edition_integrale") == 't') {
7924                $params["specific"]["corps"] = array(
7925                    "mode" => "set",
7926                    "value" => $this->getVal("corps_om_htmletatex"),
7927                );
7928                $params["specific"]["titre"] = array(
7929                    "mode" => "set",
7930                    "value" => $this->getVal("titre_om_htmletat"),
7931                );
7932            }
7933          $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();          $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7934          $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);          $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7935          $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);          $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
# Line 4039  class instruction extends instruction_ge Line 7940  class instruction extends instruction_ge
7940      /**      /**
7941       * Récupération des éléments de bible.       * Récupération des éléments de bible.
7942       *       *
      * @param utils   $f      handler de om_application  
7943       * @param integer $event  id de l'événement       * @param integer $event  id de l'événement
7944       * @param string  $idx    id du dossier       * @param string  $idx    id du dossier
7945       * @param integer $compnb numéro du champ complement       * @param integer $compnb numéro du champ complement
7946         * @param string $type types possibles : automatique ou precharge
7947       *       *
7948       * @return string   Chaîne de texte à insérer dans le champ complement       * @return string   Chaîne de texte à insérer dans le champ complement
7949       */       */
7950      function getBible($f, $event, $idx, $compnb) {      function getBible($event, $idx, $compnb, $type = 'automatique') {
7951          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
7952          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
7953          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
7954                "idx" => $idx,
7955            ));
7956          // Récupération du code du type de DA          // Récupération du code du type de DA
7957          $code_da_type = '';          $code_da_type = '';
7958          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7959              $code_da_type = $matches[0];              $code_da_type = $matches[0];
7960          }          }
         //  
         $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." or evenement IS NULL) 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").")";  
7961    
7962          $res = $f->db->query($sql);          // Prépare le filtre de la requête selon le type de remplissage voulu
7963          $f->isDatabaseError($res);          $sql_filter_type = '';
7964            if ($type === 'automatique') {
7965                $sql_filter_type = "AND automatique = 'Oui'";
7966            } elseif ($type === 'precharge') {
7967                $sql_filter_type = "AND precharge IS TRUE";
7968            }
7969    
7970            $qres = $this->f->get_all_results_from_db_query(
7971                sprintf(
7972                    'SELECT
7973                        *
7974                    FROM
7975                        %1$sbible
7976                        LEFT OUTER JOIN %1$sdossier_autorisation_type
7977                            ON bible.dossier_autorisation_type =
7978                                dossier_autorisation_type.dossier_autorisation_type
7979                        LEFT JOIN %1$som_collectivite
7980                            ON bible.om_collectivite = om_collectivite.om_collectivite
7981                    WHERE
7982                        (evenement = %2$d
7983                            OR evenement IS NULL)
7984                        AND (complement = %3$d
7985                            OR complement IS NULL)
7986                        AND (dossier_autorisation_type.code = \'%4$s\'
7987                            OR bible.dossier_autorisation_type IS NULL)
7988                        AND (om_collectivite.niveau = \'2\'
7989                            OR bible.om_collectivite = %5$d)
7990                        %6$s',
7991                    DB_PREFIXE,
7992                    intval($event),
7993                    intval($compnb),
7994                    $this->f->db->escapeSimple($code_da_type),
7995                    intval($dossier->getVal("om_collectivite")),
7996                    $sql_filter_type
7997                ),
7998                array(
7999                    "origin" => __METHOD__
8000                )
8001            );
8002          $temp = "";          $temp = "";
8003          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){          foreach ($qres['result'] as $row) {
8004              // Remplacement des retours à la ligne par des br              // Remplacement des retours à la ligne par des br
8005              $temp .= preg_replace(              $temp .= preg_replace(
8006                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
# Line 4097  class instruction extends instruction_ge Line 8024  class instruction extends instruction_ge
8024          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8025          $this->checkAccessibility();          $this->checkAccessibility();
8026    
         // XXX APP  
   
         $f = $this->f;  
   
8027          /**          /**
8028           * Validation du formulaire           * Validation du formulaire
8029           */           */
8030          // Si le formulaire a été validé          // Si le formulaire a été validé
8031          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
8032              // Si un bordereau à été sélectionné              // Si un bordereau à été sélectionné
8033              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") == "" ) {
8034                  // Si aucun bordereau n'a été sélectionné                  // Si aucun bordereau n'a été sélectionné
8035                  $message_class = "error";                  $message_class = "error";
8036                  $message = _("Veuillez selectionner un bordereau.");                  $message = __("Veuillez selectionner un bordereau.");
8037              }              }
8038              // Sinon si les dates ne sont pas valide              // Sinon si les dates ne sont pas valide
8039              elseif (($f->get_submitted_post_value("date_bordereau_debut") !== null              elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8040                  && $f->get_submitted_post_value("date_bordereau_debut") == "")                  && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8041                  || ($f->get_submitted_post_value("date_bordereau_fin") !== null                  || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8042                  && $f->get_submitted_post_value("date_bordereau_fin") == "")) {                  && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8043                  // Si aucune date n'a été saisie                  // Si aucune date n'a été saisie
8044                  $message_class = "error";                  $message_class = "error";
8045                  $message = _("Veuillez saisir une date valide.");                  $message = __("Veuillez saisir une date valide.");
8046              }              }
8047              // Sinon si les dates ne sont pas valides              // Sinon si les dates ne sont pas valides
8048              elseif ($f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"              elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8049                  && $f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {                  && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
8050                  // Si aucune date n'a été saisie                  // Si aucune date n'a été saisie
8051                  $message_class = "error";                  $message_class = "error";
8052                  $message = _("Erreur de parametrage. Contactez votre administrateur.");                  $message = __("Erreur de parametrage. Contactez votre administrateur.");
8053              }              }
8054              // Affiche le message de validation              // Affiche le message de validation
8055              else {              else {
8056                  // 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
8057                  $sql = "SELECT om_etat.libelle                  $etat = $this->f->get_inst__om_dbform(array(
8058                  FROM ".DB_PREFIXE."om_etat                      "obj" => "om_etat",
8059                  WHERE om_etat.id = '".$f->get_submitted_post_value("bordereau")."'";                      "idx" => $this->f->get_submitted_post_value("bordereau")
8060                  $res = $f->db->getone($sql);                  ));
8061                  $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                  $qres = $this->f->get_one_result_from_db_query(
8062                  $f->isDatabaseError($res);                      sprintf(
8063                            'SELECT
8064                                om_etat.libelle
8065                            FROM
8066                                %som_etat
8067                            WHERE
8068                                om_etat.id = \'%s\'',
8069                            DB_PREFIXE,
8070                            $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8071                        ),
8072                        array(
8073                            "origin" => __METHOD__,
8074                        )
8075                    );
8076    
8077                  //                  //
8078                  $message_class = "valid";                  $message_class = "valid";
8079                  $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");                  $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8080                  $message .= " : <br/><br/>";                  $message .= " : <br/><br/>";
8081                  $message .= "<a class='om-prev-icon pdf-16'";                  $message .= "<a class='om-prev-icon pdf-16'";
8082                  $message .= " title=\""._("Bordereau")."\"";                  $message .= " title=\"".__("Bordereau")."\"";
8083                  $message .= "href='../scr/form.php?obj=instruction";                  $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8084                  $message .= "&action=220";                  $message .= "&action=220";
8085                  $message .= "&idx=0";                  $message .= "&idx=0";
8086                  $message .= "&type_bordereau=".$f->get_submitted_post_value("bordereau");                  $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8087                  $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");
8088                  $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");
8089                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8090                  if ($f->get_submitted_post_value("om_collectivite") !== null) {                  if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8091                      $message .= "&collectivite=".$f->get_submitted_post_value("om_collectivite");                      $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8092                  }                  }
8093                  $message .= "'"." target='_blank'>";                  $message .= "'"." target='_blank'>";
8094                  $message .= $res." "._("du")." ".$f->get_submitted_post_value("date_bordereau_debut")                  $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8095                      ." "._("au")." ".$f->get_submitted_post_value("date_bordereau_fin");                      ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8096                  $message .= "</a>";                  $message .= "</a>";
8097              }              }
8098          }          }
# Line 4165  class instruction extends instruction_ge Line 8102  class instruction extends instruction_ge
8102           */           */
8103          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8104          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8105              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8106          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8107          // Ouverture du formulaire          // Ouverture du formulaire
8108          printf("\t<form");          printf("\t<form");
8109          printf(" method=\"post\"");          printf(" method=\"post\"");
# Line 4177  class instruction extends instruction_ge Line 8112  class instruction extends instruction_ge
8112          printf(">\n");          printf(">\n");
8113          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8114          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8115          // 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
8116          // collectivité dans le formulaire          // collectivité dans le formulaire
8117          if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
8118              array_push($champs, "om_collectivite");              array_push($champs, "om_collectivite");
8119          }          }
8120          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8121          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8122                "validation" => 0,
8123                "maj" => 0,
8124                "champs" => $champs,
8125            ));
8126          // Paramétrage du champ date_bordereau_debut          // Paramétrage du champ date_bordereau_debut
8127          $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));          $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8128          $form->setType("date_bordereau_debut", "date");          $form->setType("date_bordereau_debut", "date");
8129          $form->setTaille("date_bordereau_debut", 12);          $form->setTaille("date_bordereau_debut", 12);
8130          $form->setMax("date_bordereau_debut", 12);          $form->setMax("date_bordereau_debut", 12);
# Line 4193  class instruction extends instruction_ge Line 8132  class instruction extends instruction_ge
8132          $form->setOnchange("date_bordereau_debut", "fdate(this)");          $form->setOnchange("date_bordereau_debut", "fdate(this)");
8133          $form->setVal("date_bordereau_debut", date("d/m/Y"));          $form->setVal("date_bordereau_debut", date("d/m/Y"));
8134          // Paramétrage du champ date_bordereau_fin          // Paramétrage du champ date_bordereau_fin
8135          $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));          $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8136          $form->setType("date_bordereau_fin", "date");          $form->setType("date_bordereau_fin", "date");
8137          $form->setTaille("date_bordereau_fin", 12);          $form->setTaille("date_bordereau_fin", 12);
8138          $form->setMax("date_bordereau_fin", 12);          $form->setMax("date_bordereau_fin", 12);
# Line 4201  class instruction extends instruction_ge Line 8140  class instruction extends instruction_ge
8140          $form->setOnchange("date_bordereau_fin", "fdate(this)");          $form->setOnchange("date_bordereau_fin", "fdate(this)");
8141          $form->setVal("date_bordereau_fin", date("d/m/Y"));          $form->setVal("date_bordereau_fin", date("d/m/Y"));
8142          // Paramétrage du champ bordereau          // Paramétrage du champ bordereau
8143          $form->setLib("bordereau", _("bordereau"));          $form->setLib("bordereau", __("bordereau"));
8144          $form->setType("bordereau", "select");          $form->setType("bordereau", "select");
8145          $form->setRequired("bordereau");          $form->setRequired("bordereau");
8146          // Valeurs des champs          // Valeurs des champs
8147          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
8148              $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"));
8149              $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"));
8150              $form->setVal("bordereau", $f->get_submitted_post_value("bordereau"));              $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8151              $form->setVal("om_collectivite", $f->get_submitted_post_value("om_collectivite"));              $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8152          }          }
8153          // 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
8154          // 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
8155          // 'bordereau_'          // 'bordereau_'
8156          $sql = "SELECT om_etat.id, om_etat.libelle          $qres = $this->f->get_all_results_from_db_query(
8157                  FROM ".DB_PREFIXE."om_etat              sprintf(
8158                  WHERE om_etat.id LIKE 'bordereau_%'                  'SELECT
8159                  ORDER BY om_etat.id";                      om_etat.id,
8160          $res = $f->db->query($sql);                      om_etat.libelle
8161          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                  FROM
8162          $f->isDatabaseError($res);                      %1$som_etat
8163                    WHERE
8164                        om_etat.id LIKE \'bordereau_%%\'
8165                    ORDER BY
8166                        om_etat.id',
8167                    DB_PREFIXE
8168                ),
8169                array(
8170                    "origin" => __METHOD__
8171                )
8172            );
8173          // Données du select          // Données du select
8174          $contenu = array(          $contenu = array(
8175              0 => array("", ),              0 => array("", ),
8176              1 => array(_("choisir bordereau")),              1 => array(__("choisir bordereau")),
8177          );          );
8178          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {          foreach ($qres['result'] as $row) {
8179              $contenu[0][] = $row['id'];              $contenu[0][] = $row['id'];
8180              $contenu[1][] = $row['libelle'];              $contenu[1][] = $row['libelle'];
8181          }          }
8182          $form->setSelect("bordereau", $contenu);          $form->setSelect("bordereau", $contenu);
8183      //          //
8184      if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
8185          $form->setLib("om_collectivite", _("collectivite"));              $form->setLib("om_collectivite", __("collectivite"));
8186          $form->setType("om_collectivite", "select");              $form->setType("om_collectivite", "select");
8187    
8188          // 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
8189          // de niveau 1              // de niveau 1
8190          $sql = "SELECT om_collectivite, libelle              $qres = $this->f->get_all_results_from_db_query(
8191                  FROM ".DB_PREFIXE."om_collectivite                  sprintf(
8192                  WHERE niveau = '1' ORDER BY libelle";                      'SELECT
8193          $res = $f->db->query($sql);                          om_collectivite,
8194          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                          libelle
8195          $f->isDatabaseError($res);                      FROM
8196          // La valeur par défaut du select est Toutes                          %1$som_collectivite
8197          $list_collectivites = array(                      WHERE
8198              0 => array("", ),                          niveau = \'1\'
8199              1 => array(_("toutes"))                      ORDER BY
8200          );                          libelle',
8201                        DB_PREFIXE
8202          $id_colls = "";                  ),
8203          // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées                  array(
8204          // par des virgules, pour un traitement plus facile dans la requête de sous-état                      "origin" => __METHOD__
8205          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  )
8206              if ($id_colls != "") {              );
8207                  $id_colls .= ",";              // La valeur par défaut du select est Toutes
8208              }              $list_collectivites = array(
8209              $id_colls .= $row['om_collectivite'];                  0 => array("", ),
8210              $list_collectivites[0][] = $row['om_collectivite'];                  1 => array(__("toutes"))
8211              $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);  
     }  
8212    
8213                $id_colls = "";
8214                // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8215                // par des virgules, pour un traitement plus facile dans la requête de sous-état
8216                foreach ($qres['result'] as $row) {
8217                    if ($id_colls != "") {
8218                        $id_colls .= ",";
8219                    }
8220                    $id_colls .= $row['om_collectivite'];
8221                    $list_collectivites[0][] = $row['om_collectivite'];
8222                    $list_collectivites[1][] = $row['libelle'];
8223                }
8224                // On affecte la liste d'identifiants à l'option Toutes
8225                $list_collectivites[0][0] = $id_colls ;
8226                $form->setSelect("om_collectivite", $list_collectivites);
8227            }
8228          // Affichage du formulaire          // Affichage du formulaire
8229          $form->entete();          $form->entete();
8230          $form->afficher($champs, 0, false, false);          $form->afficher($champs, 0, false, false);
8231          $form->enpied();          $form->enpied();
8232          // Affichage du bouton          // Affichage du bouton
8233          printf("\t<div class=\"formControls\">\n");          printf("\t<div class=\"formControls\">\n");
8234          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8235          printf("\t</div>\n");          printf("\t</div>\n");
8236          // Fermeture du formulaire          // Fermeture du formulaire
8237          printf("\t</form>\n");          printf("\t</form>\n");
   
8238      }      }
8239    
8240    
# Line 4305  class instruction extends instruction_ge Line 8263  class instruction extends instruction_ge
8263      /**      /**
8264       * VIEW - view_suivi_envoi_lettre_rar.       * VIEW - view_suivi_envoi_lettre_rar.
8265       *       *
8266       * Vu pour imprimer les RAR.       * Vue pour imprimer les AR.
8267       *       *
8268       * @return void       * @return void
8269       */       */
# Line 4313  class instruction extends instruction_ge Line 8271  class instruction extends instruction_ge
8271          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8272          $this->checkAccessibility();          $this->checkAccessibility();
8273    
         // XXX APP  
   
         $f = $this->f;  
   
8274          //          //
8275          if ($f->get_submitted_post_value("date") !== null) {          if ($this->f->get_submitted_post_value("date") !== null) {
8276              $date = $f->get_submitted_post_value("date");              $date = $this->f->get_submitted_post_value("date");
8277          } else {          } else {
8278              $date = "";              $date = "";
8279          }          }
8280          //          //
8281          if ($f->get_submitted_post_value("liste_code_barres_instruction") !== null) {          if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8282              $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");
8283          } else {          } else {
8284              $liste_code_barres_instruction = "";              $liste_code_barres_instruction = "";
8285          }          }
# Line 4351  class instruction extends instruction_ge Line 8305  class instruction extends instruction_ge
8305           * Validation du formulaire           * Validation du formulaire
8306           */           */
8307          // Si le formulaire a été validé          // Si le formulaire a été validé
8308          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
8309              //              //
8310              if (empty($date) || empty($liste_code_barres_instruction)) {              if (empty($date) || empty($liste_code_barres_instruction)) {
8311                  //                  //
8312                  $message_class = "error";                  $message_class = "error";
8313                  $message = _("Tous les champs doivent etre remplis.");                  $message = __("Tous les champs doivent etre remplis.");
8314              } else {              } else {
8315                  // Création d'un tableau d'instruction                  // Création d'un tableau d'instruction
8316                  $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"));
8317                  //                  //
8318                  foreach ($liste as $code_barres) {                  foreach ($liste as $code_barres) {
8319                      // On enlève les éventuels espaces saisis                      // On enlève les éventuels espaces saisis
# Line 4395  class instruction extends instruction_ge Line 8349  class instruction extends instruction_ge
8349                              $conditions = implode(" OR ", $group_clause);                              $conditions = implode(" OR ", $group_clause);
8350                              $sql .= " AND (" . $conditions . ")";                              $sql .= " AND (" . $conditions . ")";
8351    
8352                              $nbInstr = $f->db->getone($sql);                              $qres = $this->f->get_one_result_from_db_query(
8353                              $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                                  $sql,
8354                              $f->isDatabaseError($nbInstr);                                  array(
8355                              //                                      "origin" => __METHOD__,
8356                              if ($nbInstr == "1") {                                  )
8357                                );
8358    
8359                                if ($qres['result'] == "1") {
8360                                  // Récupération de la date d'envoi de l'instruction bippé                                  // Récupération de la date d'envoi de l'instruction bippé
8361                                  $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(
8362                                  $res = $f->db->query($sql);                                      sprintf(
8363                                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                                          'SELECT
8364                                  $f->isDatabaseError($res);                                              to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8365                                  $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);                                              instruction
8366                                            FROM
8367                                                %1$sinstruction
8368                                            WHERE
8369                                                code_barres = \'%2$s\'',
8370                                            DB_PREFIXE,
8371                                            $this->f->db->escapeSimple($code_barres)
8372                                        ),
8373                                        array(
8374                                            'origin' => __METHOD__
8375                                        )
8376                                    );
8377                                    $row = array_shift($qres['result']);
8378                                  // Si pas de date ou correspond à la date du formulaire on                                  // Si pas de date ou correspond à la date du formulaire on
8379                                  // effectue le traitement                                  // effectue le traitement
8380                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8381                                                                            $instr = $this->f->get_inst__om_dbform(array(
8382                                      require_once '../obj/instruction.class.php';                                          "obj" => "instruction",
8383                                      require_once '../obj/dossier.class.php';                                          "idx" => $row['instruction'],
8384                                                                ));
                                     $instr = new instruction($row['instruction'], $f->db, DEBUG);  
8385                                      $valF = array();                                      $valF = array();
8386                                      foreach($instr->champs as $id => $champ) {                                      foreach($instr->champs as $id => $champ) {
8387                                          $valF[$champ] = $instr->val[$id];                                          $valF[$champ] = $instr->val[$id];
# Line 4422  class instruction extends instruction_ge Line 8390  class instruction extends instruction_ge
8390                                      # 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
8391                                      if ($isAccredited === true                                      if ($isAccredited === true
8392                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8393                                          $dossier = new dossier($instr->getVal("dossier"));                                          $dossier = $this->f->get_inst__om_dbform(array(
8394                                                "obj" => "dossier",
8395                                                "idx" => $instr->getVal("dossier"),
8396                                            ));
8397                                          if ($dossier->is_user_from_allowed_collectivite()){                                          if ($dossier->is_user_from_allowed_collectivite()){
8398                                              $dossierTab[$instr->getVal("dossier")] = $dossier;                                              $dossierTab[$instr->getVal("dossier")] = $dossier;
8399                                          } else {                                          } else {
# Line 4476  class instruction extends instruction_ge Line 8447  class instruction extends instruction_ge
8447                                          $instr->setParameter('maj', 1);                                          $instr->setParameter('maj', 1);
8448                                          $instr->class_actions[1]["identifier"] =                                          $instr->class_actions[1]["identifier"] =
8449                                              "envoi lettre RAR (depuis le menu suivi des pièces)";                                              "envoi lettre RAR (depuis le menu suivi des pièces)";
8450                                          if ($instr->modifier($valF, $f->db, DEBUG) == true) {                                          if ($instr->modifier($valF) == true) {
8451                                              $id4Gen[] = $code_barres;                                              $id4Gen[] = $code_barres;
8452                                              $nbLettres ++;                                              $nbLettres ++;
8453                                          } else {                                          } else {
# Line 4484  class instruction extends instruction_ge Line 8455  class instruction extends instruction_ge
8455                                              if ($error != "") {                                              if ($error != "") {
8456                                                  $error .= "<br/>";                                                  $error .= "<br/>";
8457                                              }                                              }
8458                                              $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."),
8459                                                  $code_barres);                                                  $code_barres);
8460                                              $error .= " ";                                              $error .= " ";
8461                                              $error .= _("Veuillez contacter votre administrateur.");                                              $error .= __("Veuillez contacter votre administrateur.");
8462                                          }                                          }
8463                                      } else {                                      } else {
8464                                          //                                          //
8465                                          if ($error != "") {                                          if ($error != "") {
8466                                              $error .= "<br/>";                                              $error .= "<br/>";
8467                                          }                                          }
8468                                          $error .= sprintf(_("Le document correspondant au                                          $error .= sprintf(__("Le document correspondant au
8469                                              code barres %s n'est pas finalise,                                              code barres %s n'est pas finalise,
8470                                              le bordereau ne sera pas genere."),                                              le bordereau ne sera pas genere."),
8471                                              $code_barres);                                              $code_barres);
# Line 4505  class instruction extends instruction_ge Line 8476  class instruction extends instruction_ge
8476                                      if ($error != "") {                                      if ($error != "") {
8477                                          $error .= "<br/>";                                          $error .= "<br/>";
8478                                      }                                      }
8479                                      $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.");
8480                                  }                                  }
8481                              } else {                              } else {
8482                                  //                                  //
8483                                  if ($error != "") {                                  if ($error != "") {
8484                                      $error .= "<br/>";                                      $error .= "<br/>";
8485                                  }                                  }
8486                                  $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.");
8487                              }                              }
8488                          } else {                          } else {
8489                              //                              //
8490                              if ($error != "") {                              if ($error != "") {
8491                                  $error .= "<br/>";                                  $error .= "<br/>";
8492                              }                              }
8493                              $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");                              $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8494                          }                          }
8495                      }                      }
8496                  }                  }
# Line 4531  class instruction extends instruction_ge Line 8502  class instruction extends instruction_ge
8502           */           */
8503          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8504          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8505              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8506          }          }
8507          // Affichage du message d'erreur          // Affichage du message d'erreur
8508          if(!empty($error)) {          if(!empty($error)) {
8509              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
8510          }          }
8511          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
8512          if ($nbLettres > 0) {          if ($nbLettres > 0) {
# Line 4544  class instruction extends instruction_ge Line 8515  class instruction extends instruction_ge
8515              echo "\n<p>";              echo "\n<p>";
8516              echo "\n<span class=\"ui-icon ui-icon-info\"></span>";              echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8517              echo "\n<span class=\"text\">";              echo "\n<span class=\"text\">";
8518              echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");              echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8519              echo " : \n<br/><br/>";              echo " : \n<br/><br/>";
8520              echo "\n<a class='om-prev-icon pdf-16'";              echo "\n<a class='om-prev-icon pdf-16'";
8521              echo "\n title=\""._("imprimer les RAR")."\"";              echo "\n title=\"".__("imprimer les AR")."\"";
8522              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)."\"";
8523              echo "\n target='_blank'>";              echo "\n target='_blank'>";
8524              echo _("Telecharger le document pour")." ".$nbLettres." "._("RAR");              echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8525              echo "\n</a>";              echo "\n</a>";
8526              echo "\n</span>";              echo "\n</span>";
8527              echo "\n</p>";              echo "\n</p>";
# Line 4558  class instruction extends instruction_ge Line 8529  class instruction extends instruction_ge
8529              if ($isAccredited === true) {              if ($isAccredited === true) {
8530                  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;">';
8531                  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";
8532                  echo _('Dossiers concernés par ce traitement');                  echo __('Dossiers concernés par ce traitement');
8533                  echo "\n</legend>";                  echo "\n</legend>";
8534                  echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";                  echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8535                                    
# Line 4566  class instruction extends instruction_ge Line 8537  class instruction extends instruction_ge
8537                      echo "\n<br/>";                      echo "\n<br/>";
8538                      echo "\n<p>";                      echo "\n<p>";
8539                      echo "\n<span class='text'>";                      echo "\n<span class='text'>";
8540                      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.");
8541                      echo "</span>";                      echo "</span>";
8542                      echo "\n</p>";                      echo "\n</p>";
8543                      echo "\n<br/>";                      echo "\n<br/>";
# Line 4578  class instruction extends instruction_ge Line 8549  class instruction extends instruction_ge
8549                      $code_datd = $inst_datd->getVal('code');                      $code_datd = $inst_datd->getVal('code');
8550    
8551                      $obj = "dossier_instruction";                      $obj = "dossier_instruction";
8552                      if ($code_datd === 'REC' OR $code_datd === 'REG') {                      if ($code_datd === 'REC' || $code_datd === 'REG') {
8553                          $obj = "dossier_contentieux_tous_recours";                          $obj = "dossier_contentieux_tous_recours";
8554                      }                      }
8555                      if ($code_datd === 'IN') {                      if ($code_datd === 'IN') {
# Line 4590  class instruction extends instruction_ge Line 8561  class instruction extends instruction_ge
8561    
8562                      echo "\n<p>";                      echo "\n<p>";
8563                      echo "\n<span class='text'>";                      echo "\n<span class='text'>";
8564                      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') . "\"";
8565                      echo "\n href=\"../scr/form.php?obj=dossier_instruction&action=3&idx=";                      echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8566                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
8567                      echo "\">";                      echo "\">";
8568                      echo "\n</a>";                      echo "\n</a>";
8569    
8570                      echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";                      echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8571                      echo " href=\"../scr/form.php?obj=";                      echo " href=\"".OM_ROUTE_FORM."&obj=";
8572                      echo $obj;                      echo $obj;
8573                      echo "&action=3&idx=";                      echo "&action=3&idx=";
8574                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
# Line 4616  class instruction extends instruction_ge Line 8587  class instruction extends instruction_ge
8587              echo "\n</div>";              echo "\n</div>";
8588              echo "\n</div>";              echo "\n</div>";
8589          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8590          // Ouverture du formulaire          // Ouverture du formulaire
8591          echo "\t<form";          echo "\t<form";
8592          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4627  class instruction extends instruction_ge Line 8596  class instruction extends instruction_ge
8596          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8597          $champs = array("date", "liste_code_barres_instruction");          $champs = array("date", "liste_code_barres_instruction");
8598          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8599          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8600                "validation" => 0,
8601                "maj" => 0,
8602                "champs" => $champs,
8603            ));
8604          // Paramétrage du champ date du formulaire          // Paramétrage du champ date du formulaire
8605          $form->setLib("date", _("Date")."* :");          $form->setLib("date", __("Date")."* :");
8606          $form->setType("date", "date");          $form->setType("date", "date");
8607          $form->setOnchange("date", "fdate(this)");          $form->setOnchange("date", "fdate(this)");
8608          $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));          $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8609          $form->setTaille("date", 10);          $form->setTaille("date", 10);
8610          $form->setMax("date", 10);          $form->setMax("date", 10);
8611          // Paramétrage du champ liste_code_barres_instruction du formulaire          // Paramétrage du champ liste_code_barres_instruction du formulaire
8612          $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")."* :");
8613          $form->setType("liste_code_barres_instruction", "textarea");          $form->setType("liste_code_barres_instruction", "textarea");
8614          $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);          $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8615          $form->setTaille("liste_code_barres_instruction", 20);          $form->setTaille("liste_code_barres_instruction", 20);
# Line 4647  class instruction extends instruction_ge Line 8620  class instruction extends instruction_ge
8620          $form->enpied();          $form->enpied();
8621          // Affichage du bouton          // Affichage du bouton
8622          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
8623          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8624          echo "\t</div>\n";          echo "\t</div>\n";
8625          // Fermeture du formulaire          // Fermeture du formulaire
8626          echo "\t</form>\n";          echo "\t</form>\n";
# Line 4664  class instruction extends instruction_ge Line 8637  class instruction extends instruction_ge
8637          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8638          $this->checkAccessibility();          $this->checkAccessibility();
8639    
         // XXX APP  
   
         $f = $this->f;  
   
8640          // Récupération des valeur passées en POST ou GET          // Récupération des valeur passées en POST ou GET
8641          if($f->get_submitted_post_value("type_mise_a_jour") !== null) {          if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8642              $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");
8643          } elseif($f->get_submitted_get_value('type_mise_a_jour') !== null) {          } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8644              $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');
8645          } else {          } else {
8646              $type_mise_a_jour = "";              $type_mise_a_jour = "";
8647          }          }
8648          if($f->get_submitted_post_value('date') !== null) {          if($this->f->get_submitted_post_value('date') !== null) {
8649              $date = $f->get_submitted_post_value('date');              $date = $this->f->get_submitted_post_value('date');
8650          } elseif($f->get_submitted_get_value('date') !== null) {          } elseif($this->f->get_submitted_get_value('date') !== null) {
8651              $date = $f->get_submitted_get_value('date');              $date = $this->f->get_submitted_get_value('date');
8652          } else {          } else {
8653              $date = "";              $date = "";
8654          }          }
8655          if($f->get_submitted_post_value('code_barres') !== null) {          if($this->f->get_submitted_post_value('code_barres') !== null) {
8656              $code_barres = $f->get_submitted_post_value('code_barres');              $code_barres = $this->f->get_submitted_post_value('code_barres');
8657          } elseif($f->get_submitted_get_value('code_barres') !== null) {          } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8658              $code_barres = $f->get_submitted_get_value('code_barres');              $code_barres = $this->f->get_submitted_get_value('code_barres');
8659          } else {          } else {
8660              $code_barres = "";              $code_barres = "";
8661          }          }
# Line 4698  class instruction extends instruction_ge Line 8667  class instruction extends instruction_ge
8667          $liste_champs=array();          $liste_champs=array();
8668    
8669          // Si le formulaire a été validé          // Si le formulaire a été validé
8670          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
8671              if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {              if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
   
                 // Vérification de l'existence de l'instruction  
                 $sql = "SELECT instruction  
                         FROM ".DB_PREFIXE."instruction  
                             INNER JOIN ".DB_PREFIXE."dossier  
                                 ON dossier.dossier=instruction.dossier  
                             INNER JOIN ".DB_PREFIXE."dossier_instruction_type  
                                 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type  
                             INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille  
                                 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille  
                             INNER JOIN ".DB_PREFIXE."dossier_autorisation_type  
                                 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type  
                             INNER JOIN ".DB_PREFIXE."groupe  
                                 ON dossier_autorisation_type.groupe = groupe.groupe  
                             WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";  
8672    
8673                  // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès                  // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8674                  $group_clause = array();                  $group_clause = array();
# Line 4726  class instruction extends instruction_ge Line 8680  class instruction extends instruction_ge
8680                      $group_clause[$key] .= ")";                      $group_clause[$key] .= ")";
8681                  }                  }
8682                  $conditions = implode(" OR ", $group_clause);                  $conditions = implode(" OR ", $group_clause);
8683                  $sql .= " AND (" . $conditions . ")";                  $groupFilter = " AND (" . $conditions . ")";
   
8684    
8685                  $res = $f->db->query($sql);                  $qres = $this->f->get_all_results_from_db_query(
8686                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                      sprintf(
8687                  $f->isDatabaseError($res);                          'SELECT
8688                                instruction
8689                  if($res->numrows() == 1) {                          FROM
8690                                %1$sinstruction
8691                                INNER JOIN %1$sdossier
8692                                    ON dossier.dossier = instruction.dossier
8693                                INNER JOIN %1$sdossier_instruction_type
8694                                    ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8695                                INNER JOIN %1$sdossier_autorisation_type_detaille
8696                                    ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8697                                INNER JOIN %1$sdossier_autorisation_type
8698                                    ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8699                                INNER JOIN %1$sgroupe
8700                                    ON dossier_autorisation_type.groupe = groupe.groupe
8701                                WHERE
8702                                    code_barres = \'%2$s\'
8703                                    %3$s',
8704                            DB_PREFIXE,
8705                            $this->f->db->escapeSimple($code_barres),
8706                            $groupFilter
8707                        ),
8708                        array(
8709                            'origin' => __METHOD__
8710                        )
8711                    );
8712                    if($qres['row_count'] === 1) {
8713                      $liste_champs = explode(";", $type_mise_a_jour);                      $liste_champs = explode(";", $type_mise_a_jour);
8714                        $row = array_shift($qres['result']);
8715                        $instr = $this->f->get_inst__om_dbform(array(
8716                            "obj" => "instruction",
8717                            "idx" => $row['instruction'],
8718                        ));
8719                      // Mise à jour des dates après l'écran de verification                      // Mise à jour des dates après l'écran de verification
8720                      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);  
8721                          $valF = array();                          $valF = array();
8722                          foreach($instr->champs as $id => $champ) {                          foreach($instr->champs as $id => $champ) {
8723                              $valF[$champ] = $instr->val[$id];                              $valF[$champ] = $instr->val[$id];
# Line 4777  class instruction extends instruction_ge Line 8755  class instruction extends instruction_ge
8755    
8756                          // Vérification de la finalisation du document                          // Vérification de la finalisation du document
8757                          // correspondant au code barres                          // correspondant au code barres
8758                          if($valF["om_final_instruction"] === 't' or                          if($valF["om_final_instruction"] === 't' ||
8759                              $valF["lettretype"] == '') {                              $valF["lettretype"] == '') {
8760                              $code_barres = "";                              $code_barres = "";
8761                                                            
8762                              //Désactivation de l'autocommit                              //Désactivation de l'autocommit
8763                              $f->db->autoCommit(false);                              $this->f->db->autoCommit(false);
8764                                                            
8765                              //On modifie les valeurs de l'instruction                              //On modifie les valeurs de l'instruction
8766                              $instr->setParameter('maj', 170);                              $instr->setParameter('maj', 170);
8767                              $instr->class_actions[170]["identifier"] =                              $instr->class_actions[170]["identifier"] =
8768                              "mise à jour des dates (depuis le menu suivi des pièces)";                              "mise à jour des dates (depuis le menu suivi des pièces)";
8769                              $retour = $instr->modifier($valF, $f->db, DEBUG);                              $retour = $instr->modifier($valF);
8770                                                            
8771                              //Si une erreur s'est produite, on défait les modifications                              //Si une erreur s'est produite, on défait les modifications
8772                              //qui ont été faites                              //qui ont été faites
# Line 4797  class instruction extends instruction_ge Line 8775  class instruction extends instruction_ge
8775                              }                              }
8776                              //Sinon, on valide en base de données les modifications                              //Sinon, on valide en base de données les modifications
8777                              else {                              else {
8778                                  $f->db->commit();                                  $this->f->db->commit();
8779                              }                              }
8780                                                            
8781                              // Variable correct retourné depuis la classe instruction                              // Variable correct retourné depuis la classe instruction
# Line 4814  class instruction extends instruction_ge Line 8792  class instruction extends instruction_ge
8792                              // Indique que le traitement est en erreur                              // Indique que le traitement est en erreur
8793                              $correct = false;                              $correct = false;
8794                              // Message d'erreur                              // Message d'erreur
8795                              $error = sprintf(_("Le document n'est pas finalise."),                              $error = sprintf(__("Le document n'est pas finalise."),
8796                              "<span class='bold'>".$code_barres."</span>");                              "<span class='bold'>".$code_barres."</span>");
8797                          }                          }
8798                      } else {                      } else {
8799                          // Récupération des infos du dossier                          // Récupération des infos du dossier
8800                          $sqlInfo = "SELECT dossier.dossier_libelle,                          $qres = $this->f->get_all_results_from_db_query(
8801                                              evenement.libelle as evenement,                              sprintf(
8802                                              autorite_competente.code as autorite_competente_code,                                  'SELECT
8803                                              autorite_competente.libelle as autorite_competente,                                      dossier.dossier_libelle,
8804                                              evenement.type as evenement_type,                                      evenement.libelle as evenement,
8805                                              to_char(date_envoi_signature,'DD/MM/YYYY')  as date_envoi_signature,                                      autorite_competente.code as autorite_competente_code,
8806                                              to_char(date_retour_signature,'DD/MM/YYYY')  as date_retour_signature,                                      autorite_competente.libelle as autorite_competente,
8807                                              to_char(date_envoi_controle_legalite,'DD/MM/YYYY')  as date_envoi_controle_legalite,                                      evenement.type as evenement_type,
8808                                              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,
8809                                              to_char(date_envoi_rar,'DD/MM/YYYY')  as date_envoi_rar,                                      to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8810                                              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,
8811                                      FROM ".DB_PREFIXE."instruction                                      to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8812                                      INNER JOIN ".DB_PREFIXE."dossier ON                                      to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8813                                          dossier.dossier=instruction.dossier                                      to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8814                                      LEFT JOIN ".DB_PREFIXE."autorite_competente ON                                  FROM
8815                                          dossier.autorite_competente=autorite_competente.autorite_competente                                      %1$sinstruction
8816                                      INNER JOIN ".DB_PREFIXE."evenement ON                                      INNER JOIN %1$sdossier
8817                                          instruction.evenement=evenement.evenement                                          ON dossier.dossier=instruction.dossier
8818                                      WHERE code_barres='".$code_barres."'";                                      LEFT JOIN %1$sautorite_competente
8819                          $resInfo = $f->db->query($sqlInfo);                                          ON dossier.autorite_competente=autorite_competente.autorite_competente
8820                          $f->isDatabaseError($resInfo);                                      INNER JOIN %1$sevenement
8821                          $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);                                          ON instruction.evenement=evenement.evenement
8822                                    WHERE
8823                                        code_barres = \'%2$s\'',
8824                                    DB_PREFIXE,
8825                                    $this->f->db->escapeSimple($code_barres)
8826                                ),
8827                                array(
8828                                    "origin" => __METHOD__
8829                                )
8830                            );
8831                            $infos = array_shift($qres['result']);
8832    
8833                          // Vérification de la non modification des dates de suivi                          // Vérification de la non modification des dates de suivi
8834                          foreach(explode(";", $type_mise_a_jour) as $champ) {                          foreach(explode(";", $type_mise_a_jour) as $champ) {
8835                              if($infos[$champ] != "" AND $infos[$champ] != $date) {                              if ($champ === 'date_envoi_controle_legalite') {
8836                                  $error = _("Les dates de suivis ne peuvent etre modifiees");                                  if ($instr->is_sent_to_cl() === true) {
8837                                        $error = __("Les dates de suivis ne peuvent etre modifiees");
8838                                        $date_error = true;
8839                                        break;
8840                                    }
8841                                }
8842                                if($infos[$champ] != "" && $infos[$champ] != $date) {
8843                                    $error = __("Les dates de suivis ne peuvent etre modifiees");
8844                                  $date_error = true;                                  $date_error = true;
8845                                    break;
8846                              }                              }
8847                          }                          }
8848                      }                      }
8849                  } else {                  } else {
8850                      $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");                      $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
8851                  }                  }
8852    
8853              } else {              } else {
8854                  $error = _("Tous les champs doivent etre remplis.");                  $error = __("Tous les champs doivent etre remplis.");
8855              }              }
8856          }          }
8857    
# Line 4864  class instruction extends instruction_ge Line 8860  class instruction extends instruction_ge
8860           */           */
8861          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8862          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8863              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8864          }          }
8865          // Affichage du message d'erreur          // Affichage du message d'erreur
8866          if(!empty($error)) {          if(!empty($error)) {
8867              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
8868          }          }
8869    
8870          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
8871          if($correct === true) {          if($correct === true) {
8872              $f->displayMessage("ok", _("Saisie enregistree"));              $this->f->displayMessage("ok", __("Saisie enregistree"));
8873          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8874          // Ouverture du formulaire          // Ouverture du formulaire
8875          echo "\t<form";          echo "\t<form";
8876          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4894  class instruction extends instruction_ge Line 8888  class instruction extends instruction_ge
8888              $champs = array("type_mise_a_jour", "date", "code_barres");              $champs = array("type_mise_a_jour", "date", "code_barres");
8889          }          }
8890          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8891          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8892                "validation" => 0,
8893                "maj" => 0,
8894                "champs" => $champs,
8895            ));
8896          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8897          // Parametrage du champ type_mise_a_jour          // Parametrage du champ type_mise_a_jour
8898          $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");          $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
8899          if(isset($infos)) {          if(isset($infos)) {
8900              $form->setType("type_mise_a_jour", "selecthiddenstatic");              $form->setType("type_mise_a_jour", "selecthiddenstatic");
8901    
# Line 4909  class instruction extends instruction_ge Line 8907  class instruction extends instruction_ge
8907          $contenu = array();          $contenu = array();
8908    
8909          $contenu[0][0] = "date_envoi_signature";          $contenu[0][0] = "date_envoi_signature";
8910          $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");          $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
8911    
8912          $contenu[0][1] = "date_retour_signature";          $contenu[0][1] = "date_retour_signature";
8913          $contenu[1][1] = _("date de retour de signature Mairie/Prefet");          $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
8914    
8915          $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";          $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8916          $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");          $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
8917    
8918          $contenu[0][3] = "date_envoi_controle_legalite";          $contenu[0][3] = "date_envoi_controle_legalite";
8919          $contenu[1][3] = _("date d'envoi au controle de legalite");          $contenu[1][3] = __("date d'envoi au controle de legalite");
8920    
8921          $contenu[0][4] = "date_retour_controle_legalite";          $contenu[0][4] = "date_retour_controle_legalite";
8922          $contenu[1][4] = _("date de retour de controle de legalite");          $contenu[1][4] = __("date de retour de controle de legalite");
8923    
8924          $contenu[0][5] = "date_retour_rar";          $contenu[0][5] = "date_retour_rar";
8925          $contenu[1][5] = _("date de retour de l'AR");          $contenu[1][5] = __("date de notification du correspondant");
8926    
8927          $form->setSelect("type_mise_a_jour", $contenu);          $form->setSelect("type_mise_a_jour", $contenu);
8928    
8929          // Parametrage du champ date          // Parametrage du champ date
8930          $form->setLib("date", _("Date")."* :");          $form->setLib("date", __("Date")."* :");
8931          if(isset($infos)) {          if(isset($infos)) {
8932              $form->setType("date", "hiddenstaticdate");              $form->setType("date", "hiddenstaticdate");
8933    
# Line 4941  class instruction extends instruction_ge Line 8939  class instruction extends instruction_ge
8939          $form->setMax("date", 10);          $form->setMax("date", 10);
8940    
8941          // Parametrage du champ code_barres          // Parametrage du champ code_barres
8942          $form->setLib("code_barres", _("Code barres d'instruction")."* :");          $form->setLib("code_barres", __("Code barres d'instruction")."* :");
8943          if(isset($infos)) {          if(isset($infos)) {
8944              $form->setType("code_barres", "hiddenstatic");              $form->setType("code_barres", "hiddenstatic");
8945          } else {          } else {
# Line 4970  class instruction extends instruction_ge Line 8968  class instruction extends instruction_ge
8968              }              }
8969    
8970              // Parametrage du champ dossier              // Parametrage du champ dossier
8971              $form->setLib("dossier_libelle", _("dossier_libelle")." :");              $form->setLib("dossier_libelle", __("dossier_libelle")." :");
8972              $form->setType("dossier_libelle", "static");              $form->setType("dossier_libelle", "static");
8973              $form->setVal("dossier_libelle", $infos['dossier_libelle']);              $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8974    
8975              // Parametrage du champ evenement              // Parametrage du champ evenement
8976              $form->setLib("evenement", _("evenement")." :");              $form->setLib("evenement", __("evenement")." :");
8977              $form->setType("evenement", "static");              $form->setType("evenement", "static");
8978              $form->setVal("evenement", $infos['evenement']);              $form->setVal("evenement", $infos['evenement']);
8979    
8980              // Parametrage du champ autorite_competente              // Parametrage du champ autorite_competente
8981              $form->setLib("autorite_competente", _("Autorite competente")." :");              $form->setLib("autorite_competente", __("Autorite competente")." :");
8982              $form->setType("autorite_competente", "static");              $form->setType("autorite_competente", "static");
8983              $form->setVal("autorite_competente", $infos['autorite_competente']);              $form->setVal("autorite_competente", $infos['autorite_competente']);
8984    
8985              // Parametrage des libellés d'envoi avec RAR              // Parametrage des libellés d'envoi avec AR
8986              $form->setLib("date_envoi_rar", _("date_envoi_rar")." :");              $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8987              $form->setLib("date_retour_rar", _("date_retour_rar")." :");              $form->setLib("date_retour_rar", __("date_notification")." :");
8988    
8989              $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");              $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
8990              $form->setLib("date_retour_signature", _("date_retour_signature")." :");              $form->setLib("date_retour_signature", __("date_retour_signature")." :");
8991              $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");              $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
8992              $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");              $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
8993              // Configuration des libellé en fonction de l'autorité compétente              // Configuration des libellé en fonction de l'autorité compétente
8994              if($infos['autorite_competente_code'] == 'ETAT') {              if($infos['autorite_competente_code'] == 'ETAT') {
8995                  $form->setType("date_envoi_controle_legalite", "hiddendate");                  $form->setType("date_envoi_controle_legalite", "hiddendate");
# Line 4999  class instruction extends instruction_ge Line 8997  class instruction extends instruction_ge
8997              }              }
8998    
8999              // 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
9000              $form->setLib("is_valid", _("Valide")." :");              $form->setLib("is_valid", __("Valide")." :");
9001              $form->setType("is_valid", "hidden");              $form->setType("is_valid", "hidden");
9002              $form->setVal("is_valid", 'true');              $form->setVal("is_valid", 'true');
9003    
# Line 5020  class instruction extends instruction_ge Line 9018  class instruction extends instruction_ge
9018          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
9019          //          //
9020          if(!$date_error) {          if(!$date_error) {
9021              $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));              $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9022          }          }
9023          // Si pas sur l'écran de validation          // Si pas sur l'écran de validation
9024          if(isset($infos)) {          if(isset($infos)) {
9025              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";
9026                  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;
9027              echo "\">Retour</a>";              echo "\">Retour</a>";
9028          }          }
# Line 5041  class instruction extends instruction_ge Line 9039  class instruction extends instruction_ge
9039      function view_pdf_lettre_rar() {      function view_pdf_lettre_rar() {
9040          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
9041          $this->checkAccessibility();          $this->checkAccessibility();
9042            //
9043            $this->f->disableLog();
9044    
9045          // XXX APP          if($this->f->get_submitted_get_value('liste') != null) {
9046                $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'));  
9047    
9048              // Classe permettant la mise en page de l'édition pdf              // Classe permettant la mise en page de l'édition pdf
9049              require_once "../obj/pdf_lettre_rar.class.php";              require_once "../obj/pdf_lettre_rar.class.php";
9050              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9051              // Initialisation de la mise en page              // Initialisation de la mise en page
9052              $pdf_lettre_rar->init($f);              $pdf_lettre_rar->init($this->f);
   
             require_once "../obj/dossier.class.php";  
9053    
9054              foreach ($listeCodeBarres as $code_barres) {              foreach ($listeCodeBarres as $code_barres) {
9055    
9056                  // On récupère le dossier                  // On récupère le dossier
9057                  $sql = "SELECT dossier                  $qres = $this->f->get_one_result_from_db_query(
9058                          FROM " . DB_PREFIXE . "instruction                      sprintf(
9059                          WHERE code_barres = '" . $code_barres . "'";                          'SELECT
9060                  $dossier = $this->db->getOne($sql);                              dossier
9061                  $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);                          FROM
9062                  $this->f->isDatabaseError($dossier);                              %1$sinstruction
9063                  $inst_dossier = new dossier($dossier);                          WHERE
9064                                code_barres = \'%2$s\'',
9065                            DB_PREFIXE,
9066                            $this->f->db->escapeSimple($code_barres)
9067                        ),
9068                        array(
9069                            "origin" => __METHOD__,
9070                        )
9071                    );
9072                    
9073                    $inst_dossier = $this->f->get_inst__om_dbform(array(
9074                        "obj" => "dossier",
9075                        "idx" => $qres['result'],
9076                    ));
9077    
9078                  // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes                  // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9079                  $groupe = $inst_dossier->get_type_affichage_formulaire();                  $groupe = $inst_dossier->get_type_affichage_formulaire();
# Line 5081  class instruction extends instruction_ge Line 9086  class instruction extends instruction_ge
9086                          break;                          break;
9087                      case 'ADS':                      case 'ADS':
9088                      case 'DPC':                      case 'DPC':
9089                        case 'CONSULTATION ENTRANTE':
9090                      default:                      default:
9091                          $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";                          $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9092                          break;                          break;
9093                  }                  }
9094    
9095                  // 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é
9096                  $sql = "SELECT                  $qres = $this->f->get_all_results_from_db_query(
9097                        sprintf(
9098                            'SELECT
9099                              dossier.dossier_libelle,                              dossier.dossier_libelle,
9100                              evenement.type,                              evenement.type,
9101                              count(lien_dossier_demandeur) as nbdemandeur,                              count(lien_dossier_demandeur) as nbdemandeur,
9102                              CASE                              CASE
9103                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9104                                      THEN CONCAT(phase.code, ' - ', division.libelle)                                      THEN CONCAT(phase.code, \' - \', division.libelle)
9105                                  ELSE                                  ELSE
9106                                      phase.code                                      phase.code
9107                              END AS code_phase                              END AS code_phase
9108                          FROM ".DB_PREFIXE."instruction                          FROM
9109                          LEFT JOIN ".DB_PREFIXE."dossier                              %1$sinstruction
9110                              ON instruction.dossier = dossier.dossier                              LEFT JOIN %1$sdossier
9111                          LEFT JOIN ".DB_PREFIXE."division                                  ON instruction.dossier = dossier.dossier
9112                              ON dossier.division = division.division                              LEFT JOIN %1$sdivision
9113                          INNER JOIN ".DB_PREFIXE."evenement ON                                  ON dossier.division = division.division
9114                              instruction.evenement=evenement.evenement                              INNER JOIN %1$sevenement
9115                          LEFT JOIN ".DB_PREFIXE."phase                                  ON instruction.evenement=evenement.evenement
9116                              ON evenement.phase = phase.phase                              LEFT JOIN %1$sphase
9117                          inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON                                  ON evenement.phase = phase.phase
9118                              instruction.dossier=lien_dossier_demandeur.dossier                              inner JOIN %1$slien_dossier_demandeur
9119                          inner join ".DB_PREFIXE."demandeur on                                  ON instruction.dossier=lien_dossier_demandeur.dossier
9120                              demandeur.demandeur=lien_dossier_demandeur.demandeur                              inner join %1$sdemandeur
9121                          WHERE code_barres='".$code_barres."'                                  ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9122                              AND " . $sql_demandeur . "                          WHERE
9123                          GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";                              code_barres = \'%2$s\'
9124                                AND %3$s
9125                  $res = $f->db->query($sql);                          GROUP BY
9126                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                              dossier.dossier_libelle,
9127                  $f->isDatabaseError($res);                              evenement.type,
9128                  $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);                              phase.code,
9129                                division.libelle',
9130                            DB_PREFIXE,
9131                            $this->f->db->escapeSimple($code_barres),
9132                            $sql_demandeur
9133                        ),
9134                        array(
9135                            "origin" => __METHOD__
9136                        )
9137                    );
9138                    $testDemandeur = array_shift($qres['result']);
9139                                    
9140    
9141                  // Recuperation de l'adresse de destination                  // 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."'";  
   
9142                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9143                  if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {                  $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9144                      $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";                  if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9145                  } else {                      $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9146                      $sqlAdresse .= " AND " . $sql_demandeur;                  }
9147                  }  
9148                    $qres = $this->f->get_all_results_from_db_query(
9149                  $resAdresse = $f->db->query($sqlAdresse);                      sprintf(
9150                  $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);                          'SELECT
9151                  $f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);                              CASE WHEN demandeur.qualite = \'particulier\'
9152                  $f->isDatabaseError($resAdresse);                                  THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9153                                    ELSE TRIM(demandeur.personne_morale_denomination)
9154                                END  as ligne1,
9155                                CASE WHEN demandeur.qualite = \'personne_morale\'
9156                                    THEN TRIM(demandeur.personne_morale_raison_sociale)
9157                                    ELSE \'\'
9158                                END as ligne1_1,
9159                                CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9160                                    THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9161                                    ELSE \'\'
9162                                END as ligne1_2,
9163                                trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9164                                CASE demandeur.complement
9165                                WHEN null THEN \'\'
9166                                ELSE trim(demandeur.complement)
9167                                END as ligne3,
9168                                CASE demandeur.lieu_dit
9169                                WHEN null THEN \'\'
9170                                ELSE trim(demandeur.lieu_dit)
9171                                END as ligne4,
9172                                CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9173                                    (CASE WHEN demandeur.bp IS NOT NULL
9174                                        THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9175                                        ELSE \'\'
9176                                    END),
9177                                    (CASE WHEN demandeur.cedex IS NOT NULL
9178                                        THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9179                                        ELSE \'\'
9180                                    END))
9181                                as ligne5,
9182                                code_barres as code_barres
9183                            FROM
9184                                %1$sinstruction
9185                                INNER JOIN %1$sdossier
9186                                    ON dossier.dossier = instruction.dossier
9187                                INNER JOIN %1$slien_dossier_demandeur
9188                                    ON dossier.dossier = lien_dossier_demandeur.dossier
9189                                INNER JOIN %1$sdemandeur
9190                                    ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9191                                LEFT OUTER JOIN %1$scivilite AS pc
9192                                    ON demandeur.particulier_civilite = pc.civilite
9193                                        OR demandeur.personne_morale_civilite = pc.civilite
9194                            WHERE
9195                                instruction.code_barres = \'%2$s\'
9196                                %3$s',
9197                            DB_PREFIXE,
9198                            $this->f->db->escapeSimple($code_barres),
9199                            $sqlAdresse
9200                        ),
9201                        array(
9202                            "origin" => __METHOD__
9203                        )
9204                    );
9205                    $adresse_dest = array_shift($qres['result']);
9206    
9207                  // Création adresse destinataire sans ligne vide                  // Création adresse destinataire sans ligne vide
9208                  $adresse_destinataire = array();                  $adresse_destinataire = array();
# Line 5207  class instruction extends instruction_ge Line 9238  class instruction extends instruction_ge
9238              }              }
9239              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9240              $om_edition = $this->f->get_inst__om_edition();              $om_edition = $this->f->get_inst__om_edition();
9241                $om_edition->set_object_linked($this);
9242              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9243          }          }
9244      }      }
# Line 5264  class instruction extends instruction_ge Line 9296  class instruction extends instruction_ge
9296                          if($ret === true) {                          if($ret === true) {
9297                              // Message de validation avec lien PDF                              // Message de validation avec lien PDF
9298                              $message_class = "valid";                              $message_class = "valid";
9299                              $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");
9300                              $message .= " : <br/><br/>";                              $message .= " : <br/><br/>";
9301                              $message .= "<a class='om-prev-icon pdf-16'";                              $message .= "<a class='om-prev-icon pdf-16'";
9302                              $message .= " id=\"generer_bordereau_envoi_maire\"";                              $message .= " id=\"generer_bordereau_envoi_maire\"";
9303                              $message .= " title=\""._("Bordereau")."\"";                              $message .= " title=\"".__("Bordereau")."\"";
9304                              $message .= " href='../scr/form.php?obj=instruction";                              $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9305                              $message .= "&action=200";                              $message .= "&action=200";
9306                              $message .= "&idx=".$id_instruction."'";                              $message .= "&idx=".$id_instruction."'";
9307                              $message .= " target='_blank'>";                              $message .= " target='_blank'>";
9308                              $message .= _("Bordereau d'envoi au maire");                              $message .= __("Bordereau d'envoi au maire");
9309                              $message .= "</a><br/><br/>";                              $message .= "</a><br/><br/>";
9310                              $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";                              $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9311                              $message .= _("Code du courrier")." : ".$code_barres."<br/>";                              $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9312                              $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;                              $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9313                                                            
9314                          } else {                          } else {
9315                              // Message d'erreur                              // Message d'erreur
9316                              $message_class = "error";                              $message_class = "error";
9317                              $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."),
9318                                  $code_barres);                                  $code_barres);
9319                          }                          }
9320                      }                      }
9321                      else {                      else {
9322                          $message_class = "error";                          $message_class = "error";
9323                          $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.");
9324                      }                      }
9325                  }                  }
9326                  else {                  else {
9327                      $message_class = "error";                      $message_class = "error";
9328                      $message = _("La date est invalide.");                      $message = __("La date est invalide.");
9329                  }                  }
9330              } else {              } else {
9331                  $message_class = "error";                  $message_class = "error";
9332                  $message = _("Tous les champs doivent etre remplis.");                  $message = __("Tous les champs doivent etre remplis.");
9333              }              }
9334          }          }
9335    
# Line 5310  class instruction extends instruction_ge Line 9342  class instruction extends instruction_ge
9342              $this->f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
9343          }          }
9344    
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
9345          // Ouverture du formulaire          // Ouverture du formulaire
9346          $datasubmit = $this->getDataSubmit();          $datasubmit = $this->getDataSubmit();
9347          echo "\n<!-- ########## START DBFORM ########## -->\n";          echo "\n<!-- ########## START DBFORM ########## -->\n";
# Line 5328  class instruction extends instruction_ge Line 9358  class instruction extends instruction_ge
9358          $champs = array("code_barres","date");          $champs = array("code_barres","date");
9359    
9360          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
9361          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
9362                "validation" => 0,
9363                "maj" => 0,
9364                "champs" => $champs,
9365            ));
9366    
9367          $template_required_label = '%s *';          $template_required_label = '%s *';
9368          // Parametrage du champ code_barres          // Parametrage du champ code_barres
# Line 5357  class instruction extends instruction_ge Line 9391  class instruction extends instruction_ge
9391          // Affichage du bouton          // Affichage du bouton
9392          printf("\t<div class=\"formControls\">\n");          printf("\t<div class=\"formControls\">\n");
9393          //          //
9394          $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9395          printf("\t</div>\n");          printf("\t</div>\n");
9396          // Fermeture du formulaire          // Fermeture du formulaire
9397          printf("\t</form>\n");          printf("\t</form>\n");
# Line 5387  class instruction extends instruction_ge Line 9421  class instruction extends instruction_ge
9421      }      }
9422    
9423      /**      /**
9424         * VIEW - view_rapport_instruction.
9425         *
9426         * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9427         * Cette action est bindée pour utiliser la fonction popUpIt.
9428         *
9429         * @return void
9430         */
9431        function view_overlay_notification_manuelle() {
9432    
9433            // Vérification de l'accessibilité sur l'élément
9434            $this->checkAccessibility();
9435    
9436            printf(
9437                '<script type="text/javascript" >
9438                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9439                </script>',
9440                'instruction_notification_manuelle',
9441                OM_ROUTE_SOUSFORM,
9442                $this->getVal($this->clePrimaire),
9443                $this->getVal('dossier')
9444            );
9445        }
9446    
9447        /**
9448         * VIEW - view_overlay_notification_service_consulte.
9449         *
9450         * Ouvre le sous-formulaire de notification des services consulte
9451         * en ajaxIt dans un overlay.
9452         * Cette action est bindée pour utiliser la fonction popUpIt.
9453         *
9454         * @return void
9455         */
9456        function view_overlay_notification_service_consulte() {
9457    
9458            // Vérification de l'accessibilité sur l'élément
9459            $this->checkAccessibility();
9460    
9461            printf(
9462                '<script type="text/javascript" >
9463                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9464                </script>',
9465                'instruction_notification_manuelle',
9466                OM_ROUTE_SOUSFORM,
9467                $this->getVal($this->clePrimaire),
9468                $this->getVal('dossier')
9469            );
9470        }
9471        
9472        /**
9473         * VIEW - overlay_notification_tiers_consulte.
9474         *
9475         * Ouvre le sous-formulaire de notification des tiers consulte
9476         * en ajaxIt dans un overlay.
9477         * Cette action est bindée pour utiliser la fonction popUpIt.
9478         *
9479         * @return void
9480         */
9481        function view_overlay_notification_tiers_consulte() {
9482    
9483            // Vérification de l'accessibilité sur l'élément
9484            $this->checkAccessibility();
9485    
9486            printf(
9487                '<script type="text/javascript" >
9488                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9489                </script>',
9490                'instruction_notification_manuelle',
9491                OM_ROUTE_SOUSFORM,
9492                $this->getVal($this->clePrimaire),
9493                $this->getVal('dossier')
9494            );
9495        }
9496    
9497        /**
9498         * VIEW - view_modale_selection_document_signe
9499         *
9500         * Ouvre le sous-formulaire de notification des services consulte
9501         * en ajaxIt dans un overlay.
9502         * Cette action est bindée pour utiliser la fonction popUpIt.
9503         *
9504         * @return void
9505         */
9506        function view_modale_selection_document_signe() {
9507    
9508            // Vérification de l'accessibilité sur l'élément
9509            $this->checkAccessibility();
9510    
9511            printf(
9512                '<script type="text/javascript" >
9513                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9514                </script>',
9515                'instruction_modale',
9516                OM_ROUTE_SOUSFORM,
9517                $this->getVal($this->clePrimaire),
9518                $this->getVal('dossier')
9519            );
9520        }
9521        
9522        /**
9523       * 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
9524       * pour exclure les dossiers du groupe contentieux.       * pour exclure les dossiers du groupe contentieux.
9525       *       *
# Line 5396  class instruction extends instruction_ge Line 9529  class instruction extends instruction_ge
9529      function get_instruction_by_barcode($barcode) {      function get_instruction_by_barcode($barcode) {
9530          // Begin          // Begin
9531          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9532    
9533          // Vérification de l'existence de l'événement d'instruction          // Vérification de l'existence de l'événement d'instruction
9534          // 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
9535          $sql = "SELECT instruction          $qres = $this->f->get_one_result_from_db_query(
9536                  FROM ".DB_PREFIXE."instruction              sprintf(
9537                      INNER JOIN ".DB_PREFIXE."dossier                  'SELECT
9538                        instruction
9539                    FROM
9540                        %1$sinstruction
9541                        INNER JOIN %1$sdossier
9542                          ON dossier.dossier=instruction.dossier                          ON dossier.dossier=instruction.dossier
9543                      INNER JOIN ".DB_PREFIXE."dossier_instruction_type                      INNER JOIN %1$sdossier_instruction_type
9544                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9545                      INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                      INNER JOIN %1$sdossier_autorisation_type_detaille
9546                          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
9547                      INNER JOIN ".DB_PREFIXE."dossier_autorisation_type                      INNER JOIN %1$sdossier_autorisation_type
9548                          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
9549                      INNER JOIN ".DB_PREFIXE."groupe                      INNER JOIN %1$sgroupe
9550                          ON dossier_autorisation_type.groupe = groupe.groupe                          ON dossier_autorisation_type.groupe = groupe.groupe
9551                              AND groupe.code != 'CTX'                              AND groupe.code != \'CTX\'
9552                  WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";                  WHERE
9553          $res = $this->f->db->getOne($sql);                      code_barres = \'%2$s\'',
9554          $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);                  DB_PREFIXE,
9555          $this->f->isDatabaseError($res);                  $this->f->db->escapeSimple($barcode)
9556                ),
9557                array(
9558                    "origin" => __METHOD__,
9559                )
9560            );
9561            
9562          // Retourne résultat          // Retourne résultat
9563          return $this->end_treatment(__METHOD__, $res);          return $this->end_treatment(__METHOD__, $qres['result']);
9564      }      }
9565    
9566      /**      /**
# Line 5434  class instruction extends instruction_ge Line 9578  class instruction extends instruction_ge
9578          // Begin          // Begin
9579          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9580          // Requête          // Requête
9581          $res = $this->db->autoExecute(          $res = $this->f->db->autoexecute(
9582              DB_PREFIXE.$this->table,              DB_PREFIXE.$this->table,
9583              $valF,              $valF,
9584              DB_AUTOQUERY_UPDATE,              DB_AUTOQUERY_UPDATE,
9585              $this->getCle($id)              $this->getCle($id)
9586          );          );
9587          // S'il y a eu une erreur          $this->addToLog(
9588          if (database::isError($res, true)) {              __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9589                VERBOSE_MODE
9590            );
9591            if ($this->f->isDatabaseError($res, true) !== false) {
9592              $this->end_treatment(__METHOD__, false);              $this->end_treatment(__METHOD__, false);
9593          }          }
9594          //          //
# Line 5459  class instruction extends instruction_ge Line 9606  class instruction extends instruction_ge
9606          if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {          if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9607              $this->valF['created_by_commune'] = true;              $this->valF['created_by_commune'] = true;
9608          }          }
9609    
9610            //
9611            if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9612                if (isset($this->valF['flag_edition_integrale']) === true) {
9613                    unset($this->valF['flag_edition_integrale']);
9614                }
9615                if (isset($this->valF['signataire_arrete']) === true) {
9616                    unset($this->valF['signataire_arrete']);
9617                }
9618            }
9619      }      }
9620    
9621    
# Line 5604  class instruction extends instruction_ge Line 9761  class instruction extends instruction_ge
9761          // 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
9762          // dites de TREATMENT.          // dites de TREATMENT.
9763          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9764          // Définition des paramètres          $message = __('Erreur de paramétrage :');
9765          $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';          $erreurParametrage = false;
9766          $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  
9767          $id_di = $this->getVal('dossier');          $id_di = $this->getVal('dossier');
         $id_inst = $this->getVal($this->clePrimaire);  
         // Instanciation du DI  
9768          $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  
9769          $collectivite_di = $di->getVal('om_collectivite');          $collectivite_di = $di->getVal('om_collectivite');
9770          $params_mono = $this->f->getCollectivite($collectivite_di);          // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9771          // Récupération du paramétrage de la collectivité multi          $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9772          $collectivite_multi = $this->f->get_idx_collectivite_multi();          if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9773          $params_multi = $this->f->getCollectivite($collectivite_multi);              $erreurParametrage = true;
9774          // Vérification de l'objet (obligatoirement multi)              $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9775          $objet = null;          }
9776          if (isset($params_multi[$p_objet]) === true  
9777              && $params_multi[$p_objet] !== '') {          // Récupération de la liste des mails
9778              $objet = $params_multi[$p_objet];          $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9779          }          if (empty($adresses)) {
9780          // Vérification du modèle mono en priorité              $erreurParametrage = true;
9781          $modele = null;              $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9782          if (isset($params_mono[$p_modele]) === true          }
9783              && $params_mono[$p_modele] !== '') {  
9784              $modele = $params_mono[$p_modele];          // Vérification du paramétrage des mails
9785                        $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9786          }          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9787          // Sinon vérification du modèle multi              $erreurParametrage = true;
9788          if ($modele === null              $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9789              && isset($params_multi[$p_modele]) === true          }
9790              && $params_multi[$p_modele] !== '') {          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9791              $modele = $params_multi[$p_modele];              $erreurParametrage = true;
9792          }              $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9793          // Vérification des adresses de courriel mono          }
9794          $courriels_valides = array();  
9795          $courriels_invalides = array();          // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9796          if (isset($params_mono[$p_courriel]) === true          // un message a destination de l'utilisateur est affiché
9797              && $params_mono[$p_courriel] !== '') {          if ($erreurParametrage) {
9798              // Un mail par ligne              $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9799              $adresses = explode("\n", $params_mono[$p_courriel]);              $this->addToMessage($message);
9800              // 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;  
                 }  
             }  
9801          }          }
9802          // Vérification du paramétrage global :  
9803          // 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
9804          if ($objet === null          foreach ($adresses as $adresse) {
9805              || $modele === null              // Ajout de la notif et récupération de son id
9806              || count($courriels_valides) === 0              $destinataire = array(
9807              || count($courriels_invalides) > 0) {                  'destinataire' => $adresse,
9808              // On construit le message d'erreur adéquat                  'courriel' => $adresse
9809              $this->addToMessage(_('Erreur de paramétrage :'));              );
9810              if ($objet === null) {              $idNotif = $this->ajouter_notification(
9811                  $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));                  $this->getVal($this->clePrimaire),
9812              }                  $this->f->get_connected_user_login_name(),
9813              if ($modele === null) {                  $destinataire,
9814                  $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));                  $collectivite_di
9815              }              );
9816              if (count($courriels_valides) === 0) {              if ($idNotif === false) {
9817                  $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));                  $this->addToMessage(__("Veuillez contacter votre administrateur."));
9818                    return $this->end_treatment(__METHOD__, false);
9819              }              }
9820              if (count($courriels_invalides) > 0) {              // Création de la tache en lui donnant l'id de la notification
9821                  $courriels_invalides = implode(', ', $courriels_invalides);              $notification_by_task = $this->notification_by_task(
9822                  $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);                  $idNotif,
9823                    $this->getVal('dossier'),
9824                    'mail',
9825                    'notification_commune'
9826                );
9827                if ($notification_by_task === false) {
9828                    $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9829                    $this->addToMessage(__("Veuillez contacter votre administrateur."));
9830                    return $this->end_treatment(__METHOD__, false);
9831              }              }
             $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);  
         }  
         // Ajout du log  
         $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);  
9832          }          }
9833          // Message de validation          $this->addToMessage(__('La commune a été notifiée.'));
         $this->addToMessage(_('La commune a été notifiée.'));  
9834          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
9835      }      }
9836    
9837      /**      /**
      * 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;  
     }  
   
   
     /**  
9838       * Récupère l'instance de l'instructeur       * Récupère l'instance de l'instructeur
9839       *       *
9840       * @param integer $instructeur Identifiant de l'instructeur.       * @param integer $instructeur Identifiant de l'instructeur.
# Line 5825  class instruction extends instruction_ge Line 9922  class instruction extends instruction_ge
9922              $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");              $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9923          //          //
9924          if ($id_dossier !== "") {          if ($id_dossier !== "") {
9925              require_once "../obj/dossier_instruction.class.php";              $dossier = $this->f->get_inst__om_dbform(array(
9926              $dossier = new dossier_instruction($id_dossier, $f->db, DEBUG);                  "obj" => "dossier_instruction",
9927                    "idx" => $id_dossier,
9928                ));
9929              //              //
9930              return $dossier->can_user_access_dossier();              return $dossier->can_user_access_dossier();
9931          }          }
# Line 5846  class instruction extends instruction_ge Line 9945  class instruction extends instruction_ge
9945          $id_dossier = $this->getVal('dossier');          $id_dossier = $this->getVal('dossier');
9946          //          //
9947          if ($id_dossier !== "" && $id_dossier !== null) {          if ($id_dossier !== "" && $id_dossier !== null) {
9948              require_once "../obj/dossier_instruction.class.php";              $dossier = $this->f->get_inst__om_dbform(array(
9949              $dossier = new dossier_instruction($id_dossier, $f->db, DEBUG);                  "obj" => "dossier_instruction",
9950                    "idx" => $id_dossier,
9951                ));
9952              //              //
9953              return $dossier->can_user_access_dossier();              return $dossier->can_user_access_dossier();
9954          }          }
9955          return false;          return false;
9956      }      }
9957    
9958  }// fin classe      /**
9959         * TREATMENT - envoyer_a_signature_sans_relecture
9960         *
9961         * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9962         *
9963         * @return boolean true si l'envoi a été effectué avec succès false sinon
9964         */
9965        function envoyer_a_signature_sans_relecture() {
9966            return $this->envoyer_a_signature();
9967        }
9968    
9969        /**
9970         * TREATMENT - envoyer_a_signature_avec_relecture
9971         *
9972         * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9973         *
9974         * @return boolean true si l'envoi a été effectué avec succès false sinon
9975         */
9976        function envoyer_a_signature_avec_relecture() {
9977            $is_forced_view_files = true;
9978            return $this->envoyer_a_signature($is_forced_view_files);
9979        }
9980    
9981        /**
9982         * TREATMENT - envoyer_a_signature
9983         *
9984         * Permet d'envoyer le document de l'instruction au parapheur pour signature
9985         *
9986         * @param  boolean  $is_forced_view_files  Indique si il y a une relecture (true) ou non (false)
9987         *
9988         * @return boolean true si l'envoi a été effectué avec succès false sinon
9989         */
9990        function envoyer_a_signature($is_forced_view_files = false) {
9991            $this->begin_treatment(__METHOD__);
9992            $this->correct = true;
9993    
9994            // Instanciation de l'objet signataire_arrete
9995            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9996                'obj' => 'signataire_arrete',
9997                'idx' => $this->getVal('signataire_arrete'),
9998            ));
9999    
10000            // Instanciation de l'objet dossier
10001            $inst_dossier = $this->f->get_inst__om_dbform(array(
10002                'obj' => 'dossier',
10003                'idx' => $this->getVal('dossier'),
10004            ));
10005    
10006            //Instanciation de la classe electronicsignature
10007            $inst_es = $this->get_electronicsignature_instance();
10008            if ($inst_es === false) {
10009                $this->correct = false;
10010                return $this->end_treatment(__METHOD__, false);
10011            }
10012    
10013            // Vérifie si la notification se fait via l'application ou via le parapheur
10014            try {
10015                $notification_required = $inst_es->signer_notification_is_delegated();
10016            } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10017                // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10018                $notification_required = false;
10019            }
10020    
10021            // Si la notification est faite par l'application vérifie que l'adresse mail du
10022            // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10023            // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10024            // notification
10025            if ($notification_required === true) {
10026                $signer_mail = $inst_signataire_arrete->getVal('email');
10027                $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10028        
10029                $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10030    
10031                if (empty($signer_mail)) {
10032                    $this->correct = false;
10033                    $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10034                    $this->addToMessage($err_msg.$err_detail);
10035                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10036                    return $this->end_treatment(__METHOD__, false);
10037                }
10038                if (! $this->f->checkValidEmailAddress($signer_mail)) {
10039                    $this->correct = false;
10040                    $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10041                    $this->addToMessage($err_msg.$err_detail);
10042                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10043                    return $this->end_treatment(__METHOD__, false);
10044                }
10045            }
10046    
10047            // Récupération du document à signer
10048            $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10049            if ($file === OP_FAILURE) {
10050                $this->correct = false;
10051                $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10052                // Termine le traitement
10053                return $this->end_treatment(__METHOD__, false);
10054            }
10055    
10056            // Initialisation des paramètre à passer pour l'envoi en signature
10057            $this->f->getUserInfos();
10058            $data = array(
10059                "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10060                "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10061                "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10062                "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10063                "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10064                // Permet d'envoyer en signature l'instruction le jour de la date limite
10065                "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10066                "dossier" => $this->getVal('dossier'),
10067                "is_forced_view_files" => $is_forced_view_files,
10068                'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10069                'instruction' => $this->getVal($this->clePrimaire),
10070                'last_statut_signature' => $this->getVal('statut_signature'),
10071                'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10072            );
10073    
10074            // Initialisation des métadonnées
10075            $metadonnee_dossier = $file['metadata'];
10076            // Récupération du libellé du document transmis au parapheur
10077            $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10078            $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10079    
10080            $metadonnee_dossier['url_di'] = sprintf(
10081                '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
10082                $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10083                $this->getVal('dossier')
10084            );
10085    
10086            $optional_data = null;
10087            // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10088            if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10089                $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10090                if (json_last_error() !== JSON_ERROR_NONE) {
10091                    $this->correct = false;
10092                    $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10093                    $this->addToLog(__METHOD__."(): ".
10094                        __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10095                            Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10096                    );
10097                    // Termine le traitement
10098                    return $this->end_treatment(__METHOD__, false);
10099                }
10100            }
10101    
10102            // Appel de la méthode de l'abstracteur send_for_signature()
10103            // Cette méthode doit retourner un tableau de valeur
10104            try {
10105                $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10106            }  catch (electronicsignature_exception $e) {
10107                $this->handle_electronicsignature_exception($e);
10108                return $this->end_treatment(__METHOD__, false);
10109            }
10110    
10111            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10112            $valF = array();
10113    
10114            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10115            foreach($this->champs as $identifiant => $champ) {
10116                $valF[$champ] = $this->val[$identifiant];
10117            }
10118            // On fait ensuite nos modifications spécifiques
10119            $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10120            $valF['statut_signature'] = $result['statut'];
10121            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10122            $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10123            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10124            $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10125            $this->setParameter("maj", 1);
10126            $ret = $this->modifier($valF);
10127    
10128            if ($ret === false) {
10129                $this->correct = false;
10130                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10131                // Termine le traitement
10132                return $this->end_treatment(__METHOD__, false);
10133            }
10134    
10135            // Notification du signataire
10136            if ($notification_required === true) {
10137                if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10138                    $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10139                    $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10140                    $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10141                    // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10142                    // precedemment
10143                    $this->init_record_data($this->getVal($this->clePrimaire));
10144                    $this->annuler_envoi_en_signature();
10145                    $this->correct = false;
10146                    return $this->end_treatment(__METHOD__, true);
10147                }
10148            }
10149    
10150            // Message
10151            $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10152            if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10153                && array_key_exists('signature_page_url', $result) === true) {
10154                $this->addToMessage(sprintf(
10155                    '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10156                    $result['signature_page_url'],
10157                    __("Signez directement le document")
10158                ));
10159            }
10160            if ($notification_required !== true) {
10161                $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10162            }
10163    
10164            // Tout s'est bien passé, on termine le traitement
10165            return $this->end_treatment(__METHOD__, true);
10166        }
10167    
10168        /**
10169         * Notifie le signataire d'un document à signer.
10170         * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10171         * En cas d'erreur ajoute une ligne dans les logs de l'application.
10172         *
10173         * @param  string  $signer_name         Nom du signataire
10174         * @param  string  $signer_mail         Mail du signataire
10175         * @param  string  $user_name           Nom de l'utilisateur openADS courant
10176         *
10177         * @return boolean  true si succés, false si erreur
10178         */
10179        protected function notify_signer($signer_name, $signer_mail, $user_name) {
10180            // message d'erreur
10181            $err_msg_log = sprintf(
10182                __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10183                $signer_name,
10184                $signer_mail,
10185                $this->getVal($this->clePrimaire)
10186            );
10187            $err_msg = sprintf(
10188                '%s %s (%s)"',
10189                __("Échec de la notification du signataire"),
10190                $signer_name,
10191                $signer_mail
10192            );
10193    
10194            // vérification des informations requises
10195            if (empty($signer_name)) {
10196                $err_detail = __("le nom du signataire est vide");
10197                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10198                $this->addToMessage($err_msg.', '.$err_detail);
10199                return false;
10200            }
10201            if (empty($signer_mail)) {
10202                $err_detail = __("le courriel du signataire est vide");
10203                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10204                $this->addToMessage($err_msg.', '.$err_detail);
10205                return false;
10206            }
10207            if (empty($this->getVal('dossier'))) {
10208                $err_detail = __("l'identifiant du dossier est vide");
10209                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10210                $this->addToMessage($err_msg.', '.$err_detail);
10211                return false;
10212            }
10213    
10214            // ajout de la notification à la liste des notifications de l'instruction
10215            $instruction_id = $this->getVal($this->clePrimaire);
10216            $inst_notif = $this->f->get_inst__om_dbform(array(
10217                "obj" => "instruction_notification",
10218                "idx" => "]",
10219            ));
10220            $notif_val = array(
10221                'instruction_notification' => null,
10222                'instruction' => $instruction_id,
10223                'automatique' => true,
10224                'emetteur' => $user_name,
10225                'date_envoi' => null,
10226                'destinataire' => "$signer_name <$signer_mail>",
10227                'courriel' => $signer_mail,
10228                'date_premier_acces' => null,
10229                'statut' => '',
10230                'commentaire' => ''
10231            );
10232            $add_notif = $inst_notif->ajouter($notif_val);
10233            if ($add_notif === false) {
10234                $err_detail = __("Échec de l'ajout de la notification.");
10235                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10236                $this->addToMessage($err_msg);
10237                return false;
10238            }
10239            $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10240    
10241            // ajout d'une tâche de notification (envoi du mail)
10242            $notification_task = $this->notification_by_task(
10243                $notification_id,
10244                $this->getVal('dossier'),
10245                'mail',
10246                'notification_signataire'
10247            );
10248            if ($notification_task === false) {
10249                $err_detail = sprintf(
10250                    __("Échec de l'ajout de la tâche de notification (notification %s)."),
10251                    $notification_id);
10252                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10253                $this->addToMessage($err_msg);
10254                return false;
10255            }
10256    
10257            // Vérification de la réussite de l'envoi du mail
10258            // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10259            // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10260            // qui viens d'être créée.
10261            // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10262            $qres = $this->f->get_one_result_from_db_query(
10263                sprintf(
10264                    'SELECT
10265                        state
10266                    FROM
10267                        %1$stask
10268                    WHERE
10269                        type = \'notification_signataire\'
10270                        AND category = \'mail\'
10271                        AND dossier = \'%2$s\'
10272                    ORDER BY
10273                        task DESC
10274                    LIMIT 1',
10275                    DB_PREFIXE,
10276                    $this->f->db->escapeSimple($this->getVal('dossier'))
10277                ),
10278                array(
10279                    'origin' => __METHOD__
10280                )
10281            );
10282            if ($qres['result'] === 'error') {
10283                $err_detail = sprintf(
10284                    __("Échec de l'envoi du mail de notification (notification %s)."),
10285                    $notification_id);
10286                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10287                $this->addToMessage($err_msg);
10288                return false;
10289            }
10290            // TODO gérer les autres cas (gestion d'erreur)
10291    
10292            // succès de la planification de la notification
10293            $this->addToMessage(sprintf(
10294                __('Le signataire "%s (%s)" sera notifié prochainement'),
10295                $signer_name,
10296                $signer_mail));
10297            return true;
10298        }
10299    
10300        /**
10301         * Permet de récupérer la bonne date limite en fonction de si l'instruction
10302         * est en incomplet notifié ou non.
10303         * On peut ajouter des jours à cette date grâce au paramètre "delay".
10304         * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10305         * l'instruction en signature le jour de la date limite.
10306         *
10307         * @param int $delay Le nombre de jour à ajouter à la date limite.
10308         *
10309         * @return string $date_limite la date limite calculé ou false
10310         */
10311        private function compute_date_limite($delay) {
10312            // Instanciation de l'objet dossier
10313            $inst_dossier = $this->f->get_inst__om_dbform(array(
10314                'obj' => 'dossier',
10315                'idx' => $this->getVal('dossier'),
10316            ));
10317    
10318            $date_to_compute = null;
10319            if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10320              $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10321            } else {
10322              $date_to_compute = $inst_dossier->getVal('date_limite');
10323            }
10324            if ($date_to_compute != null) {
10325                return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10326            }
10327    
10328            return null;
10329        }
10330    
10331        /**
10332         * Permet de récupérer la traduction de la valeur de statut_signature
10333         *
10334         * @return string la valeur de statut_signature traduite | false
10335         */
10336        function get_trad_for_statut($value_to_trad){
10337            $statut_signature_tab = array(
10338                'waiting' => __('en préparation'),
10339                'in_progress' => __('en cours de signature'),
10340                'canceled' => __('signature annulée'),
10341                'expired' => __('délai de signature expiré'),
10342                'finished' => __('signé')
10343            );
10344            if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10345                return $statut_signature_tab[$value_to_trad];
10346            }
10347    
10348            return false;
10349        }
10350    
10351        /**
10352         * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10353         *
10354         * @return string (json) la valeur de historique_signature mis à jour | false
10355         */
10356        function get_updated_historique_signature($historique_signature_values) {
10357            
10358            $historique_signature_value_tab = $this->get_historique_signature_decoded();
10359    
10360            if ($historique_signature_value_tab === false) {
10361                $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10362                return false;
10363            }
10364    
10365            $last_val_historique_signature = array();
10366    
10367            // Si la tableau récupéré n'est pas vide alors
10368            // on récupère la dernière ligne du tableau
10369            if (empty($historique_signature_value_tab) === false) {
10370                $last_val_historique_signature = end($historique_signature_value_tab);
10371            }
10372    
10373            $format_date = '';
10374            $format_date_hour = '';
10375            $date_converted=array();
10376    
10377            $date_to_convert = array(
10378                'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10379                'date_limite_instruction' => $this->compute_date_limite(0),
10380                'date_retour_signature' => $historique_signature_values['date_retour_signature']
10381            );
10382    
10383            // Conversion des dates en fonction de leur format
10384            foreach ($date_to_convert as $key => $value) {
10385                $date_converted[$key] = null;
10386                if ($value != null) {
10387                    $format_date = 'd/m/Y';
10388                    $format_date_hour = 'd/m/Y H:i:s';
10389                    $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10390                }
10391            }
10392    
10393            // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10394            // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10395            // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10396            $tab_for_columns_trad = array(
10397                __('entry_date'),
10398                __('id_parapheur_signature'),
10399                __('emetteur'),
10400                __('signataire'),
10401                __('date_envoi'),
10402                __('date_limite'),
10403                __('date_retour'),
10404                __('statut_signature'),
10405                __('commentaire_signature')
10406            );
10407    
10408            array_push($historique_signature_value_tab, array(
10409                'entry_date' => date('d/m/Y H:i:s'),
10410                'id_parapheur_signature' => $historique_signature_values['id_parapheur_signature'] == null ? (isset($last_val_historique_signature['id_parapheur_signature']) === true ? $last_val_historique_signature['id_parapheur_signature'] : null) : $historique_signature_values['id_parapheur_signature'],
10411                'emetteur' => $historique_signature_values['om_utilisateur_email'] == null ? (isset($last_val_historique_signature['emetteur']) === true ? $last_val_historique_signature['emetteur'] : null) : $historique_signature_values['om_utilisateur_email'],
10412                'signataire' => $historique_signature_values['signataire_arrete_email'] == null ? (isset($last_val_historique_signature['signataire']) === true ? $last_val_historique_signature['signataire'] : null) : $historique_signature_values['signataire_arrete_email'],
10413                'date_envoi' => $historique_signature_values['date_envoi_signature'] == null ? (isset($last_val_historique_signature['date_envoi']) === true ? $last_val_historique_signature['date_envoi'] : null) : $date_converted['date_envoi_signature'],
10414                'date_limite' => $historique_signature_values['date_limite_instruction'] == null ? (isset($last_val_historique_signature['date_limite']) === true ? $last_val_historique_signature['date_limite'] : null) : $date_converted['date_limite_instruction'],
10415                'date_retour' => $historique_signature_values['date_retour_signature'] == null ? (isset($last_val_historique_signature['date_retour']) === true ? $last_val_historique_signature['date_retour'] : null) : $date_converted['date_retour_signature'],
10416                'statut_signature' => $historique_signature_values['statut'] == null ? (isset($last_val_historique_signature['statut_signature']) === true ? $last_val_historique_signature['statut_signature'] : null) : $this->get_trad_for_statut($historique_signature_values['statut']),
10417                'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10418            ));
10419            
10420            return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10421        }
10422        
10423        /**
10424         * TREATMENT - annuler_envoi_en_signature
10425         *
10426         * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10427         *
10428         * @return boolean true si l'annulation a été effectué avec succès false sinon
10429         */
10430        function annuler_envoi_en_signature() {
10431            $this->begin_treatment(__METHOD__);
10432            $this->correct = true;
10433    
10434            //Instanciation de la classe electronicsignature
10435            $inst_es = $this->get_electronicsignature_instance();
10436            if ($inst_es === false) {
10437                $this->correct = false;
10438                return $this->end_treatment(__METHOD__, false);
10439            }
10440    
10441            $data = array();
10442            if (! empty($this->getVal('id_parapheur_signature'))) {
10443                $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10444            } else {
10445                $this->correct = false;
10446                $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10447                return $this->end_treatment(__METHOD__, false);
10448            }
10449    
10450            // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10451            // Cette méthode doit retourner un tableau de valeur
10452            try {
10453                $result = $inst_es->cancel_send_for_signature($data);
10454            }  catch (electronicsignature_exception $e) {
10455                $this->handle_electronicsignature_exception($e);
10456                return $this->end_treatment(__METHOD__, false);
10457            }
10458    
10459            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10460            $valF = array();
10461    
10462            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10463            foreach($this->champs as $identifiant => $champ) {
10464                $valF[$champ] = $this->val[$identifiant];
10465            }
10466            // On fait ensuite nos modifications spécifiques
10467            $valF['id_parapheur_signature'] = null;
10468            $valF['statut_signature'] = $result['statut'];
10469            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10470            $valF['date_envoi_signature'] = null;
10471            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10472    
10473            $this->setParameter("maj", 1);
10474            $ret = $this->modifier($valF);
10475    
10476            if ($ret === false) {
10477                $this->correct = false;
10478                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10479                // Termine le traitement
10480                return $this->end_treatment(__METHOD__, false);
10481            }
10482    
10483            // Message
10484            $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10485    
10486            // Tout s'est bien passé, on termine le traitement
10487            return $this->end_treatment(__METHOD__, true);
10488        }
10489    
10490  ?>  
10491        /**
10492         * Récupère le contenu du champ historique_signature et le converti en tableau
10493         *
10494         * @return array sinon false en cas d'erreur
10495         */
10496        protected function get_historique_signature_decoded() {
10497            $val = str_replace("'", '"', $this->getVal('historique_signature'));
10498            if ($val === '' || $val == 'false') {
10499                $val = json_encode(array());
10500            }
10501            if($this->isJson($val) === false) {
10502                return false;
10503            }
10504            return json_decode($val, true);
10505        }
10506    
10507        /**
10508         * Récupère les informations à afficher dans le tableau de suivi à l'aide
10509         * d'une requête sql. Stocke ces informations dans un tableau.
10510         * Converti le tableau au format json et renvoi le json obtenu.
10511         *
10512         * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10513         * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10514         * La clause where de la requête est construite à partir du tableau contenant les types
10515         * de tâches fourni en paramètre.
10516         * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10517         *
10518         * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10519         * la date de premier accès ne sera pas affichée.
10520         *
10521         * @param array liste des tâches permettant d'identifier quelles notification afficher
10522         * @param boolean permet d'afficher les notifications non liées à des tâches
10523         * @return json
10524         */
10525        public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10526            $whereTypeTache = '';
10527            $sqlTaskNull = 'INNER';
10528    
10529            // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10530            $listeChampsTrad = array(
10531                __('emetteur'),
10532                __('date_envoi'),
10533                __('destinataire'),
10534                __('date_premier_acces'),
10535                __('instruction'),
10536                __('annexes'),
10537                __('statut'),
10538                __('commentaire')
10539            );
10540            $listeChamps = array(
10541                'emetteur',
10542                'date_envoi',
10543                'destinataire',
10544                'date_premier_acces',
10545                'instruction',
10546                'annexes',
10547                'statut',
10548                'commentaire'
10549            );
10550    
10551            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10552            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10553            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10554            // paramétrage
10555            if(is_bool($nonLieTache) && $nonLieTache === true) {
10556                $sqlTaskNull = 'LEFT';
10557            }
10558            // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10559            // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10560            // tiers consulté
10561            if (is_array($typeTache) && $typeTache != array()) {
10562                if (is_array($typeTache)) {
10563                    $whereTypeTache = sprintf(
10564                        'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10565                        "'".implode("', '", $typeTache)."'"
10566                    );
10567                }
10568                // La date de premier accès n'a pas besoin d'être renseigné pour
10569                // les notifications des demandeurs via le portail citoyen.
10570                // Les notifications des demandeurs sont liés à 3 types de tâches
10571                // notification_recepisse, notification_instruction, notification_decision
10572                // Si le suivi de la notification concerne un de ces types de tâches on
10573                // considère que c'est une notification de demandeurs.
10574                // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10575                // via le portail. Par défaut si rien n'est paramétré on considère que la
10576                // notification est faite via le portail
10577                if ((in_array('notification_recepisse', $typeTache) ||
10578                in_array('notification_instruction', $typeTache) ||
10579                in_array('notification_decision', $typeTache))) {
10580                    $dossier = $this->getVal('dossier');
10581                    $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10582                    $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10583                    if ($modeNotification === PORTAL) {
10584                        $listeChamps = array(
10585                            'emetteur',
10586                            'date_envoi',
10587                            'destinataire',
10588                            'instruction',
10589                            'annexes',
10590                            'statut',
10591                            'commentaire'
10592                        );
10593                    }
10594                }
10595                // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10596                // de les afficher dans le suivi
10597                if (in_array('notification_depot_demat', $typeTache)) {
10598                    $listeChamps = array(
10599                        'emetteur',
10600                        'date_envoi',
10601                        'destinataire',
10602                        'instruction',
10603                        'statut',
10604                        'commentaire'
10605                    );
10606                }
10607            }
10608    
10609            $valSuivi = array();
10610            // Récupération des infos nécessaires à l'affichage du tableau
10611            $sql = sprintf(
10612                'SELECT DISTINCT
10613                    instruction_notification.instruction_notification,
10614                    -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10615                    CASE WHEN instruction_notification.automatique = TRUE
10616                        THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10617                        ELSE instruction_notification.emetteur
10618                    END as emetteur,
10619                    date_envoi,
10620                    instruction_notification.destinataire,
10621                    instruction_notification.date_premier_acces,
10622                    evenement.libelle as instruction,
10623                    instruction_notification.statut,
10624                    instruction_notification.commentaire,
10625                    annexes.instruction_annexe as annexes
10626                FROM
10627                    %1$sinstruction_notification
10628                    LEFT JOIN %1$sinstruction
10629                        ON instruction.instruction = instruction_notification.instruction
10630                    LEFT JOIN %1$sevenement
10631                        ON instruction.evenement = evenement.evenement
10632                    LEFT JOIN %1$sinstruction_notification_document
10633                        ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10634                        AND instruction_notification_document.annexe = true
10635                    -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10636                    %4$s JOIN %1$stask
10637                        ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10638                        AND task.type LIKE \'notification%%\'
10639                    -- Récupération de la liste des annexes sous la forme d une liste
10640                    LEFT JOIN (
10641                        SELECT
10642                            instruction_notification,
10643                            -- Récupère la liste des annexes de la notification
10644                            -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10645                            -- à l affichage du lien vers les annexes
10646                            CONCAT(
10647                                \'[\',
10648                                STRING_AGG(
10649                                    -- Affiche le nom du fichier selon le type de document/pièce
10650                                    CASE
10651                                        WHEN instruction_notification_document.document_type = \'instruction\'
10652                                            THEN CONCAT(
10653                                                    \'{
10654                                                        "obj" : "instruction",
10655                                                        "champs" : "om_fichier_instruction",
10656                                                        "label" : "\', evenement.libelle, \'",
10657                                                        "id" : "\', instruction.instruction,\'"
10658                                                    }\'
10659                                                )
10660                                        WHEN instruction_notification_document.document_type = \'consultation\'
10661                                            THEN CONCAT(
10662                                                    \'{
10663                                                        "obj" : "consultation",
10664                                                        "champs" : "fichier",
10665                                                        "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10666                                                        "id" : "\', consultation.consultation, \'"
10667                                                    }\'
10668                                                )
10669                                    ELSE
10670                                        CONCAT(
10671                                            \'{
10672                                                "obj" : "document_numerise",
10673                                                "champs" : "uid",
10674                                                "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10675                                                "id" : "\', document_numerise.document_numerise,\'"
10676                                            }\'
10677                                        )
10678                                    END,
10679                                    \', \'),
10680                                \']\'
10681                            ) AS instruction_annexe
10682                        FROM
10683                            %1$sinstruction_notification_document
10684                            LEFT JOIN %1$sinstruction
10685                                ON instruction_notification_document.instruction = instruction.instruction
10686                            LEFT JOIN %1$sevenement
10687                                ON instruction.evenement = evenement.evenement
10688                            LEFT JOIN %1$sconsultation
10689                                ON instruction_notification_document.document_id = consultation.consultation
10690                            LEFT JOIN %1$sservice
10691                                ON consultation.service = service.service
10692                            LEFT JOIN %1$sdocument_numerise
10693                                ON instruction_notification_document.document_id = document_numerise.document_numerise
10694                            LEFT JOIN %1$sdocument_numerise_type
10695                                ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10696                        WHERE
10697                            instruction_notification_document.annexe = \'t\'
10698                        GROUP BY
10699                            instruction_notification
10700                    ) AS annexes
10701                        ON
10702                            annexes.instruction_notification = instruction_notification.instruction_notification
10703                WHERE
10704                    instruction.instruction = %2$s
10705                    %3$s
10706                ORDER BY
10707                    date_envoi ASC, instruction_notification.destinataire ASC',
10708                DB_PREFIXE,
10709                intval($this->getVal('instruction')),
10710                $whereTypeTache,
10711                $sqlTaskNull
10712            );
10713            $qres = $this->f->get_all_results_from_db_query($sql, array(
10714                    "origin" => __METHOD__
10715                )
10716            );
10717            // Préparation du lien de téléchargement des annexes
10718            $htmlList =
10719                '<style>
10720                    #content .gridjs-td a.lien_annexe {
10721                        text-decoration : underline dotted 1px;
10722                    }
10723                    #content a.lien_annexe:hover {
10724                        text-decoration : underline solid 1px;
10725                        color : #46aede;
10726                    }
10727                    ol {padding-left : 10px;}
10728                </style>
10729                <ol>%1$s</ol>';
10730            $lienTelechargement =
10731            '<a class="lien_annexe" href="../app/index.php?module=form&amp;snippet=file&amp;obj=%1$s&amp;champ=%2$s&amp;id=%3$s" target="blank" title="%4$s">
10732                Annexe
10733            </a>';
10734            // Stockage des infos de chaque notification dans un tableau
10735            foreach ($qres['result'] as $row) {
10736                $valNotif = array();
10737                foreach($listeChamps as $champ) {
10738                    $valNotif[$champ] = $row[$champ];
10739                    if (($champ === 'date_envoi'
10740                        || $champ === 'date_premier_acces')
10741                        && $row[$champ] !== null
10742                        && $row[$champ] !== '') {
10743                        //
10744                        $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10745                    } else if ($champ === 'annexes') {
10746                        $listeAnnexe = '';
10747                        $infoAnnexes = json_decode($row[$champ], true);
10748                        if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10749                            // A partir des infos récupérées prépare le code html du lien vers chacune
10750                            // des annexes et ajoute un élément de liste par annexe
10751                            foreach($infoAnnexes as $annexe) {
10752                                $listeAnnexe .= sprintf(
10753                                    '<li>%s</li>',
10754                                    sprintf($lienTelechargement,
10755                                        $annexe['obj'],
10756                                        $annexe['champs'],
10757                                        $annexe['id'],
10758                                        $annexe['label']
10759                                    )
10760                                );
10761                            }
10762                            // Construction de la liste des annexes
10763                            $valNotif[$champ] = sprintf(
10764                                $htmlList,
10765                                $listeAnnexe
10766                            );
10767                        }
10768                    }
10769                }
10770                array_push($valSuivi, $valNotif);
10771            }
10772    
10773            // Passage du tableau au format json
10774            return json_encode($valSuivi, JSON_HEX_APOS);
10775        }
10776    
10777        /**
10778         * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10779         *
10780         * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10781         *
10782         * @return void
10783         */
10784        public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10785            $this->correct = false;
10786            $this->addToMessage($exception->getMessage());
10787        }
10788    
10789    
10790        /**
10791         * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10792         *
10793         * @param  boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10794         * @return electronicsignature        Instance de l'abstracteur.
10795         */
10796        public function get_electronicsignature_instance($with_handle_error = true) {
10797            if(isset($this->electronicsignature_instance)) {
10798                return $this->electronicsignature_instance;
10799            }
10800            // Instanciation du connecteur electronicsignature
10801            try {
10802                require_once "electronicsignature.class.php";
10803                $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10804                $extra_params = array(
10805                    "inst_framework" => $this->f,
10806                );
10807                $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
10808            } catch (electronicsignature_exception $e) {
10809                if ($with_handle_error === true) {
10810                    $this->handle_electronicsignature_exception($e);
10811                }
10812                return false;
10813            }
10814            return $this->electronicsignature_instance;
10815        }
10816    
10817        /**
10818         * TREATMENT - envoyer_au_controle_de_legalite
10819         *
10820         * Ajoute la tâche envoi_CL.
10821         * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10822         *
10823         * @return [type] [description]
10824         */
10825        function envoyer_au_controle_de_legalite() {
10826            $this->begin_treatment(__METHOD__);
10827            $this->correct = true;
10828    
10829            //
10830            if ($this->can_be_sent_to_cl() === true) {
10831                // Création de la task 'envoi_CL'
10832                $inst_task = $this->f->get_inst__om_dbform(array(
10833                    "obj" => "task",
10834                    "idx" => 0,
10835                ));
10836                $task_val = array(
10837                    'type' => 'envoi_CL',
10838                    'object_id' => $this->getVal('instruction'),
10839                    'dossier' => $this->getVal('dossier'),
10840                );
10841                // Change l'état de la tâche de notification en fonction de l'état de
10842                // transmission du dossier d'instruction
10843                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10844                if ($this->f->is_option_mode_service_consulte_enabled() === false
10845                    && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10846                    || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10847                    //
10848                    $task_val['state'] = task::STATUS_DRAFT;
10849                }
10850                $add_task = $inst_task->add_task(array('val' => $task_val));
10851                if ($add_task === false) {
10852                    $this->addToMessage(sprintf('%s %s',
10853                        __("Une erreur s'est produite lors de la création tâche."),
10854                        __("Veuillez contacter votre administrateur.")
10855                    ));
10856                    $this->correct = false;
10857                    return $this->end_treatment(__METHOD__, false);
10858                }
10859                // Mise à jour du champs 'envoye_cl_platau'
10860                $instr_val = array(
10861                    'envoye_cl_platau' => 't',
10862                );
10863                $res = $this->f->db->autoExecute(
10864                    DB_PREFIXE.$this->table,
10865                    $instr_val,
10866                    DB_AUTOQUERY_UPDATE,
10867                    $this->getCle($this->getVal($this->clePrimaire))
10868                );
10869                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10870                if ($this->f->isDatabaseError($res, true) === true) {
10871                    $this->addToMessage(sprintf('%s %s',
10872                        __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10873                        __("Veuillez contacter votre administrateur.")
10874                    ));
10875                    $this->correct = false;
10876                    return $this->end_treatment(__METHOD__, false);
10877                }
10878                // Message de validation à l'utilisateur
10879                $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10880                $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10881            }
10882            //
10883            return $this->end_treatment(__METHOD__, true);
10884        }
10885    
10886    
10887        /**
10888         * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10889         *
10890         * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10891         *                     la vue 'sousformulaire'.
10892         *
10893         * @return string
10894         */
10895        function get_back_link($view = "formulaire") {
10896            //
10897            $href = parent::get_back_link($view);
10898            //
10899            $crud = $this->get_action_crud();
10900    
10901            // Redirection vers le formulaire de modification à la validation du
10902            // formulaire d'ajout si l'événement associé possède une lettre type
10903            if (($crud === 'create'
10904                    || ($crud === null
10905                        && $this->getParameter('maj') == 0))
10906                    && $this->correct == true
10907                    && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10908    
10909                // On instancie l'instruction
10910                $inst_instruction = $this->f->get_inst__om_dbform(array(
10911                    "obj" => "instruction",
10912                    "idx" => $this->valF[$this->clePrimaire],
10913                ));
10914    
10915                // Si l'instruction n'est pas finalisée automatiquement
10916                if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10917                    $href = str_replace("&action=3", "&action=1", $href);
10918                    //
10919                    if (strpos($href, "&retour=tab") !== false) {
10920                        $href = str_replace("&retour=tab", "&retour= form", $href);
10921                    } else {
10922                        $href .= "&retour=form";
10923                    }
10924                }
10925            }
10926    
10927            //
10928            return $href;
10929        }
10930    
10931        public function view_json_data() {
10932            $this->checkAccessibility();
10933            $this->f->disableLog();
10934            $view = $this->get_json_data();
10935            printf(json_encode($view));
10936        }
10937    
10938        public function get_json_data() {
10939            $val = array_combine($this->champs, $this->val);
10940            foreach ($val as $key => $value) {
10941                $val[$key] = strip_tags($value);
10942            }
10943            $val['tacite'] = 'f';
10944            $inst_ad = $this->f->get_inst__om_dbform(array(
10945                "obj" => "avis_decision",
10946                "idx" => $val['avis_decision'],
10947            ));
10948            if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10949                $val['tacite'] = 't';
10950            }
10951            return $val;
10952        }
10953    
10954        /**
10955         * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10956         * comme événement lié le suivant définit dans l'événement de l'instruction
10957         * instanciée.
10958         *
10959         * @param  string  $next_type   Correspond aux trois déclenchement automatique
10960         *                              de création d'instruction paramétré sur un événement.
10961         * @param  integer $instruction Identifiant de l'instruction à instancier.
10962         * @return mixed                Identifiant de l'instruction recherchée ou false.
10963         */
10964        public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10965            if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10966                return false;
10967            }
10968            $result = array();
10969            $evenements = array();
10970            if ($instruction === null) {
10971                $instruction = $this->getVal($this->clePrimaire);
10972                $evenement = $this->getVal('evenement');
10973                $dossier = $this->getVal('dossier');
10974            } else {
10975                $inst = $this->f->get_inst__om_dbform(array(
10976                    "obj" => "instruction",
10977                    "idx" => $instruction,
10978                ));
10979                $evenement = $inst->getVal('evenement');
10980                $dossier = $inst->getVal('dossier');
10981            }
10982            // Récupération de l'identifiant de l'événement paramétré comme suivant
10983            // sur l'instruction instanciée
10984            $qres = $this->f->get_one_result_from_db_query(
10985                sprintf(
10986                    'SELECT
10987                        evenement_%3$s
10988                    FROM
10989                        %1$sevenement
10990                    WHERE
10991                        evenement = %2$s',
10992                    DB_PREFIXE,
10993                    intval($evenement),
10994                    $next_type
10995                ),
10996                array(
10997                    "origin" => __METHOD__,
10998                    "force_return" => true,
10999                )
11000            );
11001            if ($qres["code"] !== "OK") {
11002                return false;
11003            }
11004            $ev_next = $qres["result"];
11005            // Récupération de l'instruction dans le dossier utilisant l'événement
11006            // suivant identifié dans la requête précédente
11007            $qres = $this->f->get_one_result_from_db_query(
11008                sprintf(
11009                    'SELECT
11010                        MAX(instruction.instruction) as instruction
11011                    FROM
11012                        %1$sinstruction
11013                    WHERE
11014                        dossier = \'%3$s\'
11015                        AND evenement = %2$s',
11016                    DB_PREFIXE,
11017                    intval($ev_next),
11018                    $this->f->db->escapeSimple($dossier)
11019                ),
11020                array(
11021                    "origin" => __METHOD__,
11022                    "force_return" => true,
11023                )
11024            );
11025            if ($qres["code"] !== "OK") {
11026                return false;
11027            }
11028            return $qres["result"];
11029        }
11030    
11031        public function get_related_instructions($instruction = null) {
11032            $result = array();
11033            $evenements = array();
11034            if ($instruction === null) {
11035                $instruction = $this->getVal($this->clePrimaire);
11036                $evenement = $this->getVal('evenement');
11037                $dossier = $this->getVal('dossier');
11038            } else {
11039                $inst = $this->f->get_inst__om_dbform(array(
11040                    "obj" => "instruction",
11041                    "idx" => $instruction,
11042                ));
11043                $evenement = $inst->getVal('evenement');
11044                $dossier = $inst->getVal('dossier');
11045            }
11046            //
11047            $qres = $this->f->get_one_result_from_db_query(
11048                sprintf(
11049                    'SELECT
11050                        evenement
11051                    FROM
11052                        %1$sevenement
11053                    WHERE
11054                        evenement_retour_ar = %2$s
11055                        OR evenement_retour_signature = %2$s',
11056                    DB_PREFIXE,
11057                    intval($evenement)
11058                ),
11059                array(
11060                    "origin" => __METHOD__,
11061                    "force_return" => true,
11062                )
11063            );
11064            if ($qres["code"] !== "OK") {
11065                return false;
11066            }
11067            $ev_parent = $qres["result"];
11068            //
11069            $qres = $this->f->get_one_result_from_db_query(
11070                sprintf(
11071                    'SELECT
11072                        MAX(instruction.instruction) as instruction
11073                    FROM
11074                        %1$sinstruction
11075                    WHERE
11076                        dossier = \'%3$s\'
11077                        AND evenement = %2$s',
11078                    DB_PREFIXE,
11079                    intval($ev_parent),
11080                    $this->f->db->escapeSimple($dossier)
11081                ),
11082                array(
11083                    "origin" => __METHOD__,
11084                    "force_return" => true,
11085                )
11086            );
11087            if ($qres["code"] !== "OK") {
11088                return false;
11089            }
11090            $result[] = $qres["result"];
11091            //
11092            $qres = $this->f->get_one_result_from_db_query(
11093                sprintf(
11094                    'SELECT
11095                        evenement_retour_ar
11096                    FROM
11097                        %1$sevenement
11098                    WHERE
11099                        evenement = %2$d
11100                        AND evenement_retour_ar != %3$d',
11101                    DB_PREFIXE,
11102                    intval($ev_parent),
11103                    intval($evenement)
11104                ),
11105                array(
11106                    "origin" => __METHOD__,
11107                    "force_return" => true,
11108                )
11109            );
11110            if ($qres["code"] !== "OK") {
11111                return false;
11112            }
11113            $evenements[] = $qres["result"];
11114            //
11115            $qres = $this->f->get_one_result_from_db_query(
11116                sprintf(
11117                    'SELECT
11118                        evenement_retour_signature
11119                    FROM
11120                        %1$sevenement
11121                    WHERE
11122                        evenement = %2$s
11123                        AND evenement_retour_signature != %3$s
11124                    ',
11125                    DB_PREFIXE,
11126                    intval($ev_parent),
11127                    intval($evenement)
11128                ),
11129                array(
11130                    "origin" => __METHOD__,
11131                    "force_return" => true,
11132                )
11133            );
11134            if ($qres["code"] !== "OK") {
11135                return false;
11136            }
11137            $evenements[] = $qres["result"];
11138            foreach ($evenements as $value) {
11139                if ($value !== null) {
11140                    $qres = $this->f->get_one_result_from_db_query(
11141                        sprintf(
11142                            'SELECT
11143                                MAX(instruction.instruction) as instruction
11144                            FROM
11145                                %1$sinstruction
11146                            WHERE
11147                                dossier = \'%3$s\'
11148                                AND evenement = %2$s',
11149                            DB_PREFIXE,
11150                            intval($value),
11151                            $this->f->db->escapeSimple($dossier)
11152                        ),
11153                        array(
11154                            "origin" => __METHOD__,
11155                            "force_return" => true,
11156                        )
11157                    );
11158                    if ($qres["code"] !== "OK") {
11159                        return false;
11160                    }
11161                    $result[] = $qres["result"];
11162                }
11163            }
11164            return $result;
11165        }
11166    
11167        protected function getDocumentType($champ = null) {
11168            $evenementId = $this->getVal('evenement');
11169            if (! empty($evenementId)) {
11170                $evenement = $this->f->findObjectById('evenement', $evenementId);
11171                if (! empty($evenement)) {
11172                    return __("Instruction").':'.$evenement->getVal('libelle');
11173                }
11174            }
11175            return parent::getDocumentType();
11176        }
11177    
11178        /**
11179         * Récupère à l'aide d'une requête sql la liste des demandeurs
11180         * pouvant être notifié. C'est à dire les demandeurs acceptant
11181         * les notifications et pour lesquels une adresse mail existe.
11182         *
11183         * Dans le cas, d'une notification pour le portail citoyen, seul
11184         * le pétitionnaire principal doit être notifier et uniquement si
11185         * il a une adress mail et qu'il accepte les notifications.
11186         *
11187         * @param string identifiant du dossier
11188         * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11189         * pour une notification de categorie portail
11190         * @return array liste des demandeurs pouvant être notifié
11191        */
11192        public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11193            if ($idDossier === null) {
11194                $idDossier = $this->getVal('dossier');
11195            }
11196            // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11197            // pour une notification depuis le portail citoyen
11198            $sqlPetitionnairePrincipal = '';
11199            // Gestion des champs nécessaires pour la notification d'un demandeur
11200            $condition_demandeur = "AND demandeur.notification = 't'
11201                AND demandeur.courriel IS NOT NULL";
11202            if ($portail === true) {
11203                $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11204                $condition_demandeur = "AND (
11205                        (notification = 't' AND courriel IS NOT NULL)
11206                        OR demande.source_depot = 'portal'
11207                    )";
11208            }
11209    
11210            $listeDemandeursNotifiable = array();
11211    
11212            // Requête de récupération des demandeurs
11213            $qres = $this->f->get_all_results_from_db_query(
11214                sprintf(
11215                    'SELECT
11216                        demandeur.demandeur,
11217                        CASE
11218                            WHEN demandeur.qualite=\'particulier\'
11219                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11220                        ELSE
11221                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11222                        END AS destinataire,
11223                        demandeur.courriel,
11224                        petitionnaire_principal
11225                    FROM
11226                        %1$sdossier
11227                        INNER JOIN %1$slien_dossier_demandeur
11228                            ON dossier.dossier = lien_dossier_demandeur.dossier
11229                        INNER JOIN %1$sdemandeur
11230                            ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11231                        -- Récupération de la plus ancienne demande associée au dossier (la demande
11232                        -- de création du dossier)
11233                        INNER JOIN (
11234                            SELECT
11235                                demande,
11236                                dossier_instruction,
11237                                source_depot
11238                            FROM
11239                                %1$sdemande
11240                            WHERE
11241                                dossier_instruction = \'%2$s\'
11242                            ORDER BY
11243                                demande ASC
11244                            LIMIT 1
11245                        ) as demande
11246                            ON dossier.dossier = demande.dossier_instruction
11247                    WHERE
11248                        dossier.dossier = \'%2$s\'
11249                        %3$s
11250                        %4$s',
11251                    DB_PREFIXE,
11252                    $this->f->db->escapeSimple($idDossier),
11253                    $condition_demandeur,
11254                    $sqlPetitionnairePrincipal
11255                ),
11256                array(
11257                    "origin" => __METHOD__
11258                )
11259            );
11260            // Récupération des infos des demandeurs et stockage dans un tableau
11261            // ayant pour clé les id des demandeurs
11262            foreach ($qres['result'] as $row) {
11263                $listeDemandeursNotifiable[$row['demandeur']] = $row;
11264            }
11265    
11266            return $listeDemandeursNotifiable;
11267        }
11268    
11269        /**
11270         * Renvoie la liste des notifications liées à l'instruction
11271         *
11272         * @param integer id de l'instruction dont on cherche les notifications
11273         * @return array liste des instruction_notification liés à l'instruction
11274         */
11275        public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11276            // Compose la clause définissant dans la requête le type de tâche attendus
11277            $clause_type_tache = '';
11278            if ($typeNotification != null) {
11279                if (is_array($typeNotification)) {
11280                    $clause_type_tache = sprintf(
11281                        'AND task.type IN (\'%1$s\')',
11282                        implode("', '", $typeNotification),
11283                    );
11284                } else {
11285                    $clause_type_tache = sprintf(
11286                        'AND task.type = \'%1$s\'',
11287                        $typeNotification
11288                    );
11289                }
11290            }
11291    
11292            // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11293            $qres = $this->f->get_all_results_from_db_query(
11294                sprintf('
11295                    SELECT
11296                        instruction_notification.instruction_notification
11297                    FROM
11298                        %1$sinstruction_notification
11299                        INNER JOIN %1$stask
11300                            ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11301                               %3$s
11302                    WHERE
11303                        instruction = %2$s',
11304                    DB_PREFIXE,
11305                    intval($id_instruction),
11306                    $clause_type_tache
11307                ),
11308                array(
11309                    "origin" => __METHOD__,
11310                    'log_level' => DEBUG_MODE
11311                )
11312            );
11313            $listeInstrNotif = array();
11314            foreach ($qres['result'] as $row) {
11315                $listeInstrNotif[] = $row['instruction_notification'];
11316            }
11317    
11318            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11319            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11320            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11321            // paramétrage
11322            if(is_bool($nonLieTache) && $nonLieTache === true) {
11323                $qres = $this->f->get_all_results_from_db_query(
11324                    sprintf('
11325                        SELECT
11326                            instruction_notification.instruction_notification
11327                        FROM
11328                            %1$sinstruction_notification
11329                            LEFT JOIN %1$stask
11330                                ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11331                                   AND task.type LIKE \'%%notification%%\'
11332                        WHERE
11333                            instruction = %2$s
11334                            AND task.task IS NULL',
11335                        DB_PREFIXE,
11336                        intval($id_instruction)
11337                    ),
11338                    array(
11339                        "origin" => __METHOD__
11340                    )
11341                );
11342    
11343                foreach ($qres['result'] as $row) {
11344                    $listeInstrNotif[] = $row['instruction_notification'];
11345                }
11346            }
11347    
11348            return $listeInstrNotif;
11349        }
11350    
11351        /**
11352         * Crée une clé d'accès unique permettant à un utilisateur
11353         * anonyme de récupérer le document.
11354         *
11355         * @return string clé d'accès du document
11356         */
11357        function getCleAccesDocument() {
11358            // Initialisation d'un tableau
11359            $number_list = array();
11360    
11361            // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11362            for ($i = 0; $i < 4; $i++) {
11363                $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11364            }
11365    
11366            // Transformation en chaîne tout en séparant les nombres par un "-"
11367            $result = implode('-', $number_list);
11368    
11369            // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11370            if ($this->getUidDocumentInstructionWithKey($result) != null) {
11371                return $this->getCleAccesDocument();
11372            }
11373    
11374            //
11375            return $result;
11376        }
11377    
11378        /**
11379         * Récupère une clé et renvoie l'uid du document liée à cette
11380         * clé. Si la clé n'existe pas renvoie null.
11381         *
11382         * @param string $cleGen clé dont on cherche l'instruction
11383         * @return integer|null
11384         */
11385        protected function getUidDocumentInstructionWithKey($cleGen) {
11386            $qres = $this->f->get_one_result_from_db_query(
11387                sprintf(
11388                    'SELECT
11389                        instruction.om_fichier_instruction
11390                    FROM
11391                        %1$sinstruction_notification_document
11392                        LEFT JOIN %1$sinstruction
11393                            ON instruction_notification_document.instruction = instruction.instruction
11394                    WHERE
11395                        instruction_notification_document.cle = \'%2$s\'',
11396                    DB_PREFIXE,
11397                    $this->f->db->escapeSimple($cleGen)
11398                ),
11399                array(
11400                    "origin" => __METHOD__,
11401                )
11402            );
11403            
11404            return $qres['result'];
11405        }
11406    
11407        /**
11408         * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11409         * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11410         *
11411         * @param string $cleGen
11412         * @return instruction_notification
11413         */
11414        protected function getInstanceNotificationWithKey($key) {
11415            $qres = $this->f->get_one_result_from_db_query(
11416                sprintf(
11417                    'SELECT
11418                        instruction_notification
11419                    FROM
11420                        %1$sinstruction_notification_document
11421                    WHERE
11422                        cle = \'%2$s\'',
11423                    DB_PREFIXE,
11424                    $this->f->db->escapeSimple($key)
11425                ),
11426                array(
11427                    "origin" => __METHOD__,
11428                )
11429            );
11430    
11431            // Récupération de l'instance de notification
11432            $instNotif = $this->f->get_inst__om_dbform(array(
11433                "obj" => "instruction_notification",
11434                "idx" => $qres['result'],
11435            ));
11436            return $instNotif;
11437        }
11438    
11439    
11440        /**
11441         * Affiche la page de téléchargement du document de la notification.
11442         *
11443         * @param boolean $content_only Affiche le contenu seulement.
11444         *
11445         * @return void
11446         */
11447        public function view_telecharger_document_anonym() {
11448            // Par défaut on considère qu'on va afficher le formulaire
11449            $idx = 0;
11450            // Flag d'erreur
11451            $error = false;
11452            // Message d'erreur
11453            $message = '';
11454    
11455            // Paramètres GET : récupération de la clé d'accès
11456            $cle_acces_document = $this->f->get_submitted_get_value('key');
11457            $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11458            // Vérification de l'existence de la clé et récupération de l'uid du fichier
11459            $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11460            if ($uidFichier != null) {
11461                // Récupération du document
11462                $file = $this->f->storage->get($uidFichier);
11463    
11464                // Headers
11465                header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11466                header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11467                header("Content-Type: ".$file['metadata']['mimetype']);
11468                header("Accept-Ranges: bytes");
11469                header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11470                // Affichage du document
11471                echo $file['file_content'];
11472    
11473                // Récupération de la date de premier accès et maj du suivi uniquement
11474                // si la date de 1er accès n'a pas encore été remplis
11475                $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11476                if ($inst_notif->getVal('date_premier_acces') == null ||
11477                    $inst_notif->getVal('date_premier_acces') == '') {
11478                    $notif_val = array();
11479                    foreach ($inst_notif->champs as $champ) {
11480                        $notif_val[$champ] = $inst_notif->getVal($champ);
11481                    }
11482                    $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11483                    $notif_val['statut'] = 'vu';
11484                    $notif_val['commentaire'] = 'Le document a été vu';
11485                    $suivi_notif = $inst_notif->modifier($notif_val);
11486                }
11487    
11488            } else {
11489                // Page vide 404
11490                printf('Ressource inexistante');
11491                header('HTTP/1.0 404 Not Found');
11492            }
11493        }
11494    
11495        /**
11496         * Récupère le titre du document envoyé au parapheur
11497         */
11498        protected function getDocumentTitre($champ = null) {
11499            $title = $this->getTitle();
11500            $dossier = $this->getDossier();
11501            return $dossier.' '.$title;
11502        }
11503    
11504        /**
11505         * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11506         * l'overlay de notification des demandeurs.
11507         */
11508        function getSubFormTitle($ent) {
11509            $actionSansPath = array('411', '420', '430');
11510            if (in_array($this->getParameter('maj'), $actionSansPath)) {
11511                return '';
11512            }
11513            return parent::getSubFormTitle($ent);
11514        }
11515        
11516        /**
11517         * Traitement de la notification automatique des tiers consulté.
11518         *
11519         * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11520         * récupérées ajoute une notification et une tâche de notification par mail.
11521         * La création de la tâche de notification par mail déclenchera l'envoi du mail
11522         * et la mise à jour du suivi.
11523         *
11524         * Les tiers notifiables sont ceux :
11525         *   - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11526         *   - ayant une habilitation dont le type est listé dans les paramètres de
11527         *     notification de l’événement,
11528         *   - intervenant sur la commune ou le département du dossier
11529         *   - ayant au moins une adresse mail valide
11530         *
11531         * @param evenement instance de l'événement associée à l'instruction
11532         * @param dossier instance du dossier de l'instruction
11533         * @return boolean indique si le traitement à réussi
11534         */
11535        public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11536            // Récupération de l'identifiant plat'au du service consultant
11537            $consultationEntrante = $dossier->get_inst_consultation_entrante();
11538            // Récupération de la liste des types d'habilitations autorisées pour
11539            // cette notification
11540            $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11541            // Récupération du département et de la commune du dossier
11542            $commune = $dossier->getVal('commune');
11543            // Le département est récupéré à partir de la commune du dossier donc si la
11544            // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11545            $idDepartement = null;
11546            if (! empty($commune)) {
11547                $departement = $dossier->get_inst_departement_dossier();
11548                $idDepartement = $departement->getVal($departement->clePrimaire);
11549            }
11550            // Récupération des courriels des tiers notifiables
11551            $tiersANotifier = $this->get_courriels_tiers_notifiable(
11552                $typesHabilitationsNotifiable,
11553                $consultationEntrante->getVal('service_consultant_id'),
11554                $commune,
11555                $idDepartement
11556            );
11557            // Traitement de chacune des listes de diffusion pour extraire les
11558            // courriels, vérifier la validité des courriels et envoyer la
11559            // notification
11560            $notificationSend = false;
11561            if (empty($tiersANotifier)) {
11562                $this->addToLog(
11563                    sprintf(
11564                        '%s() : %s %s : %s',
11565                        __METHOD__,
11566                        __("La récupération des tiers à échoué."),
11567                        __('Paramétrage'),
11568                        var_export(
11569                            array(
11570                                'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11571                                'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11572                                'id_commune' => $commune,
11573                                'id_departement' => $idDepartement
11574                            ),
11575                            true
11576                        )
11577                    ),
11578                    DEBUG_MODE
11579                );
11580                return false;
11581            }
11582            foreach($tiersANotifier as $tierANotifier) {
11583                // Découpe la liste de diffusion pour stocker les adresses mails
11584                // des tiers dans un tableau
11585                $courriels =
11586                    array_filter(
11587                        array_map(
11588                            'trim',
11589                            preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11590                    
11591                foreach ($courriels as $courriel) {
11592                    // Pour chaque adresse mail vérifie si l'adresse est valide
11593                    if (! $this->f->checkValidEmailAddress($courriel)) {
11594                        continue;
11595                    }
11596                    $destinataire = array(
11597                        'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11598                        'courriel' => $courriel
11599                    );
11600                    // Si l'adresse est valide ajoute une nouvelle notification
11601                    // et une tâche d'envoi de mails
11602                    $idNotif = $this->ajouter_notification(
11603                        $this->getVal($this->clePrimaire),
11604                        $this->f->get_connected_user_login_name(),
11605                        $destinataire,
11606                        $this->get_dossier_instruction_om_collectivite(),
11607                        array(),
11608                        true
11609                    );
11610                    if ($idNotif === false) {
11611                        $this->addToLog(
11612                            __METHOD__.
11613                            __("L'ajout de la notification a échoué."),
11614                            DEBUG_MODE
11615                        );
11616                        return false;
11617                    }
11618                    // Création de la tache en lui donnant l'id de la notification
11619                    $notification_by_task = $this->notification_by_task(
11620                        $idNotif,
11621                        $dossier->getVal('dossier'),
11622                        'mail',
11623                        'notification_tiers_consulte'
11624                    );
11625                    if ($notification_by_task === false) {
11626                        $this->addToLog(
11627                            __METHOD__.
11628                            __("L'ajout de la tâche de notification a échoué."),
11629                            DEBUG_MODE
11630                        );
11631                        $this->addToMessage(
11632                            __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11633                        );
11634                        return false;
11635                    }
11636                    $notificationSend = true;
11637                }
11638            }
11639            // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11640            // valide, affiche un message dans les logs pour avoir un suivi.
11641            if (! $notificationSend) {
11642                $this->addToLog(
11643                    sprintf(
11644                        '%s %s : %s %s : %s',
11645                        __METHOD__,
11646                        __("Il n'y a pas de tiers notifiable pour l'instruction"),
11647                        $evenement->getVal('libelle'),
11648                        __("du dossier"),
11649                        $this->getVal('dossier')
11650                    ),
11651                    DEBUG_MODE
11652                );
11653            }
11654            return true;
11655        }
11656    
11657        /**
11658         * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11659         * respectant les conditions suvantes :
11660         *   - le tiers consulté dois accepté les notifications
11661         *   - la liste de diffusion ne dois pas être vide
11662         *   - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11663         *     si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11664         *     du tiers
11665         *   - le type d'habilitation des tiers dois appartenir à la liste
11666         *     fournie en paramètre
11667         *   - le tiers dois être associé à la commune ou au département passé
11668         *     en paramètre
11669         *
11670         * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11671         *              pouvant être notifiée
11672         * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11673         * @param integer $commune identifiant de la commune du dossier
11674         * @param integer $departement identifiant du département du dossier
11675         *
11676         * @return array listes de diffusion des tiers notifiable
11677         */
11678        public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11679            // Si paramètre non renseigné alors ne renvoie rien
11680            if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11681                return false;
11682            }
11683            // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11684            $filtreServiceConsulteDI = '';
11685            if (! empty($idPlatau)) {
11686                $filtreServiceConsulteDI = sprintf(
11687                    "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11688                    -- en charge du dossier
11689                    AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11690                        OR tiers_consulte.uid_platau_acteur IS NULL)",
11691                    $this->f->db->escapeSimple($idPlatau)
11692                );
11693            }
11694            $rst = $this->f->get_all_results_from_db_query(
11695                sprintf(
11696                    'SELECT
11697                        -- Tiers notifiables lié à la commune du dossier
11698                        tiers_consulte.liste_diffusion,
11699                        tiers_consulte.libelle
11700                    FROM
11701                        %1$shabilitation_tiers_consulte
11702                        LEFT JOIN %1$stiers_consulte
11703                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11704                        LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11705                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11706                        -- Conservation uniquement des tiers acteur de dossiers
11707                        JOIN %1$slien_dossier_tiers
11708                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11709                    WHERE
11710                        tiers_consulte.accepte_notification_email IS TRUE
11711                        AND tiers_consulte.liste_diffusion IS NOT NULL
11712                        %3$s
11713                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11714                        AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11715                        -- Filtre sur les tiers acteur du dossier
11716                        AND lien_dossier_tiers.dossier = \'%6$s\'
11717                    UNION
11718                    SELECT
11719                        -- Tiers notifiables lié au département du dossier
11720                        tiers_consulte.liste_diffusion,
11721                        tiers_consulte.libelle
11722                    FROM
11723                        %1$shabilitation_tiers_consulte
11724                        LEFT JOIN %1$stiers_consulte
11725                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11726                        LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11727                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11728                        -- Conservation uniquement des tiers acteur de dossiers
11729                        JOIN %1$slien_dossier_tiers
11730                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11731                    WHERE
11732                        tiers_consulte.accepte_notification_email IS TRUE
11733                        AND tiers_consulte.liste_diffusion IS NOT NULL
11734                        %3$s
11735                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11736                        AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11737                        -- Filtre sur les tiers acteur du dossier
11738                        AND lien_dossier_tiers.dossier = \'%6$s\'',
11739                    DB_PREFIXE,
11740                    implode(', ', $typesHabilitations),
11741                    $filtreServiceConsulteDI,
11742                    intval($commune),
11743                    intval($departement),
11744                    $this->f->db->escapeSimple($this->getVal('dossier'))
11745                ),
11746                array(
11747                    "origin" => __METHOD__
11748                )
11749            );
11750            // Faire un order by sur un union ne fonctionne pas. A la place
11751            // c'est le tableau des résultats qui est ordonné.
11752            usort($rst['result'], function($a, $b) {
11753                return strcmp($a['libelle'], $b['libelle']);
11754            });
11755            return $rst['result'];
11756        }
11757    
11758        /**
11759         * Gestion spécifique de l'affichage des documents dans le tableau des
11760         * documents d'instruction.
11761         * Prend en compte qu'une instruction peut également avoir un document lié
11762         * dans la table storage.
11763         *
11764         * @return void
11765         */
11766        public function view_telecharger_editions() {
11767            // Récupère l'identifiant du document dans l'URL appelant l'action
11768            $idx = $this->f->get_submitted_get_value('idx');
11769            $obj = $this->table;
11770            $champ = 'om_fichier_instruction';
11771            // Cas d'un document historisé (dans la table storage)
11772            if (strpos($idx, 'STORAGE_') !== false) {
11773                 $idx = substr($idx, 8);
11774                 $obj = 'storage';
11775                 $champ = 'uid';
11776            }
11777            // Ouvre le document
11778            $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11779            header("Location: ".$lien);
11780        }
11781    }

Legend:
Removed from v.7685  
changed lines
  Added in v.18876

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26