/[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 6272 by softime, Fri Mar 3 15:27:53 2017 UTC revision 15037 by softime, Mon Jun 19 13:23:51 2023 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   */   */
# Line 27  class instruction extends instruction_ge Line 29  class instruction extends instruction_ge
29      var $abstract_type = array(      var $abstract_type = array(
30          "om_fichier_instruction" => "file",          "om_fichier_instruction" => "file",
31      );      );
32        
     var $retourformulaire;   // specific  
     var $idxformulaire;      // specific  
33      var $valEvenement;      var $valEvenement;
34      var $restriction_valid = null;      var $restriction_valid = null;
35      // 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 69  class instruction extends instruction_ge
69              "groupeInstruction" => 'getGroupeInstruction',              "groupeInstruction" => 'getGroupeInstruction',
70              "title" => 'getTitle',              "title" => 'getTitle',
71              'concerneERP' => 'get_concerne_erp',              'concerneERP' => 'get_concerne_erp',
72    
73                'date_cloture_metier' => 'getDossierDateDecision',
74                'type' => 'getDocumentType',
75                'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76                'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77                'region' => 'getDossierRegion',
78                'departement' => 'getDossierDepartement',
79                'commune' => 'getDossierCommune',
80                'annee' => 'getDossierAnnee',
81                'division' => 'getDossierDivision',
82                'collectivite' => 'getDossierServiceOrCollectivite',
83          ),          ),
84          "arrete" => array(          "arrete" => array(
85              "numArrete" => "getNumArrete",              "numArrete" => "getNumArrete",
# Line 85  class instruction extends instruction_ge Line 96  class instruction extends instruction_ge
96              "ap_ville" => "getAp_ville",              "ap_ville" => "getAp_ville",
97              "activite" => "getActivite",              "activite" => "getActivite",
98              "dateControleLegalite" => "getDateControleLegalite",              "dateControleLegalite" => "getDateControleLegalite",
99          ),          )
100      );      );
     /** @var boolean Les nouvelles actions sont activées sur cet objet */  
     var $activate_class_action;  
101    
102      function __construct($id, &$db, $debug) {      /**
103          //On active les nouvelles actions       * Flag pour identifier la reprise de l'instruction d'un dossier.
104          $this->activate_class_action = true;       * Le statut de l'état passe de "cloture" à "encours".
105          $this->constructeur($id, $db, $debug);       *
106      }       * @var boolean
107         */
108        var $di_reopened = null;
109    
110      // {{{ Gestion de la confidentialité des données spécifiques      // {{{ Gestion de la confidentialité des données spécifiques
111            
# Line 109  class instruction extends instruction_ge Line 120  class instruction extends instruction_ge
120    
121          // ACTION - 000 - ajouter          // ACTION - 000 - ajouter
122          // Modifie la condition d'affichage du bouton ajouter          // Modifie la condition d'affichage du bouton ajouter
123          $this->class_actions[0]["condition"] = array("is_addable");          $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124    
125          // ACTION - 001 - modifier          // ACTION - 001 - modifier
126          // Modifie la condition et le libellé du bouton modifier          // Modifie la condition et le libellé du bouton modifier
127          $this->class_actions[1]["condition"] = array("is_editable", "is_finalizable_without_bypass");          $this->class_actions[1]["condition"] = array(
128                "is_editable",
129                "is_finalizable_without_bypass",
130                "can_user_access_dossier_contexte_modification",
131                "is_evenement_modifiable",
132            );
133          $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");          $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134                    
135          // ACTION - 002 - supprimer          // ACTION - 002 - supprimer
136          // Modifie la condition et le libellé du bouton supprimer          // Modifie la condition et le libellé du bouton supprimer
137          $this->class_actions[2]["condition"] = array("is_deletable", "is_finalizable_without_bypass");          $this->class_actions[2]["condition"] = array(
138                "is_deletable",
139                "is_finalizable_without_bypass",
140                "can_user_access_dossier_contexte_modification",
141                "is_evenement_supprimable",
142            );
143          $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");          $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144    
145            // ACTION - 003 - consulter
146            //
147            $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148    
149          // ACTION - 100 - finaliser          // ACTION - 100 - finaliser
150          // Finalise l'enregistrement          // Finalise l'enregistrement
151          $this->class_actions[100] = array(          $this->class_actions[100] = array(
# Line 135  class instruction extends instruction_ge Line 160  class instruction extends instruction_ge
160              "method" => "finalize",              "method" => "finalize",
161              "button" => "finaliser",              "button" => "finaliser",
162              "permission_suffix" => "finaliser",              "permission_suffix" => "finaliser",
163              "condition" => array("is_finalizable", "is_finalizable_without_bypass", "has_an_edition"),              "condition" => array(
164                    "is_finalizable",
165                    "is_finalizable_without_bypass",
166                    "has_an_edition",
167                    "can_user_access_dossier_contexte_modification",
168                ),
169          );          );
170    
171          // ACTION - 110 - definaliser          // ACTION - 110 - definaliser
# Line 152  class instruction extends instruction_ge Line 182  class instruction extends instruction_ge
182              "method" => "unfinalize",              "method" => "unfinalize",
183              "button" => "definaliser",              "button" => "definaliser",
184              "permission_suffix" => "definaliser",              "permission_suffix" => "definaliser",
185              "condition" => array("is_unfinalizable", "is_unfinalizable_without_bypass"),              "condition" => array(
186                    "is_unfinalizable",
187                    "is_unfinalizable_without_bypass",
188                    "can_user_access_dossier_contexte_modification",
189                    "is_not_sent_for_signature",
190                ),
191            );
192    
193            // ACTION - 115 - Modification d'un document généré par une instruction
194            // Permet à un instructeur de modifier un document généré par une instruction
195            $this->class_actions[115] = array(
196                "identifier" => "modale_selection_document_signe",
197                "portlet" => array(
198                    "type" => "action-self",
199                    "libelle" => _("Remplacer par le document signé"),
200                    "order" => 115,
201                    "class" => "selection-document-signé",
202                ),
203                "view" => "view_modale_selection_document_signe",
204                "permission_suffix" => "selection_document_signe",
205                "condition" => array(
206                    "is_finalized",
207                    "is_not_date_retour_signature_set",
208                ),
209          );          );
210    
211          // ACTION - 120 - edition          // ACTION - 120 - edition
# Line 166  class instruction extends instruction_ge Line 219  class instruction extends instruction_ge
219                  "class" => "pdf-16",                  "class" => "pdf-16",
220              ),              ),
221              "view" => "view_edition",              "view" => "view_edition",
222              "condition" => "has_an_edition",              "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
223              "permission_suffix" => "om_fichier_instruction_telecharger",              "permission_suffix" => "om_fichier_instruction_telecharger",
224          );          );
225    
# Line 181  class instruction extends instruction_ge Line 234  class instruction extends instruction_ge
234                  "class" => "suivi-dates-16",                  "class" => "suivi-dates-16",
235              ),              ),
236              "crud" => "update",              "crud" => "update",
237              "condition" => "can_monitoring_dates",              "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
238              "permission_suffix" => "modification_dates",              "permission_suffix" => "modification_dates",
239          );          );
240    
# Line 225  class instruction extends instruction_ge Line 278  class instruction extends instruction_ge
278              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
279          );          );
280    
281            // ACTION - 175 - edit_by_notification_task
282            // Action à utiliser lors de la mise à jour des instructions par notification
283            $this->class_actions[175] = array(
284                "identifier" => "edit_by_notification_task",
285                "view" => "formulaire",
286                "permission_suffix" => "modifier",
287                "crud" => "update",
288            );
289    
290            // ACTION - 176 - add_by_evenement_retour_after_notification_task
291            // Action à utiliser lors de l'ajout des instructions par événement suivant
292            // suite à une notification par tâche (donc notification dématerialisée)
293            $this->class_actions[176] = array(
294                "identifier" => "add_by_evenement_retour_after_notification_task",
295                "view" => "formulaire",
296                "permission_suffix" => "ajouter",
297                "crud" => "create",
298            );
299    
300          // ACTION - 180 - pdf_lettre_rar          // ACTION - 180 - pdf_lettre_rar
301          // Génère PDF sur bordereaux de lettres RAR          // Génère PDF sur bordereaux de lettres AR
302          $this->class_actions[180] = array(          $this->class_actions[180] = array(
303              "identifier" => "pdf_lettre_rar",              "identifier" => "pdf_lettre_rar",
304              "view" => "view_pdf_lettre_rar",              "view" => "view_pdf_lettre_rar",
# Line 263  class instruction extends instruction_ge Line 335  class instruction extends instruction_ge
335              "view" => "formulaire",              "view" => "formulaire",
336              "method" => "notifier_commune",              "method" => "notifier_commune",
337              "permission_suffix" => "notifier_commune",              "permission_suffix" => "notifier_commune",
338              "condition" => "is_notifiable",              "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
339          );          );
340    
341          // ACTION - 220 - generate_suivi_bordereaux          // ACTION - 220 - generate_suivi_bordereaux
# Line 271  class instruction extends instruction_ge Line 343  class instruction extends instruction_ge
343          $this->class_actions[220] = array(          $this->class_actions[220] = array(
344              "identifier" => "generate_suivi_bordereaux",              "identifier" => "generate_suivi_bordereaux",
345              "view" => "view_generate_suivi_bordereaux",              "view" => "view_generate_suivi_bordereaux",
346              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
347          );          );
348    
349            // ACTION - 777 - pdf_temp
350            // Crée un PDF temporaire et affiche son contenu en base64
351            $this->class_actions[777] = array(
352                "identifier" => "pdf_temp",
353                "view" => "view_pdf_temp",
354                "permission_suffix" => "modifier",
355                "condition" => array("can_user_access_dossier_contexte_modification"),
356            );
357    
358            // ACTION - 701
359            $this->class_actions[701] = array(
360                "identifier" => "enable-edition-integrale",
361                "portlet" => array(
362                    "type" => "action-direct-with-confirmation",
363                    "libelle" => _("Rédaction libre"),
364                    "order" => 50,
365                    "class" => "redac-libre-16",
366                ),
367                "view" => "formulaire",
368                "method" => "enable_edition_integrale",
369                "permission_suffix" => "modifier",
370                "condition" => array(
371                    "is_editable",
372                    "is_finalizable_without_bypass",
373                    "can_user_access_dossier_contexte_modification",
374                    "is_edition_integrale_not_enabled",
375                    "is_option_redaction_libre_enabled",
376                    "has_an_edition",
377                ),
378            );
379            // ACTION - 702
380            $this->class_actions[702] = array(
381                "identifier" => "disable-edition-integrale",
382                "portlet" => array(
383                    "type" => "action-direct-with-confirmation",
384                    "libelle" => _("Rédaction par compléments"),
385                    "order" => 50,
386                    "class" => "redac-complement-16",
387                ),
388                "view" => "formulaire",
389                "method" => "disable_edition_integrale",
390                "permission_suffix" => "modifier",
391                "condition" => array(
392                    "is_editable",
393                    "is_finalizable_without_bypass",
394                    "can_user_access_dossier_contexte_modification",
395                    "is_edition_integrale_enabled",
396                    "is_option_redaction_libre_enabled",
397                    "has_an_edition",
398                ),
399            );
400            // ACTION - 300 - evenement_has_an_edition_json
401            //
402            $this->class_actions[300] = array(
403                "identifier" => "evenement_has_an_edition_json",
404                "view" => "view_evenement_has_an_edition_json",
405                "permission_suffix" => "consulter",
406            );
407    
408            // ACTION - 301 - evenement_has_a_commentaire
409            //
410            $this->class_actions[301] = array(
411                "identifier" => "evenement_has_a_commentaire_json",
412                "view" => "view_evenement_has_a_commentaire_json",
413                "permission_suffix" => "consulter",
414            );
415    
416            // ACTION - 400 - Envoyer en signature
417            // Cet évenement permet d'envoyer le document au parapheur pour signature
418            $this->class_actions[400] = array(
419                "identifier" => "envoyer_a_signature",
420                "portlet" => array(
421                    "libelle" => _("Envoyer à signature"),
422                    "type" => "action-direct-with-confirmation",
423                    "class" => "envoyer_a_signature-16",
424                ),
425                "view" => "formulaire",
426                "method" => "envoyer_a_signature_sans_relecture",
427                "condition" => array(
428                    "can_be_signed",
429                ),
430                "permission_suffix" => "envoyer_a_signature",
431            );
432    
433            // ACTION - 402 - Envoyer en signature avec relecture
434            // Cet évenement permet d'envoyer le document au parapheur pour signature
435            $this->class_actions[402] = array(
436                "identifier" => "envoyer_a_signature_relecture",
437                "portlet" => array(
438                    "libelle" => __("Envoyer à signature avec relecture"),
439                    "type" => "action-direct-with-confirmation",
440                    "class" => "envoyer_a_signature-16",
441                ),
442                "view" => "formulaire",
443                "method" => "envoyer_a_signature_avec_relecture",
444                "condition" => array(
445                    "can_be_signed",
446                    "is_parapheur_relecture_parameter_enabled"
447                ),
448                "permission_suffix" => "envoyer_a_signature",
449            );
450    
451            // ACTION - 404 - Annuler l'envoi en signature
452            // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
453            $this->class_actions[404] = array(
454                "identifier" => "annuler_envoi_signature",
455                "portlet" => array(
456                    "libelle" => __("Annuler l'envoi en signature"),
457                    "type" => "action-direct-with-confirmation",
458                    "class" => "annuler_envoi_signature-16",
459                ),
460                "view" => "formulaire",
461                "method" => "annuler_envoi_en_signature",
462                "condition" => array(
463                    "is_sent_for_signature",
464                    "is_parapheur_annulation_parameter_enabled"
465                ),
466                "permission_suffix" => "envoyer_a_signature",
467            );
468    
469            //
470            $this->class_actions[401] = array(
471                "identifier" => "preview_edition",
472                "view" => "formulaire",
473                "permission_suffix" => "tab",
474            );
475    
476            // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
477            $this->class_actions[410] = array(
478                "identifier" => "overlay_notification_manuelle",
479                "portlet" => array(
480                    "libelle" => __("Notifier les pétitionnaires"),
481                    "type" => "action-self",
482                    "class" => "notifier_commune-16",
483                ),
484                "condition" => array(
485                    "is_notifiable_by_task_manual",
486                    "is_not_portail_notification_sans_annexe"
487                ),
488                "view" => "view_overlay_notification_manuelle",
489                "permission_suffix" => "modifier",
490            );
491    
492            // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
493            $this->class_actions[411] = array(
494                "identifier" => "notification_manuelle_portal",
495                "portlet" => array(
496                    "libelle" => __("Notifier les pétitionnaires"),
497                    "type" => "action-direct-with-confirmation",
498                    "class" => "notifier_commune-16",
499                ),
500                "condition" => array(
501                    "is_notifiable_by_task_manual",
502                    "is_portail_notification_sans_annexe"
503                ),
504                "method" => "notifier_demandeur_principal_via_portal",
505                "permission_suffix" => "modifier",
506            );
507    
508            // ACTION - 420 - Notifier les services consultés (mail)
509            $this->class_actions[420] = array(
510                "identifier" => "overlay_notification_service_consulte",
511                "portlet" => array(
512                    "libelle" => __("Notifier les services consultés"),
513                    "type" => "action-self",
514                    "class" => "notifier_commune-16",
515                ),
516                "condition" => array(
517                    "is_service_notifiable"
518                ),
519                "view" => "view_overlay_notification_service_consulte",
520                "permission_suffix" => "tab",
521            );
522    
523            // ACTION - 430 - Notifier les tiers consultés (mail)
524            $this->class_actions[430] = array(
525                "identifier" => "overlay_notification_tiers_consulte",
526                "portlet" => array(
527                    "libelle" => __("Notifier les tiers consultés"),
528                    "type" => "action-self",
529                    "class" => "notifier_commune-16",
530                ),
531                "condition" => array(
532                    "is_tiers_notifiable"
533                ),
534                "view" => "view_overlay_notification_tiers_consulte",
535                "permission_suffix" => "tab",
536            );
537    
538            //
539            $this->class_actions[403] = array(
540                "identifier" => "envoyer_au_controle_de_legalite",
541                "portlet" => array(
542                    "libelle" => __("Envoyer au contrôle de légalité"),
543                    "type" => "action-direct-with-confirmation",
544                    "class" => "envoyer_au_controle_de_legalite-16",
545                ),
546                "view" => "formulaire",
547                "method" => "envoyer_au_controle_de_legalite",
548                "condition" => array(
549                    "can_be_sended_to_cl"
550                ),
551                "permission_suffix" => "envoyer_au_controle_de_legalite",
552            );
553    
554            //
555            $this->class_actions[998] = array(
556                "identifier" => "json_data",
557                "view" => "view_json_data",
558                "permission_suffix" => "consulter",
559            );
560      }      }
561    
562      /**      /**
563       * Cette variable permet de stocker le résultat de la méthode       * Clause select pour la requête de sélection des données de l'enregistrement.
564       * getDivisionFromDossier() afin de ne pas effectuer le recalcul à chacun de       *
565       * ces appels.       * @return array
566       * @var string Code de la division du dossier en cours       */
567       */      function get_var_sql_forminc__champs() {
568      var $_division_from_dossier = NULL;          return array(
569                "instruction",
570      /**              "destinataire",
571       * Cette méthode permet de récupérer le code de division correspondant              "instruction.evenement",
572       * au dossier sur lequel on se trouve.              "instruction.commentaire",
573       *              "date_evenement",
574       * @return string Code de la division du dossier en cours              "instruction.lettretype",
575       */              "signataire_arrete",
576      function getDivisionFromDossier() {              "flag_edition_integrale",
577                "om_final_instruction_utilisateur",
578          // Cette méthode peut être appelée plusieurs fois lors d'une requête.              "date_finalisation_courrier",
579          // Pour éviter de refaire le traitement de recherche de la division              "date_envoi_signature",
580          // alors on vérifie si nous ne l'avons pas déjà calculé.              "date_envoi_rar",
581          if ($this->_division_from_dossier != NULL) {              "date_envoi_controle_legalite",
582              // Logger  
583              $this->addToLog("getDivisionFromDossier(): retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);              "date_retour_signature",
584              // On retourne la valeur déjà calculée              "date_retour_rar",
585              return $this->_division_from_dossier;              "date_retour_controle_legalite",
586          }  
587                "numero_arrete",
588          // Par défaut, on définit la valeur du dossier à NULL  
589          $dossier = NULL;              "complement_om_html",
590          // Test sur le mode et le contexte du formulaire              "'' as bible_auto",
591          if ($this->getParameter("maj") == 0              "'' as bible",
592              && ($this->getParameter("retourformulaire") == "dossier"              "complement2_om_html",
593                  || $this->getParameter("retourformulaire") == "dossier_instruction"              "'' as bible2",
594                  || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"              "complement3_om_html",
595                  || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"              "'' as bible3",
596                  || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"              "complement4_om_html",
597                  || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures")) {              "'' as bible4",
598              // Si on se trouve en mode AJOUT (seul mode où l'enregistrement  
599              // n'existe pas en base de données) ET que nous nous trouvons              "titre_om_htmletat",
600              // dans le contexte d'un dossier d'instruction alors on récupère              "corps_om_htmletatex",
601              // le numéro de dossier depuis le paramètre 'idxformulaire'  
602              $dossier = $this->getParameter("idxformulaire");              "'' as btn_preview",
603          } else {              "'' as btn_redaction",
604              // Sinon on récupère le numéro de dossier dans le champs dossier de  
605              // l'enregistrement (en base de données)              "'' as btn_refresh",
606              $dossier = $this->getVal("dossier");              "'' as live_preview",
607    
608                "dossier",
609                "instruction.action",
610                "instruction.delai",
611                "instruction.etat",
612                "instruction.autorite_competente",
613                "instruction.accord_tacite",
614                "instruction.delai_notification",
615                "instruction.avis_decision",
616                "archive_delai",
617                "archive_accord_tacite",
618                "archive_etat",
619                "archive_avis",
620                "archive_date_complet",
621                "archive_date_rejet",
622                "archive_date_limite",
623                "archive_date_notification_delai",
624                "archive_date_decision",
625                "archive_date_validite",
626                "archive_date_achevement",
627                "archive_date_conformite",
628                "archive_date_chantier",
629                "archive_date_dernier_depot",
630                "date_depot",
631                "date_depot_mairie",
632                "complement5_om_html",
633                "'' as bible5",
634                "complement6_om_html",
635                "'' as bible6",
636                "complement7_om_html",
637                "'' as bible7",
638                "complement8_om_html",
639                "'' as bible8",
640                "complement9_om_html",
641                "'' as bible9",
642                "complement10_om_html",
643                "'' as bible10",
644                "complement11_om_html",
645                "'' as bible11",
646                "complement12_om_html",
647                "complement13_om_html",
648                "complement14_om_html",
649                "complement15_om_html",
650                "archive_incompletude",
651                "archive_incomplet_notifie",
652                "archive_evenement_suivant_tacite",
653                "archive_evenement_suivant_tacite_incompletude",
654                "archive_etat_pendant_incompletude",
655                "archive_date_limite_incompletude",
656                "archive_delai_incompletude",
657                "archive_autorite_competente",
658                "code_barres",
659                "om_fichier_instruction",
660                "om_final_instruction",
661                "om_fichier_instruction_dossier_final",
662                "document_numerise",
663                "duree_validite_parametrage",
664                "duree_validite",
665                "created_by_commune",
666                "archive_date_cloture_instruction",
667                "archive_date_premiere_visite",
668                "archive_date_derniere_visite",
669                "archive_date_contradictoire",
670                "archive_date_retour_contradictoire",
671                "archive_date_ait",
672                "archive_date_transmission_parquet",
673                "archive_dossier_instruction_type",
674                "archive_date_affichage",
675                "pec_metier",
676                "archive_pec_metier",
677                "archive_a_qualifier",
678                "id_parapheur_signature",
679                "statut_signature",
680                "commentaire_signature",
681                "historique_signature",
682                "'' as suivi_notification",
683                "'' as suivi_notification_service",
684                "'' as suivi_notification_tiers",
685                "'' as suivi_notification_commune",
686    
687                "'' as preview_edition",
688                "envoye_cl_platau",
689                "'' as log_instruction",
690                "parapheur_lien_page_signature"
691            );
692        }
693    
694        /**
695         * CONDITION - is_edition_integrale_enabled
696         *
697         * Vérifie que la rédaction libre est activée sur l'instruction en cours.
698         *
699         * @return boolean
700         */
701        function is_edition_integrale_enabled() {
702            if ($this->getVal("flag_edition_integrale") == 't') {
703                return true;
704          }          }
705            return false;
706        }
707    
708          // On appelle la méthode de la classe utils qui renvoi le code de la      /**
709          // division d'un dossier, on la stocke pour ne pas refaire le calcul au       * CONDITION - is_edition_integrale_not_enabled
710          // prochain appel de cette méthode       *
711          $this->_division_from_dossier = $this->f->getDivisionFromDossier($dossier);       * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
712          // Logger       *
713          $this->addToLog("getDivisionFromDossier(): retour de la valeur nouvellement calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);       * @return boolean
714          // On retourne la valeur retournée       */
715          return $this->_division_from_dossier;      function is_edition_integrale_not_enabled() {
716            return !$this->is_edition_integrale_enabled();
717        }
718    
719        /**
720         * CONDITION - is_option_redaction_libre_enabled
721         *
722         * Vérifie que l'option de rédaction libre est activée.
723         *
724         * @return boolean
725         */
726        function is_option_redaction_libre_enabled() {
727            $collectivite_di = $this->get_dossier_instruction_om_collectivite();
728            return $this->f->is_option_redaction_libre_enabled($collectivite_di);
729      }      }
730    
731      /**      /**
732       * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier       * CONDITION - is_option_parapheur_relecture_enabled
733         *
734         * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
735         *
736         * @return boolean
737       */       */
738      function getNumDemandeAutorFromDossier($id) {      function is_parapheur_relecture_parameter_enabled() {
739          //          //Instanciation de la classe electronicsignature
740          if (!isset($id)) {          $inst_es = $this->get_electronicsignature_instance();
741              return NULL;          if ($inst_es === false) {
742                return false;
743          }          }
744          //  
745          $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";          if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
746          $sql .= " where dossier='".$id."'";              return false;
747          //          }
748          $dossier_autorisation = $this->db->getOne($sql);  
749          $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);          return true;
         database::isError($dossier_autorisation);  
         //  
         return $dossier_autorisation;  
750      }      }
751    
752      // }}}      /**
753         * CONDITION - is_parapheur_annulation_parameter_enabled
754         *
755         * Vérifie que l'option d'annulation de l'envoi en signature est activée.
756         *
757         * @return boolean
758         */
759        function is_parapheur_annulation_parameter_enabled() {
760            //Instanciation de la classe electronicsignature
761            $inst_es = $this->get_electronicsignature_instance();
762            if ($inst_es === false) {
763                return false;
764            }
765    
766      function setType(&$form, $maj) {          if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
767          //              return false;
768          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');  
         //  
         $form->setType('numero_arrete', 'hidden');  
         //  
         $form->setType('code_barres', 'hidden');  
           
         //  
         $form->setType('archive_incompletude','hidden');  
         $form->setType('archive_incomplet_notifie','hidden');  
         $form->setType('archive_evenement_suivant_tacite','hidden');  
         $form->setType('archive_evenement_suivant_tacite_incompletude','hidden');  
         $form->setType('archive_etat_pendant_incompletude','hidden');  
         $form->setType('archive_date_limite_incompletude','hiddendate');  
         $form->setType('archive_delai_incompletude','hidden');  
769    
770            return true;
771        }
772    
773    
774        /**
775         * CONDITION - is_sent_for_signature
776         *
777         * Vérifie que l'instruction a été envoyé à signature
778         *
779         * @return boolean
780         */
781        function is_sent_for_signature() {
782            // Si un parapheur a été configuré
783            // et que le champ id_parapheur_signature n'est pas vide
784            // que le status est différent de "canceled" ou "expired"
785            // alors l'évènement a été envoyé en signature
786            if ($this->has_connector_electronicsignature() === true
787                && empty($this->getVal("id_parapheur_signature")) === false
788                && ($this->getVal("statut_signature") != "canceled"
789                && $this->getVal("statut_signature") != "expired"
790                && $this->getVal("statut_signature") != "finished")) {
791                //
792                return true;
793            }
794    
795            return false;
796        }
797    
798        /**
799         * CONDITION - is_not_sent_for_signature
800         *
801         * Vérifie que l'instruction n'a pas été envoyé à signature
802         *
803         * @return boolean
804         */
805        function is_not_sent_for_signature() {
806            // Contrôle si l'utilisateur possède un bypass
807            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
808            if ($bypass == true) {
809                return true;
810            }
811    
812            return !$this->is_sent_for_signature();
813        }
814    
815    
816        /**
817         * CONDITION - is_signed
818         *
819         * Vérifie que l'instruction a été signé
820         *
821         * @return boolean
822         */
823        function is_signed() {
824            // Si un parapheur a été configuré
825            // et que le champ id_parapheur_signature n'est pas vide
826            //  et que le statut est égal à "finished"
827            // alors le document de l'instruciton à été signé
828            if ($this->has_connector_electronicsignature() === true
829                && empty($this->getVal("id_parapheur_signature")) === false
830                && $this->getVal("statut_signature") == "finished") {
831                //
832                return true;
833            }
834    
835            return false;
836        }
837    
838    
839        /**
840         * is_sent_to_cl
841         *
842         * Vérifie que l'instruction a été envoyé au contrôle de légalité
843         *
844         * @return boolean
845         */
846        function is_sent_to_cl() {
847            // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
848            if ($this->getVal('envoye_cl_platau') === 't') {
849                //
850                return true;
851            }
852          //          //
853          $form->setType('duree_validite','hidden');          return false;
854          $form->setType('duree_validite_parametrage','hidden');      }
855    
856        /**
857         * CONDITION - is_portail_notification
858         *
859         * Vérifie si la notification est une notification de catégorie portail
860         *
861         * @return boolean
862         */
863        function is_portail_notification_sans_annexe() {
864            $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
865            $ev = $this->get_inst_evenement($this->getVal('evenement'));
866            if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
867                && $ev->getVal('notification') != 'notification_manuelle_annexe'
868                && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
869            ) {
870                return true;
871            }
872            return false;
873        }
874    
875        /**
876         * CONDITION - is_not_portail_notification
877         *
878         * Vérifie si la notification n'est pas une notification de catégorie portail
879         *
880         * @return boolean
881         */
882        function is_not_portail_notification_sans_annexe() {
883            return (! $this->is_portail_notification_sans_annexe());
884        }
885    
886        /**
887         * CONDITION - can_be_signed
888         *
889         * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
890         *
891         * @return boolean
892         */
893        function can_be_signed() {
894            // Instanciation de l'objet signataire_arrete
895            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
896                "obj" => "signataire_arrete",
897                "idx" => $this->getVal("signataire_arrete"),
898            ));
899            // Si un parapheur a été configuré, que le document est finalisé, que le signataire
900            // possède une adresse email, on vérifie le champ id_parapheur_signature
901            // S'il est vide l'évènement peut être envoyé en signature
902            // S'il ne l'est pas, alors on vérifie le champ statut_signature
903            // Si la valeur de ce champ est égal à "canceled" ou "expired"
904            // alors l'évènement peut être envoyé en signature
905            if ($this->has_connector_electronicsignature() === true
906                && $this->getVal("om_final_instruction") == 't'
907                && empty($inst_signataire_arrete->getVal('email')) === false) {
908                //
909                if (empty($this->getVal("id_parapheur_signature")) === true
910                    || $this->getVal("statut_signature") == "canceled"
911                    || $this->getVal("statut_signature") == "expired") {
912                    //
913                    return true;
914                }
915            }
916    
917            $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
918            $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
919            $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
920            $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
921            $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
922    
923            return false;
924        }
925    
926        /**
927         * CONDITION - has_connector_electronicsignature
928         *
929         * Vérifie qu'un parapheur est paramétré
930         *
931         * @return boolean
932         */
933        function has_connector_electronicsignature() {
934            $inst_es = $this->get_electronicsignature_instance(false);
935            if ($inst_es === false) {
936                return false;
937            }
938            return true;
939        }
940    
941        /**
942         * CONDITION - can_display_parapheur
943         *
944         * Vérifie que le fieldset "Suivi Parapheur" soit affichable
945         *
946         * @return boolean
947         */
948        function can_display_parapheur() {
949            $evenement_id = $this->getVal("evenement");
950            $inst_evenement = $this->get_inst_evenement($evenement_id);
951            if ($this->has_connector_electronicsignature() === true
952                && $inst_evenement->getVal('lettretype') !== ''
953                && $inst_evenement->getVal('lettretype') !== null
954                && (empty($this->getVal("id_parapheur_signature")) === false
955                    || empty($this->getVal("historique_signature")) === false)) {
956                //
957                return true;
958            }
959    
960            return false;
961        }
962    
963        /**
964         * CONDITION - can_display_notification
965         *
966         * Vérifie que le champs "Suivi notification" est affichable
967         *
968         * @return boolean
969         */
970        function can_display_notification_demandeur() {
971            // Le suivi des notification est affiché si l'événement est notifiable
972            // et si des notifications ont été envoyées
973            $evenement_id = $this->getVal("evenement");
974            $inst_evenement = $this->get_inst_evenement($evenement_id);
975            if ($inst_evenement->getVal('notification') != null &&
976                $inst_evenement->getVal('notification') != '') {
977                // Des notifications ont été envoyé si il existe au moins une notification
978                // liées à l'instruction
979                $idsNotifs = $this->get_instruction_notification(
980                    $this->getVal($this->clePrimaire),
981                    array(
982                        'notification_recepisse',
983                        'notification_instruction',
984                        'notification_decision',
985                    ),
986                    true
987                );
988                if (isset($idsNotifs) && $idsNotifs !== array()) {
989                    return true;
990                }
991            }
992            return false;
993        }
994    
995        /**
996         * CONDITION - can_display_notification
997         *
998         * Vérifie que le champs "suivi_notification_service" est affichable
999         *
1000         * @return boolean
1001         */
1002        function can_display_notification_service() {
1003            // Le suivi des notification est affiché si l'événement est notifiable
1004            // et si des notifications ont été envoyées
1005            $evenement_id = $this->getVal("evenement");
1006            $inst_evenement = $this->get_inst_evenement($evenement_id);
1007            if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1008                // Des notifications ont été envoyé si il existe au moins une notification
1009                // de type notification_service_consulte liées à l'instruction
1010                $idsNotifs = $this->get_instruction_notification(
1011                    $this->getVal($this->clePrimaire),
1012                    'notification_service_consulte'
1013                );
1014                if (isset($idsNotifs) && $idsNotifs !== array()) {
1015                    return true;
1016                }
1017            }
1018            return false;
1019        }
1020    
1021    
1022        /**
1023         * CONDITION - can_display_notification_tiers
1024         *
1025         * Vérifie que le champs "suivi_notification_tiers" est affichable
1026         *
1027         * @return boolean
1028         */
1029        function can_display_notification_tiers() {
1030            // Le suivi des notification est affiché si l'événement est notifiable
1031            // et si des notifications ont été envoyées
1032            $evenement_id = $this->getVal("evenement");
1033            $inst_evenement = $this->get_inst_evenement($evenement_id);
1034            if (! empty($inst_evenement->getVal('notification_tiers'))) {
1035                // Des notifications ont été envoyé si il existe au moins une notification
1036                // de type notification_tiers_consulte liées à l'instruction
1037                $idsNotifs = $this->get_instruction_notification(
1038                    $this->getVal($this->clePrimaire),
1039                    'notification_tiers_consulte'
1040                );
1041                if (isset($idsNotifs) && $idsNotifs !== array()) {
1042                    return true;
1043                }
1044            }
1045            return false;
1046        }
1047    
1048        /**
1049         * CONDITION - can_display_notification_commune
1050         *
1051         * Vérifie que le champs "suivi_notification_commune" est affichable
1052         *
1053         * @return boolean
1054         */
1055        function can_display_notification_commune() {
1056            // Le suivi des notification si il existe au moins une notification
1057            // de type notification_depot_demat liées à l'instruction
1058            $idsNotifs = $this->get_instruction_notification(
1059                $this->getVal($this->clePrimaire),
1060                array('notification_depot_demat', 'notification_commune')
1061            );
1062            if (isset($idsNotifs) && $idsNotifs !== array()) {
1063                return true;
1064            }
1065            return false;
1066        }
1067    
1068        /**
1069         * TREATMENT - disable_edition_integrale.
1070         *
1071         * Cette methode permet de passer la consultation en "lu"
1072         *
1073         * @return boolean true si maj effectué false sinon
1074         */
1075        function disable_edition_integrale() {
1076            // Cette méthode permet d'exécuter une routine en début des méthodes
1077            // dites de TREATMENT.
1078            $this->begin_treatment(__METHOD__);
1079            $this->correct = true;
1080            $valF = array(
1081                "flag_edition_integrale" => false,
1082                "titre_om_htmletat" => null,
1083                "corps_om_htmletatex" => null,
1084            );
1085            $res = $this->f->db->autoExecute(
1086                DB_PREFIXE.$this->table,
1087                $valF,
1088                DB_AUTOQUERY_UPDATE,
1089                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1090            );
1091            if ($this->f->isDatabaseError($res, true)) {
1092                // Appel de la methode de recuperation des erreurs
1093                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1094                $this->correct = false;
1095                // Termine le traitement
1096                return $this->end_treatment(__METHOD__, false);
1097            } else {
1098                $this->addToMessage(_("Rédaction par compléments activé."));
1099                return $this->end_treatment(__METHOD__, true);
1100            }
1101    
1102            // Termine le traitement
1103            return $this->end_treatment(__METHOD__, false);
1104        }
1105    
1106        /**
1107         * TREATMENT - enable_edition_integrale.
1108         *
1109         * Cette methode permet de passer la consultation en "lu"
1110         *
1111         * @return boolean true si maj effectué false sinon
1112         */
1113        function enable_edition_integrale() {
1114            // Cette méthode permet d'exécuter une routine en début des méthodes
1115            // dites de TREATMENT.
1116            $this->begin_treatment(__METHOD__);
1117            $this->correct = true;
1118    
1119            // Récupère la collectivite du dossier d'instruction
1120            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1121            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1122            //
1123            $params = array(
1124                "specific" => array(
1125                    "corps" => array(
1126                        "mode" => "get",
1127                    )
1128                ),
1129            );
1130            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1131            $corps = $result['pdf_output'];
1132          //          //
1133          $form->setType('created_by_commune','hidden');          $params = array(
1134                "specific" => array(
1135                    "titre" => array(
1136                        "mode" => "get",
1137                    )
1138                ),
1139            );
1140            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1141            $titre = $result['pdf_output'];
1142          //          //
1143          // gestion du champ "finalisé par"          $valF = array(
1144          if ($this->getVal("om_final_instruction") == 't') {              "flag_edition_integrale" => true,
1145              $form->setType('om_final_instruction_utilisateur', 'static');              "titre_om_htmletat" => $titre,
1146                "corps_om_htmletatex" => $corps,
1147            );
1148            $res = $this->f->db->autoExecute(
1149                DB_PREFIXE.$this->table,
1150                $valF,
1151                DB_AUTOQUERY_UPDATE,
1152                $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1153            );
1154            if ($this->f->isDatabaseError($res, true)) {
1155                // Appel de la methode de recuperation des erreurs
1156                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1157                $this->correct = false;
1158                // Termine le traitement
1159                return $this->end_treatment(__METHOD__, false);
1160          } else {          } else {
1161              $form->setType('om_final_instruction_utilisateur', 'hidden');              $this->addToMessage(_("Rédaction libre activé."));
1162                return $this->end_treatment(__METHOD__, true);
1163          }          }
1164          //  
1165          if ($maj < 2 || $maj == 125) { //ajouter, modifier et suivi des dates          // Termine le traitement
1166              $form->setType('destinataire', 'hidden');          return $this->end_treatment(__METHOD__, false);
1167              $form->setType('lettretype', 'hiddenstatic');      }
1168              $form->setType('complement_om_html', 'html');  
1169              $form->setType('complement2_om_html', 'html');      /**
1170              $form->setType('complement3_om_html', 'html');       * Cette méthode instancie le dossier à partir de l'identifiant passé
1171              $form->setType('complement4_om_html', 'html');       * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1172              $form->setType('bible_auto', 'httpclick');       * associé au dossier.
1173              $form->setType('bible', 'httpclick');       * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1174              $form->setType('bible2', 'httpclick');       * renverra NULL
1175              $form->setType('bible3', 'httpclick');       *
1176              $form->setType('bible4', 'httpclick');       * @param string identifiant du dossier
1177              $form->setType('dossier', 'hidden');         * @return null|string null ou identifiant du DA
1178              $form->setType('libelle', 'hiddenstatic');       */
1179              $form->setType('signataire_arrete','select');      function getNumDemandeAutorFromDossier($id) {
1180              $form->setType('date_envoi_signature','datedisabled');          if (!isset($id)) {
1181              $form->setType('date_retour_signature','datedisabled');              return NULL;
1182              $form->setType('date_envoi_rar','datedisabled');          }
1183              $form->setType('date_retour_rar','datedisabled');  
1184              $form->setType('date_envoi_controle_legalite','datedisabled');          $dossier = $this->f->get_inst__om_dbform(array(
1185              $form->setType('date_retour_controle_legalite','datedisabled');              'obj' => 'dossier',
1186              $form->setType('date_finalisation_courrier','datedisabled');              'idx' => $id,
1187            ));
1188              if($maj==0){ // ajouter  
1189                  $form->setType('instruction', 'hidden');          return $dossier->getVal('dossier_autorisation');
1190                  $form->setType('lettretype', 'hidden');      }
1191                  $form->setType('evenement', 'select');  
1192                  $form->setType('date_evenement', 'date2');      
1193              }else{ // modifier et suivi des dates      function setType(&$form, $maj) {
1194                  $form->setType('instruction', 'hiddenstatic');          // Récupération du mode de l'action
1195                  $form->setType('evenement', 'selecthiddenstatic');          $crud = $this->get_action_crud($maj);
1196                  //$form->setType('date_evenement', 'hiddenstaticdate');          // Récupère la collectivité du dossier d'instruction
1197                  $form->setType('date_evenement', 'date2');          $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1198    
1199            // Cache tous les champs
1200            foreach ($this->champs as $value) {
1201                $form->setType($value, 'hidden');
1202            }
1203    
1204            // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1205            if ($this->can_display_parapheur() === true && $maj == 3) {
1206                $form->setType('statut_signature', 'selectstatic');
1207                $form->setType('historique_signature', 'jsontotab');
1208                if ($this->getVal('commentaire_signature') == null) {
1209                    $form->setType('commentaire_signature', 'hidden');
1210                } else {
1211                    $form->setType('commentaire_signature', 'hiddenstatic');
1212                }
1213            }
1214    
1215            // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1216            if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1217                $form->setType('suivi_notification', 'jsontotab');
1218            }
1219            // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1220            if ($maj == 3 && $this->can_display_notification_service() === true) {
1221                $form->setType('suivi_notification_service', 'jsontotab');
1222            }
1223            // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1224            if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1225                $form->setType('suivi_notification_tiers', 'jsontotab');
1226            }
1227            // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1228            if ($maj == 3 && $this->can_display_notification_commune() === true) {
1229                $form->setType('suivi_notification_commune', 'jsontotab');
1230            }
1231    
1232            // MODE AJOUTER
1233            if ($this->getParameter('maj') == 0) {
1234                $form->setType('commentaire', 'textareahidden');
1235                // Si l'option est active passage du champ date en lecture seule
1236                if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1237                    $form->setType("date_evenement", "hiddenstaticdate");
1238                } else {
1239                    $form->setType("date_evenement", "date");
1240                }
1241                if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1242                    $form->setType("evenement", "selecthiddenstatic");
1243                } else {
1244                    $form->setType("evenement", "select");
1245                }
1246                if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1247                    $form->setType("signataire_arrete", "selecthiddenstatic");
1248                } else {
1249                    $form->setType("signataire_arrete", "select");
1250                }
1251                if ($this->is_option_redaction_libre_enabled() === true) {
1252                    $form->setType("flag_edition_integrale", "select");
1253                }
1254            }
1255    
1256            // MODE MODIFIER
1257            if ($this->getParameter('maj') == 1) {
1258                // Si l'option est active passage du champ date en lecture seule
1259                if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1260                    $form->setType("date_evenement", "hiddenstaticdate");
1261                } else {
1262                    $form->setType("date_evenement", "date");
1263                }
1264                $form->setType("evenement", "selecthiddenstatic");
1265                if ($this->has_an_edition() === true) {
1266                    $form->setType('lettretype', 'hiddenstatic');
1267                    if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1268                        $form->setType("signataire_arrete", "selecthiddenstatic");
1269                    } else {
1270                        $form->setType("signataire_arrete", "select");
1271                    }
1272                    if ($this->getVal("flag_edition_integrale") == "t") {
1273                        $form->setType("titre_om_htmletat", "htmlEtat");
1274                        $form->setType("corps_om_htmletatex", "htmlEtatEx");
1275                    } else {
1276                        $form->setType("complement_om_html", "html");
1277                        $form->setType("complement2_om_html", "html");
1278                        $form->setType("complement3_om_html", "html");
1279                        $form->setType("complement4_om_html", "html");
1280                        $form->setType('bible_auto', 'httpclick');
1281                        $form->setType('bible', 'httpclick');
1282                        $form->setType('bible2', 'httpclick');
1283                        $form->setType('bible3', 'httpclick');
1284                        $form->setType('bible4', 'httpclick');
1285                    }
1286                    if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1287                        //
1288                        $form->setType('btn_refresh', 'httpclickbutton');
1289                        $form->setType('btn_preview', 'httpclickbutton');
1290                        $form->setType('btn_redaction', 'httpclickbutton');
1291                        // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1292                        // pour identifiant le champ de prévisualisation et régler sa taille à
1293                        // l'affichage du champ. En cas de modification, le selecteur doit également
1294                        // être mis à jour
1295                        $form->setType('live_preview', 'previsualiser_pdf');
1296                    }
1297    
1298                  // necessaire pour calcul de date en modification                  // necessaire pour calcul de date en modification
1299                  //$form->setType('delai', 'hiddenstatic');                  //$form->setType('delai', 'hiddenstatic');
1300                  // les administrateurs technique et fonctionnel peuvent                  // les administrateurs technique et fonctionnel peuvent
1301                  // modifier tous les champs de date                  // modifier tous les champs de date
1302                  // 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
1303                  if ($this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")                  if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1304                            || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1305                      && $this->getVal("date_finalisation_courrier") != '') {                      && $this->getVal("date_finalisation_courrier") != '') {
1306                        //
1307                      $form->setType('date_envoi_signature', 'date');                      $form->setType('date_envoi_signature', 'date');
1308                      $form->setType('date_retour_signature', 'date');                      $form->setType('date_retour_signature', 'date');
1309                        if ($this->is_sent_for_signature() === true
1310                            && $this->is_signed() === true) {
1311                            //
1312                            $form->setType("date_envoi_signature", "datereadonly");
1313                            $form->setType("date_retour_signature", "datereadonly");
1314                        }
1315                      $form->setType('date_envoi_rar', 'date');                      $form->setType('date_envoi_rar', 'date');
1316                      $form->setType('date_retour_rar', 'date');                      $form->setType('date_retour_rar', 'date');
1317                      $form->setType('date_envoi_controle_legalite', 'date');                      $form->setType('date_envoi_controle_legalite', 'date');
1318                        if ($this->is_sent_to_cl() === true) {
1319                            $form->setType("date_envoi_controle_legalite", "datedisabled");
1320                        }
1321                      $form->setType('date_retour_controle_legalite', 'date');                      $form->setType('date_retour_controle_legalite', 'date');
1322                      $form->setType('date_finalisation_courrier', 'date');                      $form->setType('date_finalisation_courrier', 'date');
                     // suivi des dates  
                     if ($maj == 125) {  
                         $form->setType('date_evenement', 'hiddenstaticdate');  
                         $form->setType('complement_om_html', 'hiddenstatic');  
                         $form->setType('complement2_om_html', 'hiddenstatic');  
                         $form->setType('complement3_om_html', 'hiddenstatic');  
                         $form->setType('complement4_om_html', 'hiddenstatic');  
                         $form->setType('bible_auto', 'hidden');  
                         $form->setType('bible', 'hidden');  
                         $form->setType('bible2', 'hidden');  
                         $form->setType('bible3', 'hidden');  
                         $form->setType('bible4', 'hidden');  
                         $form->setType('signataire_arrete','selecthiddenstatic');  
                         $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');  
                     }  
1323                  }                  }
1324              }              }
         } elseif($maj==2){  
             $form->setType('dossier', 'hidden');  
             $form->setType('bible_auto', 'hidden');  
             $form->setType('bible', 'hidden');  
             $form->setType('bible2', 'hidden');  
             $form->setType('bible3', 'hidden');  
             $form->setType('bible4', 'hidden');  
         }else {  
             $form->setType('destinataire', 'hidden');  
             $form->setType('dossier', 'hidden');  
             $form->setType('bible_auto', 'hidden');  
             $form->setType('bible', 'hidden');  
             $form->setType('bible2', 'hidden');  
             $form->setType('bible3', 'hidden');  
             $form->setType('bible4', 'hidden');  
         }  
   
         //Cache les champs pour la finalisation  
         $form->setType('om_fichier_instruction', 'hidden');  
         $form->setType('om_final_instruction', 'hidden');  
         // Cache le document arrêté  
         $form->setType('document_numerise', 'hidden');  
           
         //Masquer les champs date_envoi_controle_legalite et  
         //date_retour_controle_legalite si ce n'est pas un arrêté et si ce n'est  
         //pas un utilisateur ayant le droit spécifique  
         if ( !is_numeric($this->getVal("avis_decision"))&&  
             !$this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")){  
               
             $form->setType("date_envoi_controle_legalite", "hiddendate");  
             $form->setType("date_retour_controle_legalite", "hiddendate");  
1325          }          }
1326    
1327          // Pour les actions finalize, unfinalize et notifier_commune          // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1328          if($maj == 100 || $maj == 110 || $maj == 210) {          if ($this->getParameter('maj') == 3
1329              //              || $this->getParameter('maj') == 2
1330              foreach ($this->champs as $value) {              || $this->getParameter('maj') == 125
1331                  // Cache tous les champs              || $this->getParameter('maj') == 410) {
1332                  $form->setType($value, 'hidden');              //
1333                $form->setType("date_evenement", "datestatic");
1334                $form->setType("evenement", "selecthiddenstatic");
1335                if ($this->has_an_edition() === true) {
1336                    $form->setType('lettretype', 'hiddenstatic');
1337                    $form->setType("signataire_arrete", "selecthiddenstatic");
1338                    if ($this->getVal("om_final_instruction") == 't') {
1339                        $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1340                    } else {
1341                        $form->setType('om_final_instruction_utilisateur', 'hidden');
1342                    }
1343                }
1344                if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1345                    $form->setType('commentaire', 'textareastatic');
1346                }
1347            }
1348    
1349            // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1350            if ($this->getParameter('maj') == 3
1351                || $this->getParameter('maj') == 2
1352                || $this->getParameter('maj') == 410) {
1353                // Si il n'y a pas de lettre type (edition) associé à l'événement
1354                // les dates de suivi ne sont pas affichée
1355                if ($this->has_an_edition() === true) {
1356                    $form->setType('date_envoi_signature', 'datestatic');
1357                    $form->setType('date_retour_signature', 'datestatic');
1358                    $form->setType('date_envoi_rar', 'datestatic');
1359                    $form->setType('date_retour_rar', 'datestatic');
1360                    $form->setType('date_envoi_controle_legalite', 'datestatic');
1361                    $form->setType('date_retour_controle_legalite', 'datestatic');
1362                    $form->setType('date_finalisation_courrier', 'datestatic');
1363                    if ($this->getVal("flag_edition_integrale") == "t") {
1364                        $form->setType("titre_om_htmletat", "htmlstatic");
1365                        $form->setType("corps_om_htmletatex", "htmlstatic");
1366                    } else {
1367                        $form->setType("complement_om_html", "htmlstatic");
1368                        $form->setType("complement2_om_html", "htmlstatic");
1369                        $form->setType("complement3_om_html", "htmlstatic");
1370                        $form->setType("complement4_om_html", "htmlstatic");
1371                    }
1372                }
1373            }
1374    
1375            // MODE SUIVI DES DATES 125
1376            if ($this->getParameter('maj') == 125) {
1377                $form->setType("date_evenement", "hiddenstaticdate");
1378                $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1379                $form->setType('date_envoi_signature', 'date');
1380                $form->setType('date_retour_signature', 'date');
1381                if ($this->is_sent_for_signature() === true
1382                    || $this->is_signed() === true) {
1383                    //
1384                    $form->setType("date_envoi_signature", "datereadonly");
1385                    $form->setType("date_retour_signature", "datereadonly");
1386                }
1387                $form->setType('date_envoi_rar', 'date');
1388                $form->setType('date_retour_rar', 'date');
1389                $form->setType('date_envoi_controle_legalite', 'date');
1390                if ($this->is_sent_to_cl() === true) {
1391                    $form->setType("date_envoi_controle_legalite", "datedisabled");
1392                }
1393                $form->setType('date_retour_controle_legalite', 'date');
1394                $form->setType('date_finalisation_courrier', 'date');
1395            }
1396    
1397            if ($maj == 401) {
1398                foreach ($this->champs as $champ) {
1399                    $form->setType($champ, 'hidden');
1400                }
1401                $form->setType('preview_edition', 'previsualiser');
1402            }
1403    
1404            // Si l'instruction a été envoyé au contrôle de légalité et que la
1405            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1406            // l'utilisateur que l'envoi au cl est en cours de traitement.
1407            if ($this->is_sent_to_cl() === true
1408                && empty($this->getVal('date_envoi_controle_legalite'))
1409                && $maj == 3) {
1410                $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1411            }
1412        }
1413    
1414        function setOnchange(&$form,$maj){
1415            parent::setOnchange($form,$maj);
1416    
1417            // MODE AJOUTER
1418            if ($this->getParameter('maj') == 0) {
1419                $form->setOnchange(
1420                    "evenement",
1421                    "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1422                    manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1423                );
1424            }
1425        }
1426    
1427        function evenement_has_an_edition($evenement_id) {
1428            $evenement = $this->get_inst_evenement($evenement_id);
1429            $lettretype = $evenement->getVal('lettretype');
1430            if ($lettretype !== '' && $lettretype !== null) {
1431                return true;
1432            }
1433            return false;
1434        }
1435    
1436        function view_evenement_has_an_edition_json() {
1437            $json_return = array(
1438                "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1439                "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1440            );
1441            echo json_encode($json_return);
1442        }
1443    
1444        function evenement_has_a_commentaire($evenement_id) {
1445            $evenement = $this->get_inst_evenement($evenement_id);
1446            return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1447        }
1448    
1449        function view_evenement_has_a_commentaire_json() {
1450            $json_return = array(
1451                "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1452            );
1453            echo json_encode($json_return);
1454        }
1455    
1456    
1457        /**
1458         * CONDITION - can_be_sended_to_cl
1459         *
1460         * Vérifie que le contrôle de légalité est disponible
1461         *
1462         * @return boolean
1463         */
1464        function can_be_sended_to_cl() {
1465            // Si l'instruction a une édition
1466            // et que l'événement est paramétré pour envoyer le contrôle de légalité
1467            // par Plat'AU
1468            // et que la date de retour signature est renseignée
1469            // et que la date d'envoi au contrôle légalité n'est pas renseignée
1470            // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1471            if ($this->has_an_edition() === true) {
1472                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1473                $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1474                if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1475                    && empty($this->getVal('date_retour_signature')) === false
1476                    && empty($this->getVal('date_envoi_controle_legalite')) === true
1477                    && $this->getVal('envoye_cl_platau') === 'f'
1478                    && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1479                    && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1480                    //
1481                    return true;
1482                }
1483            }
1484            //
1485            return false;
1486        }
1487    
1488        /**
1489         *
1490         * @return string
1491         */
1492        function get_var_sql_forminc__sql_signataire_arrete() {
1493            return sprintf(
1494                "SELECT
1495                    signataire_arrete.signataire_arrete,
1496                    CONCAT_WS(
1497                        ' - ',
1498                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1499                        signataire_habilitation.libelle,
1500                        signataire_arrete.description
1501                    )
1502                FROM
1503                    %1\$ssignataire_arrete
1504                    LEFT JOIN %1\$ssignataire_habilitation
1505                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1506                WHERE
1507                    ((signataire_arrete.om_validite_debut IS NULL
1508                        AND (signataire_arrete.om_validite_fin IS NULL
1509                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1510                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1511                            AND (signataire_arrete.om_validite_fin IS NULL
1512                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1513                ORDER BY
1514                    signataire_arrete.prenom,
1515                    signataire_arrete.nom",
1516                DB_PREFIXE
1517            );
1518        }
1519    
1520        /**
1521         *
1522         * @return string
1523         */
1524        function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1525            return sprintf(
1526                "SELECT
1527                    signataire_arrete.signataire_arrete,
1528                    CONCAT_WS(
1529                        ' - ',
1530                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1531                        signataire_habilitation.libelle,
1532                        signataire_arrete.description
1533                    )
1534                FROM
1535                    %1\$ssignataire_arrete
1536                    LEFT JOIN %1\$ssignataire_habilitation
1537                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1538                WHERE
1539                    signataire_arrete.signataire_arrete = <idx>",
1540                DB_PREFIXE
1541            );
1542        }
1543    
1544        /**
1545         *
1546         * @return string
1547         */
1548        function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1549            return sprintf(
1550                "SELECT
1551                    signataire_arrete.signataire_arrete,
1552                    CONCAT_WS(
1553                        ' - ',
1554                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1555                        signataire_habilitation.libelle,
1556                        signataire_arrete.description
1557                    )
1558                FROM
1559                    %1\$ssignataire_arrete
1560                    LEFT JOIN %1\$som_collectivite
1561                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1562                    LEFT JOIN %1\$ssignataire_habilitation
1563                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1564                WHERE
1565                    ((signataire_arrete.om_validite_debut IS NULL
1566                        AND (signataire_arrete.om_validite_fin IS NULL
1567                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1568                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1569                            AND (signataire_arrete.om_validite_fin IS NULL
1570                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1571                    AND (om_collectivite.niveau = '2'
1572                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1573                ORDER BY
1574                    signataire_arrete.prenom, signataire_arrete.nom",
1575                DB_PREFIXE
1576            );
1577        }
1578    
1579        /**
1580         *
1581         * @return string
1582         */
1583        function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1584            return sprintf(
1585                "SELECT
1586                    signataire_arrete.signataire_arrete,
1587                    CONCAT_WS(
1588                        ' - ',
1589                        CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1590                        signataire_habilitation.libelle,
1591                        signataire_arrete.description
1592                    )
1593                FROM
1594                    %1\$ssignataire_arrete
1595                    LEFT JOIN %1\$ssignataire_habilitation
1596                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1597                WHERE
1598                    ((signataire_arrete.om_validite_debut IS NULL
1599                        AND (signataire_arrete.om_validite_fin IS NULL
1600                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1601                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1602                            AND (signataire_arrete.om_validite_fin IS NULL
1603                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1604                    AND signataire_arrete.defaut IS TRUE
1605                ORDER BY
1606                    signataire_arrete.prenom, signataire_arrete.nom",
1607                DB_PREFIXE
1608            );
1609        }
1610    
1611        /**
1612         *
1613         * @return string
1614         */
1615        function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1616            return sprintf(
1617                "SELECT
1618                    signataire_arrete.signataire_arrete,
1619                        CONCAT_WS(
1620                            ' - ',
1621                            CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1622                            signataire_habilitation.libelle,
1623                            signataire_arrete.description
1624                        )
1625                FROM
1626                    %1\$ssignataire_arrete
1627                    LEFT JOIN %1\$ssignataire_habilitation
1628                        ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1629                    LEFT JOIN %1\$som_collectivite
1630                        ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1631                WHERE
1632                    ((signataire_arrete.om_validite_debut IS NULL
1633                        AND (signataire_arrete.om_validite_fin IS NULL
1634                            OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1635                        OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1636                            AND (signataire_arrete.om_validite_fin IS NULL
1637                                OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1638                    AND signataire_arrete.defaut IS TRUE
1639                    AND (om_collectivite.niveau = '2'
1640                        OR signataire_arrete.om_collectivite = <collectivite_di>)
1641                ORDER BY
1642                    signataire_arrete.prenom,
1643                    signataire_arrete.nom",
1644                DB_PREFIXE
1645            );
1646        }
1647    
1648        /**
1649         * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1650         * dont l'identifiant a été passé en paramètre dans l'url.
1651         *
1652         * @return array
1653         */
1654        function get_var_sql_forminc__sql_evenement() {
1655            // Récupération du numéro de dossier
1656            $dossier = $this->getParameter("idxformulaire");
1657            // Si changement de décision par instructeur commune
1658            $filter = '';
1659            if ($this->f->isUserInstructeur() === true
1660                && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1661                && $this->isInstrCanChangeDecision($dossier) === true) {
1662                $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1663            }
1664            // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1665            // de déterminer si il s'agit d'évènements suggérés.
1666            $qres = $this->f->get_all_results_from_db_query(
1667                sprintf(
1668                    'SELECT
1669                        DISTINCT(evenement.evenement),
1670                        evenement.libelle,
1671                        -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1672                        CASE WHEN evenement_suggere_dossier.evenement IS NULL
1673                            THEN FALSE
1674                            ELSE TRUE
1675                        END AS is_suggested
1676                    FROM
1677                        -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1678                        -- selon le type de dossier et l état du dossier.
1679                        %1$sevenement
1680                        JOIN %1$slien_dossier_instruction_type_evenement
1681                            ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1682                        JOIN %1$stransition
1683                            ON evenement.evenement = transition.evenement
1684                        JOIN %1$sdossier
1685                            ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1686                                AND transition.etat = dossier.etat
1687                        -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1688                        LEFT JOIN (
1689                            SELECT
1690                                lien_sig_contrainte_evenement.evenement,
1691                                dossier.dossier
1692                            FROM
1693                                %1$slien_sig_contrainte_evenement
1694                                JOIN %1$ssig_contrainte
1695                                    ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1696                                JOIN %1$slien_sig_contrainte_dossier_instruction_type
1697                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1698                                JOIN %1$slien_sig_contrainte_om_collectivite
1699                                    ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1700                                JOIN %1$scontrainte
1701                                    ON sig_contrainte.libelle = contrainte.libelle
1702                                JOIN %1$sdossier_contrainte
1703                                    ON contrainte.contrainte = dossier_contrainte.contrainte
1704                                JOIN %1$sdossier
1705                                    ON dossier_contrainte.dossier = dossier.dossier
1706                                        AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1707                                JOIN %1$som_collectivite
1708                                    ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1709                                        AND (dossier.om_collectivite = om_collectivite.om_collectivite
1710                                            OR om_collectivite.niveau = \'2\')
1711                        ) AS evenement_suggere_dossier
1712                            ON evenement.evenement = evenement_suggere_dossier.evenement
1713                                AND dossier.dossier = evenement_suggere_dossier.dossier
1714                    WHERE
1715                        dossier.dossier = \'%2$s\'
1716                        %3$s
1717                    ORDER BY
1718                        is_suggested DESC,
1719                        evenement.libelle',
1720                    DB_PREFIXE,
1721                    $this->f->db->escapeSimple($dossier),
1722                    $filter
1723                ),
1724                array(
1725                    "origin" => __METHOD__
1726                )
1727            );
1728            return $qres['result'];
1729        }
1730    
1731        /**
1732         * Récupère un tableau contenant des évènements de la forme :
1733         * $events = array(
1734         *      1 => array(
1735         *         'libelle' => 'evenement_libelle',
1736         *         'evenement' => 'identifiant_evenement',
1737         *         'is_suggested' => true/false   -> booleen indiquant si c'est un événement suggéré
1738         *         ))
1739         * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1740         *
1741         * Le format de sorti est le suivant :
1742         * $select = array(
1743         *      0 => array( -> liste des id des événements
1744         *          '0' => '',
1745         *          '1' => array(
1746         *              '0' => array(), -> liste des id des événements suggérés
1747         *              '1' => array(), -> liste des libelles des événements suggérés
1748         *          ),
1749         *          ...,
1750         *          n => 'id_evenement_n'
1751         *      ),
1752         *      1 => array(
1753         *          '0' => '__('choisir')." ".__('evenement')',
1754         *          '1' => '💡 Suggestions',
1755         *          ...,
1756         *          'n' => 'libelle_evenement_n',
1757         *      )
1758         * )
1759         *
1760         * @param array tableau des événements
1761         * @return array
1762         */
1763        protected function convert_events_array_to_select_format($events) {
1764            // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1765            $contenu = array(
1766                0 => array("",),
1767                1 => array(__('choisir')." ".__('evenement'),)
1768            );
1769    
1770            if (! empty($events)) {
1771                // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1772                $suggested_event_group = array_filter($events, function($a) {
1773                        return $a['is_suggested'] === 't';
1774                });
1775                if (! empty($suggested_event_group)) {
1776                    // Prépare les données qui permettront d'afficher le groupe des événements
1777                    // suggérés.
1778                    $values = array();
1779                    $labels = array();
1780                    foreach ($suggested_event_group as $index => $suggested_event) {
1781                        $values[] = $suggested_event['evenement'];
1782                        $labels[] = $suggested_event['libelle'];
1783                        // Supprime les évènements suggérés de la liste des évènements
1784                        unset($events[$index]);
1785                    }
1786                    // Remplissage du select pour le groupe
1787                    $contenu[0][] = array($values, $labels);
1788                    $contenu[1][] = __('💡 Suggestions');
1789                }
1790        
1791                // Remplissage du select
1792                foreach ($events as $event) {
1793                    $contenu[0][] = $event['evenement'];
1794                    $contenu[1][] = $event['libelle'];
1795              }              }
1796          }          }
1797            return $contenu;
1798      }      }
1799    
1800      function setSelect(&$form, $maj,&$db,$debug) {      /**
1801         * SETTER_FORM - setSelect.
1802         *
1803         * @return void
1804         */
1805        function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1806            //parent::setSelect($form, $maj);
1807          /**          /**
1808           * 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
1809           * dossier est mauvaise pour les performances, car la requête qui           * dossier est mauvaise pour les performances, car la requête qui
# Line 549  class instruction extends instruction_ge Line 1811  class instruction extends instruction_ge
1811           * 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
1812           * select           * select
1813           */           */
         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");  
   
1814          //// action          //// action
1815          //$this->init_select($form, $db, $maj, $debug, "action",          //$this->init_select($form, $this->f->db, $maj, null, "action",
1816          //                   $sql_action, $sql_action_by_id, false);          //                   $sql_action, $sql_action_by_id, false);
1817    
1818          //// avis_decision          //// avis_decision
1819          //$this->init_select($form, $db, $maj, $debug, "avis_decision",          //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1820          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);          //                   $sql_avis_decision, $sql_avis_decision_by_id, false);
1821    
1822          //// dossier          //// dossier
1823          //$this->init_select($form, $db, $maj, $debug, "dossier",          //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1824          //                   $sql_dossier, $sql_dossier_by_id, false);          //                   $sql_dossier, $sql_dossier_by_id, false);
1825    
1826          //// etat          //// etat
1827          //$this->init_select($form, $db, $maj, $debug, "etat",          //$this->init_select($form, $this->f->db, $maj, null, "etat",
1828          //                   $sql_etat, $sql_etat_by_id, false);          //                   $sql_etat, $sql_etat_by_id, false);
1829    
1830          //// evenement          //// evenement
1831          //$this->init_select($form, $db, $maj, $debug, "evenement",          //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1832          //                   $sql_evenement, $sql_evenement_by_id, false);          //                   $sql_evenement, $sql_evenement_by_id, false);
1833    
1834          // signataire_arrete          // signataire_arrete
1835          // si contexte DI          // si contexte DI
1836          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
1837                  || $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") {  
1838              // 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
1839              require_once "../obj/dossier_instruction.class.php";              $di = $this->f->get_inst__om_dbform(array(
1840              $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, $debug);                  "obj" => "dossier_instruction",
1841              $sql_signataire_arrete_by_di = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_by_di);                  "idx" => $this->getParameter('idxformulaire'),
1842              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              ));
1843                  $sql_signataire_arrete_by_di, $sql_signataire_arrete_by_id, true);              $sql_signataire_arrete_by_di = str_replace(
1844                    '<collectivite_di>',
1845                    $di->getVal("om_collectivite"),
1846                    $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1847                );
1848                $this->init_select(
1849                    $form,
1850                    $this->f->db,
1851                    $maj,
1852                    null,
1853                    "signataire_arrete",
1854                    $sql_signataire_arrete_by_di,
1855                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1856                    true
1857                );
1858          } else {          } else {
1859              $this->init_select($form, $db, $maj, $debug, "signataire_arrete",              $this->init_select(
1860                  $sql_signataire_arrete, $sql_signataire_arrete_by_id, true);                  $form,
1861                    $this->f->db,
1862                    $maj,
1863                    null,
1864                    "signataire_arrete",
1865                    $this->get_var_sql_forminc__sql("signataire_arrete"),
1866                    $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1867                    true
1868                );
1869          }          }
1870    
1871          /**          /**
# Line 600  class instruction extends instruction_ge Line 1875  class instruction extends instruction_ge
1875           * événements disponibles.           * événements disponibles.
1876           */           */
1877          if ($maj == 0) {          if ($maj == 0) {
1878              // Récupération des événements par une jointure entre la table dossier              $evenements = $this->get_var_sql_forminc__sql_evenement();
1879              // 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->f->getDivisionFromDossier($this->idxformulaire) != $_SESSION["division"]  
                 && $this->f->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);  
1880          } else {          } else {
1881              $sql = "SELECT              // Instanciation de l'événement pour récupérer son libellé
1882              evenement.libelle as lib              $evenement = $this->f->get_inst__om_dbform(array(
1883              FROM ".DB_PREFIXE."evenement                  "obj" => "evenement",
1884              WHERE evenement.evenement=".$this->getVal("evenement")."";                  "idx" => $this->getVal("evenement"),
1885              $res = $db->getone($sql);              ));
1886              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);  
             if (database::isError($res)) {  
                 die($res->getMessage());  
             }  
             //  
1887              $contenu = array(              $contenu = array(
1888                  0 => array($this->getVal("evenement"),),                  0 => array($this->getVal("evenement"),),
1889                  1 => array($res,)                  1 => array($evenement->getVal('libelle'),)
1890              );              );
1891              $form->setSelect("evenement", $contenu);              $form->setSelect("evenement", $contenu);
1892          }          }
# Line 675  class instruction extends instruction_ge Line 1909  class instruction extends instruction_ge
1909          // lien bible4          // lien bible4
1910          $contenu = array(_("bible"));          $contenu = array(_("bible"));
1911          $form->setSelect("bible4",$contenu);          $form->setSelect("bible4",$contenu);
1912    
1913            if ($maj == 1) {
1914                $base64 = $this->init_pdf_temp();
1915                $form->setSelect('live_preview', array('base64'=>$base64));
1916                $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1917                $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1918                $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1919            }
1920    
1921            // Selection du type de rédaction à l'ajout
1922            $content = array(
1923                0 => array('f', 't', ),
1924                1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1925            );
1926            $form->setSelect('flag_edition_integrale', $content);
1927    
1928            $contenu = array();
1929            foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1930                $contenu[0][] = $value;
1931                $contenu[1][] = $this->get_trad_for_statut($value);
1932            }
1933            $form->setSelect('statut_signature', $contenu);
1934    
1935    
1936            if ($maj == 401) {
1937                $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1938                $form->setSelect('preview_edition', array(
1939                    'base64' => base64_encode($file['file_content']),
1940                    'mimetype' => $file['metadata']['mimetype'],
1941                    'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1942                    'href' => sprintf(
1943                        '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1944                        $this->getVal($this->clePrimaire)
1945                    )
1946                ));
1947            }
1948      }      }
1949    
1950      function cleSecondaire($id, &$db, $val, $DEBUG) {      function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1951          //          //
1952          parent::cleSecondaire($id, $db, $val, $DEBUG);          // Vérifie uniquementla cle secondaire : demande
1953            $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1954                    
1955          $id = $this->getVal($this->clePrimaire);          $id = $this->getVal($this->clePrimaire);
1956    
           
1957          //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é
1958          //à la création d'un dossier d'instruction          //à la création d'un dossier d'instruction
1959          $sql = "SELECT demande_type.dossier_instruction_type          $qres = $this->f->get_one_result_from_db_query(
1960              FROM ".DB_PREFIXE."demande_type              sprintf(
1961              LEFT JOIN ".DB_PREFIXE."demande                  'SELECT
1962              ON demande.demande_type = demande_type.demande_type                      demande_type.dossier_instruction_type
1963              WHERE demande.instruction_recepisse = ".$id;                  FROM
1964          $res = $this->db->getOne($sql);                      %1$sdemande_type
1965          $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdemande
1966          if (database::isError($res)) {                          ON demande.demande_type = demande_type.demande_type
1967              die($res->getMessage());                  WHERE
1968          }                      demande.instruction_recepisse = \'%2$d\'',
1969                    DB_PREFIXE,
1970                    intval($id)
1971                ),
1972                array(
1973                    "origin" => __METHOD__,
1974                )
1975            );
1976    
1977          // 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
1978          //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
1979          //supprimé          //supprimé
1980          if ( $this->correct !== false || $res == null || $res == ""){          if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
   
1981              // 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é
1982              // à une demande              // à une demande
1983              $sql = "SELECT demande              $qres = $this->f->get_one_result_from_db_query(
1984                  FROM ".DB_PREFIXE."demande                  sprintf(
1985                  WHERE instruction_recepisse = ".$id;                      'SELECT
1986              $res = $this->db->getOne($sql);                          demande
1987              $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      FROM
1988              if (database::isError($res)) {                          %1$sdemande
1989                  die($res->getMessage());                      WHERE
1990              }                          instruction_recepisse = \'%2$d\'',
1991                        DB_PREFIXE,
1992                        intval($id)
1993                    ),
1994                    array(
1995                        "origin" => __METHOD__,
1996                    )
1997                );
1998    
1999              //Si c'est un événement d'instruction lié à une demande              //Si c'est un événement d'instruction lié à une demande
2000              if ($res != null || $res != ""){              if ($qres['result'] != null || $qres['result'] != ""){
2001                                    $demande = $this->f->get_inst__om_dbform(array(
2002                  require_once "../obj/demande.class.php";                      "obj" => "demande",
2003                  $demande = new demande($res, $this->db, DEBUG);                      "idx" => $qres['result'],
2004                    ));
2005    
2006                  //On met à jour la demande en supprimant la liaison vers                  //On met à jour la demande en supprimant la liaison vers
2007                  //l'événement d'instruction                  //l'événement d'instruction
2008                  $demande->setParameter("maj", 1);                  $demande->setParameter("maj", 1);
2009                  $valF = array();                  $valF = array();
# Line 728  class instruction extends instruction_ge Line 2012  class instruction extends instruction_ge
2012                  }                  }
2013                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);                  $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2014                  $valF['instruction_recepisse']=NULL;                  $valF['instruction_recepisse']=NULL;
2015                  $ret = $demande->modifier($valF, $this->db, DEBUG);                  $ret = $demande->modifier($valF);
2016              }              }
2017                                    
2018              /**              /**
2019               * Vérification que l'élément supprimé est le dernier pour pouvoir               * Vérification que l'élément supprimé est le dernier pour pouvoir
2020               * remodifier les données de manière itérative.               * remodifier les données de manière itérative.
2021               */               */
2022              // Initialisation              $qres = $this->f->get_one_result_from_db_query(
2023              $dernierevenement = "";                  sprintf(
2024              // Récupération du dernier élément de la table d'instruction qui                      'SELECT
2025              // concerne le dossier en cours                          max(instruction)
2026              $sql = "SELECT max(instruction)                      FROM
2027              FROM ".DB_PREFIXE."instruction                          %1$sinstruction
2028              WHERE dossier ='".$this->idxformulaire."'";                      WHERE
2029              $dernierevenement = $db->getOne($sql);                          dossier = \'%2$s\'',
2030              $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);                      DB_PREFIXE,
2031              if (database::isError($dernierevenement)) {                      $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2032                  die($dernierevenement->getMessage());                  ),
2033              }                  array(
2034                        "origin" => __METHOD__,
2035                    )
2036                );
2037    
2038              // Si on se trouve effectivement sur le dernier evenement d'instruction              // Si on se trouve effectivement sur le dernier evenement d'instruction
2039              if ($dernierevenement == $id) {              // alors on valide la suppression sinon on l'annule
2040                $this->correct = false;
2041                $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2042                if ($qres['result'] == $id) {
2043                  // Alors on valide la suppression                  // Alors on valide la suppression
2044                  $this->correct = true;                  $this->correct = true;
2045                  $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."));  
2046              }              }
2047                $this->addToMessage($message);
2048          }          }
2049      }      }
2050    
# Line 768  class instruction extends instruction_ge Line 2056  class instruction extends instruction_ge
2056                    
2057          //Si le retourformulaire est "dossier_instruction"          //Si le retourformulaire est "dossier_instruction"
2058          if ($this->getParameter("retourformulaire") == "dossier"          if ($this->getParameter("retourformulaire") == "dossier"
2059                  || $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") {  
2060    
2061              // 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
2062              if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {              if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
# Line 788  class instruction extends instruction_ge Line 2072  class instruction extends instruction_ge
2072          return true;          return true;
2073      }      }
2074    
2075      /*Met des valeurs par défaut dans certains des sous-formulaire*/      /**
2076      function setValsousformulaire(&$form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire){       * SETTER_FORM - setValsousformulaire (setVal).
2077         *
2078         * @return void
2079         */
2080        function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2081            // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2082            //
2083            $this->retourformulaire = $retourformulaire;
2084          //          //
         $this->retourformulaire=$retourformulaire;  
         $this->idxformulaire=$idxformulaire;  
         // Ajout  
2085          if ($maj == 0) {          if ($maj == 0) {
2086              $form->setVal("destinataire", $idxformulaire);              $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2087              $form->setVal("dossier", $idxformulaire);              $form->setVal("dossier", $this->getParameter("idxformulaire"));
2088            }
2089    
2090            // Si l'instruction a été envoyé au contrôle de légalité et que la
2091            // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2092            // l'utilisateur que l'envoi au cl est en cours de traitement.
2093            if ($this->is_sent_to_cl() === true
2094                && empty($this->getVal('date_envoi_controle_legalite'))
2095                && $maj == 3) {
2096                $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2097          }          }
2098          //          //
2099          $this->set_form_default_values($form, $maj, $validation);          $this->set_form_default_values($form, $maj, $validation);
2100      }      }
2101    
2102      /**      /**
2103       *  Permet de pré-remplir les valeurs des formulaires.       * SETTER_FORM - set_form_default_values (setVal).
2104       *         *
2105       * @param [object]   $form        formulaire       * @return void
      * @param [integer]  $maj         mode  
      * @param [integer]  $validation  validation  
2106       */       */
2107      function set_form_default_values(&$form, $maj, $validation) {      function set_form_default_values(&$form, $maj, $validation) {
2108            //
         // Ajout  
2109          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");  
2110              // si contexte DI              // si contexte DI
2111              if ($this->getParameter("retourformulaire") == "dossier"              if ($this->getParameter("retourformulaire") == "dossier"
2112                  || $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") {  
2113                  // 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
2114                  require_once "../obj/dossier_instruction.class.php";                  $di = $this->f->get_inst__om_dbform(array(
2115                  $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, DEBUG);                      "obj" => "dossier_instruction",
2116                  $sql = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_defaut_by_di);                      "idx" => $this->getParameter("idxformulaire"),
2117                    ));
2118                    $sql = str_replace(
2119                        "<collectivite_di>",
2120                        $di->getVal("om_collectivite"),
2121                        $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2122                    );
2123              } else {              } else {
2124                  $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();  
2125              }              }
           
             $row = $res->fetchrow(DB_FETCHMODE_ASSOC);  
2126                            
2127              if (isset($row['signataire_arrete']) && is_numeric($row['signataire_arrete'])){              $qres = $this->f->get_all_results_from_db_query($sql, array(
2128                  $form->setVal("signataire_arrete",$row['signataire_arrete']);                      "origin" => __METHOD__));
2129                $row = array_shift($qres['result']);
2130                if (isset($row["signataire_arrete"])
2131                    && is_numeric($row["signataire_arrete"])) {
2132                    //
2133                    $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2134              }              }
2135                // Date du jour
2136                $form->setVal("date_evenement", date("Y-m-d"));
2137          }          }
2138            //
         // Ajout et modification  
2139          if ($maj == 0 || $maj == 1 || $maj == 125) {          if ($maj == 0 || $maj == 1 || $maj == 125) {
2140              $form->setVal("bible_auto","bible_auto()");              $form->setVal("bible_auto", "bible_auto()");
2141              $form->setVal("bible","bible(1)");              $form->setVal("bible", "bible(1)");
2142              $form->setVal("bible2","bible(2)");              $form->setVal("bible2", "bible(2)");
2143              $form->setVal("bible3","bible(3)");              $form->setVal("bible3", "bible(3)");
2144              $form->setVal("bible4","bible(4)");              $form->setVal("bible4", "bible(4)");
2145            }
2146            //
2147            $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2148            if ($maj == 1
2149                && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2150                && $this->has_an_edition() === true) {
2151                //
2152                $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2153                $form->setVal("btn_refresh", "reload_pdf_viewer()");
2154                $form->setVal("btn_preview", "show_instr_preview()");
2155                $form->setVal("btn_redaction", "show_instr_redaction()");
2156            }
2157    
2158            // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2159            // des communes
2160            if ($maj == 3) {
2161                if ($this->can_display_notification_demandeur()) {
2162                    $typeNotification = array(
2163                        'notification_recepisse',
2164                        'notification_instruction',
2165                        'notification_decision',
2166                    );
2167                    $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2168                }
2169                if ($this->can_display_notification_service()) {
2170                    $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2171                }
2172                if ($this->can_display_notification_tiers()) {
2173                    $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2174                }
2175                if ($this->can_display_notification_commune()) {
2176                    $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2177                }
2178          }          }
2179      }      }
2180    
   
2181      function setLayout(&$form, $maj){      function setLayout(&$form, $maj){
2182          if ( $maj < 2 OR $maj == 3 OR $maj == 125 ) {          // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2183                          /*Champ sur lequel s'ouvre le bloc 1 */          // citoyen, si la notification des demandeurs est activée sur l'évenement
2184              $form->setBloc('evenement','D',"","col_12");          // d'instruction et que le paramétrage du demandeur principal n'est pas
2185            // correct alors un message a destination de l'instructeur est affiché.
2186            if ($maj == 3) {
2187                // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2188                // la requête permettant de savoir le type de demande à échouée) et si
2189                // la notification se fait par mail vérifie si il y a des erreurs de
2190                // paramétrage et si c'est le cas on affiche un message d'information
2191                $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2192                $categorieNotif = $this->f->get_param_option_notification($collectivite);
2193                if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2194                    $erreurParam = $this->get_info_notification_fail();
2195                    // Récupération de l'évenement d'instruction
2196                    $instEV = $this->get_inst_evenement();
2197                    if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2198                        $class = 'text-info ui-state-highlight ui-state-info';
2199                        $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2200                        $this->f->display_panel_information(
2201                            $class,
2202                            $message,
2203                            $erreurParam,
2204                            __('Veuillez corriger les informations suivantes.'),
2205                            'erreur_param_notif'
2206                        );
2207                    }
2208                }
2209            }
2210            $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2211    
2212              $form->setFieldset('evenement','D',_('Evenement'));          $form->setFieldset('evenement','D',_('Evenement'));
2213              $form->setFieldset('om_final_instruction_utilisateur','F','');          $form->setFieldset('om_final_instruction_utilisateur','F','');
2214                        
2215              $form->setBloc('om_final_instruction_utilisateur','F');          $form->setBloc('om_final_instruction_utilisateur','F');
2216    
2217              $form->setBloc('date_finalisation_courrier','D',"","col_12");          $form->setBloc('date_finalisation_courrier','D',"","");
2218    
2219              $form->setFieldset('date_finalisation_courrier','D',_('Dates'));          $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2220              $form->setBloc('date_finalisation_courrier','D',"","col_6");          $form->setBloc('date_finalisation_courrier','D',"","col_6");
2221              $form->setBloc('date_envoi_controle_legalite','F');          $form->setBloc('date_envoi_controle_legalite','F');
2222    
2223              $form->setBloc('signataire_arrete','D',"","col_6");          $form->setBloc('date_retour_signature','D',"","col_6");
2224              $form->setBloc('date_retour_controle_legalite','F');          $form->setBloc('date_retour_controle_legalite','F');
2225              $form->setFieldset('date_retour_controle_legalite','F','');          $form->setFieldset('date_retour_controle_legalite','F','');
2226                        
2227              $form->setBloc('date_retour_controle_legalite','F');          $form->setBloc('date_retour_controle_legalite','F');
2228    
2229            $form->setBloc('statut_signature','D');
2230            $form->setFieldset('statut_signature','D','Suivi Parapheur');
2231            $form->setBloc('commentaire_signature','F');
2232            $form->setBloc('historique_signature','D');
2233            $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2234            $form->setBloc('historique_signature','F');
2235            $form->setFieldset('historique_signature','F');
2236    
2237            $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2238            $form->setFieldset('suivi_notification','F');
2239            $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2240            $form->setFieldset('suivi_notification_service','F');
2241            $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2242            $form->setFieldset('suivi_notification_tiers','F');
2243            $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2244            $form->setFieldset('suivi_notification_commune','F');
2245    
2246            if ($maj == 1) {
2247                // Récupère la collectivité du dossier d'instruction
2248                $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2249    
2250              $form->setBloc('complement_om_html','D',"","col_12");              //
2251                if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2252                    && $this->has_an_edition() === true) {
2253                    //
2254                    $form->setBloc('complement_om_html','D',"","container_instr_edition");
2255                    $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2256                    $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2257                    $form->setFieldset('complement_om_html','D',_('Complement'));
2258                    $form->setFieldset('bible','F','');
2259                    $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2260                    $form->setFieldset('bible2','F','');
2261                    $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2262                    $form->setFieldset('bible3','F','');
2263                    $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2264                    $form->setFieldset('bible4','F','');
2265                    $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2266                    $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2267                    $form->setBloc('corps_om_htmletatex','F');
2268                    $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2269                    $form->setBloc('btn_preview','F');
2270                    $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2271                    $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2272                    $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2273                    $form->setFieldset('live_preview','F');
2274                    $form->setBloc('live_preview','F');
2275                    $form->setBloc('live_preview','F');
2276                } else {
2277                    $form->setBloc('complement_om_html','D',"","hidelabel");
2278                    $form->setFieldset('complement_om_html','D',_('Complement'));
2279                    $form->setFieldset('bible','F','');
2280                    $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2281                    $form->setFieldset('bible2','F','');
2282                    $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2283                    $form->setFieldset('bible3','F','');
2284                    $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2285                    $form->setFieldset('bible4','F','');
2286                    $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2287                    $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2288                    $form->setBloc('corps_om_htmletatex','F');
2289                }
2290            } else {
2291                $form->setBloc('complement_om_html','D',"","hidelabel");
2292              $form->setFieldset('complement_om_html','D',_('Complement'));              $form->setFieldset('complement_om_html','D',_('Complement'));
2293              $form->setFieldset('bible','F','');              $form->setFieldset('bible','F','');
             $form->setBloc('bible','F');  
   
             $form->setBloc('complement2_om_html','D',"","col_12");  
2294              $form->setFieldset('complement2_om_html','D',_('Complement 2'));              $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2295              $form->setFieldset('bible2','F','');              $form->setFieldset('bible2','F','');
             $form->setBloc('bible2','F');  
               
             $form->setBloc('complement3_om_html','D',"","col_12");  
2296              $form->setFieldset('complement3_om_html','D',_('Complement 3'));              $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2297              $form->setFieldset('bible3','F','');              $form->setFieldset('bible3','F','');
             $form->setBloc('bible3','F');  
               
             $form->setBloc('complement4_om_html','D',"","col_12");  
2298              $form->setFieldset('complement4_om_html','D',_('Complement 4'));              $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2299              $form->setFieldset('bible4','F','');              $form->setFieldset('bible4','F','');
2300              $form->setBloc('bible4','F');              $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2301                $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2302                $form->setBloc('corps_om_htmletatex','F');
2303          }          }
2304      }      }
2305            
# Line 913  class instruction extends instruction_ge Line 2312  class instruction extends instruction_ge
2312          $form->setLib('bible2', "");          $form->setLib('bible2', "");
2313          $form->setLib('bible3', "");          $form->setLib('bible3', "");
2314          $form->setLib('bible4', "");          $form->setLib('bible4', "");
2315            $form->setLib('btn_refresh', "");
2316            $form->setLib('btn_preview', "");
2317            $form->setLib('btn_redaction', "");
2318            $form->setLib('live_preview', "");
2319          $form->setLib('om_final_instruction_utilisateur', _("finalise par"));          $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2320            $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2321            $form->setLib('date_retour_rar', __("date_notification"));
2322            $form->setLib('statut_signature', __("statut"));
2323            $form->setLib('commentaire_signature', __("commentaire"));
2324            $form->setLib('historique_signature', '');
2325            $form->setLib('suivi_notification', '');
2326            $form->setLib('suivi_notification_service', '');
2327            $form->setLib('suivi_notification_tiers', '');
2328            $form->setLib('suivi_notification_commune', '');
2329            $form->setLib('preview_edition', "");
2330    
2331            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2332            // ajout et que l'option de rédaction libre est activée sur la
2333            // collectivité du dossier
2334            if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2335                //
2336                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2337                $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.");
2338                $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2339            }
2340            else {
2341                $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2342            }
2343    
2344            // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2345            // modification et que l'option de prévisualisation de l'édition est
2346            // activée sur la collectivité du dossier
2347            if ($maj === '1'
2348                && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2349                //
2350                $help_text_template = '%s <span class="info-16" title="%s"></span>';
2351                $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.");
2352                $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2353                $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2354            }
2355      }      }
2356    
2357      function triggerajouter($id, &$db, $val, $DEBUG) {      /**
2358         * TRIGGER - triggerajouter.
2359         *
2360         * @return boolean
2361         */
2362        function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2363            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2364          /**          /**
2365           * 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
2366           * et dossier pour les stocker dans l'instruction :           * et dossier pour les stocker dans l'instruction :
# Line 929  class instruction extends instruction_ge Line 2373  class instruction extends instruction_ge
2373           * - delai_notification           * - delai_notification
2374           * - lettretype           * - lettretype
2375           * - autorite_competente           * - autorite_competente
2376             * - pec_metier
2377             * - complement_om_html
2378             * - complement2_om_html
2379             * - complement3_om_html
2380             * - complement4_om_html
2381             * - complement5_om_html
2382           * DEPUIS LE DOSSIER D'INSTRUCTION           * DEPUIS LE DOSSIER D'INSTRUCTION
2383           * - archive_delai           * - archive_delai
2384           * - archive_accord_tacite           * - archive_accord_tacite
# Line 946  class instruction extends instruction_ge Line 2396  class instruction extends instruction_ge
2396           * - avis_decision           * - avis_decision
2397           */           */
2398          // 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é
2399          $sql = "SELECT * FROM ".DB_PREFIXE."evenement          // TODO : remplacer cette requête par l'instanciation de l'événement
2400          WHERE evenement=".$this->valF['evenement'];          $qres = $this->f->get_all_results_from_db_query(
2401          $res = $db->query($sql);              sprintf(
2402          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
2403          if (database::isError($res)) {                      *
2404              die($res->getMessage());                  FROM
2405          }                      %1$sevenement
2406          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  WHERE
2407                        evenement = %2$d',
2408                    DB_PREFIXE,
2409                    intval($this->valF['evenement'])
2410                ),
2411                array(
2412                    "origin" => __METHOD__,
2413                )
2414            );
2415            foreach ($qres['result'] as $row) {
2416              // Récupération de l'identifiant de l'action              // Récupération de l'identifiant de l'action
2417              // si une action est paramétrée dans l'événement              // si une action est paramétrée dans l'événement
2418              $this->valF['action'] = NULL;              $this->valF['action'] = NULL;
# Line 986  class instruction extends instruction_ge Line 2445  class instruction extends instruction_ge
2445              }              }
2446              // Récupération de la valeur de la lettre type              // Récupération de la valeur de la lettre type
2447              $this->valF['lettretype']=$row['lettretype'];              $this->valF['lettretype']=$row['lettretype'];
2448                // Récupération de la valeur de la prise en compte métier
2449                // si la prise en compte métier est paramétrée dans l'événement
2450                $this->valF['pec_metier'] = NULL;
2451                if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2452                    $this->valF['pec_metier'] = $row['pec_metier'];
2453                }
2454          }          }
2455          // 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
2456          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par l'instanciation de l'objet
2457          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
2458          $res = $db->query($sql);              sprintf(
2459          $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
2460          if (database::isError($res)) {                      *
2461              die($res->getMessage());                  FROM
2462          }                      %1$sdossier
2463          $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);                  WHERE
2464                    dossier = \'%2$s\'',
2465                    DB_PREFIXE,
2466                    $this->f->db->escapeSimple($this->valF['dossier'])
2467                ),
2468                array(
2469                    "origin" => __METHOD__,
2470                )
2471            );
2472            $row = array_shift($qres['result']);
2473          $this->updateArchiveData($row);          $this->updateArchiveData($row);
2474                                    
2475          // Récupération de la duree de validite du dossier d'autorisation          // Récupération de la duree de validite du dossier d'autorisation
2476          $sql = "SELECT duree_validite_parametrage          $qres = $this->f->get_one_result_from_db_query(
2477                  FROM ".DB_PREFIXE."dossier_autorisation_type_detaille              sprintf(
2478                  LEFT JOIN ".DB_PREFIXE."dossier_autorisation                  'SELECT
2479                      ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille                      duree_validite_parametrage
2480                  LEFT JOIN ".DB_PREFIXE."dossier                  FROM
2481                      ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                      %1$sdossier_autorisation_type_detaille
2482          WHERE dossier.dossier='".$this->valF['dossier']."'";                      LEFT JOIN %1$sdossier_autorisation
2483          $duree_validite_parametrage = $db->getOne($sql);                          ON  dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2484          $this->addToLog("triggerajouter(): db->getOne(\"".$sql."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdossier
2485          database::isError($duree_validite_parametrage);                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2486          if ($duree_validite_parametrage != '') {                  WHERE
2487              $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;                      dossier.dossier = \'%2$s\'',
2488                    DB_PREFIXE,
2489                    $this->f->db->escapeSimple($this->valF['dossier'])
2490                ),
2491                array(
2492                    "origin" => __METHOD__,
2493                )
2494            );
2495    
2496            if ($qres['result'] != '') {
2497                $this->valF['duree_validite_parametrage'] = $qres['result'];
2498          }          }
2499    
2500          // Identifiant du type de courrier          // Identifiant du type de courrier
# Line 1020  class instruction extends instruction_ge Line 2504  class instruction extends instruction_ge
2504          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;          $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2505      }      }
2506            
2507      // Test si une restriction est valide      /**
2508      // return boolean       * Test si une restriction est valide.
2509         *
2510         * @return boolean
2511         */
2512      function restrictionIsValid($restriction){      function restrictionIsValid($restriction){
2513          if($this->restriction_valid != null) {          if($this->restriction_valid != null) {
2514              return $this->restriction_valid;              return $this->restriction_valid;
# Line 1203  class instruction extends instruction_ge Line 2690  class instruction extends instruction_ge
2690          if(empty($evenement) || !is_numeric($evenement)) {          if(empty($evenement) || !is_numeric($evenement)) {
2691              return "";              return "";
2692          }          }
2693          $sql = "SELECT retour  
2694              FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
2695              WHERE evenement = ".$evenement;              "obj" => "evenement",
2696          $retour = $this->db->getOne($sql);              "idx" => $evenement,
2697          $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);          ));
2698          if (database::isError($retour)) {          
2699              die($retour->getMessage());          return $evenement->getVal('retour') == 't';
         }  
         if ($retour == 't') {  
             return true;  
         } else {  
             return false;  
         }  
2700      }      }
2701    
2702      /**      /**
# Line 1230  class instruction extends instruction_ge Line 2711  class instruction extends instruction_ge
2711              return "";              return "";
2712          }          }
2713          //Récupère la restriction          //Récupère la restriction
2714          $sql= "SELECT          $evenement = $this->f->get_inst__om_dbform(array(
2715                    restriction              "obj" => "evenement",
2716                FROM              "idx" => $evenement,
2717                    ".DB_PREFIXE."evenement          ));
2718                WHERE          
2719                    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;  
2720      }      }
2721    
2722      /**      /**
# Line 1271  class instruction extends instruction_ge Line 2745  class instruction extends instruction_ge
2745          return $return;          return $return;
2746      }      }
2747    
2748    
2749      /**      /**
2750       * Calcul des règle d'action.       * Calcul des règle d'action selon leur type.
2751       * @param string $rule      Règle d'action       *
2752       * @param string $rule_name Nom de la règle       * Types de règle :
2753       * @param string $type      Type de la règle       * - date
2754         * - numeric
2755         * - text
2756         * - bool
2757         * - specific
2758         * - technical_data
2759         *
2760         * @param string $rule      Règle d'action.
2761         * @param string $rule_name Nom de la règle.
2762         * @param string $type      Type de la règle.
2763       *       *
2764       * @return mixed            Résultat de la règle       * @return mixed            Résultat de la règle
2765       */       */
2766      function regle($rule, $rule_name, $type = null) {      public function regle($rule, $rule_name, $type = null) {
2767    
2768          // Supprime tous les espaces de la chaîne de caractère          // Supprime tous les espaces de la chaîne de caractère
2769          $rule = str_replace(' ', '', $rule);          $rule = str_replace(' ', '', $rule);
# Line 1293  class instruction extends instruction_ge Line 2777  class instruction extends instruction_ge
2777              return null;              return null;
2778          }          }
2779    
         // Si c'est une règle spécifique  
         if ($rule_name == "regle_autorite_competente"  
             || $rule_name == "regle_etat"  
             || $rule_name == "regle_accord_tacite"  
             || $rule_name == "regle_avis") {  
             //  
             return $this->valF[$rule];  
         }  
   
2780          // Tableau des champs de type date          // Tableau des champs de type date
2781          $rule_type_date = array(          $rule_type_date = array(
2782              "regle_date_limite",              "regle_date_limite",
# Line 1315  class instruction extends instruction_ge Line 2790  class instruction extends instruction_ge
2790              "regle_date_rejet",              "regle_date_rejet",
2791              "regle_date_dernier_depot",              "regle_date_dernier_depot",
2792              "regle_date_limite_incompletude",              "regle_date_limite_incompletude",
2793                "regle_date_cloture_instruction",
2794                "regle_date_premiere_visite",
2795                "regle_date_derniere_visite",
2796                "regle_date_contradictoire",
2797                "regle_date_retour_contradictoire",
2798                "regle_date_ait",
2799                "regle_date_transmission_parquet",
2800                "regle_date_affichage",
2801          );          );
2802          // Tableau des champs de type numérique          // Tableau des champs de type numérique
2803          $rule_type_numeric = array(          $rule_type_numeric = array(
2804              "regle_delai",              "regle_delai",
2805              "regle_delai_incompletude",              "regle_delai_incompletude",
2806          );          );
2807            // Tableau des champs de type text
2808            $rule_type_text = array(
2809            );
2810            // Tableau des champs de type booléen
2811            $rule_type_bool = array(
2812                "regle_a_qualifier",
2813                "regle_incompletude",
2814                "regle_incomplet_notifie",
2815                "regle_evenement_suivant_tacite_incompletude",
2816            );
2817            // Tableau des champs spécifiques
2818            $rule_type_specific = array(
2819                "regle_autorite_competente",
2820                "regle_etat",
2821                "regle_accord_tacite",
2822                "regle_avis",
2823                "regle_pec_metier",
2824                "regle_etat_pendant_incompletude",
2825            );
2826            // Tableau des champs de données techniques
2827            $rule_type_technical_data = array(
2828                'regle_donnees_techniques1',
2829                'regle_donnees_techniques2',
2830                'regle_donnees_techniques3',
2831                'regle_donnees_techniques4',
2832                'regle_donnees_techniques5',
2833            );
2834            // Tableau des champs simple
2835            $rule_type_simple = array(
2836                "regle_dossier_instruction_type",
2837            );
2838    
2839          // Définit le type du champ          // Définit le type du champ
2840          if (in_array($rule_name, $rule_type_date) == true) {          if (in_array($rule_name, $rule_type_date) == true) {
# Line 1329  class instruction extends instruction_ge Line 2843  class instruction extends instruction_ge
2843          if (in_array($rule_name, $rule_type_numeric) == true) {          if (in_array($rule_name, $rule_type_numeric) == true) {
2844              $type = "numeric";              $type = "numeric";
2845          }          }
2846            if (in_array($rule_name, $rule_type_text) === true) {
2847                $type = "text";
2848            }
2849            if (in_array($rule_name, $rule_type_bool) === true) {
2850                $type = "bool";
2851            }
2852            if (in_array($rule_name, $rule_type_specific) === true) {
2853                $type = "specific";
2854            }
2855            if (in_array($rule_name, $rule_type_technical_data) === true) {
2856                $type = 'text';
2857            }
2858            if (in_array($rule_name, $rule_type_simple) === true) {
2859                $type = 'simple';
2860            }
2861    
2862            // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2863            // Récupère directement la valeur de l'opérande
2864            if ($type === 'specific') {
2865                //
2866                return $this->get_value_for_rule($rule);
2867            }
2868    
2869          // Initialisation des variables          // Initialisation des variables
2870          $key_date = 0;          $key_date = 0;
2871          $total_numeric = 0;          $total_numeric = 0;
2872            $res_text = '';
2873    
2874          // Pour chaque opérande          // Pour chaque opérande
2875          foreach ($operands as $key => $operand) {          foreach ($operands as $key => $operand) {
# Line 1340  class instruction extends instruction_ge Line 2877  class instruction extends instruction_ge
2877              // Si c'est une règle de type date              // Si c'est une règle de type date
2878              if ($type == 'date') {              if ($type == 'date') {
2879                  // Vérifie si au moins une des opérandes est une date                  // Vérifie si au moins une des opérandes est une date
2880                  if (!is_numeric($operand)                  if (is_numeric($operand) === false
2881                      && isset($this->valF[$operand])                      && $this->get_value_for_rule($operand) !== null
2882                      && $this->f->check_date($this->valF[$operand]) == true) {                      && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2883                      // Récupère la position de la date                      // Récupère la position de la date
2884                      $key_date = $key;                      $key_date = $key;
2885                  }                  }
# Line 1351  class instruction extends instruction_ge Line 2888  class instruction extends instruction_ge
2888                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
2889                      $total_numeric += $operand;                      $total_numeric += $operand;
2890                  }                  }
2891                  if (!is_numeric($operand)                  if (is_numeric($operand) === false
2892                      && isset($this->valF[$operand])                      && $this->get_value_for_rule($operand) !== null
2893                      && is_numeric($this->valF[$operand]) == true) {                      && is_numeric($this->get_value_for_rule($operand)) == true) {
2894                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
2895                      $total_numeric += $this->valF[$operand];                      $total_numeric += $this->get_value_for_rule($operand);
2896                  }                  }
2897              }              }
2898    
# Line 1366  class instruction extends instruction_ge Line 2903  class instruction extends instruction_ge
2903                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
2904                      $total_numeric += $operand;                      $total_numeric += $operand;
2905                  }                  }
2906                  if (!is_numeric($operand)                  if (is_numeric($operand) === false
2907                      && isset($this->valF[$operand])                      && $this->get_value_for_rule($operand) !== null
2908                      && is_numeric($this->valF[$operand]) == true) {                      && is_numeric($this->get_value_for_rule($operand)) == true) {
2909                      // Ajoute l'opérande au total                      // Ajoute l'opérande au total
2910                      $total_numeric += $this->valF[$operand];                      $total_numeric += $this->get_value_for_rule($operand);
2911                  }                  }
2912              }              }
2913    
2914                // Si c'est une règle de type text
2915                if ($type === 'text') {
2916                    // Concatène toutes les chaînes de caractère
2917                    $res_text .= $this->get_value_for_rule($operand);
2918                }
2919          }          }
2920    
2921          // Résultat pour une règle de type date          // Résultat pour une règle de type date
# Line 1387  class instruction extends instruction_ge Line 2930  class instruction extends instruction_ge
2930              // Retourne le calcul              // Retourne le calcul
2931              return $total_numeric;              return $total_numeric;
2932          }          }
2933    
2934            // Résultat pour une règle de type text
2935            if ($type === 'text') {
2936                // Retourne la chaîne de caractère
2937                return $res_text;
2938            }
2939            if ($type === 'simple' || $type === 'bool') {
2940                // Retourne la valeur du champs rule
2941                return $rule;
2942            }
2943        }
2944    
2945    
2946        /**
2947         * Récupère la valeur du champs dans l'instruction ou dans les données
2948         * techniques.
2949         * Spécifique au calcul des règles.
2950         *
2951         * @param string $field Champ
2952         *
2953         * @return mixed Valeur du champ
2954         */
2955        private function get_value_for_rule($field) {
2956            // Si le champ n'existe pas dans la table instruction
2957            if (array_key_exists($field, $this->valF) === false) {
2958                // Récupère l'instance de la classe donnees_techniques
2959                $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2960                // Retourne la valeur de la donnée technique
2961                return $inst_donnees_techniques->getVal($field);
2962            }
2963    
2964            //
2965            return $this->valF[$field];
2966        }
2967    
2968    
2969        /**
2970         * [get_inst_donnees_techniques description]
2971         *
2972         * @param [type] $donnees_techniques [description]
2973         *
2974         * @return [type] [description]
2975         */
2976        function get_inst_donnees_techniques($donnees_techniques = null) {
2977            //
2978            if (isset($this->inst_donnees_techniques) === false or
2979                $this->inst_donnees_techniques === null) {
2980                //
2981                if (is_null($donnees_techniques)) {
2982                    $donnees_techniques = $this->getDonneesTechniques();
2983                }
2984                //
2985                $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2986                    "obj" => "donnees_techniques",
2987                    "idx" => $donnees_techniques,
2988                ));
2989            }
2990            //
2991            return $this->inst_donnees_techniques;
2992        }
2993    
2994    
2995        /**
2996         * Retourne l'identifiant des données techniques liées du dossier
2997         * @return string L'identifiant des données techniques liées du dossier
2998         */
2999        function getDonneesTechniques() {
3000        
3001            $qres = $this->f->get_one_result_from_db_query(
3002                sprintf(
3003                    'SELECT
3004                        donnees_techniques
3005                    FROM
3006                        %1$sdonnees_techniques
3007                    WHERE
3008                        dossier_instruction = \'%2$s\'',
3009                    DB_PREFIXE,
3010                    $this->f->db->escapeSimple($this->valF["dossier"])
3011                ),
3012                array(
3013                    "origin" => __METHOD__,
3014                )
3015            );
3016                    
3017            return $qres['result'];
3018      }      }
3019    
3020      /**      /**
# Line 1400  class instruction extends instruction_ge Line 3027  class instruction extends instruction_ge
3027       *       *
3028       * @return boolean       * @return boolean
3029       */       */
3030      function triggerajouterapres($id, &$db, $val, $DEBUG) {      function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3031            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3032    
3033          // 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
3034          $inst_di = $this->get_inst_dossier($this->valF['dossier']);          $inst_di = $this->get_inst_dossier($this->valF['dossier']);
   
3035          // Instance de la classe evenement          // Instance de la classe evenement
3036          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);          $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3037            // Instance de l'état courant du dossier d'instruction
3038            $inst_current_etat = $this->f->get_inst__om_dbform(array(
3039                "obj" => "etat",
3040                "idx" => $inst_di->get_id_etat(),
3041            ));
3042    
3043          /**          /**
3044           * 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 1414  class instruction extends instruction_ge Line 3046  class instruction extends instruction_ge
3046           */           */
3047          // état de complétude actuel du dossier          // état de complétude actuel du dossier
3048          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);          $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3049            // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3050            $ev_suiv_tacite_incompletude = false;
3051          // Initialisation          // Initialisation
3052          $valF = "";          $valF = array();
3053            $valF_dt = array();
3054          //          //
         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;  
             }  
         }  
3055          // Récupération des paramètres de l'action          // Récupération des paramètres de l'action
3056          $sql = "SELECT * FROM ".DB_PREFIXE."action          // TODO : remplacer cette requête par l'instanciation de l'action
3057          WHERE action='".$this->valF['action']."'";          $qres = $this->f->get_all_results_from_db_query(
3058          $res = $db->query($sql);              sprintf(
3059          $this->addToLog("triggerajouterapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
3060          if (database::isError($res)) {                      *
3061              die($res->getMessage());                  FROM
3062          }                      %1$saction
3063          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  WHERE
3064                        action = \'%2$s\'',
3065                    DB_PREFIXE,
3066                    $this->f->db->escapeSimple($this->valF['action'])
3067                ),
3068                array(
3069                    "origin" => __METHOD__
3070                )
3071            );
3072            foreach ($qres['result'] as $row) {
3073    
3074              // pour chacune des regles, on applique la regle              // pour chacune des regles, on applique la regle
3075              if($row['regle_delai']!=''){              if ($row['regle_delai'] != '') {
3076                  $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');                  $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3077              }              }
3078              if($row['regle_accord_tacite']!=''){              if ($row['regle_accord_tacite'] != '') {
3079                  $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');                  $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3080              }              }
3081              if($row['regle_avis']!=''){              if ($row['regle_avis'] != '') {
3082                  $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');                  $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3083              }              }
3084              if($row['regle_date_limite']!=''){              if ($row['regle_date_limite'] != '') {
3085                  $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');                  $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3086              }              }
3087              if($row['regle_date_complet']!=''){              if ($row['regle_date_complet'] != '') {
3088                  $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');                  $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3089              }              }
3090              if($row['regle_date_dernier_depot']!=''){              if ($row['regle_date_dernier_depot'] != '') {
3091                  $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');                  $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3092              }              }
3093              if($row['regle_date_notification_delai']!=''){              if ($row['regle_date_notification_delai'] != '') {
3094                  $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');                  $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3095              }              }
3096              if($row['regle_date_decision']!=''){              if ($row['regle_date_decision'] != '') {
3097                  $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');                  $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3098              }              }
3099              if($row['regle_date_rejet']!=''){              if ($row['regle_date_rejet'] != '') {
3100                  $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');                  $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3101              }              }
3102              if($row['regle_date_validite']!=''){              if ($row['regle_date_validite'] != '') {
3103                  $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');                  $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3104              }              }
3105              if($row['regle_date_chantier']!=''){              if ($row['regle_date_chantier'] != '') {
3106                  $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');                  $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3107              }              }
3108              if($row['regle_date_achevement']!=''){              if ($row['regle_date_achevement'] != '') {
3109                  $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');                  $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3110              }              }
3111              if($row['regle_date_conformite']!=''){              if ($row['regle_date_conformite'] != '') {
3112                  $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');                  $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3113              }              }
3114              if($row['regle_date_limite_incompletude']!=''){              if ($row['regle_date_limite_incompletude'] != '') {
3115                  $valF['date_limite_incompletude']= $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');                  $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3116              }              }
3117              if($row['regle_delai_incompletude']!=''){              if ($row['regle_delai_incompletude'] != '') {
3118                  $valF['delai_incompletude']= $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');                  $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3119              }              }
3120              if($row['regle_autorite_competente']!=''){              if ($row['regle_autorite_competente'] != '') {
3121                  $valF['autorite_competente']= $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');                  $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3122              }              }
3123              if($row['regle_etat']!=''){              if ($row['regle_etat'] != '') {
3124                  // 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');
3125                  // qu'on a un événement de type incomplétude alors : on stocke              }
3126                  // l'état dans la variable courante              if ($row['regle_date_cloture_instruction'] !== '') {
3127                  if ($incompletude == FALSE OR $inst_evenement->getVal('type') == "incompletude") {                  $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3128                      $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');              }
3129                  } else {              if ($row['regle_date_premiere_visite'] !== '') {
3130                      $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat'], 'regle_etat');                  $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3131                }
3132                if ($row['regle_date_derniere_visite'] !== '') {
3133                    $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3134                }
3135                if ($row['regle_date_contradictoire'] !== '') {
3136                    $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3137                }
3138                if ($row['regle_date_retour_contradictoire'] !== '') {
3139                    $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3140                }
3141                if ($row['regle_date_ait'] !== '') {
3142                    $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3143                }
3144                if ($row['regle_donnees_techniques1'] !== '') {
3145                    $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3146                }
3147                if ($row['regle_donnees_techniques2'] !== '') {
3148                    $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3149                }
3150                if ($row['regle_donnees_techniques3'] !== '') {
3151                    $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3152                }
3153                if ($row['regle_donnees_techniques4'] !== '') {
3154                    $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3155                }
3156                if ($row['regle_donnees_techniques5'] !== '') {
3157                    $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3158                }
3159                if ($row['regle_date_transmission_parquet'] !== '') {
3160                    $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3161                }
3162                if ($row['regle_dossier_instruction_type'] !== '') {
3163                    $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3164                }
3165                // La date d'affichage est modifiée seulement si le champ n'est pas
3166                // renseigné
3167                if ($row['regle_date_affichage'] !== ''
3168                    && ($inst_di->getVal('date_affichage') === ''
3169                        || $inst_di->getVal('date_affichage') === null)) {
3170                    //
3171                    $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3172                }
3173                //
3174                if ($row['regle_pec_metier'] != '') {
3175                    $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3176                }
3177                if ($row['regle_a_qualifier'] != '') {
3178                    $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3179                }
3180                //
3181                if ($row['regle_incompletude'] != '') {
3182                    $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3183                }
3184                if ($row['regle_incomplet_notifie'] != '') {
3185                    $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3186                }
3187                if ($row['regle_etat_pendant_incompletude'] != '') {
3188                    $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3189                }
3190                if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3191                    $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3192                    if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3193                        $ev_suiv_tacite_incompletude = true;
3194                  }                  }
3195              }              }
3196          }          }
3197    
3198          // Si l'événement a un événement suivant tacite          // Si l'événement a un événement suivant tacite
3199          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {          if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3200              // 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
3201              // dans le champ evenement_suivant_tacite du dossier              // pas associé de le même façon au dossier d'instruction
3202              if ($incompletude == false OR $inst_evenement->getVal('type') != "incompletude") {              if ($ev_suiv_tacite_incompletude === false) {
                 //  
3203                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3204              } else {              }
3205                  // Sinon l'événement tacite est stocké dans le champ              if ($ev_suiv_tacite_incompletude === true) {
                 // evenement_suivant_tacite_incompletude du dossier  
3206                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');                  $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3207              }              }
3208          }          }
3209            // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3210          // Si des valeurs ont été calculées alors on met à jour l'enregistrement          if (count($valF_dt) > 0) {
3211          if ($valF != "") {              $dt_id = $this->getDonneesTechniques();
3212              // On met à jour le dossier              // On met à jour le dossier
3213              $cle = " dossier='".$this->valF['dossier']."'";              $cle = " donnees_techniques='".$dt_id."'";
3214              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);              $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3215              $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);              $this->addToLog(
3216              if (database::isError($res1)) {                  __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3217                  die($res->getMessage());                  VERBOSE_MODE
3218                );
3219                $this->f->isDatabaseError($res1);
3220                // Affichage d'informations à l'utilisateur
3221                $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3222            }
3223            // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3224            if (count($valF) > 0) {
3225                //
3226                $inst_dossier = $this->f->get_inst__om_dbform(array(
3227                    "obj" => "dossier",
3228                    "idx" => $this->valF['dossier'],
3229                ));
3230                $valF['instruction'] = $id;
3231                $valF['crud'] = 'create';
3232                $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3233                if ($update_by_instruction === false) {
3234                    $this->cleanMessage();
3235                    $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3236                    return false;
3237              }              }
3238              // Affichage d'informations à l'utilisateur              // Affichage d'informations à l'utilisateur
3239              $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')."]");
3240          }          }
3241    
3242          /**          /**
# Line 1578  class instruction extends instruction_ge Line 3272  class instruction extends instruction_ge
3272              $this->addToMessage(_("Notification (105) du référentiel ERP OK."));              $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3273          }          }
3274    
3275            // Si le mode en rédaction intégrale est activé
3276            if (isset($this->valF['flag_edition_integrale']) === true
3277                && $this->valF['flag_edition_integrale'] === true) {
3278                $redactionIntegraleValF = array();
3279    
3280                // Récupère la collectivite du dossier d'instruction
3281                $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3282                $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3283                // Récupère le corps de la lettre type
3284                $params = array(
3285                    "specific" => array(
3286                        "corps" => array(
3287                            "mode" => "get",
3288                        )
3289                    ),
3290                );
3291                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3292                $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3293                // Récupère le titre de la lettre type
3294                $params = array(
3295                    "specific" => array(
3296                        "titre" => array(
3297                            "mode" => "get",
3298                        )
3299                    ),
3300                );
3301                $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3302                $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3303    
3304                // mise à jour en base de données
3305                $res = $this->f->db->autoExecute(
3306                    DB_PREFIXE.$this->table,
3307                    $redactionIntegraleValF,
3308                    DB_AUTOQUERY_UPDATE,
3309                    $this->clePrimaire."=".$id
3310                );
3311                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3312                if ($this->f->isDatabaseError($res, true) === true) {
3313                    return false;
3314                }
3315            }
3316    
3317            /**
3318             * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3319             */
3320            // Si la finalisation automatique de l'événement est activée
3321            // ET si l'instruction n'a pas déjà été finalisée
3322            // ET s'il existe une lettre type associée
3323            if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3324                && $inst_evenement->getVal('om_final_instruction') !== 't'
3325                && $inst_evenement->getVal('lettretype') !== ''
3326                && $inst_evenement->getVal('lettretype') !== null) {
3327    
3328                 // On instancie l'instruction
3329                $inst_instruction = $this->f->get_inst__om_dbform(array(
3330                    "obj" => "instruction",
3331                    "idx" => $this->valF[$this->clePrimaire],
3332                ));
3333    
3334                // On finalise l'instruction dans le contexte de finalisation : action 100
3335                $inst_instruction->setParameter('maj', 100);
3336                $finalize = $inst_instruction->finalize($inst_instruction->valF);
3337    
3338                // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3339                // et dans le message d'erreur
3340                if ($finalize === false) {
3341                    $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3342                    $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3343                    return false;
3344                }
3345            }
3346    
3347            /**
3348             * Finalisation automatique des instructions tacites ou retours.
3349             */
3350            // Si l'option de finalisation automatique des instructions tacites ou
3351            // retours est activée et l'événement d'instruction a une lettre type
3352            // associée
3353            $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3354            if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3355                && $inst_evenement->getVal('lettretype') !== ''
3356                && $inst_evenement->getVal('lettretype') !== null) {
3357    
3358                // Rècupère l'identifiant de l'événement
3359                $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3360    
3361                // Si l'événement d'instruction est identifié comme un événement
3362                // retour
3363                // OU l'événement d'instruction est l'événement suivant tacite du
3364                // dossier d'instruction (incomplétude prise en compte)
3365                // ET l'événement d'instruction n'a pas déjà été finalisé
3366                if (($inst_evenement->getVal("retour") === 't'
3367                    || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3368                        || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3369                        && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3370    
3371                    // Finalise l'instruction
3372                    $inst_instruction = $this->f->get_inst__om_dbform(array(
3373                        "obj" => "instruction",
3374                        "idx" => $this->valF[$this->clePrimaire],
3375                    ));
3376                    $inst_instruction->setParameter('maj', 100);
3377                    $finalize = $inst_instruction->finalize($inst_instruction->valF);
3378                    if ($finalize === false) {
3379                        //
3380                        return false;
3381                    }
3382                }
3383            }
3384    
3385            /**
3386             * Mise à jour de la version de clôture *version_clos* du dossier si et
3387             * seulement si l'instruction met à jour l'état du dossier.
3388             */
3389            if (isset($valF['etat']) === true
3390                && $valF['etat'] !== null
3391                && $valF['etat'] !== '') {
3392                // Instanciation de l'état appliqué sur le dossier par l'instruction
3393                $inst_etat = $this->f->get_inst__om_dbform(array(
3394                    "obj" => "etat",
3395                    "idx" => $valF['etat'],
3396                ));
3397                //
3398                $update_version_clos = null;
3399                // En cas d'instruction qui clôture le dossier
3400                if ($inst_etat->getVal('statut') === 'cloture') {
3401                    $update_version_clos = $inst_di->update_version_clos('up');
3402                }
3403                // En cas d'instruction qui rouvre le dossier
3404                if ($inst_current_etat->getVal('statut') === 'cloture'
3405                    && $inst_etat->getVal('statut') !== 'cloture') {
3406                    //
3407                    $update_version_clos = $inst_di->update_version_clos('down');
3408                    //
3409                    $params = array(
3410                        'di_reopened' => true,
3411                    );
3412                }
3413                //
3414                if ($update_version_clos === false) {
3415                    $this->f->addToLog(sprintf(
3416                        "%s() : ERREUR - %s %s",
3417                        __METHOD__,
3418                        sprintf(
3419                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3420                            $inst_di->getVal($inst_di->clePrimaire)
3421                        ),
3422                        sprintf(
3423                            __("L'instruction tente d'appliquer l'état %s."),
3424                            $inst_etat->getVal($inst_etat->clePrimaire)
3425                        )
3426                    ));
3427                    $this->addToMessage(sprintf(
3428                        "%s %s",
3429                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3430                        __("Veuillez contacter votre administrateur.")
3431                    ));
3432                    return false;
3433                }
3434            }
3435    
3436            /**
3437             * Notification automatique
3438             */
3439            // Notification automatique à l'ajout de l'instruction si la notification
3440            // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3441            if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3442                ($inst_evenement->getVal('lettretype') === null ||
3443                $inst_evenement->getVal('lettretype') === '')) {
3444                // Message à afficher dans les logs pour indiquer quelle notification a échouée
3445                $msgLog = sprintf(
3446                    '%s %s : %d',
3447                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3448                    __('Instruction notifiée'),
3449                    $id
3450                );
3451    
3452                // Récupération de la liste des demandeurs à notifier et de la catégorie
3453                $categorie = $this->f->get_param_option_notification($collectivite_di);
3454                $isPortal = $categorie === PORTAL;
3455                $demandeursANotifie = $this->get_demandeurs_notifiable(
3456                    $this->valF['dossier'],
3457                    $isPortal
3458                );
3459    
3460                // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3461                $demandeurPrincipalNotifie = false;
3462                foreach ($demandeursANotifie as $demandeur) {
3463                    // Identifie si le demandeur principal a été notifié ou pas
3464                    // et récupère ses informations
3465                    if ($demandeur['petitionnaire_principal'] == 't') {
3466                        $demandeurPrincipalNotifie = true;
3467                        // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3468                        // son paramétrage, on effectue pas le traitement et on passe à l'itération
3469                        // suivante. On le considère également comme non notifié pour gérer l'envoie
3470                        // des messages d'erreurs
3471                        // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3472                        // d'impact sur la notification
3473                        $erreursParam = $this->get_info_notification_fail($val['dossier']);
3474                        if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3475                            $demandeurPrincipalNotifie = false;
3476                            continue;
3477                        }
3478                    }
3479                    // Ajout de la notif et récupération de son id
3480                    $idNotif = $this->ajouter_notification(
3481                        $this->valF[$this->clePrimaire],
3482                        $this->f->get_connected_user_login_name(),
3483                        $demandeur,
3484                        $collectivite_di,
3485                        array(),
3486                        true
3487                    );
3488                    if ($idNotif === false) {
3489                        $this->addToLog(
3490                            sprintf('%s() : %s', __METHOD__, $msgLog),
3491                            DEBUG_MODE
3492                        );
3493                        return false;
3494                    }
3495                    // Création de la tache en lui donnant l'id de la notification
3496                    $notification_by_task = $this->notification_by_task(
3497                        $idNotif,
3498                        $this->valF['dossier'],
3499                        $categorie
3500                    );
3501                    if ($notification_by_task === false) {
3502                        $this->addToLog(
3503                            sprintf('%s() : %s', __METHOD__, $msgLog),
3504                            DEBUG_MODE
3505                        );
3506                        $this->addToMessage(
3507                            __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3508                        );
3509                        return false;
3510                    }
3511                }
3512                // Pour la notification par mail ou la notification via portal si le dossier a
3513                // été déposés via portal, si le demandeur principal n'est pas notifiable,
3514                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3515                // laquelle le demandeur principal n'a pas pu être notifié
3516                $depotPortal = $this->dossier_depose_sur_portail();
3517                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3518                    // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3519                    // ' ' permet de mettre un espace entre les 2 msg de log.
3520                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3521                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3522                    $erreursParam = $this->get_info_notification_fail($val['dossier']);
3523                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3524                    // Ajout de la notif et récupération de son id
3525                    $idNotif = $this->ajouter_notification(
3526                        $this->valF[$this->clePrimaire],
3527                        $this->f->get_connected_user_login_name(),
3528                        $demandeurPrincipal,
3529                        $collectivite_di,
3530                        array(),
3531                        true,
3532                        'Echec',
3533                        implode(' ', $erreursParam)
3534                    );
3535                    if ($idNotif === false) {
3536                        $this->addToLog(
3537                            sprintf('%s() : %s', __METHOD__, $msgLog),
3538                            DEBUG_MODE
3539                        );
3540                        $this->addToMessage(
3541                            __('Erreur : la création de la notification a échouée.').
3542                            __("Veuillez contacter votre administrateur.")
3543                        );
3544                        return false;
3545                    }
3546                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3547                    // de l'échec de la notification
3548                    $dossier_message = $this->get_inst_dossier_message(0);
3549                    $dossier_message_val = array(
3550                        'dossier' => $val['dossier'],
3551                        'type' => _('erreur expedition'),
3552                        'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3553                        'login' => $_SESSION['login'],
3554                        'date_emission' => date('Y-m-d H:i:s'),
3555                        'contenu' => _('Échec lors de la notification de l\'instruction ').
3556                            $inst_evenement->getVal('libelle').
3557                            '.<br>'.
3558                            implode("\n", $erreursParam).
3559                            '<br>'.
3560                            _('Veuillez corriger ces informations avant de renvoyer la notification.')
3561                    );
3562                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
3563                    // Si une erreur se produit pendant l'ajout
3564                    if ($add !== true) {
3565                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3566                        return false;
3567                    }
3568                }
3569                $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.")));
3570            }
3571    
3572            // Notification automatique en cas de dépôt de dossier dématérialisé
3573            // Vérifie si l'option de notification est active et si il s'agit bien d'une
3574            // instruction de récépissé
3575            if (
3576                $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3577                && $this->is_instruction_recepisse()
3578            ) {
3579                // Message à afficher dans les logs pour indiquer quelle notification a échouée
3580                $msgLog = sprintf(
3581                    __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3582                    $val['dossier']
3583                );
3584                // Récupère l'instance de la demande
3585                $demande = $inst_di->get_inst_demande();
3586                // Vérifie que le dossier a été déposé via platau ou portal
3587                if (
3588                    ($demande->getVal('source_depot') == PLATAU ||
3589                    $demande->getVal('source_depot') == PORTAL)
3590                ) {
3591                    // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3592                    // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3593                    $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3594                    if (empty($listeEmails)) {
3595                        $this->addToLog(
3596                            sprintf(
3597                                '%s(): %s %s',
3598                                __METHOD__,
3599                                $msgLog,
3600                                __('Aucun courriel paramétré.')
3601                            ),
3602                            DEBUG_MODE
3603                        );
3604                    } else {
3605                        foreach ($listeEmails as $email) {
3606                            // Ajout de la notif et récupération de son id
3607                            $destinataire = array(
3608                                'destinataire' => $email,
3609                                'courriel' => $email
3610                            );
3611                            $idNotif = $this->ajouter_notification(
3612                                $this->valF[$this->clePrimaire],
3613                                $this->f->get_connected_user_login_name(),
3614                                $destinataire,
3615                                $collectivite_di,
3616                                array(),
3617                                true
3618                            );
3619                            if ($idNotif === false) {
3620                                $this->addToLog(
3621                                    sprintf('%s(): %s', __METHOD__, $msgLog),
3622                                    DEBUG_MODE
3623                                );
3624                                return false;
3625                            }
3626                            // Création de la tache en lui donnant l'id de la notification
3627                            $notification_by_task = $this->notification_by_task(
3628                                $idNotif,
3629                                $this->valF['dossier'],
3630                                'mail',
3631                                'notification_depot_demat'
3632                            );
3633                            if ($notification_by_task === false) {
3634                                $this->addToMessage(
3635                                    __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3636                                );
3637                                $this->addToLog(
3638                                    sprintf('%s(): %s', __METHOD__, $msgLog),
3639                                    DEBUG_MODE
3640                                );
3641                                return false;
3642                            }
3643                        }
3644                    }
3645                }
3646            }
3647    
3648            /**
3649             * Mise à jour de la date de dernière modification du dossier
3650             */
3651            $inst_di->update_last_modification_date();
3652    
3653          /**          /**
3654           * Mise à jour des données du DA.           * Mise à jour des données du DA.
3655           */           */
         //  
3656          $inst_da = $inst_di->get_inst_dossier_autorisation();          $inst_da = $inst_di->get_inst_dossier_autorisation();
3657          //          $params['di_id'] = $this->valF['dossier'];
3658          if ($inst_da->majDossierAutorisation() === false) {          if ($inst_da->majDossierAutorisation($params) === false) {
3659              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3660              $this->correct = false;              $this->correct = false;
3661              return false;              return false;
# Line 1597  class instruction extends instruction_ge Line 3668  class instruction extends instruction_ge
3668          return $this->add_log_to_dossier($id, array_merge($val, $this->valF));          return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3669      }      }
3670    
3671      function triggermodifierapres($id,&$db,$val,$DEBUG) {      /**
3672          /**       * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3673           * L'objectif ici est d'effectuer les recalculs de date dans le dossier       * sont remplies.
3674           * si la date de l'evenement est modifiee       * Les conditions vérifiées sont les suivantes :
3675           */       *  - L'option de notification *option_notification* doit être définie
3676          // Initialisation       *  - Le petitionnaire principal doit accepter les notifications
3677          $valF = "";       *  - Le pétitionnaire principal doit avoir une adresse mail renseignée
3678          // Initialisation du type d'événement       *  - Le pétitionnaire principal doit avoir une adresse mail correcte
3679          $type_evmt = "";       * Pour chaque vérification effectué un message d'erreur est ajouté si la
3680          // Récupération de l'action correspondante à l'événement       * condition n'est pas remplie.
3681          $sql = "SELECT action       * Renvoie le message d'erreur en sortie.
3682          FROM ".DB_PREFIXE."evenement       *
3683          WHERE evenement=".$this->valF['evenement'];       * @param string identifiant du dossier sur lequel les notifications ont échouée
3684          $action = $db->getOne($sql);       * @return string
3685          $this->addToLog("triggermodifierapres(): db->getone(\"".$sql."\");", VERBOSE_MODE);       */
3686          if (database::isError($action)) {      protected function get_info_notification_fail($dossier = null) {
3687              die($action->getMessage());          // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3688            // utilise celui associé à l'instruction
3689            if ($dossier == null) {
3690                $dossier = $this->getVal('dossier');
3691            }
3692            // Tableau contenant la liste des messages d'erreur
3693            $errorMessage = array();
3694            // Récupère l'option de notification
3695            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3696            $option_notification = $this->f->get_param_option_notification($collectivite_di);
3697            if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3698                $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3699            }
3700            // Récupère les informations du demandeurs principal
3701            $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3702            // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3703            if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3704                $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3705            }
3706            // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3707            if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3708                // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3709                // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3710                if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3711                    $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3712                        $infoPetitionnaire['courriel'].
3713                        '.';
3714                }
3715            } else {
3716                // Si le courriel du pétitionnaire principal
3717                $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3718            }
3719    
3720            return $errorMessage;
3721        }
3722    
3723        /**
3724         * Méthode servant à vérifier si un dossier a été déposé sur
3725         * le portail citoyen ou pas.
3726         * La verification se fait via une requête sql dans laquelle
3727         * on va chercher un dossier ayant pour id l'identifiant de
3728         * dossier associé à l'instruction et pour lequel la demande
3729         * associée la plus ancienne est une demande de création de
3730         * dossier via portail
3731         *
3732         * @param string identifiant du dossier. Si non renseigné c'est le dossier
3733         * associé à l'instruction qui est utilisé
3734         * @return boolean|void true : dossier déposé via portail, false : dossier
3735         * non déposé via portail et null : erreur de base de données.
3736         */
3737        protected function dossier_depose_sur_portail($dossier = null) {
3738            if (empty($dossier)) {
3739                $dossier = $this->getVal('dossier');
3740            }
3741            $qres = $this->f->get_one_result_from_db_query(
3742                sprintf(
3743                    'SELECT
3744                        dossier
3745                    FROM
3746                        %1$sdossier
3747                        -- Récuperation de la première demande associée au dossier
3748                        LEFT JOIN (
3749                            SELECT
3750                                demande,
3751                                dossier_instruction,
3752                                source_depot
3753                            FROM
3754                                %1$sdemande
3755                            WHERE
3756                               dossier_instruction = \'%2$s\'
3757                            ORDER BY
3758                               demande ASC
3759                            LIMIT 1
3760                        ) AS demande
3761                            ON dossier.dossier = demande.dossier_instruction
3762                    WHERE
3763                        dossier.dossier = \'%2$s\'
3764                        AND demande.source_depot = \'portal\'',
3765                    DB_PREFIXE,
3766                    $this->f->db->escapeSimple($dossier)
3767                ),
3768                array(
3769                    "origin" => __METHOD__,
3770                    "force_return" => true,
3771                )
3772            );
3773            if ($qres["code"] !== "OK") {
3774                $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3775                return;
3776          }          }
3777            // Si on a un résultat c'est que le dossier a été déposé via le portail
3778            return ! empty($qres["result"]);
3779        }
3780    
3781          // Récupération des paramètres de l'action      public function is_service_notifiable() {
3782          $sql = "SELECT * FROM ".DB_PREFIXE."action          $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3783          WHERE action='".$action."'";  
3784          $res = $db->query($sql);          // Si l'instruction a une édition non finalisé quel que soit
3785          $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);          // le type de notification, il n'est pas notifiable
3786          if (database::isError($res)) {          if ($this->has_an_edition() === true) {
3787              die($res->getMessage());              if ($this->is_unfinalizable_without_bypass() === false) {
3788          }                  return false;
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){  
             // application des regles sur le courrier + delai  
             if(preg_match("/date_evenement/",$row['regle_date_limite'])){  
                 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');  
3789              }              }
3790              if(preg_match("/date_evenement/",$row['regle_date_complet'])){          }
3791                  $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');          // Vérifie si la notification des tiers est active pour l'évènement
3792            return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3793        }
3794    
3795        public function is_tiers_notifiable() {
3796            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3797    
3798            // Si l'instruction a une édition non finalisé quel que soit
3799            // le type de notification, il n'est pas notifiable
3800            if ($this->has_an_edition() === true) {
3801                if ($this->is_unfinalizable_without_bypass() === false) {
3802                    return false;
3803              }              }
3804              if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){          }
3805                  $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');          // Vérifie si la notification des tiers est active pour l'évènement
3806            return ! empty($evenement->getVal('notification_tiers'));
3807        }
3808    
3809        /**
3810         * Méthode permettant de savoir si une instruction peut
3811         * être notifiée manuellement selon les différents types
3812         * de notification.
3813         *
3814         * Si l'instruction a une édition non finalisée alors elle n'est pas
3815         * manuellement notifiable.
3816         * Si l'instruction est associé à un événement de notification pour
3817         * lequel un retour signature est recquis, elle n'est notifiable que
3818         * si la date de retour de signature est remplie.
3819         * Par défaut si le type de notification n'est pas connu alors l'instruction
3820         * n'est pas notifiable.
3821         * Pour tous les autres cas l'instruction est manuellement notifiable.
3822         *
3823         * @return boolean true : notifiable | false : non notifiable
3824         */
3825        public function is_notifiable_by_task_manual() {
3826            $ev = $this->get_inst_evenement($this->getVal('evenement'));
3827    
3828            // Si l'instruction a une édition non finalisé quel que soit
3829            // le type de notification, il n'est pas notifiable
3830            if ($this->has_an_edition() === true) {
3831                if ($this->is_unfinalizable_without_bypass() === false) {
3832                    return false;
3833              }              }
3834              if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){          }
3835                  $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');  
3836            // Gestion des différents cas selon la valeur du champs notification
3837            if ($ev->getVal('notification') == 'notification_manuelle' ||
3838                $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3839                $ev->getVal('notification') == 'notification_automatique'
3840            ) {
3841                return true;
3842            } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3843                $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3844                $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3845                $this->getVal('date_retour_signature') != null &&
3846                $this->getVal('date_retour_signature') != ''
3847            ) {
3848                return true ;
3849            }
3850            return false;
3851        }
3852    
3853        /**
3854         * Crée une instance de notification et une tache notification_instruction de catégorie portal
3855         * pour le demandeur principal.
3856         *
3857         * @return boolean true si le traitement à réussi
3858         */
3859        protected function notifier_demandeur_principal_via_portal() {
3860            $this->begin_treatment(__METHOD__);
3861            $message = '';
3862            // Récupération des informations concernant le demandeur
3863            $dossier = $this->getVal('dossier');
3864            $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3865            $demandeur = $this->get_demandeurs_notifiable(
3866                $dossier,
3867                true
3868            );
3869            if ($demandeur !== array()) {
3870                $destinataire = array_values($demandeur);
3871                // Ajout de la notif et récupération de son id
3872                $idNotification = $this->ajouter_notification(
3873                    $this->getVal($this->clePrimaire),
3874                    $this->f->get_connected_user_login_name(),
3875                    $destinataire[0],
3876                    $collectivite_di,
3877                    array(),
3878                    true
3879                );
3880                if ($idNotification === false) {
3881                    return $this->end_treatment(__METHOD__, false);
3882              }              }
3883              if(preg_match("/date_evenement/",$row['regle_date_decision'])){              // Création de la tâche en lui donnant l'id de la notification
3884                  $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');              $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3885                if ($notification_by_task === false) {
3886                    $this->addToMessage(
3887                        __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3888                    );
3889                    return $this->end_treatment(__METHOD__, false);
3890              }              }
3891              if(preg_match("/date_evenement/",$row['regle_date_rejet'])){              $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.")));
3892                  $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');              return $this->end_treatment(__METHOD__, true);
3893            }
3894            $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3895            return $this->end_treatment(__METHOD__, false);
3896        }
3897    
3898        public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3899            // Si le type n'est pas correctement spécifié, alors il est calculé
3900            if ($type !== 'notification_recepisse'
3901                && $type !== 'notification_instruction'
3902                && $type !== 'notification_decision'
3903                && $type !== 'notification_service_consulte'
3904                && $type !== 'notification_tiers_consulte'
3905                && $type !== 'notification_depot_demat'
3906                && $type !== 'notification_commune'
3907                && $type !== 'notification_signataire') {
3908                //
3909                $type = 'notification_instruction';
3910                // Vérifie si l'instruction est un récépissé
3911                if ($this->is_instruction_recepisse()) {
3912                    $type = 'notification_recepisse';
3913    
3914                }
3915                // Vérifie si l'instruction est une décision
3916                if ($type !== 'notification_recepisse') {
3917                    $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3918                    if ($avis_decision !== null && $avis_decision !== '') {
3919                        $type = 'notification_decision';
3920                    }
3921              }              }
3922              if(preg_match("/date_evenement/",$row['regle_date_validite'])){          }
3923                  $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');          // Préparation des valeurs de la tâche
3924            $task_val = array(
3925                'type' => $type,
3926                'object_id' => $object_id,
3927                'dossier' => $dossier,
3928                'category' => $category,
3929            );
3930            // Préparation de la tache de notification
3931            $inst_task = $this->f->get_inst__om_dbform(array(
3932                "obj" => "task",
3933                "idx" => 0,
3934            ));
3935    
3936            $add_task = $inst_task->add_task(array('val' => $task_val));
3937            if ($add_task === false) {
3938                $this->addToLog(
3939                    sprintf(
3940                        '%s(): %s %s : %s',
3941                        __METHOD__,
3942                        __('Echec de l\'ajout de la tâche de notification.'),
3943                        __('Paramétrage de la tâche'),
3944                        var_export($task_val, true)
3945                    ),
3946                    DEBUG_MODE
3947                );
3948                return false;
3949            }
3950    
3951            return true;
3952        }
3953    
3954        /**
3955         * Cette méthode permet de savoir si l'instruction est une instruction
3956         * de recepisse (instruction lié à l'ajout du dossier).
3957         *
3958         * Pour cela, on récupère la liste des actions qui ont menées à la création
3959         * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3960         * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3961         * l'instruction et donc qu'il s'agit d'un recepisse.
3962         *
3963         * @return boolean
3964         */
3965        protected function is_instruction_recepisse() {
3966            // Récupère la liste des actions qui ont mené à la création de
3967            // l'instruction
3968            $trace = debug_backtrace();
3969            // Parcours la liste des actions et si une de ces actions est lié
3970            // à la classe demande on cosidère que l'instruction est un recepisse
3971            foreach ($trace as $key => $value) {
3972                if (isset($trace[$key]['class']) === true
3973                    && empty($trace[$key]['class']) === false) {
3974                    if (strtolower($trace[$key]['class']) === 'demande') {
3975                        return true;
3976                    }
3977              }              }
3978              if(preg_match("/date_evenement/",$row['regle_date_chantier'])){          }
3979                  $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');          return false;
3980        }
3981    
3982        /**
3983         * A partir des informations passée en argument ajoute un nouvel élément
3984         * dans la table instruction_notification.
3985         * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3986         * paramètre si le paramétrage attendus est ok.
3987         * Ajoute également un nouvel élement dans instruction_notification_document
3988         * si l'instruction possède une lettretype.
3989         * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3990         * élement dans la table instruction_notification_document qui correspondra
3991         * à l'annexe de la notification.
3992         *
3993         * @param integer identifiant de l'instruction notifiée
3994         * @param string information concernant l'emetteur
3995         * @param array tableau contenant 2 entrées
3996         *  - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3997         *  - courriel : adresse mail de la personne à notifier
3998         * @param integer identifiant de la collectivité permettant de récupèrer les
3999         * paramètres à valider
4000         * @param boolean indique si la notification est automatique ou manuelle
4001         * @param integer identifiant d'une instruction dont l'édition sera annexé
4002         * à la notification
4003         *
4004         * @return integer|boolean identifiant de la notification créée si le traitement
4005         * a réussie, false sinon.
4006         */
4007        protected function ajouter_notification(
4008            $idInstruction,
4009            $emetteur,
4010            $destinataire,
4011            $collectiviteId,
4012            $annexes = array(),
4013            $demandeAuto = false,
4014            $statut = 'en cours d\'envoi',
4015            $commentaire = 'Notification en cours de traitement'
4016        ) {
4017            // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4018            // de créer la notification
4019            if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4020                $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4021                $this->addToMessage($msgErreur);
4022                $this->addToLog(
4023                    sprintf('%s() : %s', __METHOD__, $msgErreur),
4024                    DEBUG_MODE
4025                );
4026                return false;
4027            }
4028            // Préparation de la notification
4029            $inst_notif = $this->f->get_inst__om_dbform(array(
4030                "obj" => "instruction_notification",
4031                "idx" => "]",
4032            ));
4033            $notif_val = array(
4034                'instruction_notification' => null,
4035                'instruction' => $idInstruction,
4036                'automatique' => $demandeAuto,
4037                'emetteur' => $emetteur,
4038                'date_envoi' => null,
4039                'destinataire' => $destinataire['destinataire'],
4040                'courriel' => $destinataire['courriel'],
4041                'date_premier_acces' => null,
4042                'statut' => $statut,
4043                'commentaire' => $commentaire
4044            );
4045    
4046            // Création de la notification
4047            $add_notif = $inst_notif->ajouter($notif_val);
4048            if ($add_notif === false) {
4049                $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4050                $this->addToLog(
4051                    sprintf(
4052                        '%s() : %s %s : %s',
4053                        __METHOD__,
4054                        __("Echec de l'ajout de la notification en base de données."),
4055                        __('Paramétrage de la notification'),
4056                        var_export($notif_val, true)
4057                    ),
4058                    DEBUG_MODE
4059                );
4060                return false;
4061            }
4062    
4063            // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4064            if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4065                $add_notif_doc = $this->ajouter_notification_document(
4066                    $inst_notif->getVal($inst_notif->clePrimaire),
4067                    $this->getVal($this->clePrimaire),
4068                    'instruction'
4069                );
4070                if ($add_notif_doc === false) {
4071                    $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4072                    return false;
4073              }              }
4074              if(preg_match("/date_evenement/",$row['regle_date_achevement'])){          }
4075                  $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');          // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4076            if (! empty($annexes) && is_array($annexes)) {
4077                $add_notif_annexe = $this->ajouter_notification_document_multiple(
4078                    $inst_notif->getVal($inst_notif->clePrimaire),
4079                    $annexes
4080                );
4081                if ($add_notif_annexe === false) {
4082                    $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4083                    return false;
4084              }              }
4085              if(preg_match("/date_evenement/",$row['regle_date_conformite'])){          }
4086                  $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');  
4087            // Renvoie l'id de la nouvelle instance de instruction_notification
4088            return $inst_notif->getVal($inst_notif->clePrimaire);
4089        }
4090    
4091        /**
4092         * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4093         * instance dans la table instruction_notification_document lié a la
4094         * notification dont l'id est passé en paramètre.
4095         *
4096         * @param array tableau contenant les informations nécessaires pour créer les annexes
4097         *
4098         * @return integer|boolean identifiant de la notification créée si le traitement
4099         * a réussie, false sinon.
4100         */
4101        protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4102            foreach ($listeDocument as $paramDoc) {
4103                if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4104                    $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4105                    return false;
4106              }              }
4107          }          }
4108          // Si des valeurs ont été calculées alors on met à jour l'enregistrement          return true;
4109          if ($valF != "") {      }
4110              // On met à jour le dossier  
4111              $cle = " dossier='".$this->valF['dossier']."'";      /**
4112              $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);       * Ajoute un élément dans la table instruction_notification_document en utilisant
4113              $this->addToLog("triggermodifierapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);       * les éléments fourni en paramètre
4114              if (database::isError($res1)) {       *
4115                  die($res->getMessage());       * @param integer $idNotification : id de la notification à laquelle on associe le document
4116         * @param integer $idDocument : id de l'objet auquel est rattaché le document
4117         * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4118         * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4119         *
4120         * @return boolean indique si le traitement a réussi
4121         */
4122        protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4123            $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4124                "obj" => "instruction_notification_document",
4125                "idx" => "]",
4126            ));
4127            // l'attribut instruction doit obligatoirement être renseigné
4128            // pour éviter toutes confusion avec d'autres instruction l'id
4129            // 0 est donné au document n'appartenant pas aux instructions
4130            $notif_doc_val = array(
4131                'instruction_notification_document' => null,
4132                'instruction_notification' => $idNotification,
4133                'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4134                'document_type' => $tableDocument,
4135                'document_id' => $idDocument,
4136                'cle' => $this->getCleAccesDocument(),
4137                'annexe' => $isAnnexe
4138            );
4139    
4140            $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4141            if ($add_notif_doc === false) {
4142                $this->addToLog(
4143                    sprintf(
4144                        '%s() : %s %s : %s',
4145                        __METHOD__,
4146                        __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4147                        __('Paramétrage du document'),
4148                        var_export($notif_doc_val, true)
4149                    ),
4150                    DEBUG_MODE
4151                );
4152                return false;
4153            }
4154            return true;
4155        }
4156        
4157        /**
4158         * Vérifie si le paramétrage de la notification des demandeurs est correct.
4159         *
4160         * @param integer identifiant de la collectivité
4161         * @return boolean
4162         */
4163        protected function is_parametrage_notification_correct($collectiviteId) {
4164            $categorie = $this->f->get_param_option_notification($collectiviteId);
4165            $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4166            if ($categorie === 'mail' && $urlAccesNotif === null) {
4167                return false;
4168            }
4169            return true;
4170        }
4171    
4172        /**
4173         * TRIGGER - triggermodifierapres.
4174         *
4175         * @return boolean
4176         */
4177        function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4178            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4179            $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4180            $message = '';
4181    
4182            // Définit si le dossier d'instruction doit être mis à jour
4183            $update_dossier = true;
4184            // Les actions de mise à jour des dates ne doivent pas appliquer
4185            // l'action de l'événement et donc ne pas mettre à jour le dossier
4186            if ($this->getParameter("maj") == 125
4187                || $this->getParameter("maj") == 170
4188                || $this->getParameter("maj") == 175) {
4189                $update_dossier = false;
4190            }
4191    
4192            // Traitement en cas de mise à jour du dossier
4193            if ($update_dossier === true) {
4194                /**
4195                 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4196                 * si la date de l'evenement est modifiee
4197                 */
4198                // Initialisation
4199                $valF = array();
4200                $valF_dt = array();
4201                // Initialisation du type d'événement
4202                $type_evmt = "";
4203                // Récupération de l'action correspondante à l'événement
4204                $evenement = $this->f->get_inst__om_dbform(array(
4205                    "obj" => "evenement",
4206                    "idx" => $this->valF['evenement']
4207                ));
4208    
4209                // Récupération des paramètres de l'action
4210                // TODO : remplacer cette requête par l'instanciation de l'action
4211                $qres = $this->f->get_all_results_from_db_query(
4212                    sprintf(
4213                        'SELECT
4214                            *
4215                        FROM
4216                            %1$saction
4217                        WHERE
4218                            action = \'%2$s\'',
4219                        DB_PREFIXE,
4220                        $this->f->db->escapeSimple($evenement->getVal('action'))
4221                    ),
4222                    array(
4223                        "origin" => __METHOD__
4224                    )
4225                );
4226                foreach ($qres['result'] as $row) {
4227                    // application des regles sur le courrier + delai
4228                    if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4229                        $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4230                    }
4231                    if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4232                        $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4233                    }
4234                    if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4235                        $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4236                    }
4237                    if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4238                        $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4239                    }
4240                    if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4241                        $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4242                    }
4243                    if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4244                        $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4245                    }
4246                    if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4247                        $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4248                    }
4249                    if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4250                        $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4251                    }
4252                    if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4253                        $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4254                    }
4255                    if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4256                        $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4257                    }
4258                    if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4259                        $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4260                    }
4261                    if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4262                        $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4263                    }
4264                    if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4265                        $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4266                    }
4267                    if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4268                        $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4269                    }
4270                    if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4271                        $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4272                    }
4273                    if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4274                        $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4275                    }
4276                    if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4277                        $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4278                    }
4279                    if ($row['regle_donnees_techniques1'] !== '') {
4280                        $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4281                    }
4282                    if ($row['regle_donnees_techniques2'] !== '') {
4283                        $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4284                    }
4285                    if ($row['regle_donnees_techniques3'] !== '') {
4286                        $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4287                    }
4288                    if ($row['regle_donnees_techniques4'] !== '') {
4289                        $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4290                    }
4291                    if ($row['regle_donnees_techniques5'] !== '') {
4292                        $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4293                    }
4294                    if ($row['regle_dossier_instruction_type'] !== '') {
4295                        $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4296                    }
4297                }
4298                // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4299                if (count($valF_dt) > 0) {
4300                    $dt_id = $this->getDonneesTechniques();
4301                    // On met à jour le dossier
4302                    $cle = " donnees_techniques='".$dt_id."'";
4303                    $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4304                    $this->addToLog(
4305                        __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4306                        VERBOSE_MODE
4307                    );
4308                    $this->f->isDatabaseError($res1);
4309                    // Affichage d'informations à l'utilisateur
4310                    $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4311                }
4312                // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4313                if (count($valF) > 0) {
4314                    $inst_dossier = $this->f->get_inst__om_dbform(array(
4315                        "obj" => "dossier",
4316                        "idx" => $this->valF['dossier'],
4317                    ));
4318                    $valF['instruction'] = $id;
4319                    $valF['crud'] = 'update';
4320                    $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4321                    if ($update_by_instruction === false) {
4322                        $this->cleanMessage();
4323                        $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4324                        return false;
4325                    }
4326                    // Affichage d'informations à l'utilisateur
4327                    $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4328              }              }
             // Affichage d'informations à l'utilisateur  
             $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");  
4329          }          }
4330    
4331            // Par défaut les instructions à ajouter suite à la saisie d'une date
4332            // de retour signature ou de notification, utilisent l'action 0
4333            // Si la création d'événement d'instruction suivant est déclenchée par
4334            // une notification suite au traitement d'une tâche (démat') alors l'ajout
4335            // de la nouvelle instruction se fait avec l'action 176
4336            // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4337            // nouvelle instruction, depuis la méthode verifier()
4338            $code_action_add = 0;
4339            if ($this->getParameter("maj") == 175) {
4340                $code_action_add = 176;
4341            }
4342          $restriction = $this->get_restriction($val['evenement']);          $restriction = $this->get_restriction($val['evenement']);
4343          $this->restriction_valid = $this->restrictionIsValid($restriction);          $this->restriction_valid = $this->restrictionIsValid($restriction);
4344    
4345          if($restriction == "" || $this->restriction_valid ){          if($restriction == "" || $this->restriction_valid ){
4346              // 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é
4347              $sql = "SELECT * FROM ".DB_PREFIXE."evenement              // TODO : remplacer cette requête par l'instanciation de l'evenement
4348              WHERE evenement=".$this->valF['evenement'];              $qres = $this->f->get_all_results_from_db_query(
4349              $res = $db->query($sql);                  sprintf(
4350              $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);                      'SELECT
4351              if (database::isError($res)) {                          *
4352                  die($res->getMessage());                      FROM
4353              }                          %1$sevenement
4354                        WHERE
4355                            evenement = %2$d',
4356                        DB_PREFIXE,
4357                        intval($this->valF['evenement'])
4358                    ),
4359                    array(
4360                        "origin" => __METHOD__
4361                    )
4362                );
4363              $current_id = $this->getVal($this->clePrimaire);              $current_id = $this->getVal($this->clePrimaire);
4364              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
4365                  // 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 on vérifie si il existe un événement automatique
4366                  if ($this->getVal('date_retour_signature') == "" AND                  if ($this->getVal('date_retour_signature') == "" AND
4367                      $this->valF['date_retour_signature'] != "" AND                      $this->valF['date_retour_signature'] != "" AND
4368                      $row['evenement_retour_signature'] != "") {                      $row['evenement_retour_signature'] != "") {
4369                      $new_instruction = new instruction("]", $db, $DEBUG);                      $new_instruction = $this->f->get_inst__om_dbform(array(
4370                            "obj" => "instruction",
4371                            "idx" => "]",
4372                        ));
4373                      // 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
4374                      foreach($new_instruction->champs as $champ) {                      foreach($new_instruction->champs as $champ) {
4375                          $valNewInstr[$champ] = "";                          $valNewInstr[$champ] = "";
# Line 1704  class instruction extends instruction_ge Line 4385  class instruction extends instruction_ge
4385                      $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                      $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4386                      $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']);
4387                      $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']);
4388                      $new_instruction->setParameter("maj", 0);                      $new_instruction->setParameter("maj", $code_action_add);
4389                      $new_instruction->class_actions[0]["identifier"] =                      $new_instruction->class_actions[$code_action_add]["identifier"] =
4390                          "retour signature de l'instruction $current_id";                          sprintf(
4391                      $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                              __("Ajout suite au retour signature de l'instruction %s"),
4392                                $current_id
4393                            );
4394                        $retour = $new_instruction->ajouter($valNewInstr);
4395                                            
4396                      //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
4397                      //de restriction                      //de restriction
4398                      if ($retour == false && !$new_instruction->restriction_valid){                      if ($retour == false && !$new_instruction->restriction_valid){
4399                          $error_message = $this->get_restriction_error_message($restriction);                          $error_message = $this->get_restriction_error_message($restriction);
4400                          $this->f->displayMessage("error", $error_message);                          $this->f->displayMessage("error", $error_message);
4401                          $this->addToLog("triggermodifierapres() : evenement retour ".                          $this->addToLog(__METHOD__."(): evenement retour ".
4402                              "instruction ".$this->valF[$this->clePrimaire]." : ".                              "instruction ".$this->valF[$this->clePrimaire]." : ".
4403                              $new_instruction->msg);                              $new_instruction->msg);
4404                      }                      }
# Line 1730  class instruction extends instruction_ge Line 4414  class instruction extends instruction_ge
4414                      $this->valF['date_retour_rar'] != "") {                      $this->valF['date_retour_rar'] != "") {
4415                                            
4416                      if($row['evenement_retour_ar'] != "") {                      if($row['evenement_retour_ar'] != "") {
4417                          $new_instruction = new instruction("]", $db, $DEBUG);                          $new_instruction = $this->f->get_inst__om_dbform(array(
4418                                "obj" => "instruction",
4419                                "idx" => "]",
4420                            ));
4421                          // 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
4422                          foreach($new_instruction->champs as $champ) {                          foreach($new_instruction->champs as $champ) {
4423                              $valNewInstr[$champ] = "";                              $valNewInstr[$champ] = "";
# Line 1746  class instruction extends instruction_ge Line 4433  class instruction extends instruction_ge
4433                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);                          $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4434                          $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']);
4435                          $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']);
4436                          $new_instruction->setParameter("maj", 0);                          $new_instruction->setParameter("maj", $code_action_add);
4437                          $new_instruction->class_actions[0]["identifier"] =                          $new_instruction->class_actions[$code_action_add]["identifier"] =
4438                              "retour RAR de l'instruction $current_id";                              sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4439                          $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);                          $retour = $new_instruction->ajouter($valNewInstr);
4440    
4441                          //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
4442                          //de restriction                          //de restriction
# Line 1757  class instruction extends instruction_ge Line 4444  class instruction extends instruction_ge
4444                              $error_message = $this->get_restriction_error_message($restriction);                              $error_message = $this->get_restriction_error_message($restriction);
4445                              $this->f->displayMessage("error", $error_message);                              $this->f->displayMessage("error", $error_message);
4446                              $this->addToLog(                              $this->addToLog(
4447                                  "triggermodifierapres() : evenement retour instruction ".                                  __METHOD__."(): evenement retour instruction ".
4448                                  $this->valF[$this->clePrimaire]." : ".                                  $this->valF[$this->clePrimaire]." : ".
4449                                  $new_instruction->msg                                  $new_instruction->msg
4450                              );                              );
# Line 1769  class instruction extends instruction_ge Line 4456  class instruction extends instruction_ge
4456                              return false;                              return false;
4457                          }                          }
4458                      }                      }
4459                      // Mise à jour du flag incomplet_notifie dans dossier si la                  }
4460                      // date limite d'instruction n'est pas dépassée              }
4461                      if($row['type']=='incompletude' &&          }
4462                          ($this->valF['archive_date_notification_delai'] >= $this->valF['date_retour_rar'] ||  
4463                          $this->valF['archive_date_notification_delai'] == "")) {          // Traitement en cas de mise à jour du dossier
4464                          $valFIncomp['incomplet_notifie'] = true;          if ($update_dossier === true) {
4465                          $cle = " dossier='".$val['dossier']."'";              /**
4466                          $resIncomp = $db->autoExecute(               * Mise à jour de la date de dernière modification du dossier
4467                              DB_PREFIXE.'dossier',               * d'instruction
4468                              $valFIncomp,               */
4469                              DB_AUTOQUERY_UPDATE,              $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4470                              $cle              $inst_di->update_last_modification_date();
4471    
4472                // Mise à jour des données du dossier d'autorisation
4473                $da = $this->f->get_inst__om_dbform(array(
4474                    "obj" => "dossier_autorisation",
4475                    "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4476                ));
4477                $params = array(
4478                    'di_id' => $this->getVal('dossier'),
4479                );
4480                if($da->majDossierAutorisation($params) === false) {
4481                    $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4482                    $this->correct = false;
4483                    return false;
4484                }
4485            }
4486    
4487            // mise à jour des métadonnées issues des dates de suivi
4488            $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4489            $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4490            if ($dateRetourSignatureModified || $dateRetourRARModified) {
4491    
4492                // Calculs des nouvelles métadonnées
4493                $metadata = $this->getMetadata("om_fichier_instruction");
4494    
4495                // On vérifie si l'instruction à finaliser a un événement de type arrete
4496                // TODO : A voir pour remplacer par une instanciation de l'événement.
4497                //        Voir également si l'événement ne dois pas être instancié en début de
4498                //        méthode pour pouvoir être réutilisé.
4499                $qres = $this->f->get_one_result_from_db_query(
4500                    sprintf(
4501                        'SELECT
4502                            type
4503                        FROM
4504                            %1$sevenement
4505                        WHERE
4506                            evenement = \'%2$d\'',
4507                        DB_PREFIXE,
4508                        intval($this->getVal("evenement"))
4509                    ),
4510                    array(
4511                        "origin" => __METHOD__,
4512                        "force_return" => true,
4513                    )
4514                );
4515    
4516                if ($qres["code"] !== "OK") {
4517                    $this->correct = false;
4518                    $this->addToMessage(__("Erreur de traitement de fichier."));
4519                    $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4520                    return false;
4521                }
4522    
4523                // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4524                if ($qres['result'] == 'arrete'){
4525                    $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4526                }
4527    
4528                // Filtre pour conserver uniquement les métadonnées liées aux dates
4529                $metadataToKeep = array(
4530                    "statutAutorisation",
4531                    "dateEvenementDocument",
4532                    'date_cloture_metier',
4533                    "NotificationArrete",
4534                    "dateNotificationArrete",
4535                    "controleLegalite",
4536                    "dateSignature",
4537                    "nomSignataire",
4538                    "qualiteSignataire",
4539                    "dateControleLegalite",
4540                );
4541                $metadata = array_filter(
4542                    $metadata,
4543                    function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4544                    ARRAY_FILTER_USE_KEY
4545                );
4546    
4547                // Mise à jour des métadonnées du document en GED
4548                $docUid = $this->getVal("om_fichier_instruction");
4549                $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4550                if ($operationOrUID == 'OP_FAILURE') {
4551                    $this->correct = false;
4552                    $this->addToMessage(__("Erreur de traitement de fichier."));
4553                    $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4554                    return false;
4555                }
4556    
4557                // mise à jour de l'UID du document en BDD
4558                else {
4559                    $valF = array('om_fichier_instruction' => $operationOrUID);
4560                    $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4561                    $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4562                    if ($this->f->isDatabaseError($res, true) === true) {
4563                        $this->correct = false;
4564                        $this->addToMessage(__("Erreur de traitement de fichier."));
4565                        $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4566                        return false;
4567                    }
4568                    $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4569                }
4570            }
4571    
4572            // Déclenchement des notifications automatique après finalisation et
4573            // retour de signature
4574            if ($dateRetourSignatureModified === true
4575                && $this->valF['date_retour_signature'] !== ''
4576                && $this->valF['date_retour_signature'] !== null) {
4577    
4578                // Message à afficher dans les logs pour indiquer quelle notification a échouée
4579                $msgLog = sprintf(
4580                    '%s %s : %d',
4581                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4582                    __('Instruction notifiée'),
4583                    $id
4584                );
4585    
4586                // Récupération de l'instance de l'événement pour accéder au paramètrage
4587                // des notifications
4588                $ev = $this->get_inst_evenement($this->valF['evenement']);
4589                // Si la notification automatique des tiers consulté est active
4590                // déclenche le traitement de notification.
4591                // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4592                $typeNotifTiers = $ev->getVal('notification_tiers');
4593                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4594                if ($typeNotifTiers === 'notification_automatique') {
4595                    if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4596                        $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4597                        $this->correct = false;
4598                    }
4599                }
4600    
4601                if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4602                    // Récupération de la liste des demandeurs à notifier et de la catégorie
4603                    $categorie = $this->f->get_param_option_notification($collectivite_di);
4604                    $isPortal = $categorie === PORTAL;
4605                    $demandeursANotifie = $this->get_demandeurs_notifiable(
4606                        $this->valF['dossier'],
4607                        $isPortal
4608                    );
4609    
4610                    // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4611                    $demandeurPrincipalNotifie = false;
4612                    foreach ($demandeursANotifie as $demandeur) {
4613                        // Identifie si le demandeur principal a été notifié ou pas
4614                        // et récupère ses informations
4615                        if ($demandeur['petitionnaire_principal'] == 't') {
4616                            $demandeurPrincipalNotifie = true;
4617                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4618                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
4619                            // suivante. On le considère également comme non notifié pour gérer l'envoie
4620                            // des messages d'erreurs
4621                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4622                            // d'impact sur la notification
4623                            $erreursParam = $this->get_info_notification_fail();
4624                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4625                                $demandeurPrincipalNotifie = false;
4626                                continue;
4627                            }
4628                        }
4629                        // Ajout de la notif et récupération de son id
4630                        $idNotif = $this->ajouter_notification(
4631                            $this->valF[$this->clePrimaire],
4632                            $this->f->get_connected_user_login_name(),
4633                            $demandeur,
4634                            $collectivite_di,
4635                            array(),
4636                            true
4637                        );
4638                        if ($idNotif === false) {
4639                            $this->addToLog(
4640                                sprintf('%s() : %s',__METHOD__, $msgLog),
4641                                DEBUG_MODE
4642                          );                          );
4643                            return false;
4644                        }
4645                        // Création de la tache en lui donnant l'id de la notification
4646                        $notification_by_task = $this->notification_by_task(
4647                            $idNotif,
4648                            $this->valF['dossier'],
4649                            $categorie
4650                        );
4651                        if ($notification_by_task === false) {
4652                          $this->addToLog(                          $this->addToLog(
4653                              "triggersupprimer(): db->autoexecute(\"".                              sprintf('%s() : %s',__METHOD__, $msgLog),
4654                                  DB_PREFIXE."dossier\", ".print_r($valFIncomp, true).                              DEBUG_MODE
                                 ", DB_AUTOQUERY_UPDATE, \"".$cle."\");",  
                             VERBOSE_MODE  
4655                          );                          );
4656                          if (database::isError($resIncomp)) {                          $this->addToMessage(
4657                              die($resIncomp->getMessage());                              __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4658                          }                          );
4659                            return false;
4660                        }
4661                    }
4662                    // Pour la notification par mail ou la notification via portal si le dossier a
4663                    // été déposés via portal, si le demandeur principal n'est pas notifiable,
4664                    // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4665                    // laquelle le demandeur principal n'a pas pu être notifié
4666                    $depotPortal = $this->dossier_depose_sur_portail();
4667                    if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4668                        // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4669                        $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4670                        // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4671                        $erreursParam = $this->get_info_notification_fail();
4672                        $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4673                        // Ajout de la notif et récupération de son id
4674                        $idNotif = $this->ajouter_notification(
4675                            $this->valF[$this->clePrimaire],
4676                            $this->f->get_connected_user_login_name(),
4677                            $demandeurPrincipal,
4678                            $collectivite_di,
4679                            array(),
4680                            true,
4681                            'Echec',
4682                            implode(' ', $erreursParam)
4683                        );
4684                        if ($idNotif === false) {
4685                            $this->addToLog(
4686                                sprintf('%s() : %s', __METHOD__, $msgLog),
4687                                DEBUG_MODE
4688                            );
4689                            $this->addToMessage(
4690                                __('Erreur : la création de la notification a échouée.').
4691                                __("Veuillez contacter votre administrateur.")
4692                            );
4693                            return false;
4694                        }
4695                        // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4696                        // de l'échec de la notification
4697                        $dossier_message = $this->get_inst_dossier_message(0);
4698                        $dossier_message_val = array(
4699                            'dossier' => $this->getVal('dossier'),
4700                            'type' => _('erreur expedition'),
4701                            'emetteur' => $this->f->get_connected_user_login_name(),
4702                            'login' => $_SESSION['login'],
4703                            'date_emission' => date('Y-m-d H:i:s'),
4704                            'contenu' => _('Échec lors de la notification de l\'instruction ').
4705                                $ev->getVal('libelle').
4706                                '.<br>'.
4707                                implode("\n", $erreursParam).
4708                                '<br>'.
4709                                _('Veuillez corriger ces informations avant de renvoyer la notification.')
4710                        );
4711                        $add = $dossier_message->add_notification_message($dossier_message_val, true);
4712                        // Si une erreur se produit pendant l'ajout
4713                        if ($add !== true) {
4714                            $this->addToLog(
4715                                sprintf(
4716                                    '%s() : %s',
4717                                    __METHOD__,
4718                                    __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4719                                ),
4720                                DEBUG_MODE
4721                            );
4722                            return false;
4723                      }                      }
4724                  }                  }
4725                    $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.")));
4726              }              }
4727          }          }
4728    
         // Mise à jour des données du dossier d'autorisation  
         require_once "../obj/dossier_autorisation.class.php";  
         $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($this->valF['dossier']), $this->db, DEBUG);  
         if($da->majDossierAutorisation() === false) {  
             $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));  
             $this->correct = false;  
             return false;  
         }  
4729          return $this->add_log_to_dossier($id, $val);          return $this->add_log_to_dossier($id, $val);
4730      }      }
4731    
4732      function triggersupprimer($id,&$db,$val,$DEBUG) {      /**
4733         * TRIGGER - triggersupprimer.
4734         *
4735         * @return boolean
4736         */
4737        function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4738            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4739          /**          /**
4740           * 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
4741           * archive dans le dossier d'instruction avant de supprimer l'événement           * archive dans le dossier d'instruction avant de supprimer l'événement
4742           * d'instruction           * d'instruction si les valeurs du dossier sont différentes
4743           */           */
4744                    $valF = array();
4745          // Mise à jour des 4 valeurs modifiées par l'action          $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4746          $valF['delai'] = $val['archive_delai'];          foreach ($inst_di->champs as $key => $champ) {
4747          $valF['accord_tacite'] = $val['archive_accord_tacite'];              // Si le champ du DI à une archive dans l'instruction
4748          $valF['etat'] = $val['archive_etat'];              if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4749          if ($val['archive_avis'] != '') {                  // Si la valeur entre le champ du DI et son archive dans instruction
4750              $valF['avis_decision'] = $val['archive_avis'];                  // est différente
4751          } else {                  if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4752              $valF['avis_decision'] = NULL;                      $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4753          }                      // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur '   ' (3 espaces vides) au lieu de null
4754          // Mise à jour des 10 dates avec la valeur présente dans le formulaire                      // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou '   '
4755          // de suppression. Si la valeur de la date est vide alors on fixe                      if ($champ === "accord_tacite" && $valF[$champ] === null) {
4756          // à la valeur NULL                          $valF[$champ] = '   ';
4757          //                      }
4758          if ($val['archive_date_complet'] != '') {                  }
4759              $valF['date_complet'] = $val['archive_date_complet'];              }
         } 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;  
4760          }          }
4761          if ($val['archive_delai_incompletude'] != '') {          // Spécificité du champ avis_decision dont le champ archive est nommé
4762              $valF['delai_incompletude'] = $val['archive_delai_incompletude'];          // différemment
4763          } else {          if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4764              $valF['delai_incompletude'] = NULL;              $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4765            }
4766            // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4767            // par l'archive
4768            unset($valF['date_affichage']);
4769    
4770            /**
4771             * Mise à jour de la version de clôture *version_clos* du dossier si et
4772             * seulement si l'instruction met à jour l'état du dossier.
4773             */
4774            if (isset($valF['etat']) === true
4775                && $valF['etat'] !== null
4776                && $valF['etat'] !== '') {
4777                // Récupère l'état actuel du dossier d'instruction
4778                $inst_current_etat = $this->f->get_inst__om_dbform(array(
4779                    "obj" => "etat",
4780                    "idx" => $inst_di->get_id_etat(),
4781                ));
4782                // Instanciation de l'état archivé appliqué sur le dossier
4783                $inst_etat = $this->f->get_inst__om_dbform(array(
4784                    "obj" => "etat",
4785                    "idx" => $valF['etat'],
4786                ));
4787                //
4788                $update_version_clos = null;
4789                // En cas de clôture du dossier par l'état archivé
4790                if ($inst_etat->getVal('statut') === 'cloture') {
4791                    $update_version_clos = $inst_di->update_version_clos('up');
4792                }
4793                // En cas de réouverture du dossier par l'état archivé
4794                if ($inst_current_etat->getVal('statut') === 'cloture'
4795                    && $inst_etat->getVal('statut') !== 'cloture') {
4796                    //
4797                    $update_version_clos = $inst_di->update_version_clos('down');
4798                    //
4799                    $this->set_att_di_reopened(true);
4800                }
4801                //
4802                if ($update_version_clos === false) {
4803                    $this->f->addToLog(sprintf(
4804                        "%s() : ERREUR - %s %s",
4805                        __METHOD__,
4806                        sprintf(
4807                            __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4808                            $inst_di->getVal($inst_di->clePrimaire)
4809                        ),
4810                        sprintf(
4811                            __("L'instruction tente d'appliquer l'état %s."),
4812                            $inst_etat->getVal($inst_etat->clePrimaire)
4813                        )
4814                    ));
4815                    $this->addToMessage(sprintf(
4816                        "%s %s",
4817                        __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4818                        __("Veuillez contacter votre administrateur.")
4819                    ));
4820                    return false;
4821                }
4822          }          }
4823          if ($val['archive_autorite_competente'] != '') {          // On supprime toutes les notications liées à l'instruction
4824              $valF['autorite_competente'] = $val['archive_autorite_competente'];          $notifASupprimer = $this->get_instruction_notification(
4825          } else {              $this->getVal($this->clePrimaire),
4826              $valF['autorite_competente'] = NULL;              array(
4827                    'notification_recepisse',
4828                    'notification_instruction',
4829                    'notification_decision',
4830                    'notification_service_consulte',
4831                    'notification_tiers_consulte',
4832                    'notification_depot_demat',
4833                    'notification_commune',
4834                    'notification_signataire'
4835                ),
4836                true
4837            );
4838                
4839            foreach ($notifASupprimer as $idNotif) {
4840                $inst_notif = $this->f->get_inst__om_dbform(array(
4841                    "obj" => "instruction_notification",
4842                    "idx" => $idNotif,
4843                ));
4844                $val_notif = array();
4845                foreach ($inst_notif->champs as $champ) {
4846                    $val_notif[$champ] = $inst_notif->getVal($champ);
4847                }
4848                // La suppression des notifications entrainera la suppression des tâches qui y sont
4849                // liées
4850                $supprNotif = $inst_notif->supprimer($val_notif);
4851                if ($supprNotif == false) {
4852                    $this->addToMessage(sprintf(
4853                        "%s %s",
4854                        __("Erreur lors de la suppression des notifications de l'instruction."),
4855                        __("Veuillez contacter votre administrateur.")
4856                    ));
4857                    return false;
4858                }
4859          }          }
4860    
4861          // On met à jour le dossier          // On met à jour le dossier
4862          $cle = " dossier='".$val['dossier']."'";          $valF['instruction'] = $id;
4863          $res = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);          $valF['crud'] = 'delete';
4864          $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);
4865          if (database::isError($res)) {          if ($update_by_instruction === false) {
4866              die($res->getMessage());              $this->cleanMessage();
4867                $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4868                return false;
4869          }          }
4870    
4871          // Affichage d'informations à l'utilisateur          // Affichage d'informations à l'utilisateur
4872          $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')."]");
4873    
4874          // 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
4875      }      }
4876    
4877      function triggersupprimerapres($id,&$db,$val,$DEBUG) {      /**
4878         * TRIGGER - triggersupprimerapres.
4879         *
4880         * @return boolean
4881         */
4882        function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4883            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4884            /**
4885             * Mise à jour de la date de dernière modification du dossier
4886             * d'instruction
4887             */
4888            $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4889            $inst_di->update_last_modification_date();
4890    
4891          // Mise à jour des données du dossier d'autorisation          /**
4892          require_once "../obj/dossier_autorisation.class.php";           * Mise à jour des données du dossier d'autorisation
4893          $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($val["dossier"]), $this->db, DEBUG);           */
4894          if($da->majDossierAutorisation() === false) {          $da = $this->f->get_inst__om_dbform(array(
4895                "obj" => "dossier_autorisation",
4896                "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4897            ));
4898            $params = array(
4899                'di_id' => $this->getVal('dossier'),
4900                'di_reopened' => $this->get_att_di_reopened(),
4901            );
4902            if($da->majDossierAutorisation($params) === false) {
4903              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));              $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4904              $this->correct = false;              $this->correct = false;
4905              return false;              return false;
4906          }          }
4907    
4908            /**
4909             * Gestion des tâches pour la dématérialisation
4910             */
4911            $inst_task_empty = $this->f->get_inst__om_dbform(array(
4912                "obj" => "task",
4913                "idx" => 0,
4914            ));
4915            foreach ($inst_di->task_types as $task_type) {
4916                $task_exists = $inst_task_empty->task_exists($task_type, $id);
4917                if ($task_exists !== false) {
4918                    $inst_task = $this->f->get_inst__om_dbform(array(
4919                        "obj" => "task",
4920                        "idx" => $task_exists,
4921                    ));
4922                    if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4923                        $task_val = array(
4924                            'state' => $inst_task::STATUS_CANCELED,
4925                        );
4926                        $update_task = $inst_task->update_task(array('val' => $task_val));
4927                        if ($update_task === false) {
4928                            $this->addToMessage(sprintf('%s %s',
4929                                sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4930                                __("Veuillez contacter votre administrateur.")
4931                            ));
4932                            $this->correct = false;
4933                            return false;
4934                        }
4935                    }
4936                }
4937            }
4938    
4939            //
4940          $val['evenement'] = $this->getVal('evenement');          $val['evenement'] = $this->getVal('evenement');
4941          return $this->add_log_to_dossier($id, $val);          return $this->add_log_to_dossier($id, $val);
4942      }      }
4943    
4944      /**      /**
4945         * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4946         * "di_reopened".
4947         *
4948         * @param boolean $val
4949         */
4950        function set_att_di_reopened($val) {
4951            $this->di_reopened = $val;
4952        }
4953    
4954        /**
4955         * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4956         *
4957         * @return boolean
4958         */
4959        function get_att_di_reopened() {
4960            return $this->di_reopened;
4961        }
4962    
4963        /**
4964       * Permet de composer un message d'erreur sur restriction non valide en       * Permet de composer un message d'erreur sur restriction non valide en
4965       * fonction du contexte.       * fonction du contexte.
4966       *       *
# Line 1983  class instruction extends instruction_ge Line 4999  class instruction extends instruction_ge
4999      }      }
5000    
5001      /**      /**
5002       * Vérifie la restriction sur l'événement.       * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5003       *       * les vérifications suivantes :
5004       * @param array    $val   valeurs du formulaire       *   - Si l'instruction à un événement associé et que cet événement à des restrictions :
5005       * @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
5006       * @param boolean  $DEBUG NA       *          le message d'erreur associé à la restriction
5007         *       2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5008         *          et / ou la modification et affiche un message d'erreur
5009         *   -
5010         *   -
5011         *   -
5012         *   -
5013         *   -
5014         *   -
5015         *
5016         * @param array val : tableau contenant les valeurs issues du formulaire.
5017         * @param - dnu1 : Paramètre déprécié et non utilisé.
5018         * @param - dnu2 : Paramètre déprécié et non utilisé.
5019       *       *
5020       * @return [type] [description]       * @return void
5021       */       */
5022      function verifier($val = array(), &$db, $DEBUG) {      function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5023          parent::verifier($val, $db, $DEBUG);          parent::verifier($val);
5024            //
5025          if ( isset($val['evenement']) && is_numeric($val['evenement'])){          if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5026              $restriction = $this->get_restriction($val['evenement']);              $restriction = $this->get_restriction($val['evenement']);
5027            
5028              //Test qu'une restriction est présente              //Test qu'une restriction est présente
5029              if ($restriction != "" ){              if ($restriction != "" ){
5030                                    
5031                  //Test si la restriction est valide                  // Vérifie le contexte de la modification et test si la restriction est valide.
5032                    // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5033                    // Il n'est donc pas nécessaire de vérifier les restrictions.
5034                  $this->restriction_valid = $this->restrictionIsValid($restriction);                  $this->restriction_valid = $this->restrictionIsValid($restriction);
5035                  if ( !$this->restriction_valid ){                  if ($this->getParameter("maj") != 176
5036                        && !$this->restriction_valid) {
5037    
5038                      // Affichage du message si la restriction s'applique                      // Affichage du message si la restriction s'applique
5039                      $this->addToMessage(                      $this->addToMessage(
# Line 2070  class instruction extends instruction_ge Line 5101  class instruction extends instruction_ge
5101          }          }
5102    
5103      }      }
5104    
5105        /**
5106         * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5107         * principal du dossier auquel appartiens l'instruction.
5108         * Renvoie un tableau contenant les informations du pétitionnaire principal.
5109         *
5110         * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5111         * et affiche un message dans les logs.
5112         * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5113         *
5114         * @param string identifiant du dossier
5115         * @return array|boolean
5116         */
5117        protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5118            // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5119            // l'objet courant
5120            if (empty($dossier)) {
5121                $dossier = $this->getVal('dossier');
5122                // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5123                // false et on affiche un message d'erreur dans les logs
5124                if (empty($dossier)) {
5125                    $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5126                    return false;
5127                }
5128            }
5129    
5130            // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5131            // principal
5132            $qres = $this->f->get_all_results_from_db_query(
5133                sprintf(
5134                    'SELECT
5135                        -- Récupère toutes les informations du demandeur principal
5136                        demandeur.*,
5137                        CASE
5138                            WHEN demandeur.qualite=\'particulier\'
5139                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5140                        ELSE
5141                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5142                        END AS destinataire
5143                    FROM
5144                        %1$sdossier
5145                        LEFT JOIN %1$slien_dossier_demandeur
5146                            ON lien_dossier_demandeur.dossier = dossier.dossier
5147                        LEFT JOIN %1$sdemandeur
5148                            ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5149                    WHERE
5150                        dossier.dossier = \'%2$s\'
5151                        AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5152                    DB_PREFIXE,
5153                    $this->f->db->escapeSimple($dossier)
5154                ),
5155                array(
5156                    "origin" => __METHOD__,
5157                )
5158            );
5159            if (is_array($qres["result"]) === true
5160                && array_key_exists(0, $qres["result"]) === true) {
5161                //
5162                return $qres["result"][0];
5163            }
5164            return null;
5165        }
5166    
5167    
5168            
5169      /**      /**
5170       * Finalisation des documents.       * Finalisation des documents.
# Line 2102  class instruction extends instruction_ge Line 5197  class instruction extends instruction_ge
5197    
5198              //              //
5199              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);              $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5200                
5201                //
5202                $params = array(
5203                    "specific" => array(),
5204                );
5205                // Si la rédaction libre est activée sur l'instruction
5206                if ($this->getVal("flag_edition_integrale") == 't') {
5207                    $params["specific"]["corps"] = array(
5208                        "mode" => "set",
5209                        "value" => $this->getVal("corps_om_htmletatex"),
5210                    );
5211                    $params["specific"]["titre"] = array(
5212                        "mode" => "set",
5213                        "value" => $this->getVal("titre_om_htmletat"),
5214                    );
5215                }
5216              // Génération du PDF              // Génération du PDF
5217              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite);              $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5218              $pdf_output = $result['pdf_output'];              $pdf_output = $result['pdf_output'];
5219                
5220              //Métadonnées du document              //Métadonnées du document
5221              $metadata = array(              $metadata = array(
5222                  'filename' => 'instruction_'.$id_inst.'.pdf',                  'filename' => 'instruction_'.$id_inst.'.pdf',
# Line 2118  class instruction extends instruction_ge Line 5228  class instruction extends instruction_ge
5228              $spe_metadata = $this->getMetadata("om_fichier_instruction");              $spe_metadata = $this->getMetadata("om_fichier_instruction");
5229    
5230              //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
5231              $sql = "SELECT type              // TODO : A voir pour remplacer par une instanciation de l'événement.
5232                  FROM ".DB_PREFIXE."evenement              //        Voir également si l'événement ne dois pas être instancié en début de
5233                  WHERE evenement = ".$this->getVal("evenement");              //        méthode pour pouvoir être réutilisé.
5234              $typeEvenement = $this->db->getOne($sql);              $qres = $this->f->get_one_result_from_db_query(
5235              $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);                  sprintf(
5236              if ($this->f->isDatabaseError($typeEvenement, true) === true) {                      'SELECT
5237                            type
5238                        FROM
5239                            %1$sevenement
5240                        WHERE
5241                            evenement = \'%2$d\'',
5242                        DB_PREFIXE,
5243                        intval($this->getVal("evenement"))
5244                    ),
5245                    array(
5246                        "origin" => __METHOD__,
5247                        "force_return" => true,
5248                    )
5249                );
5250    
5251                if ($qres["code"] !== "OK") {
5252                  $this->correct = false;                  $this->correct = false;
5253                  $this->addToMessage($bdd_msg_error);                  $this->addToMessage($bdd_msg_error);
5254                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
# Line 2132  class instruction extends instruction_ge Line 5257  class instruction extends instruction_ge
5257              //Initialisation de la variable              //Initialisation de la variable
5258              $arrete_metadata = array();              $arrete_metadata = array();
5259              // 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
5260              if ( $typeEvenement === 'arrete' ){              if ($qres['result'] === 'arrete'){
5261                  $arrete_metadata = $this->getMetadata("arrete");                  $arrete_metadata = $this->getMetadata("arrete");
5262              }              }
5263    
5264              $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);              $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5265    
5266                /*
5267                // transforme le tableau de métadonnées en objet
5268                $mdf = new MetadataFactory();
5269                $md = $mdf->build('Instruction', $metadata);
5270                */
5271    
5272              // Si le document a déjà été finalisé on le met à jour              // Si le document a déjà été finalisé on le met à jour
5273              // en conservant son UID              // en conservant son UID
5274              if ($this->getVal("om_fichier_instruction") != ''){              if ($this->getVal("om_fichier_instruction") != ''){
# Line 2146  class instruction extends instruction_ge Line 5277  class instruction extends instruction_ge
5277              }              }
5278              // 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
5279              else {              else {
5280                  $uid = $this->f->storage->create($pdf_output, $metadata);                  $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5281              }              }
5282          }          }
5283    
# Line 2163  class instruction extends instruction_ge Line 5294  class instruction extends instruction_ge
5294          if ($uid == '' || $uid == 'OP_FAILURE' ) {          if ($uid == '' || $uid == 'OP_FAILURE' ) {
5295              $this->correct = false;              $this->correct = false;
5296              $this->addToMessage($file_msg_error);              $this->addToMessage($file_msg_error);
5297              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));              $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5298              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
5299          }          }
5300    
# Line 2174  class instruction extends instruction_ge Line 5305  class instruction extends instruction_ge
5305          }          }
5306    
5307          //          //
5308          $val['date_evenement']=$this->dateDBToForm($val['date_evenement']);          $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5309          $val['archive_date_complet']=$this->dateDBToForm($val['archive_date_complet']);          $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5310          $val['archive_date_rejet']=$this->dateDBToForm($val['archive_date_rejet']);          $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5311          $val['archive_date_limite']=$this->dateDBToForm($val['archive_date_limite']);          $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5312          $val['archive_date_notification_delai']=$this->dateDBToForm($val['archive_date_notification_delai']);          $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5313          $val['archive_date_decision']=$this->dateDBToForm($val['archive_date_decision']);          $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5314          $val['archive_date_validite']=$this->dateDBToForm($val['archive_date_validite']);          $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5315          $val['archive_date_achevement']=$this->dateDBToForm($val['archive_date_achevement']);          $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5316          $val['archive_date_chantier']=$this->dateDBToForm($val['archive_date_chantier']);          $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5317          $val['archive_date_conformite']=$this->dateDBToForm($val['archive_date_conformite']);          $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5318          $val['archive_date_dernier_depot']=$this->dateDBToForm($val['archive_date_dernier_depot']);          $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5319          $val['archive_date_limite_incompletude']=$this->dateDBToForm($val['archive_date_limite_incompletude']);          $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5320          $val['date_finalisation_courrier']=$this->dateDBToForm($val['date_finalisation_courrier']);          $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5321          $val['date_envoi_signature']=$this->dateDBToForm($val['date_envoi_signature']);          $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5322          $val['date_retour_signature']=$this->dateDBToForm($val['date_retour_signature']);          $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5323          $val['date_envoi_rar']=$this->dateDBToForm($val['date_envoi_rar']);          $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5324          $val['date_retour_rar']=$this->dateDBToForm($val['date_retour_rar']);          $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5325          $val['date_envoi_controle_legalite']=$this->dateDBToForm($val['date_envoi_controle_legalite']);          $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5326          $val['date_retour_controle_legalite']=$this->dateDBToForm($val['date_retour_controle_legalite']);          $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5327            $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5328            $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5329            $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5330            $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5331            $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5332            $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5333            $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5334            $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5335          $this->setvalF($val);          $this->setvalF($val);
5336    
5337          // Verification de la validite des donnees          // Verification de la validite des donnees
5338          $this->verifier($this->val, $this->db, DEBUG);          $this->verifier($this->val);
5339          // Si les verifications precedentes sont correctes, on procede a          // Si les verifications precedentes sont correctes, on procede a
5340          // la modification, sinon on ne fait rien et on retourne une erreur          // la modification, sinon on ne fait rien et on retourne une erreur
5341          if ($this->correct === true) {          if ($this->correct === true) {
# Line 2230  class instruction extends instruction_ge Line 5369  class instruction extends instruction_ge
5369    
5370              // Execution de la requête de modification des donnees de l'attribut              // Execution de la requête de modification des donnees de l'attribut
5371              // valF de l'objet dans l'attribut table de l'objet              // valF de l'objet dans l'attribut table de l'objet
5372              $res = $this->db->autoExecute(DB_PREFIXE.$this->table, $valF,              $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5373                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));                  DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5374               $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);
5375              //              //
# Line 2251  class instruction extends instruction_ge Line 5390  class instruction extends instruction_ge
5390          }          }
5391          // L'appel de verifier() a déjà positionné correct à false          // L'appel de verifier() a déjà positionné correct à false
5392          // et défini un message d'erreur.          // et défini un message d'erreur.
5393          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));          $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5394          return $this->end_treatment(__METHOD__, false);          return $this->end_treatment(__METHOD__, false);
5395      }      }
5396    
# Line 2259  class instruction extends instruction_ge Line 5398  class instruction extends instruction_ge
5398       * 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
5399       * @return string numéro de dossier d'instruction       * @return string numéro de dossier d'instruction
5400       */       */
5401      protected function getDossier() {      protected function getDossier($champ = null) {
5402          if(empty($this->specificMetadata)) {          if(empty($this->specificMetadata)) {
5403              $this->getSpecificMetadata();              $this->getSpecificMetadata();
5404          }          }
# Line 2356  class instruction extends instruction_ge Line 5495  class instruction extends instruction_ge
5495          }          }
5496    
5497          // Requête sql          // Requête sql
5498          $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement          $evenement = $this->f->get_inst__om_dbform(array(
5499                  WHERE evenement=".$evenement;              "obj" => "evenement",
5500          $evenement_libelle = $this->db->getOne($sql);              "idx" => $evenement
5501          $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);          ));
         if (database::isError($evenement_libelle)) {  
             die();  
         }  
5502    
5503          // Retourne le libelle de l'événement          // Retourne le libelle de l'événement
5504          return $evenement_libelle;          return $evenement->getVal('libelle');
5505      }      }
5506    
5507    
# Line 2395  class instruction extends instruction_ge Line 5531  class instruction extends instruction_ge
5531              $dossier = $this->getVal("dossier");              $dossier = $this->getVal("dossier");
5532          }          }
5533          //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
5534          $sql = "SELECT dossier.dossier as dossier,          $qres = $this->f->get_all_results_from_db_query(
5535                          dossier_autorisation.dossier_autorisation as dossier_autorisation,              sprintf(
5536                          to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,                  'SELECT
5537                          dossier_instruction_type.code as dossier_instruction_type,                      dossier.dossier AS dossier,
5538                          etat_dossier_autorisation.libelle as statut,                      dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5539                          dossier_autorisation_type.code as dossier_autorisation_type,                      to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5540                          groupe.code as groupe_instruction,                      dossier_instruction_type.code AS dossier_instruction_type,
5541                          CASE WHEN dossier.erp IS TRUE                      etat_dossier_autorisation.libelle AS statut,
5542                              THEN 'true'                      dossier_autorisation_type.code AS dossier_autorisation_type,
5543                              ELSE 'false'                      groupe.code AS groupe_instruction,
5544                          END as erp                      CASE WHEN dossier.erp IS TRUE
5545                  FROM ".DB_PREFIXE."dossier                          THEN \'true\'
5546                      LEFT JOIN ".DB_PREFIXE."dossier_instruction_type                            ELSE \'false\'
5547                        END AS erp
5548                    FROM
5549                        %1$sdossier
5550                        LEFT JOIN %1$sdossier_instruction_type  
5551                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type                          ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5552                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation                      LEFT JOIN %1$sdossier_autorisation
5553                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation                          ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5554                      LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation                      LEFT JOIN %1$setat_dossier_autorisation
5555                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation                          ON  dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5556                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille                      LEFT JOIN %1$sdossier_autorisation_type_detaille
5557                          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
5558                      LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type                      LEFT JOIN %1$sdossier_autorisation_type
5559                          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
5560                      LEFT JOIN ".DB_PREFIXE."groupe                      LEFT JOIN %1$sgroupe
5561                          ON dossier_autorisation_type.groupe = groupe.groupe                          ON dossier_autorisation_type.groupe = groupe.groupe
5562                  WHERE dossier.dossier = '".$dossier."'";                  WHERE
5563          $res = $this->db->query($sql);                      dossier.dossier = \'%2$s\'',
5564          $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);                  DB_PREFIXE,
5565          if ( database::isError($res)){                  $this->f->db->escapeSimple($dossier)
5566              die();              ),
5567          }              array(
5568                            "origin" => __METHOD__,
5569          //Le résultat est récupéré dans un objet              )
5570          $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);          );
5571            $row = array_shift($qres['result']);
5572    
5573          //Si il y a un résultat          //Si il y a un résultat
5574          if ($row !== null) {          if (! empty($row)) {
5575    
5576              // Instrance de la classe dossier              // Instrance de la classe dossier
5577              $inst_dossier = $this->get_inst_dossier($dossier);              $inst_dossier = $this->get_inst_dossier($dossier);
5578                // TODO : améliorer ce code
5579                //
5580                // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5581                // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5582                // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5583                // valeurs issues de la requête en objet.
5584                $metadata = (object)$row;
5585              // Insère l'attribut version à l'objet              // Insère l'attribut version à l'objet
5586              $row->version = $inst_dossier->get_dossier_instruction_version();              $metadata->version = $inst_dossier->get_di_numero_suffixe();
5587    
5588              //Alors on créé l'objet dossier_instruction              //Alors on créé l'objet dossier_instruction
5589              $this->specificMetadata = $row;              $this->specificMetadata = $metadata;
5590    
5591          }          }
5592      }      }
# Line 2458  class instruction extends instruction_ge Line 5605  class instruction extends instruction_ge
5605                            
5606              //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
5607              //dossier              //dossier
5608              $sql = "SELECT etat.statut              $qres = $this->f->get_one_result_from_db_query(
5609                  FROM ".DB_PREFIXE."dossier                  sprintf(
5610                  LEFT JOIN                      'SELECT
5611                      ".DB_PREFIXE."etat                          etat.statut
5612                      ON                      FROM
5613                          dossier.etat = etat.etat                          %1$sdossier
5614                  WHERE dossier ='".$idx."'";                          LEFT JOIN
5615              $statut = $this->db->getOne($sql);                              %1$setat
5616              $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                              ON
5617              if ( database::isError($statut)){                                  dossier.etat = etat.etat
5618                  die();                      WHERE
5619              }                          dossier = \'%2$s\'',
5620                        DB_PREFIXE,
5621                        $this->f->db->escapeSimple($idx)
5622                    ),
5623                    array(
5624                        "origin" => __METHOD__,
5625                    )
5626                );
5627          }          }
5628          return $statut;  
5629            return $qres['result'];
5630      }      }
5631    
5632      /**      /**
# Line 2484  class instruction extends instruction_ge Line 5639  class instruction extends instruction_ge
5639          $return = array();          $return = array();
5640    
5641          // 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
5642          $sql = "SELECT * FROM ".DB_PREFIXE."dossier          // TODO : remplacer cette requête par une instanciation de l'objet
5643          WHERE dossier='".$this->valF['dossier']."'";          $qres = $this->f->get_all_results_from_db_query(
5644          $res = $this->db->query($sql);              sprintf(
5645          $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);                  'SELECT
5646          $this->f->isDatabaseError($res);                      *
5647                    FROM
5648                        %1$sdossier
5649                    WHERE
5650                        dossier = \'%2$s\'',
5651                    DB_PREFIXE,
5652                    $this->f->db->escapeSimple($this->valF['dossier'])
5653                ),
5654                array(
5655                    'origin' => __METHOD__
5656                )
5657            );
5658    
5659          //          foreach ($qres['result'] as $row) {
         while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {  
5660    
5661              // 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,
5662              // de l'état et de l'avis du dossier d'instruction              // de l'état et de l'avis du dossier d'instruction
5663              $return['archive_delai']=$row['delai'];              $return['archive_delai'] = $row['delai'];
5664              $return['archive_accord_tacite']=$row['accord_tacite'];              $return['archive_accord_tacite'] = $row['accord_tacite'];
5665              $return['archive_etat']=$row['etat'];              $return['archive_etat'] = $row['etat'];
5666              $return['archive_avis']=$row['avis_decision'];              $return['archive_avis'] = $row['avis_decision'];
5667              // Récupération de la valeur actuelle des 9 dates du dossier              // Récupération de la valeur actuelle des dates du dossier
5668              // d'instruction              // d'instruction
5669              $return['archive_date_complet']=$row['date_complet'];              $return['archive_date_complet'] = $row['date_complet'];
5670              $return['archive_date_dernier_depot']=$row['date_dernier_depot'];              $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5671              $return['archive_date_rejet']= $row['date_rejet'];              $return['archive_date_rejet'] = $row['date_rejet'];
5672              $return['archive_date_limite']= $row['date_limite'];              $return['archive_date_limite'] = $row['date_limite'];
5673              $return['archive_date_notification_delai']= $row['date_notification_delai'];              $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5674              $return['archive_date_decision']= $row['date_decision'];              $return['archive_date_decision'] = $row['date_decision'];
5675              $return['archive_date_validite']= $row['date_validite'];              $return['archive_date_validite'] = $row['date_validite'];
5676              $return['archive_date_achevement']= $row['date_achevement'];              $return['archive_date_achevement'] = $row['date_achevement'];
5677              $return['archive_date_chantier']= $row['date_chantier'];              $return['archive_date_chantier'] = $row['date_chantier'];
5678              $return['archive_date_conformite']= $row['date_conformite'];              $return['archive_date_conformite'] = $row['date_conformite'];
5679              $return['archive_incompletude']= $row['incompletude'];              $return['archive_incompletude'] = $row['incompletude'];
5680              $return['archive_incomplet_notifie']= $row['incomplet_notifie'];              $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5681              $return['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];              $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5682              $return['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];              $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5683              $return['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];              $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5684              $return['archive_date_limite_incompletude']= $row['date_limite_incompletude'];              $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5685              $return['archive_delai_incompletude']= $row['delai_incompletude'];              $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5686              $return['archive_autorite_competente']= $row['autorite_competente'];              $return['archive_autorite_competente'] = $row['autorite_competente'];
5687              $return['duree_validite']= $row['duree_validite'];              $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5688              $return['date_depot']= $row['date_depot'];              $return['duree_validite'] = $row['duree_validite'];
5689                $return['date_depot'] = $row['date_depot'];
5690                $return['date_depot_mairie'] = $row['date_depot_mairie'];
5691                $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5692                $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5693                $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5694                $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5695                $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5696                $return['archive_date_ait'] = $row['date_ait'];
5697                $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5698                $return['archive_date_affichage'] = $row['date_affichage'];
5699                $return['archive_pec_metier'] = $row['pec_metier'];
5700                $return['archive_a_qualifier'] = $row['a_qualifier'];
5701          }          }
5702    
5703          // Retour de la fonction          // Retour de la fonction
# Line 2534  class instruction extends instruction_ge Line 5711  class instruction extends instruction_ge
5711       * @return boolean                 * @return boolean          
5712       */       */
5713      function checkEvenementNonVerrouillable($idx) {      function checkEvenementNonVerrouillable($idx) {
   
         // Initialisation du résultat  
         $non_verrouillable = false;  
   
5714          // Si la condition n'est pas vide          // Si la condition n'est pas vide
5715          if ($idx != "") {          if ($idx != "") {
5716    
5717              // Requête SQL              // Requête SQL
5718              $sql = "SELECT evenement.non_verrouillable              $qres = $this->f->get_one_result_from_db_query(
5719                      FROM ".DB_PREFIXE."evenement                  sprintf(
5720                      LEFT JOIN ".DB_PREFIXE."instruction                      'SELECT
5721                          ON instruction.evenement = evenement.evenement                          evenement.non_verrouillable
5722                      WHERE instruction.instruction = $idx";                      FROM
5723              $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);                          %1$sevenement
5724              $res = $this->db->getOne($sql);                          LEFT JOIN %1$sinstruction
5725              $this->f->isDatabaseError($res);                              ON instruction.evenement = evenement.evenement
5726                        WHERE
5727              // Si le retour de la requête est true                          instruction.instruction = \'%2$s\'',
5728              if ($res == 't') {                      DB_PREFIXE,
5729                  //                      intval($idx)
5730                  $non_verrouillable = true;                  ),
5731              }                  array(
5732                        "origin" => __METHOD__,
5733                    )
5734                );
5735          }          }
5736    
5737          // Retourne résultat          // Si on a un résultat et que ce résultat indique que l'événement n'est
5738          return $non_verrouillable;          // pas vérrouillable renvoie true, sinon renvoie false
5739            return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5740      }      }
5741            
5742      /**      /**
# Line 2582  class instruction extends instruction_ge Line 5759  class instruction extends instruction_ge
5759          if ($row['date_dernier_depot'] != '') {          if ($row['date_dernier_depot'] != '') {
5760              $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];              $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5761          }          }
5762          if ($row['date_rejet']!='') {          if ($row['date_rejet'] != '') {
5763              $this->valF['archive_date_rejet']= $row['date_rejet'];              $this->valF['archive_date_rejet']= $row['date_rejet'];
5764          }          }
5765          if ($row['date_limite']!='') {          if ($row['date_limite'] != '') {
5766              $this->valF['archive_date_limite']= $row['date_limite'];              $this->valF['archive_date_limite']= $row['date_limite'];
5767          }          }
5768          if ($row['date_notification_delai']!='') {          if ($row['date_notification_delai'] != '') {
5769              $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];              $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5770          }          }
5771          if ($row['date_decision']!='') {          if ($row['date_decision'] != '') {
5772              $this->valF['archive_date_decision']= $row['date_decision'];              $this->valF['archive_date_decision']= $row['date_decision'];
5773          }          }
5774          if ($row['date_validite']!='') {          if ($row['date_validite'] != '') {
5775              $this->valF['archive_date_validite']= $row['date_validite'];              $this->valF['archive_date_validite']= $row['date_validite'];
5776          }          }
5777          if ($row['date_achevement']!='') {          if ($row['date_achevement'] != '') {
5778              $this->valF['archive_date_achevement']= $row['date_achevement'];              $this->valF['archive_date_achevement']= $row['date_achevement'];
5779          }          }
5780          if ($row['date_chantier']!='') {          if ($row['date_chantier'] != '') {
5781              $this->valF['archive_date_chantier']= $row['date_chantier'];              $this->valF['archive_date_chantier']= $row['date_chantier'];
5782          }          }
5783          if ($row['date_conformite']!='') {          if ($row['date_conformite'] != '') {
5784              $this->valF['archive_date_conformite']= $row['date_conformite'];                $this->valF['archive_date_conformite']= $row['date_conformite'];  
5785          }          }
5786          if ($row['incompletude']!='') {          if ($row['incompletude'] != '') {
5787              $this->valF['archive_incompletude']= $row['incompletude'];                $this->valF['archive_incompletude']= $row['incompletude'];  
5788          }          }
5789          if ($row['incomplet_notifie']!='') {          if ($row['incomplet_notifie'] != '') {
5790              $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];                $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];  
5791          }          }
5792          if ($row['evenement_suivant_tacite']!='') {          if ($row['evenement_suivant_tacite'] != '') {
5793              $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];                $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];  
5794          }          }
5795          if ($row['evenement_suivant_tacite_incompletude']!='') {          if ($row['evenement_suivant_tacite_incompletude'] != '') {
5796              $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];                $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];  
5797          }          }
5798          if ($row['etat_pendant_incompletude']!='') {          if ($row['etat_pendant_incompletude'] != '') {
5799              $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];                $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];  
5800          }          }
5801          if ($row['date_limite_incompletude']!='') {          if ($row['date_limite_incompletude'] != '') {
5802              $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];                $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];  
5803          }          }
5804          if ($row['delai_incompletude']!='') {          if ($row['delai_incompletude'] != '') {
5805              $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];                $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];  
5806          }          }
5807          if ($row['autorite_competente']!='') {          if ($row['autorite_competente'] != '') {
5808              $this->valF['archive_autorite_competente']= $row['autorite_competente'];                $this->valF['archive_autorite_competente']= $row['autorite_competente'];  
5809          }          }
5810          if ($row['duree_validite']!='') {          if ($row['duree_validite'] != '') {
5811              $this->valF['duree_validite']= $row['duree_validite'];                $this->valF['duree_validite']= $row['duree_validite'];  
5812          }          }
5813          if ($row['date_depot']!='') {          if ($row['date_depot'] != '') {
5814              $this->valF['date_depot']= $row['date_depot'];                $this->valF['date_depot']= $row['date_depot'];  
5815          }          }
5816            if ($row['date_depot_mairie'] != '') {
5817                $this->valF['date_depot_mairie']= $row['date_depot_mairie'];  
5818            }
5819            // Dates concernant les dossiers contentieux
5820            if ($row['date_cloture_instruction'] != '') {
5821                $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];  
5822            }
5823            if ($row['date_premiere_visite'] != '') {
5824                $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];  
5825            }
5826            if ($row['date_derniere_visite'] != '') {
5827                $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];  
5828            }
5829            if ($row['date_contradictoire'] != '') {
5830                $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];  
5831            }
5832            if ($row['date_retour_contradictoire'] != '') {
5833                $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];  
5834            }
5835            if ($row['date_ait'] != '') {
5836                $this->valF['archive_date_ait']= $row['date_ait'];  
5837            }
5838            if ($row['date_transmission_parquet'] != '') {
5839                $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];  
5840            }
5841            //
5842            if ($row['dossier_instruction_type'] != '') {
5843                $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];  
5844            }
5845            if ($row['date_affichage'] != '') {
5846                $this->valF['archive_date_affichage']= $row['date_affichage'];  
5847            }
5848            if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5849                $this->valF['archive_pec_metier']= $row['pec_metier'];  
5850            }
5851            if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5852                $this->valF['archive_a_qualifier']= $row['a_qualifier'];  
5853            }
5854      }      }
5855    
5856      // {{{      // {{{
# Line 2761  class instruction extends instruction_ge Line 5976  class instruction extends instruction_ge
5976       */       */
5977      function getArreteMetadata() {      function getArreteMetadata() {
5978    
5979      //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'
5980      $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",          $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5981          "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",              "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5982          "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",              "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5983          "ap_codepostal"=>"", "ap_ville"=>"");              "ap_codepostal"=>"", "ap_ville"=>"");
5984    
5985          $sqlArrete = "SELECT    signataire_arrete.nom as \"nomsignataire\",          $qres = $this->f->get_all_results_from_db_query(
5986                  signataire_arrete.qualite as \"qualitesignataire\",              sprintf(
5987                  instruction.etat as \"decisionarrete\",                  'SELECT
5988                  instruction.date_retour_rar as \"datenotification\",                      signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
5989                  instruction.date_retour_signature as \"datesignaturearrete\",                      signataire_arrete.qualite as qualitesignataire,
5990                  instruction.date_retour_controle_legalite as \"datecontrolelegalite\",                      instruction.etat as decisionarrete,
5991                  dossier.terrain_adresse_voie_numero as \"ap_numrue\",                      instruction.date_retour_rar as datenotification,
5992                  dossier.terrain_adresse_voie as \"ap_nomdelavoie\",                      instruction.date_retour_signature as datesignaturearrete,
5993                  dossier.terrain_adresse_code_postal as \"ap_codepostal\",                      instruction.date_retour_controle_legalite as datecontrolelegalite,
5994                  dossier.terrain_adresse_localite as \"ap_ville\"                      dossier.terrain_adresse_voie_numero as ap_numrue,
5995              FROM ".DB_PREFIXE."instruction                      dossier.terrain_adresse_voie as ap_nomdelavoie,
5996              LEFT JOIN ".DB_PREFIXE."signataire_arrete ON                      dossier.terrain_adresse_code_postal as ap_codepostal,
5997                  instruction.signataire_arrete = signataire_arrete.signataire_arrete                      dossier.terrain_adresse_localite as ap_ville
5998              LEFT JOIN ".DB_PREFIXE."dossier ON                  FROM
5999                  instruction.dossier = dossier.dossier                      %1$sinstruction
6000              LEFT JOIN ".DB_PREFIXE."donnees_techniques ON                      LEFT JOIN %1$ssignataire_arrete
6001                      donnees_techniques.dossier_instruction = dossier.dossier                          ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6002              WHERE instruction.instruction = ".$this->getVal("instruction");                      LEFT JOIN %1$sdossier
6003          $resArrete = $this->db->query($sqlArrete);                          ON instruction.dossier = dossier.dossier
6004          $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);                      LEFT JOIN %1$sdonnees_techniques
6005          if ( database::isError($resArrete)){                          ON donnees_techniques.dossier_instruction = dossier.dossier
6006              die();                  WHERE
6007          }                      instruction.instruction = %2$d',
6008                    DB_PREFIXE,
6009          $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);                  intval($this->getVal('instruction'))
6010                ),
6011                array(
6012                    'origin' => __METHOD__
6013                )
6014            );
6015            $this->metadonneesArrete = array_shift($qres['result']);
6016      }      }
6017    
6018      /**      /**
# Line 2805  class instruction extends instruction_ge Line 6026  class instruction extends instruction_ge
6026          // Récupère la valeur du champ lettretype          // Récupère la valeur du champ lettretype
6027          $lettretype = $this->getVal("lettretype");          $lettretype = $this->getVal("lettretype");
6028          // Si le champ est vide          // Si le champ est vide
6029          if (empty($lettretype)) {          if ($lettretype !== '' && $lettretype !== null) {
6030              //              //
6031              return false;              return true;
6032          }          }
6033    
6034          //          //
6035          return true;          return false;
6036        }
6037    
6038        /**
6039         * CONDITION - is_modifiable.
6040         *
6041         * Controle si l'évenement est modifiable.
6042         *
6043         * @return boolean
6044         */
6045        function is_evenement_modifiable() {
6046            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6047            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6048      }      }
6049    
6050      /**      /**
# Line 2822  class instruction extends instruction_ge Line 6055  class instruction extends instruction_ge
6055       * @return boolean       * @return boolean
6056       */       */
6057      function is_editable() {      function is_editable() {
6058    
6059            // XXX
6060            // 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é)
6061            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6062    
6063          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6064          $bypass = $this->f->isAccredited(get_class()."_modifier_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6065          //          //
6066          if ($bypass == true) {          if ($bypass == true) {
   
6067              //              //
6068              return true;              return true;
6069          }          }
6070            
         // Si l'utilisateur est un intructeur qui ne correspond pas à la  
         // division du dossier  
         if ($this->f->isUserInstructeur()  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {  
   
             //  
             return false;  
         }  
   
         // si instructeur commune  
         if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true  
             || $this->getVal('created_by_commune') !== 't')) {  
             return false;  
         }  
6071          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6072          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
6073          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
6074              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6075              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
   
6076              //              //
6077              return false;              return false;
6078          }          }
6079    
6080            // Si l'utilisateur est un intructeur qui correspond à la division du
6081            // dossier
6082            if ($this->is_instructeur_from_division_dossier() === true) {
6083                //
6084                return true;
6085            }
6086    
6087            // Si l'utilisateur est instructeur de la commune du dossier et que
6088            // l'instruction est créée par un instructeur de la commune
6089            if ($this->is_instructeur_from_collectivite_dossier() === true and
6090                $this->getVal('created_by_commune') === 't') {
6091                return true;
6092            }
6093    
6094          //          //
6095          return true;          return false;
6096        }
6097    
6098        /**
6099         * Vérifie si l'événement est supprimable ou pas.
6100         *
6101         * @return boolean
6102         */
6103        function is_evenement_supprimable() {
6104            // Controle si l'évenement est supprimable
6105            $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6106            return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6107      }      }
6108    
6109      /**      /**
6110       * CONDITION - is_deletable.       * CONDITION - is_deletable.
6111       *       *
6112       * Condition pour lma modification.       * Condition pour la suppression.
6113       *       *
6114       * @return boolean       * @return boolean
6115       */       */
6116      function is_deletable() {      function is_deletable() {
6117          // Contrôle si l'utilisateur possède un bypass  
6118          $bypass = $this->f->isAccredited(get_class()."_supprimer_bypass");          // XXX
6119            // 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é)
6120            // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6121    
6122            // Contrôle si l'utilisateur possède un bypass intégral
6123            $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6124          //          //
6125          if ($bypass == true) {          if ($bypass == true) {
6126    
# Line 2880  class instruction extends instruction_ge Line 6129  class instruction extends instruction_ge
6129          }          }
6130    
6131          // Si l'utilisateur est un intructeur qui ne correspond pas à la          // Si l'utilisateur est un intructeur qui ne correspond pas à la
6132          // division du dossier          // division du dossier et si l'utilisateur n'a pas la permission bypass
6133          if ($this->f->isUserInstructeur()          // de la division
6134              && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) {          if ($this->is_instructeur_from_division_dossier() === false
6135                && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6136    
6137              //              //
6138              return false;              return false;
# Line 2891  class instruction extends instruction_ge Line 6141  class instruction extends instruction_ge
6141          // l'événement est-il le dernier ?          // l'événement est-il le dernier ?
6142          $dernier_evenement = false;          $dernier_evenement = false;
6143          // instanciation dossier          // instanciation dossier
6144          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
6145          $dossier = new dossier($this->getVal('dossier'), $this->db, DEBUG);              "obj" => "dossier",
6146                "idx" => $this->getVal('dossier'),
6147            ));
6148          // récupération dernier événement          // récupération dernier événement
6149          $id_dernier_evenement = $dossier->get_dernier_evenement();          $id_dernier_evenement = $dossier->get_dernier_evenement();
6150          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {          if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
# Line 2918  class instruction extends instruction_ge Line 6170  class instruction extends instruction_ge
6170          //          //
6171          return true;          return true;
6172      }      }
6173        
6174        
6175        /**
6176         * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6177         * dossier.
6178         *
6179         * @return,  boolean true/false
6180         */
6181        function is_instructeur_from_collectivite_dossier() {
6182            if ($this->f->isUserInstructeur() === true and
6183                $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6184                return true;
6185            }
6186            return false;
6187        }
6188        
6189      /**      /**
6190       * CONDITION - is_addable.       * CONDITION - is_addable.
6191       *       *
# Line 2928  class instruction extends instruction_ge Line 6195  class instruction extends instruction_ge
6195       */       */
6196      function is_addable() {      function is_addable() {
6197          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6198          $bypass = $this->f->isAccredited(get_class()."_ajouter_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6199          //          //
6200          if ($bypass == true) {          if ($bypass == true) {
6201    
6202              //              //
6203              return true;              return true;
6204          }          }
6205            // Si l'utilisateur est un intructeur qui correspond à la
6206          // Si l'utilisateur est un intructeur qui ne correspond pas à la          // division du dossier ou qu'il peut changer la décision
6207          // division du dossier          if ($this->is_instructeur_from_division_dossier() === true or
6208          if ($this->f->isUserInstructeur()              $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {  
   
6209              //              //
6210              return false;              return true;
         }  
   
         // si instructeur commune  
         if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false  
             && $this->f->isInstrCanChangeDecision($this->getVal('dossier')) === true) {  
             return false;  
6211          }          }
6212    
   
6213          //          //
6214          return true;          return false;
6215      }      }
6216    
6217      /**      /**
# Line 2966  class instruction extends instruction_ge Line 6223  class instruction extends instruction_ge
6223       */       */
6224      function is_finalizable() {      function is_finalizable() {
6225          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6226          $bypass = $this->f->isAccredited(get_class()."_finaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6227          //          //
6228          if ($bypass == true) {          if ($bypass == true) {
   
6229              //              //
6230              return true;              return true;
6231          }          }
6232            
         // Si l'utilisateur est un intructeur qui ne correspond pas à la  
         // division du dossier  
         if ($this->f->isUserInstructeur()  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {  
   
             //  
             return false;  
         }  
   
         // si instructeur commune  
         if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true  
             || $this->getVal('created_by_commune') !== 't')) {  
             return false;  
         }  
   
6233          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6234          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
6235          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
6236              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6237              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
   
6238              //              //
6239              return false;              return false;
6240          }          }
6241            
6242            // Si l'utilisateur est un intructeur qui correspond à la division du
6243            // dossier
6244            if ($this->is_instructeur_from_division_dossier() === true) {
6245                //
6246                return true;
6247            }
6248    
6249            // Si l'utilisateur est instructeur de la commune du dossier et que
6250            // l'instruction est créée par un instructeur de la commune
6251            if ($this->is_instructeur_from_collectivite_dossier() === true and
6252                $this->getVal('created_by_commune') === 't') {
6253                return true;
6254            }
6255    
6256          //          //
6257          return true;          return false;
6258      }      }
6259    
6260      /**      /**
# Line 3037  class instruction extends instruction_ge Line 6288  class instruction extends instruction_ge
6288       */       */
6289      function is_unfinalizable(){      function is_unfinalizable(){
6290          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6291          $bypass = $this->f->isAccredited(get_class()."_definaliser_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6292          //          //
6293          if ($bypass == true) {          if ($bypass == true) {
   
6294              //              //
6295              return true;              return true;
6296          }          }
6297            
         // Si l'utilisateur est un intructeur qui ne correspond pas à la  
         // division du dossier  
         if ($this->f->isUserInstructeur()  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {  
   
             //  
             return false;  
         }  
   
         // si instructeur commune  
         if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true  
             && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()  
             && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true  
             || $this->getVal('created_by_commune') !== 't')) {  
             return false;  
         }  
   
6298          // Si l'utilisateur est un instructeur, que le dossier est cloturé et          // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6299          // que l'événement n'est pas identifié comme non verrouillable          // que l'événement n'est pas identifié comme non verrouillable
6300          if ($this->f->isUserInstructeur()          if ($this->f->isUserInstructeur()
6301              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"              && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6302              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {              && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
   
6303              //              //
6304              return false;              return false;
6305          }          }
6306    
6307            // Si l'utilisateur est un intructeur qui correspond à la division du
6308            // dossier
6309            if ($this->is_instructeur_from_division_dossier() === true) {
6310                //
6311                return true;
6312            }
6313    
6314            // Si l'utilisateur est instructeur de la commune du dossier et que
6315            // l'instruction est créée par un instructeur de la commune
6316            if ($this->is_instructeur_from_collectivite_dossier() === true and
6317                $this->getVal('created_by_commune') === 't') {
6318                return true;
6319            }
6320    
6321          //          //
6322          return true;          return false;
6323      }      }
6324    
6325      /**      /**
# Line 3100  class instruction extends instruction_ge Line 6345  class instruction extends instruction_ge
6345    
6346    
6347      /**      /**
6348         * Permet de définir si un instructeur commune peut editer une instruction
6349         *
6350         * @return boolean true si il peut
6351         */
6352        function isInstrCanChangeDecision($idx) {
6353            
6354            if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6355                $this->f->isUserInstructeur() !== true) {
6356                return false;
6357            }
6358            
6359            
6360    
6361            // Sinon on vérifie l'éligibilité du dossier au changement de décision
6362            // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6363            // de décision :
6364            //   * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6365            //   * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6366            $sql = sprintf(
6367                'SELECT
6368                    dossier.dossier
6369                FROM
6370                    %1$sdossier
6371                    JOIN %1$setat
6372                        ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6373                    JOIN %1$slien_dossier_demandeur
6374                        ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6375                    JOIN %1$sdossier_instruction_type
6376                        ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6377                    JOIN %1$sinstruction
6378                        -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6379                        ON instruction.instruction = (
6380                                SELECT instruction
6381                                FROM %1$sinstruction
6382                                JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6383                                AND evenement.retour IS FALSE
6384                                WHERE instruction.dossier = dossier.dossier
6385                                ORDER BY date_evenement DESC, instruction DESC
6386                                LIMIT 1
6387                            )
6388                            -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6389                            -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6390                            -- non signée, non notifié, etc.
6391                            AND (instruction.om_final_instruction IS TRUE
6392                                OR instruction.created_by_commune IS TRUE)
6393                            AND instruction.date_retour_signature IS NULL
6394                            AND instruction.date_envoi_rar IS NULL
6395                            AND instruction.date_retour_rar IS NULL
6396                            AND instruction.date_envoi_controle_legalite IS NULL
6397                            AND instruction.date_retour_controle_legalite IS NULL
6398                    -- On vérifie que l instruction soit un arrêté ou un changement de décision
6399                    JOIN %1$sevenement
6400                        ON instruction.evenement=evenement.evenement
6401                            AND (evenement.type = \'arrete\'
6402                                OR evenement.type = \'changement_decision\')
6403                    -- Recherche les informations du pétitionnaire principal pour l affichage
6404                    JOIN %1$sdemandeur
6405                        ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6406                    -- Recherche la collectivité rattachée à l instructeur
6407                    JOIN %1$sinstructeur
6408                        ON dossier.instructeur=instructeur.instructeur
6409                    JOIN %1$sdivision
6410                        ON instructeur.division=division.division
6411                    JOIN %1$sdirection
6412                        ON division.direction=direction.direction
6413                    JOIN %1$som_collectivite
6414                        ON direction.om_collectivite=om_collectivite.om_collectivite
6415                WHERE
6416                    -- Vérification que la décision a été prise par l agglo
6417                    om_collectivite.niveau = \'2\'
6418                    AND dossier.dossier = \'%2$s\'
6419                ',
6420                DB_PREFIXE,
6421                $this->f->db->escapeSimple($idx)
6422            );
6423    
6424    
6425            // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6426            if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6427                $sql .= sprintf(
6428                    ' AND dossier.om_collectivite = %1$d',
6429                    intval($_SESSION['collectivite'])
6430                );
6431            }
6432            $qres = $this->f->get_one_result_from_db_query(
6433                $sql,
6434                array(
6435                    "origin" => __METHOD__,
6436                )
6437            );
6438    
6439            return $qres['result'] !== null;
6440        }
6441    
6442    
6443        /**
6444       * CONDITION - can_monitoring_dates.       * CONDITION - can_monitoring_dates.
6445       *       *
6446       * Condition pour afficher le bouton de suivi des dates.       * Condition pour afficher le bouton de suivi des dates.
# Line 3117  class instruction extends instruction_ge Line 6458  class instruction extends instruction_ge
6458          }          }
6459    
6460          // Contrôle si l'utilisateur possède un bypass          // Contrôle si l'utilisateur possède un bypass
6461          $bypass = $this->f->isAccredited(get_class()."_modification_dates_bypass");          $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6462          if ($bypass === true) {          if ($bypass === true) {
6463              return true;              return true;
6464          }          }
6465    
6466          // 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
6467            // un utilisateur lié à un instructeur
6468            $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6469    
6470            // On vérifie en premier lieu que le DI n'est pas clôturé et que
6471            // l'utilisateur ne possède pas la permission de modifier le suivi des
6472            // dates sur un dossier clôturé
6473          $inst_dossier = $this->get_inst_dossier();          $inst_dossier = $this->get_inst_dossier();
6474          if ($inst_dossier->getStatut() === 'cloture') {          if ($inst_dossier->getStatut() === 'cloture'
6475                && $perm_moni_dates_d_closed === false) {
6476              //              //
6477              return false;              return false;
6478          }          }
# Line 3134  class instruction extends instruction_ge Line 6482  class instruction extends instruction_ge
6482          // et celles de son éventuel instructeur          // et celles de son éventuel instructeur
6483          $instr_di = $inst_dossier->getVal('instructeur');          $instr_di = $inst_dossier->getVal('instructeur');
6484    
6485            // Il faut disposer d'une entrée instructeur
6486            if ($this->f->isUserInstructeur() === false) {
6487                return false;
6488            }
6489    
6490          // Par défaut on prétend que l'instructeur n'est pas multi          // Par défaut on prétend que l'instructeur n'est pas multi
6491          $instr_di_coll_multi = false;          $instr_di_coll_multi = false;
6492          // Si un instructeur est affecté au dossier          // Si un instructeur est affecté au dossier
# Line 3146  class instruction extends instruction_ge Line 6499  class instruction extends instruction_ge
6499              }              }
6500          }          }
6501    
6502          // S'il s'agit d'un instructeur          // Il faut qu'il instruise le dossier ou soit de la même division
6503          if ($this->f->isUserInstructeur() === true) {          if ($this->f->om_utilisateur['instructeur'] === $instr_di
6504              // Il faut qu'il instruise le dossier ou soit de la même division                  || $this->f->om_utilisateur['division'] === $div_di) {
             if ($this->f->om_utilisateur['instructeur'] === $instr_di  
                     || $this->f->om_utilisateur['division'] === $div_di) {  
                 //  
                 return true;  
             }  
   
             // On donne également le droit s'il est de la même collectivité que  
             // le dossier et si l'instruction est déléguée à la communauté  
             if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true  
                 && $this->f->om_utilisateur['om_collectivite'] === $coll_di  
                 && $instr_di_coll_multi === true) {  
                 //  
                 return true;  
             }  
   
             // Si l'instructeur ne rentre pas dans les deux cas précédents  
             return false;  
         }  
   
         //  
         // A ce stade l'utilisateur connecté n'est pas instructeur  
         //  
   
         // Il a le droit s'il est de la communauté  
         if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === false) {  
6505              //              //
6506              return true;              return true;
6507          }          }
6508    
6509          // Sinon il faut qu'il soit de la même commune que celle du dossier          // On donne également le droit s'il est de la même collectivité que
6510          if ($this->f->om_utilisateur['om_collectivite'] === $coll_di) {          // le dossier ET si l'instruction est déléguée à la communauté
6511            if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6512                && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6513                && $instr_di_coll_multi === true) {
6514              //              //
6515              return true;              return true;
6516          }          }
6517    
6518          //          // Si l'instructeur ne rentre pas dans les deux cas précédents
6519          return false;          return false;
6520      }      }
6521    
6522    
6523      /**      /**
6524         * CONDITION - is_finalized.
6525         *
6526         * Condition pour vérifier si une instruction est finalisée.
6527         *
6528         * @return boolean
6529         */
6530        public function is_finalized() {
6531    
6532            return $this->getVal('om_final_instruction') === "t";
6533        }
6534    
6535        /**
6536         * CONDITION - is_not_date_retour_signature_set.
6537         *
6538         * Condition pour vérifier si une date de retour signature n'est pas définie.
6539         *
6540         * @return boolean
6541         */
6542        public function is_not_date_retour_signature_set() {
6543    
6544            return $this->getVal('date_retour_signature') == null;
6545    
6546        }
6547    
6548    
6549        /**
6550       * TREATMENT - finalize.       * TREATMENT - finalize.
6551       *       *
6552       * Permet de finaliser un enregistrement.       * Permet de finaliser un enregistrement.
# Line 3203  class instruction extends instruction_ge Line 6560  class instruction extends instruction_ge
6560          // 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
6561          // dites de TREATMENT.          // dites de TREATMENT.
6562          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
6563            $message = '';
6564            $ev = $this->get_inst_evenement($this->getVal('evenement'));
6565    
6566            // Controle du signataire
6567            if (! $this->controle_signataire($ev)) {
6568                $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6569                // Termine le traitement
6570                return $this->end_treatment(__METHOD__, false);
6571            }
6572    
6573          // Traitement de la finalisation          // Traitement de la finalisation
6574          $ret = $this->manage_finalizing("finalize", $val);          $ret = $this->manage_finalizing("finalize", $val);
# Line 3214  class instruction extends instruction_ge Line 6580  class instruction extends instruction_ge
6580              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
6581          }          }
6582    
6583            // Envoi des notifications aux demandeurs si la notification est automatique
6584            // et que la signature n'est pas requise
6585            if ($ev->getVal('notification') === 'notification_automatique') {
6586                // Préparation du message de log en cas d'erreur de notification
6587                $msgLog = sprintf(
6588                    '%s %s : %d',
6589                    __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6590                    __('Instruction notifiée'),
6591                    $this->getVal($this->clePrimaire)
6592                );
6593                // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6594                $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6595                // Récupération de la liste des demandeurs à notifier et de la catégorie
6596                $categorie = $this->f->get_param_option_notification($collectivite_di);
6597                $isPortal = $categorie === PORTAL;
6598                $demandeursANotifie = $this->get_demandeurs_notifiable(
6599                    $this->getVal('dossier'),
6600                    $isPortal
6601                );
6602    
6603                // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6604                $demandeurPrincipalNotifie = false;
6605                if (count($demandeursANotifie) > 0) {
6606                    foreach ($demandeursANotifie as $demandeur) {
6607                        // Identifie si le demandeur principal a été notifié ou pas
6608                        // et récupère ses informations
6609                        if ($demandeur['petitionnaire_principal'] == 't') {
6610                            $demandeurPrincipalNotifie = true;
6611                            // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6612                            // son paramétrage, on effectue pas le traitement et on passe à l'itération
6613                            // suivante. On le considère également comme non notifié pour gérer l'envoie
6614                            // des messages d'erreurs
6615                            // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6616                            // d'impact sur la notification
6617                            $erreursParam = $this->get_info_notification_fail();
6618                            if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6619                                $demandeurPrincipalNotifie = false;
6620                                continue;
6621                            }
6622                        }
6623                        // Ajout de la notif et récupération de son id
6624                        $idNotif = $this->ajouter_notification(
6625                            $this->getVal($this->clePrimaire),
6626                            $this->f->get_connected_user_login_name(),
6627                            $demandeur,
6628                            $collectivite_di,
6629                            array(),
6630                            true
6631                        );
6632                        if ($idNotif === false) {
6633                            // Termine le traitement
6634                            $this->addToLog(
6635                                sprintf('%s() : %s', __METHOD__, $msgLog),
6636                                DEBUG_MODE
6637                            );
6638                            return $this->end_treatment(__METHOD__, false);
6639                        }
6640                        $notification_by_task = $this->notification_by_task(
6641                            $idNotif,
6642                            $this->getVal('dossier'),
6643                            $categorie
6644                        );
6645                        if ($notification_by_task === false) {
6646                            $this->addToLog(
6647                                sprintf('%s() : %s', __METHOD__, $msgLog),
6648                                DEBUG_MODE
6649                            );
6650                            $this->addToMessage(
6651                                __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6652                            );
6653                            // Termine le traitement
6654                            return $this->end_treatment(__METHOD__, false);
6655                        }
6656                        $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.")));
6657                    }
6658                }
6659                // Pour la notification par mail ou la notification via portal si le dossier a
6660                // été déposés via portal, si le demandeur principal n'est pas notifiable,
6661                // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6662                // laquelle le demandeur principal n'a pas pu être notifié
6663                $depotPortal = $this->dossier_depose_sur_portail();
6664                if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6665                    // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6666                    $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6667                    // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6668                    $erreursParam = $this->get_info_notification_fail();
6669                    $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6670                    // Ajout de la notif et récupération de son id
6671                    $idNotif = $this->ajouter_notification(
6672                        $this->valF[$this->clePrimaire],
6673                        $this->f->get_connected_user_login_name(),
6674                        $demandeurPrincipal,
6675                        $collectivite_di,
6676                        array(),
6677                        true,
6678                        'Echec',
6679                        implode(' ', $erreursParam)
6680                    );
6681                    if ($idNotif === false) {
6682                        $this->addToMessage(
6683                            __('Erreur : la création de la notification a échouée.').
6684                            __("Veuillez contacter votre administrateur.")
6685                        );
6686                        $this->addToLog(
6687                            sprintf('%s() : %s', __METHOD__, $msgLog),
6688                            DEBUG_MODE
6689                        );
6690                        return false;
6691                    }
6692                    // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6693                    // de l'échec de la notification
6694                    $dossier_message = $this->get_inst_dossier_message(0);
6695                    $dossier_message_val = array(
6696                        'dossier' => $this->getVal('dossier'),
6697                        'type' => _('erreur expedition'),
6698                        'emetteur' => $this->f->get_connected_user_login_name(),
6699                        'login' => $_SESSION['login'],
6700                        'date_emission' => date('Y-m-d H:i:s'),
6701                        'contenu' => _('Échec lors de la notification de l\'instruction ').
6702                            $ev->getVal('libelle').
6703                            '.<br>'.
6704                            implode("\n", $erreursParam).
6705                            '<br>'.
6706                            _('Veuillez corriger ces informations avant de renvoyer la notification.')
6707                    );
6708                    $add = $dossier_message->add_notification_message($dossier_message_val, true);
6709                    // Si une erreur se produit pendant l'ajout
6710                    if ($add !== true) {
6711                        $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6712                        return false;
6713                    }
6714                }
6715            }
6716    
6717          // Termine le traitement          // Termine le traitement
6718          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
6719      }      }
6720    
6721      /**      /**
6722         * Récupère l'instance de dossier message.
6723         *
6724         * @param string $dossier_message Identifiant du message.
6725         *
6726         * @return object
6727         */
6728        private function get_inst_dossier_message($dossier_message = null) {
6729            //
6730            return $this->get_inst_common("dossier_message", $dossier_message);
6731        }
6732    
6733        /**
6734         * Vérifie si le signataire est obligatoire pour finaliser
6735         * le document apartir du paramétrage de l'événement.
6736         * Si c'est le cas, vérifie si il y a bien un signataire
6737         * renseigné.
6738         * Si c'est le cas renvoie true, sinon renvoie false.
6739         *
6740         * @param evenement évenement de l'instruction permettant de
6741         * récupérer le paramétrage
6742         * @return boolean
6743         */
6744        protected function controle_signataire($evenement) {
6745            // Vérifie si le signataire est obligatoire et si c'est le cas
6746            // vérifie si il y a bien un signataire pour le document
6747            if ($evenement->is_signataire_obligatoire() &&
6748                ($this->getVal('signataire_arrete') === null ||
6749                $this->getVal('signataire_arrete') === '')) {
6750                return false;
6751            }
6752            return true;
6753        }
6754    
6755        /**
6756       * TREATMENT - unfinalize.       * TREATMENT - unfinalize.
6757       *       *
6758       * Permet de définaliser un enregistrement.       * Permet de définaliser un enregistrement.
# Line 3261  class instruction extends instruction_ge Line 6795  class instruction extends instruction_ge
6795              && $this->getVal("om_final_instruction") != null) {              && $this->getVal("om_final_instruction") != null) {
6796    
6797              // Ouvre le document              // Ouvre le document
6798              $lien = '../spg/file.php?obj='.$this->table.'&'.              $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6799                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);                      'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6800              //              //
6801              header("Location: ".$lien);              header("Location: ".$lien);
# Line 3280  class instruction extends instruction_ge Line 6814  class instruction extends instruction_ge
6814                      "mode" => "previsualisation",                      "mode" => "previsualisation",
6815                  ),                  ),
6816              );              );
6817                // Si la rédaction libre est activée sur l'instruction
6818                if ($this->getVal("flag_edition_integrale") == 't') {
6819                    $params["specific"]["corps"] = array(
6820                        "mode" => "set",
6821                        "value" => $this->getVal("corps_om_htmletatex"),
6822                    );
6823                    $params["specific"]["titre"] = array(
6824                        "mode" => "set",
6825                        "value" => $this->getVal("titre_om_htmletat"),
6826                    );
6827                }
6828    
6829              // Génération du PDF              // Génération du PDF
6830              $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 3294  class instruction extends instruction_ge Line 6839  class instruction extends instruction_ge
6839      /**      /**
6840       * Récupère la collectivité du dossier d'instruction.       * Récupère la collectivité du dossier d'instruction.
6841       *       *
6842         * @param string $dossier_instruction_id Identifiant du DI.
6843         *
6844       * @return integer       * @return integer
6845       */       */
6846      function get_dossier_instruction_om_collectivite() {      function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6847    
6848            // Si l'identifiant n'est pas renseigné
6849            if ($dossier_instruction_id === null) {
6850                // Récupère la valeur
6851                if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6852                    $dossier_instruction_id = $this->getVal('dossier');
6853                } elseif ($this->getParameter('idxformulaire') !== null
6854                    && $this->getParameter('idxformulaire') !== '') {
6855                    //
6856                    $dossier_instruction_id = $this->getParameter('idxformulaire');
6857                } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6858                    && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6859                    //
6860                    $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6861                }
6862            }
6863    
6864          //          //
6865          require_once "../obj/dossier_instruction.class.php";          $dossier_instruction = $this->f->get_inst__om_dbform(array(
6866          $dossier_instruction = new dossier_instruction($this->getVal('dossier'), $this->f->db, false);              "obj" => "dossier_instruction",
6867                "idx" => $dossier_instruction_id,
6868            ));
6869    
6870          //          //
6871          return $dossier_instruction->getVal('om_collectivite');          return $dossier_instruction->getVal('om_collectivite');
# Line 3317  class instruction extends instruction_ge Line 6882  class instruction extends instruction_ge
6882          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
6883          $this->checkAccessibility();          $this->checkAccessibility();
6884    
         // XXX APP  
   
         $f = $this->f;  
   
6885          /**          /**
6886           * Affichage de la structure HTML           * Affichage de la structure HTML
6887           */           */
6888          //          //
6889          if ($f->isAjaxRequest()) {          if ($this->f->isAjaxRequest()) {
6890              //              //
6891              header("Content-type: text/html; charset=".HTTPCHARSET."");              header("Content-type: text/html; charset=".HTTPCHARSET."");
6892          } else {          } else {
6893              //              //
6894              $f->setFlag("htmlonly");              $this->f->setFlag("htmlonly");
6895              $f->display();              $this->f->display();
6896          }          }
6897          //          //
6898          $f->displayStartContent();          $this->f->displayStartContent();
6899          //          //
6900          $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"));
6901          $f->displayTitle();          $this->f->displayTitle();
6902    
6903          /**          /**
6904           *           *
6905           */           */
6906          //          //
6907          ($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 = "");
6908          $evenement = intval($evenement);          $evenement = intval($evenement);
6909          //          //
6910          ($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 = "");
6911          // Récupération du code du type de DA          // Récupération du code du type de DA
6912          $code_da_type = '';          $code_da_type = '';
6913          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6914              $code_da_type = $matches[0];              $code_da_type = $matches[0];
6915          }          }
6916          //          //
6917          ($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");
6918    
6919          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
6920          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
6921          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
6922                "idx" => $idx,
6923          /**          ));
6924           *  
6925           */          $qres = $this->f->get_all_results_from_db_query(
6926          //              sprintf(
6927          $sql = "SELECT *, bible.libelle as bible_lib                  'SELECT
6928          FROM ".DB_PREFIXE."bible                      *,
6929          LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type                      bible.libelle as bible_lib
6930              ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type                  FROM
6931          LEFT JOIN ".DB_PREFIXE."om_collectivite                      %1$sbible
6932              ON bible.om_collectivite = om_collectivite.om_collectivite                      LEFT OUTER JOIN %1$sdossier_autorisation_type
6933          WHERE evenement=".$evenement."                          ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6934              AND complement=".$complement."                      LEFT JOIN %1$som_collectivite
6935              AND (bible.dossier_autorisation_type IS NULL                          ON bible.om_collectivite = om_collectivite.om_collectivite
6936                  OR dossier_autorisation_type.code ='".$code_da_type."')                  WHERE
6937              AND (om_collectivite.niveau = '2'                      (evenement = %2$d
6938                  OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")                          OR evenement IS NULL)
6939          ORDER BY bible_lib ASC";                      AND (complement = %3$d
6940          $res = $f->db->query($sql);                          OR complement IS NULL)
6941          $f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);                      AND (bible.dossier_autorisation_type IS NULL
6942          $f->isDatabaseError($res);                          OR dossier_autorisation_type.code = \'%4$s\')
6943                        AND (om_collectivite.niveau = \'2\'
6944                            OR bible.om_collectivite = %5$d)
6945                    ORDER BY
6946                        bible_lib ASC',
6947                    DB_PREFIXE,
6948                    intval($evenement),
6949                    intval($complement),
6950                    $this->f->db->escapeSimple($code_da_type),
6951                    intval($dossier->getVal("om_collectivite"))
6952                ),
6953                array(
6954                    'origin' => __METHOD__
6955                )
6956            );
6957          //          //
6958          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";          echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6959          //          //
6960          if ($res->numrows() > 0) {          if (count($qres['result']) > 0) {
6961              //              //
6962              echo "\t<table id='tab-bible' width='100%'>\n";              echo "\t<table id='tab-bible' width='100%'>\n";
6963              //              //
# Line 3393  class instruction extends instruction_ge Line 6968  class instruction extends instruction_ge
6968              //              //
6969              $i = 0;              $i = 0;
6970              //              //
6971              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {              foreach ($qres['result'] as $row) {
6972                  //                  //
6973                  echo "\t\t<tr";                  echo "\t\t<tr";
6974                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";                  echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
# Line 3410  class instruction extends instruction_ge Line 6985  class instruction extends instruction_ge
6985              echo "\t</table>\n";              echo "\t</table>\n";
6986              //              //
6987              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
6988              $f->layout->display_form_button(array(              $this->f->layout->display_form_button(array(
6989                  "value" => _("Valider"),                  "value" => _("Valider"),
6990                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",                  "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6991              ));              ));
6992              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
6993              echo "</div>\n";              echo "</div>\n";
6994    
6995          } else {          } else {
6996              //              //
6997              $message_class = "error";              $message_class = "error";
6998              $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;              $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6999              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
7000              //              //
7001              echo "<div class=\"formControls\">\n";              echo "<div class=\"formControls\">\n";
7002              $f->displayLinkJsCloseWindow();              $this->f->displayLinkJsCloseWindow();
7003              echo "</div>\n";              echo "</div>\n";
7004          }          }
7005          //          //
# Line 3434  class instruction extends instruction_ge Line 7009  class instruction extends instruction_ge
7009           * Affichage de la structure HTML           * Affichage de la structure HTML
7010           */           */
7011          //          //
7012          $f->displayEndContent();          $this->f->displayEndContent();
7013      }      }
7014    
7015      /**      /**
# Line 3447  class instruction extends instruction_ge Line 7022  class instruction extends instruction_ge
7022      function view_bible_auto() {      function view_bible_auto() {
7023          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7024          $this->checkAccessibility();          $this->checkAccessibility();
   
         // XXX APP  
   
         $f = $this->f;  
   
7025          //          //
7026          $f->disableLog();          $this->f->disableLog();
7027    
7028          $formatDate="AAAA-MM-JJ";          $formatDate="AAAA-MM-JJ";
7029    
7030          // Récupération des paramètres          // Récupération des paramètres
7031          $idx = $f->get_submitted_get_value('idx');          $idx = $this->f->get_submitted_get_value('idx');
7032          $evenement = $f->get_submitted_get_value('ev');          $evenement = $this->f->get_submitted_get_value('ev');
7033    
7034          // Initialisation de la variable de retour          // Initialisation de la variable de retour
7035          $retour['complement_om_html'] = '';          $retour['complement_om_html'] = '';
7036          $retour['complement2_om_html'] = '';          $retour['complement2_om_html'] = '';
7037          $retour['complement3_om_html'] = '';          $retour['complement3_om_html'] = '';
7038          $retour['complement4_om_html'] = '';          $retour['complement4_om_html'] = '';
7039    
7040          // Vérification d'une consultation liée à l'événement          // Vérification d'une consultation liée à l'événement
7041          $consultation = $f->db->getOne(          $instEvenement = $this->f->get_inst__om_dbform(array(
7042              "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement              "obj" => "evenement",
7043          );              "idx" => $evenement,
7044          $f->isDatabaseError($consultation);          ));
7045    
7046          // Si consultation liée, récupération du retour d'avis          // Si consultation liée, récupération du retour d'avis
7047          if($consultation=='Oui'){          if($instEvenement->getVal('consultation') == 'Oui'){
7048              $sql="select date_retour,avis_consultation.libelle as avis_consultation,  
7049                    service.libelle as service              $qres = $this->f->get_all_results_from_db_query(
7050                    from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service                  sprintf(
7051                    on consultation.service =service.service                      'SELECT
7052                    left join ".DB_PREFIXE."avis_consultation on                          date_retour,
7053                      consultation.avis_consultation = avis_consultation.avis_consultation                          avis_consultation.libelle as avis_consultation,
7054                    where dossier ='".$idx."'";                          COALESCE(service.libelle, tiers_consulte.libelle) as service
7055              $res = $f->db->query($sql);                      FROM
7056              $f->isDatabaseError($res);                          %1$sconsultation
7057                            LEFT JOIN %1$stiers_consulte
7058                                ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7059                            LEFT JOIN %1$sservice
7060                                ON consultation.service = service.service
7061                            LEFT JOIN %1$savis_consultation
7062                                ON consultation.avis_consultation = avis_consultation.avis_consultation
7063                        WHERE
7064                            dossier = \'%2$s\'
7065                            AND consultation.visible',
7066                        DB_PREFIXE,
7067                        $this->f->db->escapeSimple($idx)
7068                    ),
7069                    array(
7070                        'origin' => __METHOD__
7071                    )
7072                );
7073              // Récupération des consultations              // Récupération des consultations
7074              while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){              foreach ($qres['result'] as $row) {
7075                  $correct=false;                  $correct=false;
7076                  // date retour                  // date retour
7077                  if ($row['date_retour']<>""){                  if ($row['date_retour']<>""){
# Line 3506  class instruction extends instruction_ge Line 7094  class instruction extends instruction_ge
7094                      $temp=$temp." du ".$date_retour_f;                      $temp=$temp." du ".$date_retour_f;
7095                  }                  }
7096                  // Concaténation des retours d'avis de consultation                  // Concaténation des retours d'avis de consultation
7097                  $retour['complement_om_html'] .= $temp;                  $retour['complement_om_html'] .= $temp . "<br/><br/>";
7098              } // while              } // while
7099                            
7100          } // consultation          } // consultation
7101          // Récupération des bibles automatiques pour le champ complement_om_html          // Récupération des bibles automatiques pour le champ complement_om_html
7102          $retour['complement_om_html'] .= $this->getBible($f, $evenement, $idx, '1');          $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7103          // Récupération des bibles automatiques pour le champ complement2_om_html          // Récupération des bibles automatiques pour le champ complement2_om_html
7104          $retour['complement2_om_html'] .= $this->getBible($f, $evenement, $idx, '2');          $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7105          // Récupération des bibles automatiques pour le champ complement3_om_html          // Récupération des bibles automatiques pour le champ complement3_om_html
7106          $retour['complement3_om_html'] .= $this->getBible($f, $evenement, $idx, '3');          $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7107          // Récupération des bibles automatiques pour le champ complement4_om_html          // Récupération des bibles automatiques pour le champ complement4_om_html
7108          $retour['complement4_om_html'] .= $this->getBible($f, $evenement, $idx, '4');          $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7109    
7110    
7111    
# Line 3525  class instruction extends instruction_ge Line 7113  class instruction extends instruction_ge
7113      }      }
7114    
7115      /**      /**
7116         * VIEW - view_pdf_temp
7117         *
7118         * @return void
7119         */
7120        function view_pdf_temp() {
7121            $this->checkAccessibility();
7122            // Utilisation de $_POST pour ne pas que les textes soient altérés.
7123            $this->f->set_submitted_value();
7124            $merge_fields = array();
7125            //
7126            if (array_key_exists('c1', $_POST) === true) {
7127                $merge_fields['[complement_instruction]'] = $_POST['c1'];
7128                $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7129            }
7130            if (array_key_exists('c2', $_POST) === true) {
7131                $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7132            }
7133            if (array_key_exists('c3', $_POST) === true) {
7134                $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7135            }
7136            if (array_key_exists('c4', $_POST) === true) {
7137                $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7138            }
7139            $params = array(
7140                "watermark" => true,
7141                "specific" => array(
7142                    "merge_fields" => $merge_fields,
7143                ),
7144            );
7145            //
7146            if (array_key_exists('corps', $_POST) === true) {
7147                $params["specific"]["corps"] = array(
7148                    "mode" => "set",
7149                    "value" => $_POST['corps'],
7150                );
7151            }
7152            if (array_key_exists('titre', $_POST) === true) {
7153                $params["specific"]["titre"] = array(
7154                    "mode" => "set",
7155                    "value" => $_POST['titre'],
7156                );
7157            }
7158            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7159            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7160            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7161            $retour = array(
7162                'base' => base64_encode($result['pdf_output']),
7163            );
7164            echo json_encode($retour);
7165        }
7166    
7167        /**
7168         * Dans le contexte de prévisualisation des éditions, génère le rendu du
7169         * PDF sans prise en compte de la valeur des compléments et le retourne en
7170         * base 64.
7171         *
7172         * @return string Rendu PDF converti en base 64.
7173         */
7174        function init_pdf_temp() {
7175            $params = array(
7176                "watermark" => true,
7177            );
7178            // Si la rédaction libre est activée sur l'instruction
7179            if ($this->getVal("flag_edition_integrale") == 't') {
7180                $params["specific"]["corps"] = array(
7181                    "mode" => "set",
7182                    "value" => $this->getVal("corps_om_htmletatex"),
7183                );
7184                $params["specific"]["titre"] = array(
7185                    "mode" => "set",
7186                    "value" => $this->getVal("titre_om_htmletat"),
7187                );
7188            }
7189            $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7190            $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7191            $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7192    
7193            return base64_encode($result['pdf_output']);
7194        }
7195    
7196        /**
7197       * Récupération des éléments de bible.       * Récupération des éléments de bible.
7198       *       *
      * @param utils   $f      handler de om_application  
7199       * @param integer $event  id de l'événement       * @param integer $event  id de l'événement
7200       * @param string  $idx    id du dossier       * @param string  $idx    id du dossier
7201       * @param integer $compnb numéro du champ complement       * @param integer $compnb numéro du champ complement
7202       *       *
7203       * @return string   Chaîne de texte à insérer dans le champ complement       * @return string   Chaîne de texte à insérer dans le champ complement
7204       */       */
7205      function getBible($f, $event, $idx, $compnb) {      function getBible($event, $idx, $compnb) {
7206          // Récupération de la collectivité du dossier          // Récupération de la collectivité du dossier
7207          require_once "../obj/dossier.class.php";          $dossier = $this->f->get_inst__om_dbform(array(
7208          $dossier = new dossier($idx, $f->db, DEBUG);              "obj" => "dossier",
7209                "idx" => $idx,
7210            ));
7211          // Récupération du code du type de DA          // Récupération du code du type de DA
7212          $code_da_type = '';          $code_da_type = '';
7213          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {          if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7214              $code_da_type = $matches[0];              $code_da_type = $matches[0];
7215          }          }
         //  
         $sql = "SELECT * FROM ".DB_PREFIXE."bible  
             LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type  
                 ON bible.dossier_autorisation_type=  
                     dossier_autorisation_type.dossier_autorisation_type  
             LEFT JOIN  
                     ".DB_PREFIXE."om_collectivite  
                     ON bible.om_collectivite = om_collectivite.om_collectivite  
             WHERE evenement =".$event." and  
                 complement=".$compnb." and  
                 automatique='Oui' and  
                 (dossier_autorisation_type.code ='".$code_da_type."' or  
                     bible.dossier_autorisation_type IS NULL) and  
                 (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";  
7216    
7217          $res = $f->db->query($sql);          $qres = $this->f->get_all_results_from_db_query(
7218          $f->isDatabaseError($res);              sprintf(
7219                    'SELECT
7220                        *
7221                    FROM
7222                        %1$sbible
7223                        LEFT OUTER JOIN %1$sdossier_autorisation_type
7224                            ON bible.dossier_autorisation_type =
7225                                dossier_autorisation_type.dossier_autorisation_type
7226                        LEFT JOIN %1$som_collectivite
7227                            ON bible.om_collectivite = om_collectivite.om_collectivite
7228                    WHERE
7229                        (evenement = %2$d
7230                            OR evenement IS NULL)
7231                        AND (complement = %3$d
7232                            OR complement IS NULL)
7233                        AND automatique = \'Oui\'
7234                        AND (dossier_autorisation_type.code = \'%4$s\'
7235                            OR bible.dossier_autorisation_type IS NULL)
7236                        AND (om_collectivite.niveau = \'2\'
7237                            OR bible.om_collectivite = %5$d)',
7238                    DB_PREFIXE,
7239                    intval($event),
7240                    intval($compnb),
7241                    $this->f->db->escapeSimple($code_da_type),
7242                    intval($dossier->getVal("om_collectivite"))
7243                ),
7244                array(
7245                    "origin" => __METHOD__
7246                )
7247            );
7248          $temp = "";          $temp = "";
7249          while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){          foreach ($qres['result'] as $row) {
7250              // Remplacement des retours à la ligne par des br              // Remplacement des retours à la ligne par des br
7251              $temp .= preg_replace(              $temp .= preg_replace(
7252                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']                  '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7253              );              );
7254                // Ajout d'un saut de ligne entre chaque bible.
7255                $temp .= '<br/>';
7256          } // fin while          } // fin while
7257          return $temp;          return $temp;
7258      }      }
# Line 3583  class instruction extends instruction_ge Line 7270  class instruction extends instruction_ge
7270          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7271          $this->checkAccessibility();          $this->checkAccessibility();
7272    
         // XXX APP  
   
         $f = $this->f;  
   
7273          /**          /**
7274           * Validation du formulaire           * Validation du formulaire
7275           */           */
7276          // Si le formulaire a été validé          // Si le formulaire a été validé
7277          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
7278              // Si un bordereau à été sélectionné              // Si un bordereau à été sélectionné
7279              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") == "" ) {
7280                  // Si aucun bordereau n'a été sélectionné                  // Si aucun bordereau n'a été sélectionné
7281                  $message_class = "error";                  $message_class = "error";
7282                  $message = _("Veuillez selectionner un bordereau.");                  $message = _("Veuillez selectionner un bordereau.");
7283              }              }
7284              // Sinon si les dates ne sont pas valide              // Sinon si les dates ne sont pas valide
7285              elseif (($f->get_submitted_post_value("date_bordereau_debut") !== null              elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7286                  && $f->get_submitted_post_value("date_bordereau_debut") == "")                  && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7287                  || ($f->get_submitted_post_value("date_bordereau_fin") !== null                  || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7288                  && $f->get_submitted_post_value("date_bordereau_fin") == "")) {                  && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7289                  // Si aucune date n'a été saisie                  // Si aucune date n'a été saisie
7290                  $message_class = "error";                  $message_class = "error";
7291                  $message = _("Veuillez saisir une date valide.");                  $message = _("Veuillez saisir une date valide.");
7292              }              }
7293                // Sinon si les dates ne sont pas valides
7294                elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7295                    && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7296                    // Si aucune date n'a été saisie
7297                    $message_class = "error";
7298                    $message = _("Erreur de parametrage. Contactez votre administrateur.");
7299                }
7300              // Affiche le message de validation              // Affiche le message de validation
7301              else {              else {
7302                  // 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
7303                  $sql = "SELECT om_etat.libelle                  $etat = $this->f->get_inst__om_dbform(array(
7304                  FROM ".DB_PREFIXE."om_etat                      "obj" => "om_etat",
7305                  WHERE om_etat.id = '".$f->get_submitted_post_value("bordereau")."'";                      "idx" => $this->f->get_submitted_post_value("bordereau")
7306                  $res = $f->db->getone($sql);                  ));
7307                  $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                  $qres = $this->f->get_one_result_from_db_query(
7308                  $f->isDatabaseError($res);                      sprintf(
7309                            'SELECT
7310                                om_etat.libelle
7311                            FROM
7312                                %som_etat
7313                            WHERE
7314                                om_etat.id = \'%s\'',
7315                            DB_PREFIXE,
7316                            $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7317                        ),
7318                        array(
7319                            "origin" => __METHOD__,
7320                        )
7321                    );
7322    
7323                  //                  //
7324                  $message_class = "valid";                  $message_class = "valid";
7325                  $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");                  $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7326                  $message .= " : <br/><br/>";                  $message .= " : <br/><br/>";
7327                  $message .= "<a class='om-prev-icon pdf-16'";                  $message .= "<a class='om-prev-icon pdf-16'";
7328                  $message .= " title=\""._("Bordereau")."\"";                  $message .= " title=\""._("Bordereau")."\"";
7329                  $message .= "href='../scr/form.php?obj=instruction";                  $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7330                  $message .= "&action=220";                  $message .= "&action=220";
7331                  $message .= "&idx=0";                  $message .= "&idx=0";
7332                  $message .= "&type_bordereau=".$f->get_submitted_post_value("bordereau");                  $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7333                  $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");
7334                  $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");
7335                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite                  // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7336                  if ($f->get_submitted_post_value("om_collectivite") !== null) {                  if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7337                      $message .= "&collectivite=".$f->get_submitted_post_value("om_collectivite");                      $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7338                  }                  }
7339                  $message .= "'"." target='_blank'>";                  $message .= "'"." target='_blank'>";
7340                  $message .= $res." "._("du")." ".$f->get_submitted_post_value("date_bordereau_debut")                  $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7341                      ." "._("au")." ".$f->get_submitted_post_value("date_bordereau_fin");                      ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7342                  $message .= "</a>";                  $message .= "</a>";
7343              }              }
7344          }          }
# Line 3644  class instruction extends instruction_ge Line 7348  class instruction extends instruction_ge
7348           */           */
7349          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
7350          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
7351              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
7352          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
7353          // Ouverture du formulaire          // Ouverture du formulaire
7354          printf("\t<form");          printf("\t<form");
7355          printf(" method=\"post\"");          printf(" method=\"post\"");
# Line 3656  class instruction extends instruction_ge Line 7358  class instruction extends instruction_ge
7358          printf(">\n");          printf(">\n");
7359          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
7360          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");          $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7361          // 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
7362          // collectivité dans le formulaire          // collectivité dans le formulaire
7363          if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
7364              array_push($champs, "om_collectivite");              array_push($champs, "om_collectivite");
7365          }          }
7366          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
7367          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
7368                "validation" => 0,
7369                "maj" => 0,
7370                "champs" => $champs,
7371            ));
7372          // Paramétrage du champ date_bordereau_debut          // Paramétrage du champ date_bordereau_debut
7373          $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));          $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7374          $form->setType("date_bordereau_debut", "date");          $form->setType("date_bordereau_debut", "date");
# Line 3684  class instruction extends instruction_ge Line 7390  class instruction extends instruction_ge
7390          $form->setType("bordereau", "select");          $form->setType("bordereau", "select");
7391          $form->setRequired("bordereau");          $form->setRequired("bordereau");
7392          // Valeurs des champs          // Valeurs des champs
7393          if ($f->get_submitted_post_value("validation") !== null) {          if ($this->f->get_submitted_post_value("validation") !== null) {
7394              $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"));
7395              $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"));
7396              $form->setVal("bordereau", $f->get_submitted_post_value("bordereau"));              $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7397              $form->setVal("om_collectivite", $f->get_submitted_post_value("om_collectivite"));              $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7398          }          }
7399          // 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
7400          // 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
7401          // 'bordereau_'          // 'bordereau_'
7402          $sql = "SELECT om_etat.id, om_etat.libelle          $qres = $this->f->get_all_results_from_db_query(
7403                  FROM ".DB_PREFIXE."om_etat              sprintf(
7404                  WHERE om_etat.id LIKE 'bordereau_%'                  'SELECT
7405                  ORDER BY om_etat.id";                      om_etat.id,
7406          $res = $f->db->query($sql);                      om_etat.libelle
7407          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                  FROM
7408          $f->isDatabaseError($res);                      %1$som_etat
7409                    WHERE
7410                        om_etat.id LIKE \'bordereau_%%\'
7411                    ORDER BY
7412                        om_etat.id',
7413                    DB_PREFIXE
7414                ),
7415                array(
7416                    "origin" => __METHOD__
7417                )
7418            );
7419          // Données du select          // Données du select
7420          $contenu = array(          $contenu = array(
7421              0 => array("", ),              0 => array("", ),
7422              1 => array(_("choisir bordereau")),              1 => array(_("choisir bordereau")),
7423          );          );
7424          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {          foreach ($qres['result'] as $row) {
7425              $contenu[0][] = $row['id'];              $contenu[0][] = $row['id'];
7426              $contenu[1][] = $row['libelle'];              $contenu[1][] = $row['libelle'];
7427          }          }
7428          $form->setSelect("bordereau", $contenu);          $form->setSelect("bordereau", $contenu);
7429      //          //
7430      if($_SESSION["niveau"] == 2) {          if ($_SESSION["niveau"] == 2) {
7431          $form->setLib("om_collectivite", _("collectivite"));              $form->setLib("om_collectivite", _("collectivite"));
7432          $form->setType("om_collectivite", "select");              $form->setType("om_collectivite", "select");
7433    
7434          // 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
7435          // de niveau 1              // de niveau 1
7436          $sql = "SELECT om_collectivite, libelle              $qres = $this->f->get_all_results_from_db_query(
7437                  FROM ".DB_PREFIXE."om_collectivite                  sprintf(
7438                  WHERE niveau = '1' ORDER BY libelle";                      'SELECT
7439          $res = $f->db->query($sql);                          om_collectivite,
7440          $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                          libelle
7441          $f->isDatabaseError($res);                      FROM
7442          // La valeur par défaut du select est Toutes                          %1$som_collectivite
7443          $list_collectivites = array(                      WHERE
7444              0 => array("", ),                          niveau = \'1\'
7445              1 => array(_("toutes"))                      ORDER BY
7446          );                          libelle',
7447                        DB_PREFIXE
7448          $id_colls = "";                  ),
7449          // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées                  array(
7450          // par des virgules, pour un traitement plus facile dans la requête de sous-état                      "origin" => __METHOD__
7451          while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {                  )
7452              if ($id_colls != "") {              );
7453                  $id_colls .= ",";              // La valeur par défaut du select est Toutes
7454              }              $list_collectivites = array(
7455              $id_colls .= $row['om_collectivite'];                  0 => array("", ),
7456              $list_collectivites[0][] = $row['om_collectivite'];                  1 => array(_("toutes"))
7457              $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);  
     }  
7458    
7459                $id_colls = "";
7460                // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7461                // par des virgules, pour un traitement plus facile dans la requête de sous-état
7462                foreach ($qres['result'] as $row) {
7463                    if ($id_colls != "") {
7464                        $id_colls .= ",";
7465                    }
7466                    $id_colls .= $row['om_collectivite'];
7467                    $list_collectivites[0][] = $row['om_collectivite'];
7468                    $list_collectivites[1][] = $row['libelle'];
7469                }
7470                // On affecte la liste d'identifiants à l'option Toutes
7471                $list_collectivites[0][0] = $id_colls ;
7472                $form->setSelect("om_collectivite", $list_collectivites);
7473            }
7474          // Affichage du formulaire          // Affichage du formulaire
7475          $form->entete();          $form->entete();
7476          $form->afficher($champs, 0, false, false);          $form->afficher($champs, 0, false, false);
7477          $form->enpied();          $form->enpied();
7478          // Affichage du bouton          // Affichage du bouton
7479          printf("\t<div class=\"formControls\">\n");          printf("\t<div class=\"formControls\">\n");
7480          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7481          printf("\t</div>\n");          printf("\t</div>\n");
7482          // Fermeture du formulaire          // Fermeture du formulaire
7483          printf("\t</form>\n");          printf("\t</form>\n");
   
7484      }      }
7485    
7486    
# Line 3784  class instruction extends instruction_ge Line 7509  class instruction extends instruction_ge
7509      /**      /**
7510       * VIEW - view_suivi_envoi_lettre_rar.       * VIEW - view_suivi_envoi_lettre_rar.
7511       *       *
7512       * Vu pour imprimer les RAR.       * Vue pour imprimer les AR.
7513       *       *
7514       * @return void       * @return void
7515       */       */
# Line 3792  class instruction extends instruction_ge Line 7517  class instruction extends instruction_ge
7517          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7518          $this->checkAccessibility();          $this->checkAccessibility();
7519    
         // XXX APP  
   
         $f = $this->f;  
   
7520          //          //
7521          if ($f->get_submitted_post_value("date") !== null) {          if ($this->f->get_submitted_post_value("date") !== null) {
7522              $date = $f->get_submitted_post_value("date");              $date = $this->f->get_submitted_post_value("date");
7523          } else {          } else {
7524              $date = "";              $date = "";
7525          }          }
7526          //          //
7527          if ($f->get_submitted_post_value("liste_code_barres_instruction") !== null) {          if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7528              $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");
7529          } else {          } else {
7530              $liste_code_barres_instruction = "";              $liste_code_barres_instruction = "";
7531          }          }
# Line 3830  class instruction extends instruction_ge Line 7551  class instruction extends instruction_ge
7551           * Validation du formulaire           * Validation du formulaire
7552           */           */
7553          // Si le formulaire a été validé          // Si le formulaire a été validé
7554          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
7555              //              //
7556              if (empty($date) || empty($liste_code_barres_instruction)) {              if (empty($date) || empty($liste_code_barres_instruction)) {
7557                  //                  //
# Line 3838  class instruction extends instruction_ge Line 7559  class instruction extends instruction_ge
7559                  $message = _("Tous les champs doivent etre remplis.");                  $message = _("Tous les champs doivent etre remplis.");
7560              } else {              } else {
7561                  // Création d'un tableau d'instruction                  // Création d'un tableau d'instruction
7562                  $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"));
7563                  //                  //
7564                  foreach ($liste as $code_barres) {                  foreach ($liste as $code_barres) {
7565                      // On enlève les éventuels espaces saisis                      // On enlève les éventuels espaces saisis
# Line 3848  class instruction extends instruction_ge Line 7569  class instruction extends instruction_ge
7569                          // Si la valeur transmise est numérique                          // Si la valeur transmise est numérique
7570                          if (is_numeric($code_barres)) {                          if (is_numeric($code_barres)) {
7571                              //                              //
7572                              $sql = "SELECT count(*) FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";                              $sql = "SELECT count(*)
7573                              $nbInstr = $f->db->getone($sql);                                      FROM ".DB_PREFIXE."instruction
7574                              $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);                                          INNER JOIN ".DB_PREFIXE."dossier
7575                              $f->isDatabaseError($nbInstr);                                              ON dossier.dossier=instruction.dossier
7576                              //                                          INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7577                              if ($nbInstr == "1") {                                              ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7578                                            INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7579                                                ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7580                                            INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7581                                                ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7582                                            INNER JOIN ".DB_PREFIXE."groupe
7583                                                ON dossier_autorisation_type.groupe = groupe.groupe
7584                                            WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7585                                            
7586                                // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7587                                $group_clause = array();
7588                                foreach ($_SESSION["groupe"] as $key => $value) {
7589                                    $group_clause[$key] = "(groupe.code = '".$key."'";
7590                                    if($value["confidentiel"] !== true) {
7591                                        $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7592                                    }
7593                                    $group_clause[$key] .= ")";
7594                                }
7595                                $conditions = implode(" OR ", $group_clause);
7596                                $sql .= " AND (" . $conditions . ")";
7597    
7598                                $qres = $this->f->get_one_result_from_db_query(
7599                                    $sql,
7600                                    array(
7601                                        "origin" => __METHOD__,
7602                                    )
7603                                );
7604    
7605                                if ($qres['result'] == "1") {
7606                                  // Récupération de la date d'envoi de l'instruction bippé                                  // Récupération de la date d'envoi de l'instruction bippé
7607                                  $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(
7608                                  $res = $f->db->query($sql);                                      sprintf(
7609                                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                                          'SELECT
7610                                  $f->isDatabaseError($res);                                              to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7611                                  $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);                                              instruction
7612                                            FROM
7613                                                %1$sinstruction
7614                                            WHERE
7615                                                code_barres = \'%2$s\'',
7616                                            DB_PREFIXE,
7617                                            $this->f->db->escapeSimple($code_barres)
7618                                        ),
7619                                        array(
7620                                            'origin' => __METHOD__
7621                                        )
7622                                    );
7623                                    $row = array_shift($qres['result']);
7624                                  // Si pas de date ou correspond à la date du formulaire on                                  // Si pas de date ou correspond à la date du formulaire on
7625                                  // effectue le traitement                                  // effectue le traitement
7626                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {                                  if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7627                                                                            $instr = $this->f->get_inst__om_dbform(array(
7628                                      require_once '../obj/instruction.class.php';                                          "obj" => "instruction",
7629                                      require_once '../obj/dossier.class.php';                                          "idx" => $row['instruction'],
7630                                                                ));
                                     $instr = new instruction($row['instruction'], $f->db, DEBUG);  
7631                                      $valF = array();                                      $valF = array();
7632                                      foreach($instr->champs as $id => $champ) {                                      foreach($instr->champs as $id => $champ) {
7633                                          $valF[$champ] = $instr->val[$id];                                          $valF[$champ] = $instr->val[$id];
# Line 3876  class instruction extends instruction_ge Line 7636  class instruction extends instruction_ge
7636                                      # 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
7637                                      if ($isAccredited === true                                      if ($isAccredited === true
7638                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {                                          && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7639                                          $dossier = new dossier($instr->getVal("dossier"));                                          $dossier = $this->f->get_inst__om_dbform(array(
7640                                                "obj" => "dossier",
7641                                                "idx" => $instr->getVal("dossier"),
7642                                            ));
7643                                          if ($dossier->is_user_from_allowed_collectivite()){                                          if ($dossier->is_user_from_allowed_collectivite()){
7644                                              $dossierTab[$instr->getVal("dossier")] = $dossier;                                              $dossierTab[$instr->getVal("dossier")] = $dossier;
7645                                          } else {                                          } else {
# Line 3922  class instruction extends instruction_ge Line 7685  class instruction extends instruction_ge
7685                                          $instr->dateDBToForm($valF['date_envoi_controle_legalite']);                                          $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7686                                      $valF['date_retour_controle_legalite']=                                      $valF['date_retour_controle_legalite']=
7687                                          $instr->dateDBToForm($valF['date_retour_controle_legalite']);                                          $instr->dateDBToForm($valF['date_retour_controle_legalite']);
   
7688                                      $valF['date_envoi_rar'] = $date;                                      $valF['date_envoi_rar'] = $date;
7689    
7690                                      // Vérification de la finalisation du document                                      // Vérification de la finalisation du document
# Line 3931  class instruction extends instruction_ge Line 7693  class instruction extends instruction_ge
7693                                          $instr->setParameter('maj', 1);                                          $instr->setParameter('maj', 1);
7694                                          $instr->class_actions[1]["identifier"] =                                          $instr->class_actions[1]["identifier"] =
7695                                              "envoi lettre RAR (depuis le menu suivi des pièces)";                                              "envoi lettre RAR (depuis le menu suivi des pièces)";
7696                                          if ($instr->modifier($valF, $f->db, DEBUG) == true) {                                          if ($instr->modifier($valF) == true) {
7697                                              $id4Gen[] = $code_barres;                                              $id4Gen[] = $code_barres;
7698                                              $nbLettres ++;                                              $nbLettres ++;
7699                                          } else {                                          } else {
# Line 3986  class instruction extends instruction_ge Line 7748  class instruction extends instruction_ge
7748           */           */
7749          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
7750          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
7751              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
7752          }          }
7753          // Affichage du message d'erreur          // Affichage du message d'erreur
7754          if(!empty($error)) {          if(!empty($error)) {
7755              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
7756          }          }
7757          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
7758          if ($nbLettres > 0) {          if ($nbLettres > 0) {
# Line 4002  class instruction extends instruction_ge Line 7764  class instruction extends instruction_ge
7764              echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");              echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7765              echo " : \n<br/><br/>";              echo " : \n<br/><br/>";
7766              echo "\n<a class='om-prev-icon pdf-16'";              echo "\n<a class='om-prev-icon pdf-16'";
7767              echo "\n title=\""._("imprimer les RAR")."\"";              echo "\n title=\""._("imprimer les AR")."\"";
7768              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)."\"";
7769              echo "\n target='_blank'>";              echo "\n target='_blank'>";
7770              echo _("Telecharger le document pour")." ".$nbLettres." "._("RAR");              echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7771              echo "\n</a>";              echo "\n</a>";
7772              echo "\n</span>";              echo "\n</span>";
7773              echo "\n</p>";              echo "\n</p>";
# Line 4027  class instruction extends instruction_ge Line 7789  class instruction extends instruction_ge
7789                      echo "\n<br/>";                      echo "\n<br/>";
7790                  }                  }
7791                  foreach ($dossierTab as $dossier) {                  foreach ($dossierTab as $dossier) {
7792                      
7793                        $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7794                        $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7795                        $code_datd = $inst_datd->getVal('code');
7796    
7797                        $obj = "dossier_instruction";
7798                        if ($code_datd === 'REC' OR $code_datd === 'REG') {
7799                            $obj = "dossier_contentieux_tous_recours";
7800                        }
7801                        if ($code_datd === 'IN') {
7802                            $obj = "dossier_contentieux_toutes_infractions";
7803                        }
7804    
7805                      echo "\n<div class=\"bloc group\">";                      echo "\n<div class=\"bloc group\">";
7806                      echo "\n<div class=\"field field-type-text\">";                      echo "\n<div class=\"field field-type-text\">";
7807    
7808                      echo "\n<p>";                      echo "\n<p>";
7809                      echo "\n<span class='text'>";                      echo "\n<span class='text'>";
7810                      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') . "\"";
7811                      echo "\n href=\"../scr/form.php?obj=dossier_instruction&action=3&idx=";                      echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7812                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
7813                      echo "\">";                      echo "\">";
7814                      echo "\n</a>";                      echo "\n</a>";
7815    
7816                      echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";                      echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7817                      echo " href=\"../scr/form.php?obj=dossier_instruction&action=3&idx=";                      echo " href=\"".OM_ROUTE_FORM."&obj=";
7818                        echo $obj;
7819                        echo "&action=3&idx=";
7820                      echo $dossier->getVal("dossier");                      echo $dossier->getVal("dossier");
7821                      echo "\">";                      echo "\">";
7822                      echo $dossier->getVal("dossier_libelle");                      echo $dossier->getVal("dossier_libelle");
# Line 4056  class instruction extends instruction_ge Line 7833  class instruction extends instruction_ge
7833              echo "\n</div>";              echo "\n</div>";
7834              echo "\n</div>";              echo "\n</div>";
7835          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
7836          // Ouverture du formulaire          // Ouverture du formulaire
7837          echo "\t<form";          echo "\t<form";
7838          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4067  class instruction extends instruction_ge Line 7842  class instruction extends instruction_ge
7842          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
7843          $champs = array("date", "liste_code_barres_instruction");          $champs = array("date", "liste_code_barres_instruction");
7844          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
7845          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
7846                "validation" => 0,
7847                "maj" => 0,
7848                "champs" => $champs,
7849            ));
7850          // Paramétrage du champ date du formulaire          // Paramétrage du champ date du formulaire
7851          $form->setLib("date", _("Date")."* :");          $form->setLib("date", _("Date")."* :");
7852          $form->setType("date", "date");          $form->setType("date", "date");
# Line 4087  class instruction extends instruction_ge Line 7866  class instruction extends instruction_ge
7866          $form->enpied();          $form->enpied();
7867          // Affichage du bouton          // Affichage du bouton
7868          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
7869          $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));          $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7870          echo "\t</div>\n";          echo "\t</div>\n";
7871          // Fermeture du formulaire          // Fermeture du formulaire
7872          echo "\t</form>\n";          echo "\t</form>\n";
# Line 4104  class instruction extends instruction_ge Line 7883  class instruction extends instruction_ge
7883          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
7884          $this->checkAccessibility();          $this->checkAccessibility();
7885    
         // XXX APP  
   
         $f = $this->f;  
   
7886          // Récupération des valeur passées en POST ou GET          // Récupération des valeur passées en POST ou GET
7887          if($f->get_submitted_post_value("type_mise_a_jour") !== null) {          if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7888              $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");
7889          } elseif($f->get_submitted_get_value('type_mise_a_jour') !== null) {          } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7890              $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');
7891          } else {          } else {
7892              $type_mise_a_jour = "";              $type_mise_a_jour = "";
7893          }          }
7894          if($f->get_submitted_post_value('date') !== null) {          if($this->f->get_submitted_post_value('date') !== null) {
7895              $date = $f->get_submitted_post_value('date');              $date = $this->f->get_submitted_post_value('date');
7896          } elseif($f->get_submitted_get_value('date') !== null) {          } elseif($this->f->get_submitted_get_value('date') !== null) {
7897              $date = $f->get_submitted_get_value('date');              $date = $this->f->get_submitted_get_value('date');
7898          } else {          } else {
7899              $date = "";              $date = "";
7900          }          }
7901          if($f->get_submitted_post_value('code_barres') !== null) {          if($this->f->get_submitted_post_value('code_barres') !== null) {
7902              $code_barres = $f->get_submitted_post_value('code_barres');              $code_barres = $this->f->get_submitted_post_value('code_barres');
7903          } elseif($f->get_submitted_get_value('code_barres') !== null) {          } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7904              $code_barres = $f->get_submitted_get_value('code_barres');              $code_barres = $this->f->get_submitted_get_value('code_barres');
7905          } else {          } else {
7906              $code_barres = "";              $code_barres = "";
7907          }          }
# Line 4138  class instruction extends instruction_ge Line 7913  class instruction extends instruction_ge
7913          $liste_champs=array();          $liste_champs=array();
7914    
7915          // Si le formulaire a été validé          // Si le formulaire a été validé
7916          if ($f->get_submitted_post_value('validation') !== null) {          if ($this->f->get_submitted_post_value('validation') !== null) {
7917              if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {              if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7918    
7919                  //Vérification de l'existance de l'instruction                  // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7920                  $sql = "SELECT instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";                  $group_clause = array();
7921                  $res = $f->db->query($sql);                  foreach ($_SESSION["groupe"] as $key => $value) {
7922                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                      $group_clause[$key] = "(groupe.code = '".$key."'";
7923                  $f->isDatabaseError($res);                      if($value["confidentiel"] !== true) {
7924                            $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7925                        }
7926                        $group_clause[$key] .= ")";
7927                    }
7928                    $conditions = implode(" OR ", $group_clause);
7929                    $groupFilter = " AND (" . $conditions . ")";
7930    
7931                  if($res->numrows() == 1) {                  $qres = $this->f->get_all_results_from_db_query(
7932                        sprintf(
7933                            'SELECT
7934                                instruction
7935                            FROM
7936                                %1$sinstruction
7937                                INNER JOIN %1$sdossier
7938                                    ON dossier.dossier = instruction.dossier
7939                                INNER JOIN %1$sdossier_instruction_type
7940                                    ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7941                                INNER JOIN %1$sdossier_autorisation_type_detaille
7942                                    ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7943                                INNER JOIN %1$sdossier_autorisation_type
7944                                    ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7945                                INNER JOIN %1$sgroupe
7946                                    ON dossier_autorisation_type.groupe = groupe.groupe
7947                                WHERE
7948                                    code_barres = \'%2$s\'
7949                                    %3$s',
7950                            DB_PREFIXE,
7951                            $this->f->db->escapeSimple($code_barres),
7952                            $groupFilter
7953                        ),
7954                        array(
7955                            'origin' => __METHOD__
7956                        )
7957                    );
7958                    if(count($qres['result']) === 1) {
7959                      $liste_champs = explode(";", $type_mise_a_jour);                      $liste_champs = explode(";", $type_mise_a_jour);
7960                        $row = array_shift($qres['result']);
7961                        $instr = $this->f->get_inst__om_dbform(array(
7962                            "obj" => "instruction",
7963                            "idx" => $row['instruction'],
7964                        ));
7965                      // Mise à jour des dates après l'écran de verification                      // Mise à jour des dates après l'écran de verification
7966                      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 and $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);  
7967                          $valF = array();                          $valF = array();
7968                          foreach($instr->champs as $id => $champ) {                          foreach($instr->champs as $id => $champ) {
7969                              $valF[$champ] = $instr->val[$id];                              $valF[$champ] = $instr->val[$id];
7970                          }                          }
7971                          $valF['date_evenement']=$instr->dateDBToForm($valF['date_evenement']);                          $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7972                          $valF['archive_date_complet']=$instr->dateDBToForm($valF['archive_date_complet']);                          $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7973                          $valF['archive_date_rejet']=$instr->dateDBToForm($valF['archive_date_rejet']);                          $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7974                          $valF['archive_date_limite']=$instr->dateDBToForm($valF['archive_date_limite']);                          $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7975                          $valF['archive_date_notification_delai']=$instr->dateDBToForm($valF['archive_date_notification_delai']);                          $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7976                          $valF['archive_date_decision']=$instr->dateDBToForm($valF['archive_date_decision']);                          $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7977                          $valF['archive_date_validite']=$instr->dateDBToForm($valF['archive_date_validite']);                          $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7978                          $valF['archive_date_achevement']=$instr->dateDBToForm($valF['archive_date_achevement']);                          $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7979                          $valF['archive_date_chantier']=$instr->dateDBToForm($valF['archive_date_chantier']);                          $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7980                          $valF['archive_date_conformite']=$instr->dateDBToForm($valF['archive_date_conformite']);                          $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7981                          $valF['archive_date_dernier_depot']=$instr->dateDBToForm($valF['archive_date_dernier_depot']);                          $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7982                          $valF['archive_date_limite_incompletude']=$instr->dateDBToForm($valF['archive_date_limite_incompletude']);                          $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7983                          $valF['date_finalisation_courrier']=$instr->dateDBToForm($valF['date_finalisation_courrier']);                          $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7984                          $valF['date_envoi_signature']=$instr->dateDBToForm($valF['date_envoi_signature']);                          $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7985                          $valF['date_retour_signature']=$instr->dateDBToForm($valF['date_retour_signature']);                          $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7986                          $valF['date_envoi_rar']=$instr->dateDBToForm($valF['date_envoi_rar']);                          $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7987                          $valF['date_retour_rar']=$instr->dateDBToForm($valF['date_retour_rar']);                          $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7988                          $valF['date_envoi_controle_legalite']=$instr->dateDBToForm($valF['date_envoi_controle_legalite']);                          $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7989                          $valF['date_retour_controle_legalite']=$instr->dateDBToForm($valF['date_retour_controle_legalite']);                          $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7990                            $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7991                            $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7992                            $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7993                            $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7994                            $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7995                            $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7996                            $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7997    
7998                          foreach(explode(";", $type_mise_a_jour) as $maj_date) {                          foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7999                              $valF[$maj_date]=$date;                              $valF[$maj_date]=$date;
# Line 4189  class instruction extends instruction_ge Line 8006  class instruction extends instruction_ge
8006                              $code_barres = "";                              $code_barres = "";
8007                                                            
8008                              //Désactivation de l'autocommit                              //Désactivation de l'autocommit
8009                              $f->db->autoCommit(false);                              $this->f->db->autoCommit(false);
8010                                                            
8011                              //On modifie les valeurs de l'instruction                              //On modifie les valeurs de l'instruction
8012                              $instr->setParameter('maj', 170);                              $instr->setParameter('maj', 170);
8013                              $instr->class_actions[170]["identifier"] =                              $instr->class_actions[170]["identifier"] =
8014                              "mise à jour des dates (depuis le menu suivi des pièces)";                              "mise à jour des dates (depuis le menu suivi des pièces)";
8015                              $retour = $instr->modifier($valF, $f->db, DEBUG);                              $retour = $instr->modifier($valF);
8016                                                            
8017                              //Si une erreur s'est produite, on défait les modifications                              //Si une erreur s'est produite, on défait les modifications
8018                              //qui ont été faites                              //qui ont été faites
# Line 4204  class instruction extends instruction_ge Line 8021  class instruction extends instruction_ge
8021                              }                              }
8022                              //Sinon, on valide en base de données les modifications                              //Sinon, on valide en base de données les modifications
8023                              else {                              else {
8024                                  $f->db->commit();                                  $this->f->db->commit();
8025                              }                              }
8026                                                            
8027                              // Variable correct retourné depuis la classe instruction                              // Variable correct retourné depuis la classe instruction
# Line 4226  class instruction extends instruction_ge Line 8043  class instruction extends instruction_ge
8043                          }                          }
8044                      } else {                      } else {
8045                          // Récupération des infos du dossier                          // Récupération des infos du dossier
8046                          $sqlInfo = "SELECT dossier.dossier_libelle,                          $qres = $this->f->get_all_results_from_db_query(
8047                                              evenement.libelle as evenement,                              sprintf(
8048                                              autorite_competente.code as autorite_competente_code,                                  'SELECT
8049                                              autorite_competente.libelle as autorite_competente,                                      dossier.dossier_libelle,
8050                                              evenement.type as evenement_type,                                      evenement.libelle as evenement,
8051                                              to_char(date_envoi_signature,'DD/MM/YYYY')  as date_envoi_signature,                                      autorite_competente.code as autorite_competente_code,
8052                                              to_char(date_retour_signature,'DD/MM/YYYY')  as date_retour_signature,                                      autorite_competente.libelle as autorite_competente,
8053                                              to_char(date_envoi_controle_legalite,'DD/MM/YYYY')  as date_envoi_controle_legalite,                                      evenement.type as evenement_type,
8054                                              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,
8055                                              to_char(date_envoi_rar,'DD/MM/YYYY')  as date_envoi_rar,                                      to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8056                                              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,
8057                                      FROM ".DB_PREFIXE."instruction                                      to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8058                                      INNER JOIN ".DB_PREFIXE."dossier ON                                      to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8059                                          dossier.dossier=instruction.dossier                                      to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8060                                      LEFT JOIN ".DB_PREFIXE."autorite_competente ON                                  FROM
8061                                          dossier.autorite_competente=autorite_competente.autorite_competente                                      %1$sinstruction
8062                                      INNER JOIN ".DB_PREFIXE."evenement ON                                      INNER JOIN %1$sdossier
8063                                          instruction.evenement=evenement.evenement                                          ON dossier.dossier=instruction.dossier
8064                                      WHERE code_barres='".$code_barres."'";                                      LEFT JOIN %1$sautorite_competente
8065                          $resInfo = $f->db->query($sqlInfo);                                          ON dossier.autorite_competente=autorite_competente.autorite_competente
8066                          $f->isDatabaseError($resInfo);                                      INNER JOIN %1$sevenement
8067                          $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);                                          ON instruction.evenement=evenement.evenement
8068                                    WHERE
8069                                        code_barres = \'%2$s\'',
8070                                    DB_PREFIXE,
8071                                    $this->f->db->escapeSimple($code_barres)
8072                                ),
8073                                array(
8074                                    "origin" => __METHOD__
8075                                )
8076                            );
8077                            $infos = array_shift($qres['result']);
8078    
8079                          // Vérification de la non modification des dates de suivi                          // Vérification de la non modification des dates de suivi
8080                          foreach(explode(";", $type_mise_a_jour) as $champ) {                          foreach(explode(";", $type_mise_a_jour) as $champ) {
8081                                if ($champ === 'date_envoi_controle_legalite') {
8082                                    if ($instr->is_sent_to_cl() === true) {
8083                                        $error = __("Les dates de suivis ne peuvent etre modifiees");
8084                                        $date_error = true;
8085                                        break;
8086                                    }
8087                                }
8088                              if($infos[$champ] != "" AND $infos[$champ] != $date) {                              if($infos[$champ] != "" AND $infos[$champ] != $date) {
8089                                  $error = _("Les dates de suivis ne peuvent etre modifiees");                                  $error = _("Les dates de suivis ne peuvent etre modifiees");
8090                                  $date_error = true;                                  $date_error = true;
8091                                    break;
8092                              }                              }
8093                          }                          }
8094                      }                      }
# Line 4271  class instruction extends instruction_ge Line 8106  class instruction extends instruction_ge
8106           */           */
8107          // Affichage du message de validation ou d'erreur          // Affichage du message de validation ou d'erreur
8108          if (isset($message) && isset($message_class) && $message != "") {          if (isset($message) && isset($message_class) && $message != "") {
8109              $f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8110          }          }
8111          // Affichage du message d'erreur          // Affichage du message d'erreur
8112          if(!empty($error)) {          if(!empty($error)) {
8113              $f->displayMessage("error", $error);              $this->f->displayMessage("error", $error);
8114          }          }
8115    
8116          // Affichage du message de validation de la saisie          // Affichage du message de validation de la saisie
8117          if($correct === true) {          if($correct === true) {
8118              $f->displayMessage("ok", _("Saisie enregistree"));              $this->f->displayMessage("ok", _("Saisie enregistree"));
8119          }          }
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8120          // Ouverture du formulaire          // Ouverture du formulaire
8121          echo "\t<form";          echo "\t<form";
8122          echo " method=\"post\"";          echo " method=\"post\"";
# Line 4301  class instruction extends instruction_ge Line 8134  class instruction extends instruction_ge
8134              $champs = array("type_mise_a_jour", "date", "code_barres");              $champs = array("type_mise_a_jour", "date", "code_barres");
8135          }          }
8136          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8137          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8138                "validation" => 0,
8139                "maj" => 0,
8140                "champs" => $champs,
8141            ));
8142          // Paramétrage des champs du formulaire          // Paramétrage des champs du formulaire
8143          // Parametrage du champ type_mise_a_jour          // Parametrage du champ type_mise_a_jour
8144          $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");          $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
# Line 4331  class instruction extends instruction_ge Line 8168  class instruction extends instruction_ge
8168          $contenu[1][4] = _("date de retour de controle de legalite");          $contenu[1][4] = _("date de retour de controle de legalite");
8169    
8170          $contenu[0][5] = "date_retour_rar";          $contenu[0][5] = "date_retour_rar";
8171          $contenu[1][5] = _("date de retour de l'AR");          $contenu[1][5] = __("date de notification du correspondant");
8172    
8173          $form->setSelect("type_mise_a_jour", $contenu);          $form->setSelect("type_mise_a_jour", $contenu);
8174    
# Line 4391  class instruction extends instruction_ge Line 8228  class instruction extends instruction_ge
8228              $form->setType("autorite_competente", "static");              $form->setType("autorite_competente", "static");
8229              $form->setVal("autorite_competente", $infos['autorite_competente']);              $form->setVal("autorite_competente", $infos['autorite_competente']);
8230    
8231              // Parametrage des libellés d'envoi avec RAR              // Parametrage des libellés d'envoi avec AR
8232              $form->setLib("date_envoi_rar", _("date_envoi_rar")." :");              $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8233              $form->setLib("date_retour_rar", _("date_retour_rar")." :");              $form->setLib("date_retour_rar", __("date_notification")." :");
8234    
8235              $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");              $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8236              $form->setLib("date_retour_signature", _("date_retour_signature")." :");              $form->setLib("date_retour_signature", _("date_retour_signature")." :");
# Line 4427  class instruction extends instruction_ge Line 8264  class instruction extends instruction_ge
8264          echo "\t<div class=\"formControls\">\n";          echo "\t<div class=\"formControls\">\n";
8265          //          //
8266          if(!$date_error) {          if(!$date_error) {
8267              $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));              $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8268          }          }
8269          // Si pas sur l'écran de validation          // Si pas sur l'écran de validation
8270          if(isset($infos)) {          if(isset($infos)) {
8271              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";
8272                  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;
8273              echo "\">Retour</a>";              echo "\">Retour</a>";
8274          }          }
# Line 4448  class instruction extends instruction_ge Line 8285  class instruction extends instruction_ge
8285      function view_pdf_lettre_rar() {      function view_pdf_lettre_rar() {
8286          // Vérification de l'accessibilité sur l'élément          // Vérification de l'accessibilité sur l'élément
8287          $this->checkAccessibility();          $this->checkAccessibility();
8288            //
8289            $this->f->disableLog();
8290    
8291          // XXX APP          if($this->f->get_submitted_get_value('liste') != null) {
8292                $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'));  
8293    
8294              // Classe permettant la mise en page de l'édition pdf              // Classe permettant la mise en page de l'édition pdf
8295              require_once "../obj/pdf_lettre_rar.class.php";              require_once "../obj/pdf_lettre_rar.class.php";
8296              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');              $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8297              // Initialisation de la mise en page              // Initialisation de la mise en page
8298              $pdf_lettre_rar->init($f);              $pdf_lettre_rar->init($this->f);
8299    
8300              foreach ($listeCodeBarres as $code_barres) {              foreach ($listeCodeBarres as $code_barres) {
8301    
8302                    // On récupère le dossier
8303                    $qres = $this->f->get_one_result_from_db_query(
8304                        sprintf(
8305                            'SELECT
8306                                dossier
8307                            FROM
8308                                %1$sinstruction
8309                            WHERE
8310                                code_barres = \'%2$s\'',
8311                            DB_PREFIXE,
8312                            $this->f->db->escapeSimple($code_barres)
8313                        ),
8314                        array(
8315                            "origin" => __METHOD__,
8316                        )
8317                    );
8318                    
8319                    $inst_dossier = $this->f->get_inst__om_dbform(array(
8320                        "obj" => "dossier",
8321                        "idx" => $qres['result'],
8322                    ));
8323    
8324                    // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8325                    $groupe = $inst_dossier->get_type_affichage_formulaire();
8326                    switch ($groupe) {
8327                        case 'CTX IN':
8328                            $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8329                            break;
8330                        case 'CTX RE':
8331                            $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8332                            break;
8333                        case 'ADS':
8334                        case 'DPC':
8335                        case 'CONSULTATION ENTRANTE':
8336                        default:
8337                            $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8338                            break;
8339                    }
8340    
8341                  // 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é
8342                  $sql = "SELECT                  $qres = $this->f->get_all_results_from_db_query(
8343                        sprintf(
8344                            'SELECT
8345                              dossier.dossier_libelle,                              dossier.dossier_libelle,
8346                              evenement.type,                              evenement.type,
8347                              count(lien_dossier_demandeur) as nbdemandeur,                              count(lien_dossier_demandeur) as nbdemandeur,
8348                              CASE                              CASE
8349                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL                                  WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8350                                      THEN CONCAT(phase.code, ' - ', division.libelle)                                      THEN CONCAT(phase.code, \' - \', division.libelle)
8351                                  ELSE                                  ELSE
8352                                      phase.code                                      phase.code
8353                              END AS code_phase                              END AS code_phase
8354                          FROM ".DB_PREFIXE."instruction                          FROM
8355                          LEFT JOIN ".DB_PREFIXE."dossier                              %1$sinstruction
8356                              ON instruction.dossier = dossier.dossier                              LEFT JOIN %1$sdossier
8357                          LEFT JOIN ".DB_PREFIXE."division                                  ON instruction.dossier = dossier.dossier
8358                              ON dossier.division = division.division                              LEFT JOIN %1$sdivision
8359                          INNER JOIN ".DB_PREFIXE."evenement ON                                  ON dossier.division = division.division
8360                              instruction.evenement=evenement.evenement                              INNER JOIN %1$sevenement
8361                          LEFT JOIN ".DB_PREFIXE."phase                                  ON instruction.evenement=evenement.evenement
8362                              ON evenement.phase = phase.phase                              LEFT JOIN %1$sphase
8363                          inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON                                  ON evenement.phase = phase.phase
8364                              instruction.dossier=lien_dossier_demandeur.dossier                              inner JOIN %1$slien_dossier_demandeur
8365                          inner join ".DB_PREFIXE."demandeur on                                  ON instruction.dossier=lien_dossier_demandeur.dossier
8366                              demandeur.demandeur=lien_dossier_demandeur.demandeur                              inner join %1$sdemandeur
8367                          WHERE code_barres='".$code_barres."'                                  ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8368                              AND ((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire')                          WHERE
8369                              OR demandeur.type_demandeur='delegataire')                              code_barres = \'%2$s\'
8370                          GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";                              AND %3$s
8371                            GROUP BY
8372                  $res = $f->db->query($sql);                              dossier.dossier_libelle,
8373                  $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);                              evenement.type,
8374                  $f->isDatabaseError($res);                              phase.code,
8375                  $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);                              division.libelle',
8376                            DB_PREFIXE,
8377                            $this->f->db->escapeSimple($code_barres),
8378                            $sql_demandeur
8379                        ),
8380                        array(
8381                            "origin" => __METHOD__
8382                        )
8383                    );
8384                    $testDemandeur = array_shift($qres['result']);
8385                                    
8386    
8387                  // 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."'";  
   
8388                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement                  // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8389                    $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8390                  if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {                  if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8391                      $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";                      $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
                 } else {  
                     $sqlAdresse .= " AND lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire'";  
8392                  }                  }
8393    
8394                  $resAdresse = $f->db->query($sqlAdresse);                  $qres = $this->f->get_all_results_from_db_query(
8395                  $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);                      sprintf(
8396                  $f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);                          'SELECT
8397                  $f->isDatabaseError($resAdresse);                              CASE WHEN demandeur.qualite = \'particulier\'
8398                                    THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8399                                    ELSE TRIM(demandeur.personne_morale_denomination)
8400                                END  as ligne1,
8401                                CASE WHEN demandeur.qualite = \'personne_morale\'
8402                                    THEN TRIM(demandeur.personne_morale_raison_sociale)
8403                                    ELSE \'\'
8404                                END as ligne1_1,
8405                                CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8406                                    THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8407                                    ELSE \'\'
8408                                END as ligne1_2,
8409                                trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8410                                CASE demandeur.complement
8411                                WHEN null THEN \'\'
8412                                ELSE trim(demandeur.complement)
8413                                END as ligne3,
8414                                CASE demandeur.lieu_dit
8415                                WHEN null THEN \'\'
8416                                ELSE trim(demandeur.lieu_dit)
8417                                END as ligne4,
8418                                CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8419                                    (CASE WHEN demandeur.bp IS NOT NULL
8420                                        THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8421                                        ELSE \'\'
8422                                    END),
8423                                    (CASE WHEN demandeur.cedex IS NOT NULL
8424                                        THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8425                                        ELSE \'\'
8426                                    END))
8427                                as ligne5,
8428                                code_barres as code_barres
8429                            FROM
8430                                %1$sinstruction
8431                                INNER JOIN %1$sdossier
8432                                    ON dossier.dossier = instruction.dossier
8433                                INNER JOIN %1$slien_dossier_demandeur
8434                                    ON dossier.dossier = lien_dossier_demandeur.dossier
8435                                INNER JOIN %1$sdemandeur
8436                                    ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8437                                LEFT OUTER JOIN %1$scivilite AS pc
8438                                    ON demandeur.particulier_civilite = pc.civilite
8439                                        OR demandeur.personne_morale_civilite = pc.civilite
8440                            WHERE
8441                                instruction.code_barres = \'%2$s\'
8442                                %3$s',
8443                            DB_PREFIXE,
8444                            $this->f->db->escapeSimple($code_barres),
8445                            $sqlAdresse
8446                        ),
8447                        array(
8448                            "origin" => __METHOD__
8449                        )
8450                    );
8451                    $adresse_dest = array_shift($qres['result']);
8452    
8453                  // Création adresse destinataire sans ligne vide                  // Création adresse destinataire sans ligne vide
8454                  $adresse_destinataire = array();                  $adresse_destinataire = array();
# Line 4582  class instruction extends instruction_ge Line 8478  class instruction extends instruction_ge
8478                  $specifique_content[] = $testDemandeur['dossier_libelle'];                  $specifique_content[] = $testDemandeur['dossier_libelle'];
8479                  $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";                  $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8480                  unset($adresse_dest['code_barres']);                  unset($adresse_dest['code_barres']);
   
8481                  // Ajout d'une page aux pdf                  // Ajout d'une page aux pdf
8482                  $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);                  $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8483    
8484              }              }
8485              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");              $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8486              require_once PATH_OPENMAIRIE."om_edition.class.php";              $om_edition = $this->f->get_inst__om_edition();
             $om_edition = new edition();  
8487              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");              $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8488          }          }
8489      }      }
# Line 4652  class instruction extends instruction_ge Line 8546  class instruction extends instruction_ge
8546                              $message .= "<a class='om-prev-icon pdf-16'";                              $message .= "<a class='om-prev-icon pdf-16'";
8547                              $message .= " id=\"generer_bordereau_envoi_maire\"";                              $message .= " id=\"generer_bordereau_envoi_maire\"";
8548                              $message .= " title=\""._("Bordereau")."\"";                              $message .= " title=\""._("Bordereau")."\"";
8549                              $message .= " href='../scr/form.php?obj=instruction";                              $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8550                              $message .= "&action=200";                              $message .= "&action=200";
8551                              $message .= "&idx=".$id_instruction."'";                              $message .= "&idx=".$id_instruction."'";
8552                              $message .= " target='_blank'>";                              $message .= " target='_blank'>";
# Line 4693  class instruction extends instruction_ge Line 8587  class instruction extends instruction_ge
8587              $this->f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
8588          }          }
8589    
         // Inclusion de la classe de gestion des formulaires  
         require_once "../obj/om_formulaire.class.php";  
8590          // Ouverture du formulaire          // Ouverture du formulaire
8591          $datasubmit = $this->getDataSubmit();          $datasubmit = $this->getDataSubmit();
8592          echo "\n<!-- ########## START DBFORM ########## -->\n";          echo "\n<!-- ########## START DBFORM ########## -->\n";
# Line 4711  class instruction extends instruction_ge Line 8603  class instruction extends instruction_ge
8603          $champs = array("code_barres","date");          $champs = array("code_barres","date");
8604    
8605          // Création d'un nouvel objet de type formulaire          // Création d'un nouvel objet de type formulaire
8606          $form = new formulaire(NULL, 0, 0, $champs);          $form = $this->f->get_inst__om_formulaire(array(
8607                "validation" => 0,
8608                "maj" => 0,
8609                "champs" => $champs,
8610            ));
8611    
8612          $template_required_label = '%s *';          $template_required_label = '%s *';
8613          // Parametrage du champ code_barres          // Parametrage du champ code_barres
# Line 4770  class instruction extends instruction_ge Line 8666  class instruction extends instruction_ge
8666      }      }
8667    
8668      /**      /**
8669       * Retourne l'événement d'instruction dont on donne le code-barres       * VIEW - view_rapport_instruction.
8670         *
8671         * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8672         * Cette action est bindée pour utiliser la fonction popUpIt.
8673         *
8674         * @return void
8675         */
8676        function view_overlay_notification_manuelle() {
8677    
8678            // Vérification de l'accessibilité sur l'élément
8679            $this->checkAccessibility();
8680    
8681            printf(
8682                '<script type="text/javascript" >
8683                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8684                </script>',
8685                'instruction_notification_manuelle',
8686                OM_ROUTE_SOUSFORM,
8687                $this->getVal($this->clePrimaire),
8688                $this->getVal('dossier')
8689            );
8690        }
8691    
8692        /**
8693         * VIEW - view_overlay_notification_service_consulte.
8694         *
8695         * Ouvre le sous-formulaire de notification des services consulte
8696         * en ajaxIt dans un overlay.
8697         * Cette action est bindée pour utiliser la fonction popUpIt.
8698         *
8699         * @return void
8700         */
8701        function view_overlay_notification_service_consulte() {
8702    
8703            // Vérification de l'accessibilité sur l'élément
8704            $this->checkAccessibility();
8705    
8706            printf(
8707                '<script type="text/javascript" >
8708                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8709                </script>',
8710                'instruction_notification_manuelle',
8711                OM_ROUTE_SOUSFORM,
8712                $this->getVal($this->clePrimaire),
8713                $this->getVal('dossier')
8714            );
8715        }
8716        
8717        /**
8718         * VIEW - overlay_notification_tiers_consulte.
8719         *
8720         * Ouvre le sous-formulaire de notification des tiers consulte
8721         * en ajaxIt dans un overlay.
8722         * Cette action est bindée pour utiliser la fonction popUpIt.
8723         *
8724         * @return void
8725         */
8726        function view_overlay_notification_tiers_consulte() {
8727    
8728            // Vérification de l'accessibilité sur l'élément
8729            $this->checkAccessibility();
8730    
8731            printf(
8732                '<script type="text/javascript" >
8733                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8734                </script>',
8735                'instruction_notification_manuelle',
8736                OM_ROUTE_SOUSFORM,
8737                $this->getVal($this->clePrimaire),
8738                $this->getVal('dossier')
8739            );
8740        }
8741    
8742        /**
8743         * VIEW - view_modale_selection_document_signe
8744         *
8745         * Ouvre le sous-formulaire de notification des services consulte
8746         * en ajaxIt dans un overlay.
8747         * Cette action est bindée pour utiliser la fonction popUpIt.
8748         *
8749         * @return void
8750         */
8751        function view_modale_selection_document_signe() {
8752    
8753            // Vérification de l'accessibilité sur l'élément
8754            $this->checkAccessibility();
8755    
8756            printf(
8757                '<script type="text/javascript" >
8758                    overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8759                </script>',
8760                'instruction_modale',
8761                OM_ROUTE_SOUSFORM,
8762                $this->getVal($this->clePrimaire),
8763                $this->getVal('dossier')
8764            );
8765        }
8766        
8767        /**
8768         * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8769         * pour exclure les dossiers du groupe contentieux.
8770       *       *
8771       * @param   [string]  $barcode  numéro du code-barres       * @param   [string]  $barcode  numéro du code-barres
8772       * @return  [mixed]             ID de son instruction ou null si aucun code       * @return  [mixed]             ID de son instruction ou null si aucun code
# Line 4778  class instruction extends instruction_ge Line 8774  class instruction extends instruction_ge
8774      function get_instruction_by_barcode($barcode) {      function get_instruction_by_barcode($barcode) {
8775          // Begin          // Begin
8776          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
8777    
8778          // Vérification de l'existence de l'événement d'instruction          // Vérification de l'existence de l'événement d'instruction
8779          // pour le code-barres donné          // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8780          $sql = "SELECT instruction          $qres = $this->f->get_one_result_from_db_query(
8781              FROM ".DB_PREFIXE."instruction              sprintf(
8782              WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";                  'SELECT
8783          $res = $this->f->db->getOne($sql);                      instruction
8784          $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);                  FROM
8785          $this->f->isDatabaseError($res);                      %1$sinstruction
8786                        INNER JOIN %1$sdossier
8787                            ON dossier.dossier=instruction.dossier
8788                        INNER JOIN %1$sdossier_instruction_type
8789                            ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8790                        INNER JOIN %1$sdossier_autorisation_type_detaille
8791                            ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8792                        INNER JOIN %1$sdossier_autorisation_type
8793                            ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8794                        INNER JOIN %1$sgroupe
8795                            ON dossier_autorisation_type.groupe = groupe.groupe
8796                                AND groupe.code != \'CTX\'
8797                    WHERE
8798                        code_barres = \'%2$s\'',
8799                    DB_PREFIXE,
8800                    $this->f->db->escapeSimple($barcode)
8801                ),
8802                array(
8803                    "origin" => __METHOD__,
8804                )
8805            );
8806            
8807          // Retourne résultat          // Retourne résultat
8808          return $this->end_treatment(__METHOD__, $res);          return $this->end_treatment(__METHOD__, $qres['result']);
8809      }      }
8810    
8811      /**      /**
# Line 4805  class instruction extends instruction_ge Line 8823  class instruction extends instruction_ge
8823          // Begin          // Begin
8824          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
8825          // Requête          // Requête
8826          $res = $this->db->autoExecute(          $res = $this->f->db->autoexecute(
8827              DB_PREFIXE.$this->table,              DB_PREFIXE.$this->table,
8828              $valF,              $valF,
8829              DB_AUTOQUERY_UPDATE,              DB_AUTOQUERY_UPDATE,
8830              $this->getCle($id)              $this->getCle($id)
8831          );          );
8832          // S'il y a eu une erreur          $this->addToLog(
8833          if (database::isError($res, true)) {              __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8834                VERBOSE_MODE
8835            );
8836            if ($this->f->isDatabaseError($res, true) !== false) {
8837              $this->end_treatment(__METHOD__, false);              $this->end_treatment(__METHOD__, false);
8838          }          }
8839          //          //
# Line 4824  class instruction extends instruction_ge Line 8845  class instruction extends instruction_ge
8845       * validation du formulaire d'ajout.       * validation du formulaire d'ajout.
8846       * @param array $val tableau des valeurs retournées par le formulaire       * @param array $val tableau des valeurs retournées par le formulaire
8847       */       */
8848      function setValFAjout($val) {      function setValFAjout($val = array()) {
8849          // Mise à jour du flag created_by_commune lors d'un changement de décision          // Mise à jour du flag created_by_commune lors d'un changement de décision
8850          // par un utilisateur de commune sur un dossier instruit par la comcom          // par un utilisateur de commune sur un dossier instruit par la comcom
8851          if($this->f->isInstrCanChangeDecision($this->valF["dossier"])) {          if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8852              $this->valF['created_by_commune'] = true;              $this->valF['created_by_commune'] = true;
8853          }          }
     }  
8854    
     /**  
      * Récupère l'instance du dossier d'instruction  
      *  
      * @param mixed Identifiant du dossier d'instruction  
      *  
      * @return object  
      */  
     function get_inst_dossier($dossier = null) {  
8855          //          //
8856          return $this->get_inst_common("dossier", $dossier);          if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8857                if (isset($this->valF['flag_edition_integrale']) === true) {
8858                    unset($this->valF['flag_edition_integrale']);
8859                }
8860                if (isset($this->valF['signataire_arrete']) === true) {
8861                    unset($this->valF['signataire_arrete']);
8862                }
8863            }
8864      }      }
8865    
8866    
8867      /**      /**
8868       * Récupère l'instance d'un événement de workflow.       * Récupère l'instance d'un événement de workflow.
8869       *       *
# Line 4986  class instruction extends instruction_ge Line 9006  class instruction extends instruction_ge
9006          // 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
9007          // dites de TREATMENT.          // dites de TREATMENT.
9008          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
9009          // Définition des paramètres          $message = __('Erreur de paramétrage :');
9010          $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';          $erreurParametrage = false;
9011          $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  
9012          $id_di = $this->getVal('dossier');          $id_di = $this->getVal('dossier');
         $id_inst = $this->getVal($this->clePrimaire);  
         // Instanciation du DI  
9013          $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  
9014          $collectivite_di = $di->getVal('om_collectivite');          $collectivite_di = $di->getVal('om_collectivite');
9015          $params_mono = $this->f->getCollectivite($collectivite_di);          // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9016          // Récupération du paramétrage de la collectivité multi          $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9017          $collectivite_multi = $this->f->get_idx_collectivite_multi();          if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9018          $params_multi = $this->f->getCollectivite($collectivite_multi);              $erreurParametrage = true;
9019          // Vérification de l'objet (obligatoirement multi)              $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9020          $objet = null;          }
9021          if (isset($params_multi[$p_objet]) === true  
9022              && $params_multi[$p_objet] !== '') {          // Récupération de la liste des mails
9023              $objet = $params_multi[$p_objet];          $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9024          }          if (empty($adresses)) {
9025          // Vérification du modèle mono en priorité              $erreurParametrage = true;
9026          $modele = null;              $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9027          if (isset($params_mono[$p_modele]) === true          }
9028              && $params_mono[$p_modele] !== '') {  
9029              $modele = $params_mono[$p_modele];          // Vérification du paramétrage des mails
9030                        $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9031          }          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9032          // Sinon vérification du modèle multi              $erreurParametrage = true;
9033          if ($modele === null              $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9034              && isset($params_multi[$p_modele]) === true          }
9035              && $params_multi[$p_modele] !== '') {          if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9036              $modele = $params_multi[$p_modele];              $erreurParametrage = true;
9037          }              $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9038          // Vérification des adresses de courriel mono          }
9039          $courriels_valides = array();  
9040          $courriels_invalides = array();          // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9041          if (isset($params_mono[$p_courriel]) === true          // un message a destination de l'utilisateur est affiché
9042              && $params_mono[$p_courriel] !== '') {          if ($erreurParametrage) {
9043              // Un mail par ligne              $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9044              $adresses = explode("\n", $params_mono[$p_courriel]);              $this->addToMessage($message);
9045              // 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;  
                 }  
             }  
9046          }          }
9047          // Vérification du paramétrage global :  
9048          // 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
9049          if ($objet === null          foreach ($adresses as $adresse) {
9050              || $modele === null              // Ajout de la notif et récupération de son id
9051              || count($courriels_valides) === 0              $destinataire = array(
9052              || count($courriels_invalides) > 0) {                  'destinataire' => $adresse,
9053              // On construit le message d'erreur adéquat                  'courriel' => $adresse
9054              $this->addToMessage(_('Erreur de paramétrage :'));              );
9055              if ($objet === null) {              $idNotif = $this->ajouter_notification(
9056                  $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));                  $this->getVal($this->clePrimaire),
9057              }                  $this->f->get_connected_user_login_name(),
9058              if ($modele === null) {                  $destinataire,
9059                  $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));                  $collectivite_di
9060              }              );
9061              if (count($courriels_valides) === 0) {              if ($idNotif === false) {
9062                  $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));                  $this->addToMessage(__("Veuillez contacter votre administrateur."));
9063                    return $this->end_treatment(__METHOD__, false);
9064              }              }
9065              if (count($courriels_invalides) > 0) {              // Création de la tache en lui donnant l'id de la notification
9066                  $courriels_invalides = implode(', ', $courriels_invalides);              $notification_by_task = $this->notification_by_task(
9067                  $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);                  $idNotif,
9068                    $this->getVal('dossier'),
9069                    'mail',
9070                    'notification_commune'
9071                );
9072                if ($notification_by_task === false) {
9073                    $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9074                    $this->addToMessage(__("Veuillez contacter votre administrateur."));
9075                    return $this->end_treatment(__METHOD__, false);
9076              }              }
             $this->addToMessage(_("Veuillez contacter votre administrateur."));  
             return $this->end_treatment(__METHOD__, false);  
9077          }          }
9078          // Remplacement des variables de substitution          $this->addToMessage(__('La commune a été notifiée.'));
         $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);  
         }  
         // Message de validation  
         $this->addToMessage(_('La commune a été notifiée.'));  
9079          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
9080      }      }
9081    
9082      /**      /**
      * 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;  
     }  
   
   
     /**  
9083       * Récupère l'instance de l'instructeur       * Récupère l'instance de l'instructeur
9084       *       *
9085       * @param integer $instructeur Identifiant de l'instructeur.       * @param integer $instructeur Identifiant de l'instructeur.
# Line 5145  class instruction extends instruction_ge Line 9105  class instruction extends instruction_ge
9105      }      }
9106    
9107    
9108       /**      /**
9109       * Récupère l'instance de la division.       * Récupère l'instance de la division.
9110       *       *
9111       * @param integer $division Identifiant de la division.       * @param integer $division Identifiant de la division.
# Line 5192  class instruction extends instruction_ge Line 9152  class instruction extends instruction_ge
9152          return $om_collectivite;          return $om_collectivite;
9153      }      }
9154    
9155        /*
9156         * CONDITION - can_user_access_dossier_contexte_ajout
9157         *
9158         * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9159         * formulaire d'ajout.
9160         * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9161         * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9162         *
9163         */
9164        function can_user_access_dossier_contexte_ajout() {
9165    
9166            ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9167                $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9168            //
9169            if ($id_dossier !== "") {
9170                $dossier = $this->f->get_inst__om_dbform(array(
9171                    "obj" => "dossier_instruction",
9172                    "idx" => $id_dossier,
9173                ));
9174                //
9175                return $dossier->can_user_access_dossier();
9176            }
9177            return false;
9178        }
9179    
9180       /*
9181         * CONDITION - can_user_access_dossier
9182         *
9183         * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9184         * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9185         * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9186         *
9187         */
9188        function can_user_access_dossier_contexte_modification() {
9189    
9190            $id_dossier = $this->getVal('dossier');
9191            //
9192            if ($id_dossier !== "" && $id_dossier !== null) {
9193                $dossier = $this->f->get_inst__om_dbform(array(
9194                    "obj" => "dossier_instruction",
9195                    "idx" => $id_dossier,
9196                ));
9197                //
9198                return $dossier->can_user_access_dossier();
9199            }
9200            return false;
9201        }
9202    
9203        /**
9204         * TREATMENT - envoyer_a_signature_sans_relecture
9205         *
9206         * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9207         *
9208         * @return boolean true si l'envoi a été effectué avec succès false sinon
9209         */
9210        function envoyer_a_signature_sans_relecture() {
9211            return $this->envoyer_a_signature();
9212        }
9213    
9214        /**
9215         * TREATMENT - envoyer_a_signature_avec_relecture
9216         *
9217         * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9218         *
9219         * @return boolean true si l'envoi a été effectué avec succès false sinon
9220         */
9221        function envoyer_a_signature_avec_relecture() {
9222            $is_forced_view_files = true;
9223            return $this->envoyer_a_signature($is_forced_view_files);
9224        }
9225    
9226        /**
9227         * TREATMENT - envoyer_a_signature
9228         *
9229         * Permet d'envoyer le document de l'instruction au parapheur pour signature
9230         *
9231         * @param  boolean  $is_forced_view_files  Indique si il y a une relecture (true) ou non (false)
9232         *
9233         * @return boolean true si l'envoi a été effectué avec succès false sinon
9234         */
9235        function envoyer_a_signature($is_forced_view_files = false) {
9236            $this->begin_treatment(__METHOD__);
9237            $this->correct = true;
9238    
9239            // Instanciation de l'objet signataire_arrete
9240            $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9241                'obj' => 'signataire_arrete',
9242                'idx' => $this->getVal('signataire_arrete'),
9243            ));
9244    
9245            // Instanciation de l'objet dossier
9246            $inst_dossier = $this->f->get_inst__om_dbform(array(
9247                'obj' => 'dossier',
9248                'idx' => $this->getVal('dossier'),
9249            ));
9250    
9251            //Instanciation de la classe electronicsignature
9252            $inst_es = $this->get_electronicsignature_instance();
9253            if ($inst_es === false) {
9254                $this->correct = false;
9255                return $this->end_treatment(__METHOD__, false);
9256            }
9257    
9258            // Vérifie si la notification se fait via l'application ou via le parapheur
9259            try {
9260                $notification_required = $inst_es->signer_notification_is_delegated();
9261            } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9262                // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9263                $notification_required = false;
9264            }
9265    
9266            // Si la notification est faite par l'application vérifie que l'adresse mail du
9267            // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9268            // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9269            // notification
9270            if ($notification_required === true) {
9271                $signer_mail = $inst_signataire_arrete->getVal('email');
9272                $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9273        
9274                $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9275    
9276                if (empty($signer_mail)) {
9277                    $this->correct = false;
9278                    $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9279                    $this->addToMessage($err_msg.$err_detail);
9280                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9281                    return $this->end_treatment(__METHOD__, false);
9282                }
9283                if (! $this->f->checkValidEmailAddress($signer_mail)) {
9284                    $this->correct = false;
9285                    $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9286                    $this->addToMessage($err_msg.$err_detail);
9287                    $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9288                    return $this->end_treatment(__METHOD__, false);
9289                }
9290            }
9291    
9292            // Récupération du document à signer
9293            $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9294            if ($file === OP_FAILURE) {
9295                $this->correct = false;
9296                $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9297                // Termine le traitement
9298                return $this->end_treatment(__METHOD__, false);
9299            }
9300    
9301            // Initialisation des paramètre à passer pour l'envoi en signature
9302            $data = array(
9303                "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9304                "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9305                "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9306                "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9307                "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9308                // Permet d'envoyer en signature l'instruction le jour de la date limite
9309                "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9310                "dossier" => $this->getVal('dossier'),
9311                "is_forced_view_files" => $is_forced_view_files,
9312                'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9313            );
9314    
9315            // Initialisation des métadonnées
9316            $metadonnee_dossier = $file['metadata'];
9317            // récupération de l'extension du fichier
9318            $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9319            // Modification du libellé du document transmis au parapheur
9320            // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9321            $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9322            $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9323    
9324            $metadonnee_dossier['url_di'] = sprintf(
9325                '%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',
9326                $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9327                $this->getVal('dossier')
9328            );
9329    
9330            $optional_data = null;
9331            // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9332            if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9333                $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9334                if (json_last_error() !== JSON_ERROR_NONE) {
9335                    $this->correct = false;
9336                    $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9337                    $this->addToLog(__METHOD__."(): ".
9338                        __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9339                            Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9340                    );
9341                    // Termine le traitement
9342                    return $this->end_treatment(__METHOD__, false);
9343                }
9344            }
9345    
9346            // Appel de la méthode de l'abstracteur send_for_signature()
9347            // Cette méthode doit retourner un tableau de valeur
9348            try {
9349                $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9350            }  catch (electronicsignature_exception $e) {
9351                $this->handle_electronicsignature_exception($e);
9352                return $this->end_treatment(__METHOD__, false);
9353            }
9354    
9355            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9356            $valF = array();
9357    
9358            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9359            foreach($this->champs as $identifiant => $champ) {
9360                $valF[$champ] = $this->val[$identifiant];
9361            }
9362            // On fait ensuite nos modifications spécifiques
9363            $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9364            $valF['statut_signature'] = $result['statut'];
9365            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9366            $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9367            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9368            $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9369            $ret = $this->modifier($valF);
9370    
9371            if ($ret === false) {
9372                $this->correct = false;
9373                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9374                // Termine le traitement
9375                return $this->end_treatment(__METHOD__, false);
9376            }
9377    
9378            // Notification du signataire
9379            if ($notification_required === true) {
9380                if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9381                    $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9382                    $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9383                    $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9384                    // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9385                    // precedemment
9386                    $this->init_record_data($this->getVal($this->clePrimaire));
9387                    $this->annuler_envoi_en_signature();
9388                    $this->correct = false;
9389                    return $this->end_treatment(__METHOD__, true);
9390                }
9391            }
9392    
9393            // Message
9394            $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9395            if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9396                && array_key_exists('signature_page_url', $result) === true) {
9397                $this->addToMessage(sprintf(
9398                    '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9399                    $result['signature_page_url'],
9400                    __("Signez directement le document")
9401                ));
9402            }
9403            if ($notification_required !== true) {
9404                $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9405            }
9406    
9407            // Tout s'est bien passé, on termine le traitement
9408            return $this->end_treatment(__METHOD__, true);
9409        }
9410    
9411        /**
9412         * Notifie le signataire d'un document à signer.
9413         * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9414         * En cas d'erreur ajoute une ligne dans les logs de l'application.
9415         *
9416         * @param  string  $signer_name         Nom du signataire
9417         * @param  string  $signer_mail         Mail du signataire
9418         * @param  string  $user_name           Nom de l'utilisateur openADS courant
9419         *
9420         * @return boolean  true si succés, false si erreur
9421         */
9422        protected function notify_signer($signer_name, $signer_mail, $user_name) {
9423            // message d'erreur
9424            $err_msg_log = sprintf(
9425                __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9426                $signer_name,
9427                $signer_mail,
9428                $this->getVal($this->clePrimaire)
9429            );
9430            $err_msg = sprintf(
9431                '%s %s (%s)"',
9432                __("Échec de la notification du signataire"),
9433                $signer_name,
9434                $signer_mail
9435            );
9436    
9437  }// fin classe          // vérification des informations requises
9438            if (empty($signer_name)) {
9439                $err_detail = __("le nom du signataire est vide");
9440                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9441                $this->addToMessage($err_msg.', '.$err_detail);
9442                return false;
9443            }
9444            if (empty($signer_mail)) {
9445                $err_detail = __("le courriel du signataire est vide");
9446                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9447                $this->addToMessage($err_msg.', '.$err_detail);
9448                return false;
9449            }
9450            if (empty($this->getVal('dossier'))) {
9451                $err_detail = __("l'identifiant du dossier est vide");
9452                $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9453                $this->addToMessage($err_msg.', '.$err_detail);
9454                return false;
9455            }
9456    
9457  ?>          // ajout de la notification à la liste des notifications de l'instruction
9458            $instruction_id = $this->getVal($this->clePrimaire);
9459            $inst_notif = $this->f->get_inst__om_dbform(array(
9460                "obj" => "instruction_notification",
9461                "idx" => "]",
9462            ));
9463            $notif_val = array(
9464                'instruction_notification' => null,
9465                'instruction' => $instruction_id,
9466                'automatique' => true,
9467                'emetteur' => $user_name,
9468                'date_envoi' => null,
9469                'destinataire' => "$signer_name <$signer_mail>",
9470                'courriel' => $signer_mail,
9471                'date_premier_acces' => null,
9472                'statut' => '',
9473                'commentaire' => ''
9474            );
9475            $add_notif = $inst_notif->ajouter($notif_val);
9476            if ($add_notif === false) {
9477                $err_detail = __("Échec de l'ajout de la notification.");
9478                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9479                $this->addToMessage($err_msg);
9480                return false;
9481            }
9482            $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9483    
9484            // ajout d'une tâche de notification (envoi du mail)
9485            $notification_task = $this->notification_by_task(
9486                $notification_id,
9487                $this->getVal('dossier'),
9488                'mail',
9489                'notification_signataire'
9490            );
9491            if ($notification_task === false) {
9492                $err_detail = sprintf(
9493                    __("Échec de l'ajout de la tâche de notification (notification %s)."),
9494                    $notification_id);
9495                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9496                $this->addToMessage($err_msg);
9497                return false;
9498            }
9499    
9500            // Vérification de la réussite de l'envoi du mail
9501            // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9502            // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9503            // qui viens d'être créée.
9504            // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9505            $qres = $this->f->get_one_result_from_db_query(
9506                sprintf(
9507                    'SELECT
9508                        state
9509                    FROM
9510                        %1$stask
9511                    WHERE
9512                        type = \'notification_signataire\'
9513                        AND category = \'mail\'
9514                        AND dossier = \'%2$s\'
9515                    ORDER BY
9516                        task DESC
9517                    LIMIT 1',
9518                    DB_PREFIXE,
9519                    $this->f->db->escapeSimple($this->getVal('dossier'))
9520                ),
9521                array(
9522                    'origin' => __METHOD__
9523                )
9524            );
9525            if ($qres['result'] === 'error') {
9526                $err_detail = sprintf(
9527                    __("Échec de l'envoi du mail de notification (notification %s)."),
9528                    $notification_id);
9529                $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9530                $this->addToMessage($err_msg);
9531                return false;
9532            }
9533    
9534            // succès de la planification de la notification
9535            $this->addToMessage(sprintf(
9536                __('Le signataire "%s (%s)" sera notifié prochainement'),
9537                $signer_name,
9538                $signer_mail));
9539            return true;
9540        }
9541    
9542        /**
9543         * Permet de récupérer la bonne date limite en fonction de si l'instruction
9544         * est en incomplet notifié ou non.
9545         * On peut ajouter des jours à cette date grâce au paramètre "delay".
9546         * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9547         * l'instruction en signature le jour de la date limite.
9548         *
9549         * @param int $delay Le nombre de jour à ajouter à la date limite.
9550         *
9551         * @return string $date_limite la date limite calculé ou false
9552         */
9553        private function compute_date_limite($delay) {
9554            // Instanciation de l'objet dossier
9555            $inst_dossier = $this->f->get_inst__om_dbform(array(
9556                'obj' => 'dossier',
9557                'idx' => $this->getVal('dossier'),
9558            ));
9559    
9560            $date_to_compute = null;
9561            if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9562              $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9563            } else {
9564              $date_to_compute = $inst_dossier->getVal('date_limite');
9565            }
9566            if ($date_to_compute != null) {
9567                return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9568            }
9569    
9570            return null;
9571        }
9572    
9573        /**
9574         * Permet de récupérer la traduction de la valeur de statut_signature
9575         *
9576         * @return string la valeur de statut_signature traduite | false
9577         */
9578        function get_trad_for_statut($value_to_trad){
9579            $statut_signature_tab = array(
9580                'waiting' => __('en préparation'),
9581                'in_progress' => __('en cours de signature'),
9582                'canceled' => __('signature annulée'),
9583                'expired' => __('délai de signature expiré'),
9584                'finished' => __('signé')
9585            );
9586            if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9587                return $statut_signature_tab[$value_to_trad];
9588            }
9589    
9590            return false;
9591        }
9592    
9593        /**
9594         * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9595         *
9596         * @return string (json) la valeur de historique_signature mis à jour | false
9597         */
9598        function get_updated_historique_signature($historique_signature_values) {
9599            
9600            $historique_signature_value_tab = $this->get_historique_signature_decoded();
9601    
9602            if ($historique_signature_value_tab === false) {
9603                $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9604                return false;
9605            }
9606    
9607            $last_val_historique_signature = array();
9608    
9609            // Si la tableau récupéré n'est pas vide alors
9610            // on récupère la dernière ligne du tableau
9611            if (empty($historique_signature_value_tab) === false) {
9612                $last_val_historique_signature = end($historique_signature_value_tab);
9613            }
9614    
9615            $format_date = '';
9616            $format_date_hour = '';
9617            $date_converted=array();
9618    
9619            $date_to_convert = array(
9620                'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9621                'date_limite_instruction' => $this->compute_date_limite(0),
9622                'date_retour_signature' => $historique_signature_values['date_retour_signature']
9623            );
9624    
9625            // Conversion des dates en fonction de leur format
9626            foreach ($date_to_convert as $key => $value) {
9627                $date_converted[$key] = null;
9628                if ($value != null) {
9629                    $format_date = 'd/m/Y';
9630                    $format_date_hour = 'd/m/Y H:i:s';
9631                    $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9632                }
9633            }
9634    
9635            // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9636            // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9637            // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9638            $tab_for_columns_trad = array(
9639                __('entry_date'),
9640                __('id_parapheur_signature'),
9641                __('emetteur'),
9642                __('signataire'),
9643                __('date_envoi'),
9644                __('date_limite'),
9645                __('date_retour'),
9646                __('statut_signature'),
9647                __('commentaire_signature')
9648            );
9649    
9650            array_push($historique_signature_value_tab, array(
9651                'entry_date' => date('d/m/Y H:i:s'),
9652                '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'],
9653                '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'],
9654                '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'],
9655                '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'],
9656                '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'],
9657                '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'],
9658                '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']),
9659                'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9660            ));
9661            
9662            return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9663        }
9664        
9665        /**
9666         * TREATMENT - annuler_envoi_en_signature
9667         *
9668         * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9669         *
9670         * @return boolean true si l'annulation a été effectué avec succès false sinon
9671         */
9672        function annuler_envoi_en_signature() {
9673            $this->begin_treatment(__METHOD__);
9674            $this->correct = true;
9675    
9676            //Instanciation de la classe electronicsignature
9677            $inst_es = $this->get_electronicsignature_instance();
9678            if ($inst_es === false) {
9679                $this->correct = false;
9680                return $this->end_treatment(__METHOD__, false);
9681            }
9682    
9683            $data = array();
9684            if (! empty($this->getVal('id_parapheur_signature'))) {
9685                $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9686            } else {
9687                $this->correct = false;
9688                $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9689                return $this->end_treatment(__METHOD__, false);
9690            }
9691    
9692            // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9693            // Cette méthode doit retourner un tableau de valeur
9694            try {
9695                $result = $inst_es->cancel_send_for_signature($data);
9696            }  catch (electronicsignature_exception $e) {
9697                $this->handle_electronicsignature_exception($e);
9698                return $this->end_treatment(__METHOD__, false);
9699            }
9700    
9701            // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9702            $valF = array();
9703    
9704            // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9705            foreach($this->champs as $identifiant => $champ) {
9706                $valF[$champ] = $this->val[$identifiant];
9707            }
9708            // On fait ensuite nos modifications spécifiques
9709            $valF['id_parapheur_signature'] = null;
9710            $valF['statut_signature'] = $result['statut'];
9711            $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9712            $valF['date_envoi_signature'] = null;
9713            $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9714    
9715            $ret = $this->modifier($valF);
9716    
9717            if ($ret === false) {
9718                $this->correct = false;
9719                $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9720                // Termine le traitement
9721                return $this->end_treatment(__METHOD__, false);
9722            }
9723    
9724            // Message
9725            $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9726    
9727            // Tout s'est bien passé, on termine le traitement
9728            return $this->end_treatment(__METHOD__, true);
9729        }
9730    
9731    
9732        /**
9733         * Récupère le contenu du champ historique_signature et le converti en tableau
9734         *
9735         * @return array sinon false en cas d'erreur
9736         */
9737        protected function get_historique_signature_decoded() {
9738            $val = str_replace("'", '"', $this->getVal('historique_signature'));
9739            if ($val === '' || $val == 'false') {
9740                $val = json_encode(array());
9741            }
9742            if($this->isJson($val) === false) {
9743                return false;
9744            }
9745            return json_decode($val, true);
9746        }
9747    
9748        /**
9749         * Récupère les informations à afficher dans le tableau de suivi à l'aide
9750         * d'une requête sql. Stocke ces informations dans un tableau.
9751         * Converti le tableau au format json et renvoi le json obtenu.
9752         *
9753         * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9754         * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9755         * La clause where de la requête est construite à partir du tableau contenant les types
9756         * de tâches fourni en paramètre.
9757         * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9758         *
9759         * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9760         * la date de premier accès ne sera pas affichée.
9761         *
9762         * @param array liste des tâches permettant d'identifier quelles notification afficher
9763         * @param boolean permet d'afficher les notifications non liées à des tâches
9764         * @return json
9765         */
9766        public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9767            $whereTypeTache = '';
9768            $sqlTaskNull = 'INNER';
9769    
9770            // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9771            $listeChampsTrad = array(
9772                __('emetteur'),
9773                __('date_envoi'),
9774                __('destinataire'),
9775                __('date_premier_acces'),
9776                __('instruction'),
9777                __('annexes'),
9778                __('statut'),
9779                __('commentaire')
9780            );
9781            $listeChamps = array(
9782                'emetteur',
9783                'date_envoi',
9784                'destinataire',
9785                'date_premier_acces',
9786                'instruction',
9787                'annexes',
9788                'statut',
9789                'commentaire'
9790            );
9791    
9792            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9793            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9794            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9795            // paramétrage
9796            if(is_bool($nonLieTache) && $nonLieTache === true) {
9797                $sqlTaskNull = 'LEFT';
9798            }
9799            // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9800            // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9801            // tiers consulté
9802            if (is_array($typeTache) && $typeTache != array()) {
9803                if (is_array($typeTache)) {
9804                    $whereTypeTache = sprintf(
9805                        'AND (task.type IN (%1$s))',
9806                        "'".implode("', '", $typeTache)."'"
9807                    );
9808                }
9809                // La date de premier accès n'a pas besoin d'être renseigné pour
9810                // les notifications des demandeurs via le portail citoyen.
9811                // Les notifications des demandeurs sont liés à 3 types de tâches
9812                // notification_recepisse, notification_instruction, notification_decision
9813                // Si le suivi de la notification concerne un de ces types de tâches on
9814                // considère que c'est une notification de demandeurs.
9815                // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9816                // via le portail. Par défaut si rien n'est paramétré on considère que la
9817                // notification est faite via le portail
9818                if ((in_array('notification_recepisse', $typeTache) ||
9819                in_array('notification_instruction', $typeTache) ||
9820                in_array('notification_decision', $typeTache))) {
9821                    $dossier = $this->getVal('dossier');
9822                    $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9823                    $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9824                    if ($modeNotification === PORTAL) {
9825                        $listeChamps = array(
9826                            'emetteur',
9827                            'date_envoi',
9828                            'destinataire',
9829                            'instruction',
9830                            'annexes',
9831                            'statut',
9832                            'commentaire'
9833                        );
9834                    }
9835                }
9836                // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9837                // de les afficher dans le suivi
9838                if (in_array('notification_depot_demat', $typeTache)) {
9839                    $listeChamps = array(
9840                        'emetteur',
9841                        'date_envoi',
9842                        'destinataire',
9843                        'instruction',
9844                        'statut',
9845                        'commentaire'
9846                    );
9847                }
9848            }
9849    
9850            $valSuivi = array();
9851            // Récupération des infos nécessaires à l'affichage du tableau
9852            $sql = sprintf(
9853                'SELECT DISTINCT
9854                    instruction_notification.instruction_notification,
9855                    -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9856                    CASE WHEN instruction_notification.automatique = TRUE
9857                        THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9858                        ELSE instruction_notification.emetteur
9859                    END as emetteur,
9860                    date_envoi,
9861                    instruction_notification.destinataire,
9862                    instruction_notification.date_premier_acces,
9863                    evenement.libelle as instruction,
9864                    instruction_notification.statut,
9865                    instruction_notification.commentaire,
9866                    annexes.instruction_annexe as annexes
9867                FROM
9868                    %1$sinstruction_notification
9869                    LEFT JOIN %1$sinstruction
9870                        ON instruction.instruction = instruction_notification.instruction
9871                    LEFT JOIN %1$sevenement
9872                        ON instruction.evenement = evenement.evenement
9873                    LEFT JOIN %1$sinstruction_notification_document
9874                        ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9875                        AND instruction_notification_document.annexe = true
9876                    -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9877                    %4$s JOIN %1$stask
9878                        ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9879                            %3$s
9880                    -- Récupération de la liste des annexes sous la forme d une liste
9881                    LEFT JOIN (
9882                        SELECT
9883                            instruction_notification,
9884                            -- Récupère la liste des annexes de la notification
9885                            -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9886                            -- à l affichage du lien vers les annexes
9887                            CONCAT(
9888                                \'[\',
9889                                STRING_AGG(
9890                                    -- Affiche le nom du fichier selon le type de document/pièce
9891                                    CASE
9892                                        WHEN instruction_notification_document.document_type = \'instruction\'
9893                                            THEN CONCAT(
9894                                                    \'{
9895                                                        "obj" : "instruction",
9896                                                        "champs" : "om_fichier_instruction",
9897                                                        "label" : "\', evenement.libelle, \'",
9898                                                        "id" : "\', instruction.instruction,\'"
9899                                                    }\'
9900                                                )
9901                                        WHEN instruction_notification_document.document_type = \'consultation\'
9902                                            THEN CONCAT(
9903                                                \'{
9904                                                    "obj" : "consultation",
9905                                                    "champs" : "fichier",
9906                                                    "label" : "\',
9907                                                    CONCAT_WS(
9908                                                        \' - \',
9909                                                        \'Avis\',
9910                                                        service.libelle,
9911                                                        to_char(consultation.date_retour,\'DD/MM/YYYY\')
9912                                                    ),
9913                                                    \'", "id" : "\',
9914                                                    consultation.consultation,
9915                                                    \'"}\'
9916                                                )
9917                                    ELSE
9918                                        CONCAT(
9919                                            \'{
9920                                                "obj" : "document_numerise",
9921                                                "champs" : "uid",
9922                                                "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9923                                                "id" : "\', document_numerise.document_numerise,\'"
9924                                            }\'
9925                                        )
9926                                    END,
9927                                    \', \'),
9928                                \']\'
9929                            ) AS instruction_annexe
9930                        FROM
9931                            %1$sinstruction_notification_document
9932                            LEFT JOIN %1$sinstruction
9933                                ON instruction_notification_document.instruction = instruction.instruction
9934                            LEFT JOIN %1$sevenement
9935                                ON instruction.evenement = evenement.evenement
9936                            LEFT JOIN %1$sconsultation
9937                                ON instruction_notification_document.document_id = consultation.consultation
9938                            LEFT JOIN %1$sservice
9939                                ON consultation.service = service.service
9940                            LEFT JOIN %1$sdocument_numerise
9941                                ON instruction_notification_document.document_id = document_numerise.document_numerise
9942                            LEFT JOIN %1$sdocument_numerise_type
9943                                ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9944                        WHERE
9945                            instruction_notification_document.annexe = \'t\'
9946                        GROUP BY
9947                            instruction_notification
9948                    ) AS annexes
9949                        ON
9950                            annexes.instruction_notification = instruction_notification.instruction_notification
9951                WHERE
9952                    instruction.instruction = %2$s
9953                ORDER BY
9954                    date_envoi ASC, instruction_notification.destinataire ASC',
9955                DB_PREFIXE,
9956                intval($this->getVal('instruction')),
9957                $whereTypeTache,
9958                $sqlTaskNull
9959            );
9960            $qres = $this->f->get_all_results_from_db_query($sql, array(
9961                    "origin" => __METHOD__
9962                )
9963            );
9964            // Préparation du lien de téléchargement des annexes
9965            $htmlList =
9966                '<style>
9967                    #content .gridjs-td a.lien_annexe {
9968                        text-decoration : underline dotted 1px;
9969                    }
9970                    #content a.lien_annexe:hover {
9971                        text-decoration : underline solid 1px;
9972                        color : #46aede;
9973                    }
9974                    ol {padding-left : 10px;}
9975                </style>
9976                <ol>%1$s</ol>';
9977            $lienTelechargement =
9978            '<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">
9979                Annexe
9980            </a>';
9981            // Stockage des infos de chaque notification dans un tableau
9982            foreach ($qres['result'] as $row) {
9983                $valNotif = array();
9984                foreach($listeChamps as $champ) {
9985                    $valNotif[$champ] = $row[$champ];
9986                    if (($champ === 'date_envoi'
9987                        || $champ === 'date_premier_acces')
9988                        && $row[$champ] !== null
9989                        && $row[$champ] !== '') {
9990                        //
9991                        $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9992                    } else if ($champ === 'annexes') {
9993                        $listeAnnexe = '';
9994                        $infoAnnexes = json_decode($row[$champ], true);
9995                        if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9996                            // A partir des infos récupérées prépare le code html du lien vers chacune
9997                            // des annexes et ajoute un élément de liste par annexe
9998                            foreach($infoAnnexes as $annexe) {
9999                                $listeAnnexe .= sprintf(
10000                                    '<li>%s</li>',
10001                                    sprintf($lienTelechargement,
10002                                        $annexe['obj'],
10003                                        $annexe['champs'],
10004                                        $annexe['id'],
10005                                        $annexe['label']
10006                                    )
10007                                );
10008                            }
10009                            // Construction de la liste des annexes
10010                            $valNotif[$champ] = sprintf(
10011                                $htmlList,
10012                                $listeAnnexe
10013                            );
10014                        }
10015                    }
10016                }
10017                array_push($valSuivi, $valNotif);
10018            }
10019    
10020            // Passage du tableau au format json
10021            return json_encode($valSuivi, JSON_HEX_APOS);
10022        }
10023    
10024        /**
10025         * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10026         *
10027         * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10028         *
10029         * @return void
10030         */
10031        public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10032            $this->f->displayMessage('error', $exception->getMessage());
10033        }
10034    
10035    
10036        /**
10037         * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10038         *
10039         * @param  boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10040         * @return electronicsignature        Instance de l'abstracteur.
10041         */
10042        public function get_electronicsignature_instance($with_handle_error = true) {
10043            if(isset($this->electronicsignature_instance)) {
10044                return $this->electronicsignature_instance;
10045            }
10046            // Instanciation du connecteur electronicsignature
10047            try {
10048                require_once "electronicsignature.class.php";
10049                $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10050                $this->electronicsignature_instance = new electronicsignature($collectivites);
10051            } catch (electronicsignature_exception $e) {
10052                if ($with_handle_error === true) {
10053                    $this->handle_electronicsignature_exception($e);
10054                }
10055                return false;
10056            }
10057            return $this->electronicsignature_instance;
10058        }
10059    
10060        /**
10061         * TREATMENT - envoyer_au_controle_de_legalite
10062         *
10063         * Ajoute la tâche envoi_CL.
10064         * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10065         *
10066         * @return [type] [description]
10067         */
10068        function envoyer_au_controle_de_legalite() {
10069            $this->begin_treatment(__METHOD__);
10070            $this->correct = true;
10071    
10072            //
10073            if ($this->can_be_sended_to_cl() === true) {
10074                // Création de la task 'envoi_CL'
10075                $inst_task = $this->f->get_inst__om_dbform(array(
10076                    "obj" => "task",
10077                    "idx" => 0,
10078                ));
10079                $task_val = array(
10080                    'type' => 'envoi_CL',
10081                    'object_id' => $this->getVal('instruction'),
10082                    'dossier' => $this->getVal('dossier'),
10083                );
10084                // Change l'état de la tâche de notification en fonction de l'état de
10085                // transmission du dossier d'instruction
10086                $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10087                if ($this->f->is_option_mode_service_consulte_enabled() === false
10088                    && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10089                    || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10090                    //
10091                    $task_val['state'] = $inst_task::STATUS_DRAFT;
10092                }
10093                $add_task = $inst_task->add_task(array('val' => $task_val));
10094                if ($add_task === false) {
10095                    $this->addToMessage(sprintf('%s %s',
10096                        __("Une erreur s'est produite lors de la création tâche."),
10097                        __("Veuillez contacter votre administrateur.")
10098                    ));
10099                    $this->correct = false;
10100                    return $this->end_treatment(__METHOD__, false);
10101                }
10102                // Mise à jour du champs 'envoye_cl_platau'
10103                $instr_val = array(
10104                    'envoye_cl_platau' => 't',
10105                );
10106                $res = $this->f->db->autoExecute(
10107                    DB_PREFIXE.$this->table,
10108                    $instr_val,
10109                    DB_AUTOQUERY_UPDATE,
10110                    $this->getCle($this->getVal($this->clePrimaire))
10111                );
10112                $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10113                if ($this->f->isDatabaseError($res, true) === true) {
10114                    $this->addToMessage(sprintf('%s %s',
10115                        __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10116                        __("Veuillez contacter votre administrateur.")
10117                    ));
10118                    $this->correct = false;
10119                    return $this->end_treatment(__METHOD__, false);
10120                }
10121                // Message de validation à l'utilisateur
10122                $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10123                $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10124            }
10125            //
10126            return $this->end_treatment(__METHOD__, true);
10127        }
10128    
10129    
10130        /**
10131         * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10132         *
10133         * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10134         *                     la vue 'sousformulaire'.
10135         *
10136         * @return string
10137         */
10138        function get_back_link($view = "formulaire") {
10139            //
10140            $href = parent::get_back_link($view);
10141            //
10142            $crud = $this->get_action_crud();
10143    
10144            // Redirection vers le formulaire de modification à la validation du
10145            // formulaire d'ajout si l'événement associé possède une lettre type
10146            if (($crud === 'create'
10147                    || ($crud === null
10148                        && $this->getParameter('maj') == 0))
10149                    && $this->correct == true
10150                    && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10151    
10152                // On instancie l'instruction
10153                $inst_instruction = $this->f->get_inst__om_dbform(array(
10154                    "obj" => "instruction",
10155                    "idx" => $this->valF[$this->clePrimaire],
10156                ));
10157    
10158                // Si l'instruction n'est pas finalisée automatiquement
10159                if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10160                    $href = str_replace("&action=3", "&action=1", $href);
10161                    //
10162                    if (strpos($href, "&retour=tab") !== false) {
10163                        $href = str_replace("&retour=tab", "&retour= form", $href);
10164                    } else {
10165                        $href .= "&retour=form";
10166                    }
10167                }
10168            }
10169    
10170            //
10171            return $href;
10172        }
10173    
10174        public function view_json_data() {
10175            $this->checkAccessibility();
10176            $this->f->disableLog();
10177            $view = $this->get_json_data();
10178            printf(json_encode($view));
10179        }
10180    
10181        public function get_json_data() {
10182            $val = array_combine($this->champs, $this->val);
10183            foreach ($val as $key => $value) {
10184                $val[$key] = strip_tags($value);
10185            }
10186            $val['tacite'] = 'f';
10187            $inst_ad = $this->f->get_inst__om_dbform(array(
10188                "obj" => "avis_decision",
10189                "idx" => $val['avis_decision'],
10190            ));
10191            if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10192                $val['tacite'] = 't';
10193            }
10194            return $val;
10195        }
10196    
10197        /**
10198         * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10199         * comme événement lié le suivant définit dans l'événement de l'instruction
10200         * instanciée.
10201         *
10202         * @param  string  $next_type   Correspond aux trois déclenchement automatique
10203         *                              de création d'instruction paramétré sur un événement.
10204         * @param  integer $instruction Identifiant de l'instruction à instancier.
10205         * @return mixed                Identifiant de l'instruction recherchée ou false.
10206         */
10207        public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10208            if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10209                return false;
10210            }
10211            $result = array();
10212            $evenements = array();
10213            if ($instruction === null) {
10214                $instruction = $this->getVal($this->clePrimaire);
10215                $evenement = $this->getVal('evenement');
10216                $dossier = $this->getVal('dossier');
10217            } else {
10218                $inst = $this->f->get_inst__om_dbform(array(
10219                    "obj" => "instruction",
10220                    "idx" => $instruction,
10221                ));
10222                $evenement = $inst->getVal('evenement');
10223                $dossier = $inst->getVal('dossier');
10224            }
10225            // Récupération de l'identifiant de l'événement paramétré comme suivant
10226            // sur l'instruction instanciée
10227            $qres = $this->f->get_one_result_from_db_query(
10228                sprintf(
10229                    'SELECT
10230                        evenement_%3$s
10231                    FROM
10232                        %1$sevenement
10233                    WHERE
10234                        evenement = %2$s',
10235                    DB_PREFIXE,
10236                    intval($evenement),
10237                    $next_type
10238                ),
10239                array(
10240                    "origin" => __METHOD__,
10241                    "force_return" => true,
10242                )
10243            );
10244            if ($qres["code"] !== "OK") {
10245                return false;
10246            }
10247            $ev_next = $qres["result"];
10248            // Récupération de l'instruction dans le dossier utilisant l'événement
10249            // suivant identifié dans la requête précédente
10250            $qres = $this->f->get_one_result_from_db_query(
10251                sprintf(
10252                    'SELECT
10253                        MAX(instruction.instruction) as instruction
10254                    FROM
10255                        %1$sinstruction
10256                    WHERE
10257                        dossier = \'%3$s\'
10258                        AND evenement = %2$s',
10259                    DB_PREFIXE,
10260                    intval($ev_next),
10261                    $this->f->db->escapeSimple($dossier)
10262                ),
10263                array(
10264                    "origin" => __METHOD__,
10265                    "force_return" => true,
10266                )
10267            );
10268            if ($qres["code"] !== "OK") {
10269                return false;
10270            }
10271            return $qres["result"];
10272        }
10273    
10274        public function get_related_instructions($instruction = null) {
10275            $result = array();
10276            $evenements = array();
10277            if ($instruction === null) {
10278                $instruction = $this->getVal($this->clePrimaire);
10279                $evenement = $this->getVal('evenement');
10280                $dossier = $this->getVal('dossier');
10281            } else {
10282                $inst = $this->f->get_inst__om_dbform(array(
10283                    "obj" => "instruction",
10284                    "idx" => $instruction,
10285                ));
10286                $evenement = $inst->getVal('evenement');
10287                $dossier = $inst->getVal('dossier');
10288            }
10289            //
10290            $qres = $this->f->get_one_result_from_db_query(
10291                sprintf(
10292                    'SELECT
10293                        evenement
10294                    FROM
10295                        %1$sevenement
10296                    WHERE
10297                        evenement_retour_ar = %2$s
10298                        OR evenement_retour_signature = %2$s',
10299                    DB_PREFIXE,
10300                    intval($evenement)
10301                ),
10302                array(
10303                    "origin" => __METHOD__,
10304                    "force_return" => true,
10305                )
10306            );
10307            if ($qres["code"] !== "OK") {
10308                return false;
10309            }
10310            $ev_parent = $qres["result"];
10311            //
10312            $qres = $this->f->get_one_result_from_db_query(
10313                sprintf(
10314                    'SELECT
10315                        MAX(instruction.instruction) as instruction
10316                    FROM
10317                        %1$sinstruction
10318                    WHERE
10319                        dossier = \'%3$s\'
10320                        AND evenement = %2$s',
10321                    DB_PREFIXE,
10322                    intval($ev_parent),
10323                    $this->f->db->escapeSimple($dossier)
10324                ),
10325                array(
10326                    "origin" => __METHOD__,
10327                    "force_return" => true,
10328                )
10329            );
10330            if ($qres["code"] !== "OK") {
10331                return false;
10332            }
10333            $result[] = $qres["result"];
10334            //
10335            $qres = $this->f->get_one_result_from_db_query(
10336                sprintf(
10337                    'SELECT
10338                        evenement_retour_ar
10339                    FROM
10340                        %1$sevenement
10341                    WHERE
10342                        evenement = %2$d
10343                        AND evenement_retour_ar != %3$d',
10344                    DB_PREFIXE,
10345                    intval($ev_parent),
10346                    intval($evenement)
10347                ),
10348                array(
10349                    "origin" => __METHOD__,
10350                    "force_return" => true,
10351                )
10352            );
10353            if ($qres["code"] !== "OK") {
10354                return false;
10355            }
10356            $evenements[] = $qres["result"];
10357            //
10358            $qres = $this->f->get_one_result_from_db_query(
10359                sprintf(
10360                    'SELECT
10361                        evenement_retour_signature
10362                    FROM
10363                        %1$sevenement
10364                    WHERE
10365                        evenement = %2$s
10366                        AND evenement_retour_signature != %3$s
10367                    ',
10368                    DB_PREFIXE,
10369                    intval($ev_parent),
10370                    intval($evenement)
10371                ),
10372                array(
10373                    "origin" => __METHOD__,
10374                    "force_return" => true,
10375                )
10376            );
10377            if ($qres["code"] !== "OK") {
10378                return false;
10379            }
10380            $evenements[] = $qres["result"];
10381            foreach ($evenements as $value) {
10382                if ($value !== null) {
10383                    $qres = $this->f->get_one_result_from_db_query(
10384                        sprintf(
10385                            'SELECT
10386                                MAX(instruction.instruction) as instruction
10387                            FROM
10388                                %1$sinstruction
10389                            WHERE
10390                                dossier = \'%3$s\'
10391                                AND evenement = %2$s',
10392                            DB_PREFIXE,
10393                            intval($value),
10394                            $this->f->db->escapeSimple($dossier)
10395                        ),
10396                        array(
10397                            "origin" => __METHOD__,
10398                            "force_return" => true,
10399                        )
10400                    );
10401                    if ($qres["code"] !== "OK") {
10402                        return false;
10403                    }
10404                    $result[] = $qres["result"];
10405                }
10406            }
10407            return $result;
10408        }
10409    
10410        protected function getDocumentType($champ = null) {
10411            $evenementId = $this->getVal('evenement');
10412            if (! empty($evenementId)) {
10413                $evenement = $this->f->findObjectById('evenement', $evenementId);
10414                if (! empty($evenement)) {
10415                    return __("Instruction").':'.$evenement->getVal('libelle');
10416                }
10417            }
10418            return parent::getDocumentType();
10419        }
10420    
10421        /**
10422         * Récupère à l'aide d'une requête sql la liste des demandeurs
10423         * pouvant être notifié. C'est à dire les demandeurs acceptant
10424         * les notifications et pour lesquels une adresse mail existe.
10425         *
10426         * Dans le cas, d'une notification pour le portail citoyen, seul
10427         * le pétitionnaire principal doit être notifier et uniquement si
10428         * il a une adress mail et qu'il accepte les notifications.
10429         *
10430         * @param string identifiant du dossier
10431         * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10432         * pour une notification de categorie portail
10433         * @return array liste des demandeurs pouvant être notifié
10434        */
10435        protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10436            if ($idDossier === null) {
10437                $idDossier = $this->getVal('dossier');
10438            }
10439            // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10440            // pour une notification depuis le portail citoyen
10441            $sqlPetitionnairePrincipal = '';
10442            // Gestion des champs nécessaires pour la notification d'un demandeur
10443            $condition_demandeur = "AND demandeur.notification = 't'
10444                AND demandeur.courriel IS NOT NULL";
10445            if ($portail === true) {
10446                $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10447                $condition_demandeur = "AND (
10448                        (notification = 't' AND courriel IS NOT NULL)
10449                        OR demande.source_depot = 'portal'
10450                    )";
10451            }
10452    
10453            $listeDemandeursNotifiable = array();
10454    
10455            // Requête de récupération des demandeurs
10456            $qres = $this->f->get_all_results_from_db_query(
10457                sprintf(
10458                    'SELECT
10459                        demandeur.demandeur,
10460                        CASE
10461                            WHEN demandeur.qualite=\'particulier\'
10462                            THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10463                        ELSE
10464                            TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10465                        END AS destinataire,
10466                        demandeur.courriel,
10467                        petitionnaire_principal
10468                    FROM
10469                        %1$sdossier
10470                        INNER JOIN %1$slien_dossier_demandeur
10471                            ON dossier.dossier = lien_dossier_demandeur.dossier
10472                        INNER JOIN %1$sdemandeur
10473                            ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10474                        -- Récupération de la plus ancienne demande associée au dossier (la demande
10475                        -- de création du dossier)
10476                        INNER JOIN (
10477                            SELECT
10478                                demande,
10479                                dossier_instruction,
10480                                source_depot
10481                            FROM
10482                                %1$sdemande
10483                            WHERE
10484                                dossier_instruction = \'%2$s\'
10485                            ORDER BY
10486                                demande ASC
10487                            LIMIT 1
10488                        ) as demande
10489                            ON dossier.dossier = demande.dossier_instruction
10490                    WHERE
10491                        dossier.dossier = \'%2$s\'
10492                        %3$s
10493                        %4$s',
10494                    DB_PREFIXE,
10495                    $this->f->db->escapeSimple($idDossier),
10496                    $condition_demandeur,
10497                    $sqlPetitionnairePrincipal
10498                ),
10499                array(
10500                    "origin" => __METHOD__
10501                )
10502            );
10503            // Récupération des infos des demandeurs et stockage dans un tableau
10504            // ayant pour clé les id des demandeurs
10505            foreach ($qres['result'] as $row) {
10506                $listeDemandeursNotifiable[$row['demandeur']] = $row;
10507            }
10508    
10509            return $listeDemandeursNotifiable;
10510        }
10511    
10512        /**
10513         * Renvoie la liste des notifications liées à l'instruction
10514         *
10515         * @param integer id de l'instruction dont on cherche les notifications
10516         * @return array liste des instruction_notification liés à l'instruction
10517         */
10518        public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10519            $whereTypeTache = '';
10520            $sqlTaskNull = 'INNER';
10521            // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10522            // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10523            // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10524            // paramétrage
10525            if(is_bool($nonLieTache) && $nonLieTache === true) {
10526                $sqlTaskNull = 'LEFT';
10527            }
10528            if ($typeNotification != null) {
10529                if (is_array($typeNotification)) {
10530                    $whereTypeTache = sprintf(
10531                        'AND (task.type IN (%1$s))',
10532                        "'".implode("', '", $typeNotification)."'"
10533                    );
10534                } else {
10535                    $whereTypeTache = sprintf(
10536                        'AND (task.type = \'%1$s\')',
10537                        $typeNotification
10538                    );
10539                }
10540            }
10541            $listeInstrNotif = array();
10542            $qres = $this->f->get_all_results_from_db_query(
10543                sprintf('
10544                    SELECT
10545                        instruction_notification.instruction_notification
10546                    FROM
10547                        %1$sinstruction_notification
10548                        %4$s JOIN %1$stask
10549                            ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10550                            %3$s
10551                    WHERE
10552                        instruction = %2$s',
10553                    DB_PREFIXE,
10554                    intval($id_instruction),
10555                    $whereTypeTache,
10556                    $sqlTaskNull
10557                ),
10558                array(
10559                    "origin" => __METHOD__
10560                )
10561            );
10562            foreach ($qres['result'] as $row) {
10563                $listeInstrNotif[] = $row['instruction_notification'];
10564            }
10565            return $listeInstrNotif;
10566        }
10567    
10568        /**
10569         * Crée une clé d'accès unique permettant à un utilisateur
10570         * anonyme de récupérer le document.
10571         *
10572         * @return string clé d'accès du document
10573         */
10574        protected function getCleAccesDocument() {
10575            // Initialisation d'un tableau
10576            $number_list = array();
10577    
10578            // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10579            for ($i = 0; $i < 4; $i++) {
10580                $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10581            }
10582    
10583            // Transformation en chaîne tout en séparant les nombres par un "-"
10584            $result = implode('-', $number_list);
10585    
10586            // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10587            if ($this->getUidDocumentInstructionWithKey($result) != null) {
10588                return $this->getCleAccesDocument();
10589            }
10590    
10591            //
10592            return $result;
10593        }
10594    
10595        /**
10596         * Récupère une clé et renvoie l'uid du document liée à cette
10597         * clé. Si la clé n'existe pas renvoie null.
10598         *
10599         * @param string $cleGen clé dont on cherche l'instruction
10600         * @return integer|null
10601         */
10602        protected function getUidDocumentInstructionWithKey($cleGen) {
10603            $qres = $this->f->get_one_result_from_db_query(
10604                sprintf(
10605                    'SELECT
10606                        instruction.om_fichier_instruction
10607                    FROM
10608                        %1$sinstruction_notification_document
10609                        LEFT JOIN %1$sinstruction
10610                            ON instruction_notification_document.instruction = instruction.instruction
10611                    WHERE
10612                        instruction_notification_document.cle = \'%2$s\'',
10613                    DB_PREFIXE,
10614                    $this->f->db->escapeSimple($cleGen)
10615                ),
10616                array(
10617                    "origin" => __METHOD__,
10618                )
10619            );
10620            
10621            return $qres['result'];
10622        }
10623    
10624        /**
10625         * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10626         * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10627         *
10628         * @param string $cleGen
10629         * @return instruction_notification
10630         */
10631        protected function getInstanceNotificationWithKey($key) {
10632            $qres = $this->f->get_one_result_from_db_query(
10633                sprintf(
10634                    'SELECT
10635                        instruction_notification
10636                    FROM
10637                        %1$sinstruction_notification_document
10638                    WHERE
10639                        cle = \'%2$s\'',
10640                    DB_PREFIXE,
10641                    $this->f->db->escapeSimple($key)
10642                ),
10643                array(
10644                    "origin" => __METHOD__,
10645                )
10646            );
10647    
10648            // Récupération de l'instance de notification
10649            $instNotif = $this->f->get_inst__om_dbform(array(
10650                "obj" => "instruction_notification",
10651                "idx" => $qres['result'],
10652            ));
10653            return $instNotif;
10654        }
10655    
10656    
10657        /**
10658         * Affiche la page de téléchargement du document de la notification.
10659         *
10660         * @param boolean $content_only Affiche le contenu seulement.
10661         *
10662         * @return void
10663         */
10664        public function view_telecharger_document_anonym() {
10665            // Par défaut on considère qu'on va afficher le formulaire
10666            $idx = 0;
10667            // Flag d'erreur
10668            $error = false;
10669            // Message d'erreur
10670            $message = '';
10671    
10672            // Paramètres GET : récupération de la clé d'accès
10673            $cle_acces_document = $this->f->get_submitted_get_value('key');
10674            $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10675            // Vérification de l'existence de la clé et récupération de l'uid du fichier
10676            $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10677            if ($uidFichier != null) {
10678                // Récupération du document
10679                $file = $this->f->storage->get($uidFichier);
10680    
10681                // Headers
10682                header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10683                header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10684                header("Content-Type: ".$file['metadata']['mimetype']);
10685                header("Accept-Ranges: bytes");
10686                header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10687                // Affichage du document
10688                echo $file['file_content'];
10689    
10690                // Récupération de la date de premier accès et maj du suivi uniquement
10691                // si la date de 1er accès n'a pas encore été remplis
10692                $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10693                if ($inst_notif->getVal('date_premier_acces') == null ||
10694                    $inst_notif->getVal('date_premier_acces') == '') {
10695                    $notif_val = array();
10696                    foreach ($inst_notif->champs as $champ) {
10697                        $notif_val[$champ] = $inst_notif->getVal($champ);
10698                    }
10699                    $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10700                    $notif_val['statut'] = 'vu';
10701                    $notif_val['commentaire'] = 'Le document a été vu';
10702                    $suivi_notif = $inst_notif->modifier($notif_val);
10703                }
10704    
10705            } else {
10706                // Page vide 404
10707                printf('Ressource inexistante');
10708                header('HTTP/1.0 404 Not Found');
10709            }
10710        }
10711    
10712        /**
10713         * Récupère le titre du document envoyé au parapheur
10714         */
10715        protected function getDocumentTitre($champ = null) {
10716            $title = $this->getTitle();
10717            $dossier = $this->getDossier();
10718            return $dossier.' '.$title;
10719        }
10720    
10721        /**
10722         * Compose le nom du document à transmettre au parapheur.
10723         * Le nom ets composé de cette manière :
10724         * instruction_xxx_libelle_de_la_lettre_type_associee
10725         * ou xxx correspond au numéro de l'instruction
10726         */
10727        protected function getDocumentLibelle() {
10728            // Récupère le champ instruction
10729            $instruction = $this->getVal("instruction");
10730    
10731            // Requête sql servant à récupérer le titre du document
10732            // TO_CHAR() introduit un espace avant l'affichage du nombre
10733            // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10734            // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10735            $documentLibelle = $this->f->get_one_result_from_db_query(
10736                sprintf(
10737                    'SELECT
10738                        CONCAT(
10739                            \'instruction\',
10740                            TO_CHAR(instruction.instruction, \'000\'),
10741                            \'_\',
10742                            LOWER(om_lettretype.libelle)
10743                        ) AS nom_fichier
10744                    FROM
10745                        %1$sinstruction
10746                        LEFT JOIN %1$som_lettretype
10747                            ON om_lettretype.id = instruction.lettretype
10748                    WHERE
10749                        instruction = %2$d',
10750                    DB_PREFIXE,
10751                    intval($instruction)
10752                ),
10753                array(
10754                    "origin" => __METHOD__,
10755                )
10756            );
10757    
10758            $documentLibelle = $documentLibelle['result'];
10759    
10760            // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10761            // caractères spéciaux en '_'
10762            // La méthode normalize_string est utilisé pour gérer les accents
10763            $documentLibelle = $this->f->normalize_string($documentLibelle);
10764            // TODO : comparer cette liste et celle de la méthode normalize_string
10765            // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10766            // liste
10767            $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10768                '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10769                '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10770                '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10771                '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10772                '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10773                'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10774                '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10775                '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10776                '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10777                '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10778                ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10779                '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10780                '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10781                '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10782                '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10783                '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10784                '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10785                '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10786                '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10787                '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10788                '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10789                '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10790                'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10791                'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10792                'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10793                'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10794                'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10795                'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10796                'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10797                'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10798            );
10799    
10800            return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10801        }
10802    
10803        /**
10804         * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10805         * l'overlay de notification des demandeurs.
10806         */
10807        function getSubFormTitle($ent) {
10808            $actionSansPath = array('411', '420', '430');
10809            if (in_array($this->getParameter('maj'), $actionSansPath)) {
10810                return '';
10811            }
10812            return parent::getSubFormTitle($ent);
10813        }
10814        
10815        /**
10816         * Traitement de la notification automatique des tiers consulté.
10817         *
10818         * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10819         * récupérées ajoute une notification et une tâche de notification par mail.
10820         * La création de la tâche de notification par mail déclenchera l'envoi du mail
10821         * et la mise à jour du suivi.
10822         *
10823         * Les tiers notifiables sont ceux :
10824         *   - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10825         *   - ayant une habilitation dont le type est listé dans les paramètres de
10826         *     notification de l’événement,
10827         *   - intervenant sur la commune ou le département du dossier
10828         *   - ayant au moins une adresse mail valide
10829         *
10830         * @param evenement instance de l'événement associée à l'instruction
10831         * @param dossier instance du dossier de l'instruction
10832         * @return boolean indique si le traitement à réussi
10833         */
10834        protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10835            // Récupération de l'identifiant plat'au du service consultant
10836            $consultationEntrante = $dossier->get_inst_consultation_entrante();
10837            // Récupération de la liste des types d'habilitations autorisées pour
10838            // cette notification
10839            $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10840            // Récupération du département et de la commune du dossier
10841            $commune = $dossier->getVal('commune');
10842            // Le département est récupéré à partir de la commune du dossier donc si la
10843            // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10844            $idDepartement = null;
10845            if (! empty($commune)) {
10846                $departement = $dossier->get_inst_departement_dossier();
10847                $idDepartement = $departement->getVal($departement->clePrimaire);
10848            }
10849            // Récupération des courriels des tiers notifiables
10850            $tiersANotifier = $this->get_courriels_tiers_notifiable(
10851                $typesHabilitationsNotifiable,
10852                $consultationEntrante->getVal('service_consultant_id'),
10853                $commune,
10854                $idDepartement
10855            );
10856            // Traitement de chacune des listes de diffusion pour extraire les
10857            // courriels, vérifier la validité des courriels et envoyer la
10858            // notification
10859            $notificationSend = false;
10860            if (empty($tiersANotifier)) {
10861                $this->addToLog(
10862                    sprintf(
10863                        '%s() : %s %s : %s',
10864                        __METHOD__,
10865                        __("La récupération des tiers à échoué."),
10866                        __('Paramétrage'),
10867                        var_export(
10868                            array(
10869                                'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10870                                'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10871                                'id_commune' => $commune,
10872                                'id_departement' => $idDepartement
10873                            ),
10874                            true
10875                        )
10876                    ),
10877                    DEBUG_MODE
10878                );
10879                return false;
10880            }
10881            foreach($tiersANotifier as $tierANotifier) {
10882                // Découpe la liste de diffusion pour stocker les adresses mails
10883                // des tiers dans un tableau
10884                $courriels =
10885                    array_filter(
10886                        array_map(
10887                            'trim',
10888                            preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10889                    
10890                foreach ($courriels as $courriel) {
10891                    // Pour chaque adresse mail vérifie si l'adresse est valide
10892                    if (! $this->f->checkValidEmailAddress($courriel)) {
10893                        continue;
10894                    }
10895                    $destinataire = array(
10896                        'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10897                        'courriel' => $courriel
10898                    );
10899                    // Si l'adresse est valide ajoute une nouvelle notification
10900                    // et une tâche d'envoi de mails
10901                    $idNotif = $this->ajouter_notification(
10902                        $this->getVal($this->clePrimaire),
10903                        $this->f->get_connected_user_login_name(),
10904                        $destinataire,
10905                        $this->get_dossier_instruction_om_collectivite(),
10906                        array(),
10907                        true
10908                    );
10909                    if ($idNotif === false) {
10910                        $this->addToLog(
10911                            __METHOD__.
10912                            __("L'ajout de la notification a échoué."),
10913                            DEBUG_MODE
10914                        );
10915                        return false;
10916                    }
10917                    // Création de la tache en lui donnant l'id de la notification
10918                    $notification_by_task = $this->notification_by_task(
10919                        $idNotif,
10920                        $dossier->getVal('dossier'),
10921                        'mail',
10922                        'notification_tiers_consulte'
10923                    );
10924                    if ($notification_by_task === false) {
10925                        $this->addToLog(
10926                            __METHOD__.
10927                            __("L'ajout de la tâche de notification a échoué."),
10928                            DEBUG_MODE
10929                        );
10930                        $this->addToMessage(
10931                            __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10932                        );
10933                        return false;
10934                    }
10935                    $notificationSend = true;
10936                }
10937            }
10938            // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10939            // valide, affiche un message dans les logs pour avoir un suivi.
10940            if (! $notificationSend) {
10941                $this->addToLog(
10942                    sprintf(
10943                        '%s %s : %s %s : %s',
10944                        __METHOD__,
10945                        __("Il n'y a pas de tiers notifiable pour l'instruction"),
10946                        $evenement->getVal('libelle'),
10947                        __("du dossier"),
10948                        $this->getVal('dossier')
10949                    ),
10950                    DEBUG_MODE
10951                );
10952            }
10953            return true;
10954        }
10955    
10956        /**
10957         * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10958         * respectant les conditions suvantes :
10959         *   - le tiers consulté dois accepté les notifications
10960         *   - la liste de diffusion ne dois pas être vide
10961         *   - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10962         *     si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10963         *     du tiers
10964         *   - le type d'habilitation des tiers dois appartenir à la liste
10965         *     fournie en paramètre
10966         *   - le tiers dois être associé à la commune ou au département passé
10967         *     en paramètre
10968         *
10969         * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10970         *              pouvant être notifiée
10971         * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10972         * @param integer $commune identifiant de la commune du dossier
10973         * @param integer $departement identifiant du département du dossier
10974         *
10975         * @return array listes de diffusion des tiers notifiable
10976         */
10977        protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10978            // Si paramètre non renseigné alors ne renvoie rien
10979            if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10980                return false;
10981            }
10982            // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10983            $filtreServiceConsulteDI = '';
10984            if (! empty($idPlatau)) {
10985                $filtreServiceConsulteDI = sprintf(
10986                    "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10987                    -- en charge du dossier
10988                    AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10989                        OR tiers_consulte.uid_platau_acteur IS NULL)",
10990                    $this->f->db->escapeSimple($idPlatau)
10991                );
10992            }
10993            $rst = $this->f->get_all_results_from_db_query(
10994                sprintf(
10995                    'SELECT
10996                        -- Tiers notifiables lié à la commune du dossier
10997                        tiers_consulte.liste_diffusion,
10998                        tiers_consulte.libelle
10999                    FROM
11000                        %1$shabilitation_tiers_consulte
11001                        LEFT JOIN %1$stiers_consulte
11002                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11003                        LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11004                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11005                        -- Conservation uniquement des tiers acteur de dossiers
11006                        JOIN %1$slien_dossier_tiers
11007                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11008                    WHERE
11009                        tiers_consulte.accepte_notification_email IS TRUE
11010                        AND tiers_consulte.liste_diffusion IS NOT NULL
11011                        %3$s
11012                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11013                        AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11014                        -- Filtre sur les tiers acteur du dossier
11015                        AND lien_dossier_tiers.dossier = \'%6$s\'
11016                    UNION
11017                    SELECT
11018                        -- Tiers notifiables lié au département du dossier
11019                        tiers_consulte.liste_diffusion,
11020                        tiers_consulte.libelle
11021                    FROM
11022                        %1$shabilitation_tiers_consulte
11023                        LEFT JOIN %1$stiers_consulte
11024                            ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11025                        LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11026                            ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11027                        -- Conservation uniquement des tiers acteur de dossiers
11028                        JOIN %1$slien_dossier_tiers
11029                            ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11030                    WHERE
11031                        tiers_consulte.accepte_notification_email IS TRUE
11032                        AND tiers_consulte.liste_diffusion IS NOT NULL
11033                        %3$s
11034                        AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11035                        AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11036                        -- Filtre sur les tiers acteur du dossier
11037                        AND lien_dossier_tiers.dossier = \'%6$s\'',
11038                    DB_PREFIXE,
11039                    implode(', ', $typesHabilitations),
11040                    $filtreServiceConsulteDI,
11041                    intval($commune),
11042                    intval($departement),
11043                    $this->f->db->escapeSimple($this->getVal('dossier'))
11044                ),
11045                array(
11046                    "origin" => __METHOD__
11047                )
11048            );
11049            // Faire un order by sur un union ne fonctionne pas. A la place
11050            // c'est le tableau des résultats qui est ordonné.
11051            usort($rst['result'], function($a, $b) {
11052                return strcmp($a['libelle'], $b['libelle']);
11053            });
11054            return $rst['result'];
11055        }
11056    }

Legend:
Removed from v.6272  
changed lines
  Added in v.15037

root@scm.adullact.net
ViewVC Help
Powered by ViewVC 1.1.26