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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4708 - (hide annotations)
Fri Jul 1 16:59:15 2016 UTC (8 years, 6 months ago) by fmichon
File size: 214760 byte(s)
* Évolution - Suppression du composant de gestion de file d'attente RabbitMQ.
  La gestion de file d'attente entre les applicatifs est une question
  d'exploitation propre au SI. C'est une application à part entière. openADS
  n'a pas à gérer cette partie.
* Amélioration - Refonte de l'interface avec le référentiel ERP :
 - Ajout de logs dédiés aux services.
 - Transformation de tests PHPUnit en RobotFramework.
 - Ajout d'un champ connecté au référentiel ERP sur le dossier.
 - Possibilité de récupérer les informations sur les demandeurs.
 - Renommage de l'option option_erp en option_referentiel_erp.
 - Ajout d'une interface de controlpanel.

1 mbroquet 3730 <?php
2     /**
3     * specific :
4     * - cle secondaire
5     * destruction autorisée que pour le dernier evenement
6     * [delete the last event ]
7     * - variable globale [global variables]
8     * var $retourformulaire;
9     * var $idxformulaire;
10     * - modification des données dans dossier trigger avant
11     * [modify dossier data with trigger function]
12     * - function mois_date : pour ajouter des mois a une date
13     * [add months (delay) and calculation final date]
14     * - voir script_lang.js : bible ...
15     *
16     * @package openfoncier
17     * @version SVN : $Id: instruction.class.php 6178 2016-03-15 10:56:43Z nmeucci $
18     */
19    
20     //
21     require_once "../gen/obj/instruction.class.php";
22    
23     //
24     class instruction extends instruction_gen {
25    
26     // Champs contenant les UID des fichiers
27     var $abstract_type = array(
28     "om_fichier_instruction" => "file",
29     );
30    
31     var $retourformulaire; // specific
32     var $idxformulaire; // specific
33     var $valEvenement;
34     var $restriction_valid = null;
35     // Tableau contenant une partie des métadonnées arrêtés
36     var $metadonneesArrete;
37    
38 fmichon 3892 /**
39     * Instance de la classe dossier
40     *
41     * @var mixed
42     */
43     var $inst_dossier = null;
44    
45 mbroquet 3730 var $metadata = array(
46     "om_fichier_instruction" => array(
47     "dossier" => "getDossier",
48     "dossier_version" => "getDossierVersion",
49     "numDemandeAutor" => "getNumDemandeAutor",
50     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
51     "typeInstruction" => "getTypeInstruction",
52     "statutAutorisation" => "getStatutAutorisation",
53     "typeAutorisation" => "getTypeAutorisation",
54     "dateEvenementDocument" => "getDateEvenementDocument",
55     "groupeInstruction" => 'getGroupeInstruction',
56     "title" => 'getTitle',
57     ),
58     "arrete" => array(
59     "numArrete" => "getNumArrete",
60     "ReglementaireArrete" => "getReglementaireArrete",
61     "NotificationArrete" => "getNotificationArrete",
62     "dateNotificationArrete" => "getDateNotificationArrete",
63     "controleLegalite" => "getControleLegalite",
64     "dateSignature" => "getDateSignature",
65     "nomSignataire" => "getNomSignataire",
66     "qualiteSignataire" => "getQualiteSignataire",
67     "ap_numRue" => "getAp_numRue",
68     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
69     "ap_codePostal" => "getAp_codePostal",
70     "ap_ville" => "getAp_ville",
71     "activite" => "getActivite",
72     "dateControleLegalite" => "getDateControleLegalite",
73     ),
74     );
75     /** @var boolean Les nouvelles actions sont activées sur cet objet */
76     var $activate_class_action;
77    
78     function __construct($id, &$db, $debug) {
79     //On active les nouvelles actions
80     $this->activate_class_action = true;
81     $this->constructeur($id, $db, $debug);
82     }
83    
84     // {{{ Gestion de la confidentialité des données spécifiques
85    
86     /**
87     * Définition des actions disponibles sur la classe.
88     *
89     * @return void
90     */
91     function init_class_actions() {
92    
93     parent::init_class_actions();
94    
95     // ACTION - 000 - ajouter
96     // Modifie la condition d'affichage du bouton ajouter
97     $this->class_actions[0]["condition"] = "is_addable_editable_and_deletable";
98    
99     // ACTION - 001 - modifier
100     // Modifie la condition et le libellé du bouton modifier
101     $this->class_actions[1]["condition"] = array("is_editable", "is_finalizable_without_bypass");
102     $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
103    
104     // ACTION - 002 - supprimer
105     // Modifie la condition et le libellé du bouton supprimer
106     $this->class_actions[2]["condition"] = array("is_deletable", "is_finalizable_without_bypass");
107     $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
108    
109     // ACTION - 100 - finaliser
110     // Finalise l'enregistrement
111     $this->class_actions[100] = array(
112     "identifier" => "finaliser",
113     "portlet" => array(
114     "type" => "action-direct",
115     "libelle" => _("Finaliser le document"),
116     "order" => 110,
117     "class" => "finalise",
118     ),
119     "view" => "formulaire",
120     "method" => "finalize",
121     "button" => "finaliser",
122     "permission_suffix" => "finaliser",
123     "condition" => array("is_finalizable", "is_finalizable_without_bypass", "has_an_edition"),
124     );
125    
126     // ACTION - 110 - definaliser
127     // Finalise l'enregistrement
128     $this->class_actions[110] = array(
129     "identifier" => "definaliser",
130     "portlet" => array(
131     "type" => "action-direct",
132     "libelle" => _("Reprendre la redaction du document"),
133     "order" => 110,
134     "class" => "definalise",
135     ),
136     "view" => "formulaire",
137     "method" => "unfinalize",
138     "button" => "definaliser",
139     "permission_suffix" => "definaliser",
140     "condition" => array("is_unfinalizable", "is_unfinalizable_without_bypass"),
141     );
142    
143     // ACTION - 120 - edition
144     // Affiche l'édition
145     $this->class_actions[120] = array(
146     "identifier" => "edition",
147     "portlet" => array(
148     "type" => "action-blank",
149     "libelle" => _("Edition"),
150     "order" => 100,
151     "class" => "pdf-16",
152     ),
153     "view" => "view_edition",
154     "condition" => "has_an_edition",
155     "permission_suffix" => "om_fichier_instruction_telecharger",
156     );
157    
158     // ACTION - 125 - modifier_suivi
159     // Suivi des dates
160     $this->class_actions[125] = array(
161     "identifier" => "modifier_suivi",
162     "portlet" => array(
163     "type" => "action-self",
164     "libelle" => _("Suivi des dates"),
165     "order" => 125,
166     "class" => "suivi-dates-16",
167     ),
168     "crud" => "update",
169     "condition" => array("is_unfinalizable", "is_unfinalizable_without_bypass"),
170     "permission_suffix" => "modification_dates",
171     );
172    
173     // ACTION - 130 - bible
174     // Affiche la bible
175     $this->class_actions[130] = array(
176     "identifier" => "bible",
177     "view" => "view_bible",
178     "permission_suffix" => "modifier",
179     );
180    
181     // ACTION - 140 - bible_auto
182     // Active la bible automatique
183     $this->class_actions[140] = array(
184     "identifier" => "bible_auto",
185     "view" => "view_bible_auto",
186     "permission_suffix" => "modifier",
187     );
188    
189     // ACTION - 150 - suivi_bordereaux
190     // Imprimer un bordereau d'envoi
191     $this->class_actions[150] = array(
192     "identifier" => "suivi_bordereaux",
193     "view" => "view_suivi_bordereaux",
194     "permission_suffix" => "consulter",
195     );
196    
197     // ACTION - 160 - suivi_envoi_lettre_rar
198     // Imprimer un bordereau d'envoi
199     $this->class_actions[160] = array(
200     "identifier" => "suivi_envoi_lettre_rar",
201     "view" => "view_suivi_envoi_lettre_rar",
202     "permission_suffix" => "consulter",
203     );
204    
205     // ACTION - 170 - suivi_mise_a_jour_des_dates
206     // Mettre à jour les dates de l'instruction
207     $this->class_actions[170] = array(
208     "identifier" => "suivi_mise_a_jour_des_dates",
209     "view" => "view_suivi_mise_a_jour_des_dates",
210     "permission_suffix" => "consulter",
211     );
212    
213     // ACTION - 180 - pdf_lettre_rar
214     // Génère PDF sur bordereaux de lettres RAR
215     $this->class_actions[180] = array(
216     "identifier" => "pdf_lettre_rar",
217     "view" => "view_pdf_lettre_rar",
218     "permission_suffix" => "consulter",
219     );
220    
221     // ACTION - 190 - bordereau_envoi_maire
222     // Formulaire pour générer le bordereau d'envoi au maire
223     // Met à jour la date d'envoi à signature du maire
224     $this->class_actions[190] = array(
225     "identifier" => "bordereau_envoi_maire",
226     "view" => "view_bordereau_envoi_maire",
227     "permission_suffix" => "bordereau_envoi_maire",
228     );
229    
230     // ACTION - 200 - generate_bordereau_envoi_maire
231     // Génère PDF bordereau d'envoi au maire
232     $this->class_actions[200] = array(
233     "identifier" => "generate_bordereau_envoi_maire",
234     "view" => "view_generate_bordereau_envoi_maire",
235     "permission_suffix" => "bordereau_envoi_maire",
236     );
237 nmeucci 4108
238     // ACTION - 210 - notifier_commune
239     // Notifie la commune par mail d'un évément d'instruction finalisé
240     $this->class_actions[210] = array(
241     "identifier" => "notifier_commune",
242     "portlet" => array(
243     "type" => "action-direct-with-confirmation",
244     "libelle" => _("Notifier la commune par courriel"),
245     "order" => 210,
246     "class" => "notifier_commune-16",
247     ),
248     "view" => "formulaire",
249     "method" => "notifier_commune",
250     "permission_suffix" => "notifier_commune",
251     "condition" => "is_notifiable",
252     );
253 nmeucci 4317
254     // ACTION - 220 - generate_suivi_bordereaux
255     // GénÚre PDF bordereaux
256     $this->class_actions[220] = array(
257     "identifier" => "generate_suivi_bordereaux",
258     "view" => "view_generate_suivi_bordereaux",
259     "permission_suffix" => "consulter",
260     );
261 mbroquet 3730 }
262    
263     /**
264     * Cette variable permet de stocker le résultat de la méthode
265     * getDivisionFromDossier() afin de ne pas effectuer le recalcul à chacun de
266     * ces appels.
267     * @var string Code de la division du dossier en cours
268     */
269     var $_division_from_dossier = NULL;
270    
271     /**
272     * Cette méthode permet de récupérer le code de division correspondant
273     * au dossier sur lequel on se trouve.
274     *
275     * @return string Code de la division du dossier en cours
276     */
277     function getDivisionFromDossier() {
278    
279     // Cette méthode peut être appelée plusieurs fois lors d'une requête.
280     // Pour éviter de refaire le traitement de recherche de la division
281     // alors on vérifie si nous ne l'avons pas déjà calculé.
282     if ($this->_division_from_dossier != NULL) {
283     // Logger
284     $this->addToLog("getDivisionFromDossier(): retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
285     // On retourne la valeur déjà calculée
286     return $this->_division_from_dossier;
287     }
288    
289     // Par défaut, on définit la valeur du dossier à NULL
290     $dossier = NULL;
291     // Test sur le mode et le contexte du formulaire
292     if ($this->getParameter("maj") == 0
293     && ($this->getParameter("retourformulaire") == "dossier"
294     || $this->getParameter("retourformulaire") == "dossier_instruction"
295     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
296     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
297     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
298     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures")) {
299     // Si on se trouve en mode AJOUT (seul mode où l'enregistrement
300     // n'existe pas en base de données) ET que nous nous trouvons
301     // dans le contexte d'un dossier d'instruction alors on récupère
302     // le numéro de dossier depuis le paramètre 'idxformulaire'
303     $dossier = $this->getParameter("idxformulaire");
304     } else {
305     // Sinon on récupère le numéro de dossier dans le champs dossier de
306     // l'enregistrement (en base de données)
307     $dossier = $this->getVal("dossier");
308     }
309    
310     // On appelle la méthode de la classe utils qui renvoi le code de la
311     // division d'un dossier, on la stocke pour ne pas refaire le calcul au
312     // prochain appel de cette méthode
313     $this->_division_from_dossier = $this->f->getDivisionFromDossier($dossier);
314     // Logger
315     $this->addToLog("getDivisionFromDossier(): retour de la valeur nouvellement calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
316     // On retourne la valeur retournée
317     return $this->_division_from_dossier;
318    
319     }
320    
321     /**
322     * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
323     */
324     function getNumDemandeAutorFromDossier($id) {
325     //
326     if (!isset($id)) {
327     return NULL;
328     }
329     //
330     $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
331     $sql .= " where dossier='".$id."'";
332     //
333     $dossier_autorisation = $this->db->getOne($sql);
334     $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
335     database::isError($dossier_autorisation);
336     //
337     return $dossier_autorisation;
338     }
339    
340     // }}}
341    
342     function setType(&$form, $maj) {
343     //
344     parent::setType($form, $maj);
345     // On cache tous les champs
346     // XXX
347     $form->setType('complement5_om_html', 'hidden');
348     $form->setType('bible5', 'hidden');
349     $form->setType('complement6_om_html', 'hidden');
350     $form->setType('bible6', 'hidden');
351     $form->setType('complement7_om_html', 'hidden');
352     $form->setType('bible7', 'hidden');
353     $form->setType('complement8_om_html', 'hidden');
354     $form->setType('bible8', 'hidden');
355     $form->setType('complement9_om_html', 'hidden');
356     $form->setType('bible9', 'hidden');
357     $form->setType('complement10_om_html', 'hidden');
358     $form->setType('bible10', 'hidden');
359     $form->setType('complement11_om_html', 'hidden');
360     $form->setType('bible11', 'hidden');
361     $form->setType('complement12_om_html', 'hidden');
362     $form->setType('bible12', 'hidden');
363     $form->setType('complement13_om_html', 'hidden');
364     $form->setType('bible13', 'hidden');
365     $form->setType('complement14_om_html', 'hidden');
366     $form->setType('bible14', 'hidden');
367     $form->setType('complement15_om_html', 'hidden');
368     $form->setType('bible15', 'hidden');
369     //
370     $form->setType('delai', 'hidden');
371     $form->setType('etat', 'hidden');
372     $form->setType('accord_tacite', 'hidden');
373     $form->setType('action', 'hidden');
374     $form->setType('delai_notification', 'hidden');
375     $form->setType('avis_decision', 'hidden');
376     $form->setType('autorite_competente', 'hidden');
377     //
378     $form->setType('archive_delai', 'hidden');
379     $form->setType('archive_etat', 'hidden');
380     $form->setType('archive_accord_tacite', 'hidden');
381     $form->setType('archive_avis', 'hidden');
382     $form->setType('archive_date_complet', 'hiddendate');
383     $form->setType('archive_date_dernier_depot', 'hiddendate');
384     $form->setType('archive_date_rejet', 'hiddendate');
385     $form->setType('archive_date_limite', 'hiddendate');
386     $form->setType('archive_date_notification_delai', 'hiddendate');
387     $form->setType('archive_date_decision', 'hiddendate');
388     $form->setType('archive_date_validite', 'hiddendate');
389     $form->setType('archive_date_achevement', 'hiddendate');
390     $form->setType('archive_date_conformite', 'hiddendate');
391     $form->setType('archive_date_chantier', 'hiddendate');
392     $form->setType('archive_autorite_competente','hidden');
393 nmeucci 3873 $form->setType('date_depot','hidden');
394 mbroquet 3730 //
395     $form->setType('numero_arrete', 'hidden');
396     //
397     $form->setType('code_barres', 'hidden');
398    
399     //
400     $form->setType('archive_incompletude','hidden');
401     $form->setType('archive_incomplet_notifie','hidden');
402     $form->setType('archive_evenement_suivant_tacite','hidden');
403     $form->setType('archive_evenement_suivant_tacite_incompletude','hidden');
404     $form->setType('archive_etat_pendant_incompletude','hidden');
405     $form->setType('archive_date_limite_incompletude','hiddendate');
406     $form->setType('archive_delai_incompletude','hidden');
407    
408     //
409     $form->setType('duree_validite','hidden');
410     $form->setType('duree_validite_parametrage','hidden');
411    
412     //
413     $form->setType('created_by_commune','hidden');
414     //
415     // gestion du champ "finalisé par"
416     if ($this->getVal("om_final_instruction") == 't') {
417     $form->setType('om_final_instruction_utilisateur', 'static');
418     } else {
419     $form->setType('om_final_instruction_utilisateur', 'hidden');
420     }
421     //
422     if ($maj < 2 || $maj == 125) { //ajouter, modifier et suivi des dates
423     $form->setType('destinataire', 'hidden');
424     $form->setType('lettretype', 'hiddenstatic');
425     $form->setType('complement_om_html', 'html');
426     $form->setType('complement2_om_html', 'html');
427     $form->setType('complement3_om_html', 'html');
428     $form->setType('complement4_om_html', 'html');
429     $form->setType('bible_auto', 'httpclick');
430     $form->setType('bible', 'httpclick');
431     $form->setType('bible2', 'httpclick');
432     $form->setType('bible3', 'httpclick');
433     $form->setType('bible4', 'httpclick');
434     $form->setType('dossier', 'hidden');
435     $form->setType('libelle', 'hiddenstatic');
436     $form->setType('signataire_arrete','select');
437     $form->setType('date_envoi_signature','datedisabled');
438     $form->setType('date_retour_signature','datedisabled');
439     $form->setType('date_envoi_rar','datedisabled');
440     $form->setType('date_retour_rar','datedisabled');
441     $form->setType('date_envoi_controle_legalite','datedisabled');
442     $form->setType('date_retour_controle_legalite','datedisabled');
443     $form->setType('date_finalisation_courrier','datedisabled');
444    
445     if($maj==0){ // ajouter
446     $form->setType('instruction', 'hidden');
447     $form->setType('lettretype', 'hidden');
448     $form->setType('evenement', 'select');
449     $form->setType('date_evenement', 'date2');
450     }else{ // modifier et suivi des dates
451     $form->setType('instruction', 'hiddenstatic');
452     $form->setType('evenement', 'selecthiddenstatic');
453     //$form->setType('date_evenement', 'hiddenstaticdate');
454     $form->setType('date_evenement', 'date2');
455     // necessaire pour calcul de date en modification
456     //$form->setType('delai', 'hiddenstatic');
457     // les administrateurs technique et fonctionnel peuvent
458     // modifier tous les champs de date
459     // si l'instruction a déjà été finalisée au moins une fois
460 softime 4667 if ($this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")
461 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
462     $form->setType('date_envoi_signature', 'date');
463     $form->setType('date_retour_signature', 'date');
464     $form->setType('date_envoi_rar', 'date');
465     $form->setType('date_retour_rar', 'date');
466     $form->setType('date_envoi_controle_legalite', 'date');
467     $form->setType('date_retour_controle_legalite', 'date');
468     $form->setType('date_finalisation_courrier', 'date');
469     // suivi des dates
470     if ($maj == 125) {
471 jymadier 3904 $form->setType('date_evenement', 'hiddenstaticdate');
472 mbroquet 3730 $form->setType('complement_om_html', 'hiddenstatic');
473     $form->setType('complement2_om_html', 'hiddenstatic');
474     $form->setType('complement3_om_html', 'hiddenstatic');
475     $form->setType('complement4_om_html', 'hiddenstatic');
476     $form->setType('bible_auto', 'hidden');
477     $form->setType('bible', 'hidden');
478     $form->setType('bible2', 'hidden');
479     $form->setType('bible3', 'hidden');
480     $form->setType('bible4', 'hidden');
481     $form->setType('signataire_arrete','selecthiddenstatic');
482     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
483     }
484     }
485     }
486     } elseif($maj==2){
487     $form->setType('dossier', 'hidden');
488     $form->setType('bible_auto', 'hidden');
489     $form->setType('bible', 'hidden');
490     $form->setType('bible2', 'hidden');
491     $form->setType('bible3', 'hidden');
492     $form->setType('bible4', 'hidden');
493     }else {
494     $form->setType('destinataire', 'hidden');
495     $form->setType('dossier', 'hidden');
496     $form->setType('bible_auto', 'hidden');
497     $form->setType('bible', 'hidden');
498     $form->setType('bible2', 'hidden');
499     $form->setType('bible3', 'hidden');
500     $form->setType('bible4', 'hidden');
501     }
502    
503     //Cache les champs pour la finalisation
504     $form->setType('om_fichier_instruction', 'hidden');
505     $form->setType('om_final_instruction', 'hidden');
506     // Cache le document arrêté
507     $form->setType('document_numerise', 'hidden');
508    
509     //Masquer les champs date_envoi_controle_legalite et
510     //date_retour_controle_legalite si ce n'est pas un arrêté et si ce n'est
511     //pas un utilisateur ayant le droit spécifique
512     if ( !is_numeric($this->getVal("avis_decision"))&&
513 softime 4667 !$this->f->isAccredited(array("instruction", "instruction_modification_dates"), "OR")){
514 mbroquet 3730
515     $form->setType("date_envoi_controle_legalite", "hiddendate");
516     $form->setType("date_retour_controle_legalite", "hiddendate");
517     }
518    
519 nmeucci 4108 // Pour les actions finalize, unfinalize et notifier_commune
520     if($maj == 100 || $maj == 110 || $maj == 210) {
521 mbroquet 3730 //
522     foreach ($this->champs as $value) {
523     // Cache tous les champs
524     $form->setType($value, 'hidden');
525     }
526     }
527     }
528    
529     function setSelect(&$form, $maj,&$db,$debug) {
530     /**
531     * On ne surcharge pas la méthode parent car une requête sur la table
532     * dossier est mauvaise pour les performances, car la requête qui
533     * concerne evenement est plus complexe que celle générée et car les
534     * champs action, avis_decision et etat ne sont pas utilisés comme des
535     * select
536     */
537     if(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php"))
538     include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php");
539     elseif(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc"))
540     include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc");
541    
542     //// action
543     //$this->init_select($form, $db, $maj, $debug, "action",
544     // $sql_action, $sql_action_by_id, false);
545    
546     //// avis_decision
547     //$this->init_select($form, $db, $maj, $debug, "avis_decision",
548     // $sql_avis_decision, $sql_avis_decision_by_id, false);
549    
550     //// dossier
551     //$this->init_select($form, $db, $maj, $debug, "dossier",
552     // $sql_dossier, $sql_dossier_by_id, false);
553    
554     //// etat
555     //$this->init_select($form, $db, $maj, $debug, "etat",
556     // $sql_etat, $sql_etat_by_id, false);
557    
558     //// evenement
559     //$this->init_select($form, $db, $maj, $debug, "evenement",
560     // $sql_evenement, $sql_evenement_by_id, false);
561    
562     // signataire_arrete
563     // si contexte DI
564     if ($this->getParameter("retourformulaire") == "dossier"
565     || $this->getParameter("retourformulaire") == "dossier_instruction"
566     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
567     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
568     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
569     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures") {
570     // on recupère les signataires de la multicollectivité et de celle du DI
571     require_once "../obj/dossier_instruction.class.php";
572     $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, $debug);
573     $sql_signataire_arrete_by_di = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_by_di);
574     $this->init_select($form, $db, $maj, $debug, "signataire_arrete",
575     $sql_signataire_arrete_by_di, $sql_signataire_arrete_by_id, true);
576     } else {
577     $this->init_select($form, $db, $maj, $debug, "signataire_arrete",
578     $sql_signataire_arrete, $sql_signataire_arrete_by_id, true);
579     }
580    
581     /**
582     * Gestion du filtre sur les événements de workflow disponibles
583     * On récupère ici en fonction de l'état du dossier d'instruction en
584     * cours et du type du dossier d'instruction en cours la liste
585     * événements disponibles.
586     */
587     if ($maj == 0) {
588     // Récupération des événements par une jointure entre la table dossier
589     // et la table transition et la table evenement et la table
590     // lien_dossier_instruction_type_evenement en fonction de l'identifiant
591     // du dossier d'instruction en cours
592     $sql = "SELECT
593     evenement.evenement,
594     evenement.libelle as lib
595     FROM ".DB_PREFIXE."dossier
596     INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
597     ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
598     INNER JOIN ".DB_PREFIXE."evenement
599     ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
600     INNER JOIN ".DB_PREFIXE."transition
601     ON evenement.evenement = transition.evenement
602     AND dossier.etat=transition.etat
603     WHERE dossier.dossier='".$this->idxformulaire."' ";
604    
605     // Si changement de décision par instructeur commune
606     if($this->f->isUserInstructeur() === true
607     && $this->f->getDivisionFromDossier($this->idxformulaire) != $_SESSION["division"]
608     && $this->f->isInstrCanChangeDecision($this->idxformulaire) === true) {
609     $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
610     }
611     $sql .= "ORDER BY evenement.libelle, evenement.action";
612     $res = $db->query($sql);
613     $this->addToLog("setSelect(): db->query(\"".$sql."\");", VERBOSE_MODE);
614     if (database::isError($res)) {
615     die($res->getMessage());
616     }
617     // Remplissage du tableau du select
618     $contenu = array(
619     0 => array("",),
620     1 => array(_('choisir')." "._('evenement'),)
621     );
622     while ($row=& $res->fetchRow()) {
623     $contenu[0][] = $row[0];
624     $contenu[1][] = $row[1];
625     }
626     $form->setSelect("evenement", $contenu);
627     } else {
628     $sql = "SELECT
629     evenement.libelle as lib
630     FROM ".DB_PREFIXE."evenement
631     WHERE evenement.evenement=".$this->getVal("evenement")."";
632     $res = $db->getone($sql);
633     $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
634     if (database::isError($res)) {
635     die($res->getMessage());
636     }
637     //
638     $contenu = array(
639     0 => array($this->getVal("evenement"),),
640     1 => array($res,)
641     );
642     $form->setSelect("evenement", $contenu);
643     }
644    
645     /**
646     * Gesion des liens vers la bible
647     */
648     // lien bible_auto
649     $contenu = array(_("automatique"));
650     $form->setSelect("bible_auto",$contenu);
651     // lien bible1
652     $contenu = array(_("bible"));
653     $form->setSelect("bible",$contenu);
654     // lien bible2
655     $contenu = array(_("bible"));
656     $form->setSelect("bible2",$contenu);
657     // lien bible3
658     $contenu = array(_("bible"));
659     $form->setSelect("bible3",$contenu);
660     // lien bible4
661     $contenu = array(_("bible"));
662     $form->setSelect("bible4",$contenu);
663     }
664    
665     function cleSecondaire($id, &$db, $val, $DEBUG) {
666     //
667     parent::cleSecondaire($id, $db, $val, $DEBUG);
668    
669     $id = $this->getVal($this->clePrimaire);
670    
671    
672     //Requête de vérification que cet événement d'instruction n'est pas lié
673     //à la création d'un dossier d'instruction
674     $sql = "SELECT demande_type.dossier_instruction_type
675     FROM ".DB_PREFIXE."demande_type
676     LEFT JOIN ".DB_PREFIXE."demande
677     ON demande.demande_type = demande_type.demande_type
678     WHERE demande.instruction_recepisse = ".$id;
679     $res = $this->db->getOne($sql);
680     $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
681     if (database::isError($res)) {
682     die($res->getMessage());
683     }
684    
685     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
686     //création de dossier d'instruction, l'événement d'instruction peut être
687     //supprimé
688     if ( $this->correct !== false || $res == null || $res == ""){
689    
690     // Requête de vérification que cet événement d'instruction est lié
691     // à une demande
692     $sql = "SELECT demande
693     FROM ".DB_PREFIXE."demande
694     WHERE instruction_recepisse = ".$id;
695     $res = $this->db->getOne($sql);
696     $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
697     if (database::isError($res)) {
698     die($res->getMessage());
699     }
700    
701     //Si c'est un événement d'instruction lié à une demande
702     if ($res != null || $res != ""){
703    
704     require_once "../obj/demande.class.php";
705     $demande = new demande($res, $this->db, DEBUG);
706    
707     //On met à jour la demande en supprimant la liaison vers
708     //l'événement d'instruction
709     $demande->setParameter("maj", 1);
710     $valF = array();
711     foreach($demande->champs as $identifiant => $champ) {
712     $valF[$champ] = $demande->val[$identifiant];
713     }
714     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
715     $valF['instruction_recepisse']=NULL;
716     $ret = $demande->modifier($valF, $this->db, DEBUG);
717     }
718    
719     /**
720     * Vérification que l'élément supprimé est le dernier pour pouvoir
721     * remodifier les données de manière itérative.
722     */
723     // Initialisation
724     $dernierevenement = "";
725     // Récupération du dernier élément de la table d'instruction qui
726     // concerne le dossier en cours
727     $sql = "SELECT max(instruction)
728     FROM ".DB_PREFIXE."instruction
729     WHERE dossier ='".$this->idxformulaire."'";
730     $dernierevenement = $db->getOne($sql);
731     $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
732     if (database::isError($dernierevenement)) {
733     die($dernierevenement->getMessage());
734     }
735     // Si on se trouve effectivement sur le dernier evenement d'instruction
736     if ($dernierevenement == $id) {
737     // Alors on valide la suppression
738     $this->correct = true;
739     $this->addToMessage(_('Destruction_chronologique'));
740     } else {
741     // Alors on annule la suppression
742     $this->correct = false;
743     $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
744     }
745     }
746     }
747    
748     /**
749     * Vérification de la possibilité ou non de modifier des dates de suivi
750     * @param string $champ champ date à vérifier
751     */
752     function updateDate($champ) {
753    
754     //Si le retourformulaire est "dossier_instruction"
755     if ($this->getParameter("retourformulaire") == "dossier"
756     || $this->getParameter("retourformulaire") == "dossier_instruction"
757     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
758     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
759     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
760     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures") {
761    
762     // Vérification de la possibilité de modifier les dates si déjà éditées
763     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
764     // si l'utilisateur n'est pas un admin
765     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
766     $this->correct = false;
767     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
768     }
769     }
770     }
771    
772     //
773     return true;
774     }
775    
776     /*Met des valeurs par défaut dans certains des sous-formulaire*/
777     function setValsousformulaire(&$form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire){
778    
779     //
780     $this->retourformulaire=$retourformulaire;
781     $this->idxformulaire=$idxformulaire;
782     // Ajout
783     if ($maj == 0) {
784     $form->setVal("destinataire", $idxformulaire);
785     $form->setVal("dossier", $idxformulaire);
786     }
787     //
788     $this->set_form_default_values($form, $maj, $validation);
789     }
790    
791     /**
792     * Permet de pré-remplir les valeurs des formulaires.
793     *
794     * @param [object] $form formulaire
795     * @param [integer] $maj mode
796     * @param [integer] $validation validation
797     */
798     function set_form_default_values(&$form, $maj, $validation) {
799    
800     // Ajout
801     if ($maj == 0) {
802     if(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php"))
803     include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc.php");
804     elseif(file_exists ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc"))
805     include ("../sql/".OM_DB_PHPTYPE."/".$this->table.".form.inc");
806     // si contexte DI
807     if ($this->getParameter("retourformulaire") == "dossier"
808     || $this->getParameter("retourformulaire") == "dossier_instruction"
809     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
810     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
811     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
812     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures") {
813     // on recupère les signataires de la multicollectivité et de celle du DI
814     require_once "../obj/dossier_instruction.class.php";
815     $di = new dossier_instruction($this->getParameter('idxformulaire'), $db, DEBUG);
816     $sql = str_replace('<collectivite_di>', $di->getVal("om_collectivite"), $sql_signataire_arrete_defaut_by_di);
817     } else {
818     $sql = $sql_signataire_arrete_defaut;
819     }
820     // Date du jour
821     $form->setVal("date_evenement", date('Y-m-d'));
822    
823     // Exécution de la requête
824     $res = $this->f->db->query($sql);
825     $this->f->addToLog("setVal(): db->query(\"".$sql."\");", VERBOSE_MODE);
826     if ( database::isError($res)){
827     die();
828     }
829    
830     $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
831    
832     if (isset($row['signataire_arrete']) && is_numeric($row['signataire_arrete'])){
833     $form->setVal("signataire_arrete",$row['signataire_arrete']);
834     }
835     }
836    
837     // Ajout et modification
838     if ($maj == 0 || $maj == 1 || $maj == 125) {
839     $form->setVal("bible_auto","bible_auto()");
840     $form->setVal("bible","bible(1)");
841     $form->setVal("bible2","bible(2)");
842     $form->setVal("bible3","bible(3)");
843     $form->setVal("bible4","bible(4)");
844     }
845     }
846    
847    
848     function setLayout(&$form, $maj){
849     if ( $maj < 2 OR $maj == 3 OR $maj == 125 ) {
850     /*Champ sur lequel s'ouvre le bloc 1 */
851     $form->setBloc('evenement','D',"","col_12");
852    
853     $form->setFieldset('evenement','D',_('Evenement'));
854     $form->setFieldset('om_final_instruction_utilisateur','F','');
855    
856     $form->setBloc('om_final_instruction_utilisateur','F');
857    
858     $form->setBloc('date_finalisation_courrier','D',"","col_12");
859    
860     $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
861     $form->setBloc('date_finalisation_courrier','D',"","col_6");
862     $form->setBloc('date_envoi_controle_legalite','F');
863    
864     $form->setBloc('signataire_arrete','D',"","col_6");
865     $form->setBloc('date_retour_controle_legalite','F');
866     $form->setFieldset('date_retour_controle_legalite','F','');
867    
868     $form->setBloc('date_retour_controle_legalite','F');
869    
870     $form->setBloc('complement_om_html','D',"","col_12");
871     $form->setFieldset('complement_om_html','D',_('Complement'));
872     $form->setFieldset('bible','F','');
873     $form->setBloc('bible','F');
874    
875     $form->setBloc('complement2_om_html','D',"","col_12");
876     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
877     $form->setFieldset('bible2','F','');
878     $form->setBloc('bible2','F');
879    
880     $form->setBloc('complement3_om_html','D',"","col_12");
881     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
882     $form->setFieldset('bible3','F','');
883     $form->setBloc('bible3','F');
884    
885     $form->setBloc('complement4_om_html','D',"","col_12");
886     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
887     $form->setFieldset('bible4','F','');
888     $form->setBloc('bible4','F');
889     }
890     }
891    
892     function setLib(&$form, $maj) {
893     //
894     parent::setLib($form, $maj);
895     //
896     $form->setLib('bible_auto', "");
897     $form->setLib('bible', "");
898     $form->setLib('bible2', "");
899     $form->setLib('bible3', "");
900     $form->setLib('bible4', "");
901     $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
902     }
903    
904     function triggerajouter($id, &$db, $val, $DEBUG) {
905     /**
906     * Le code suivant permet de récupérer des valeurs des tables evenement
907     * et dossier pour les stocker dans l'instruction :
908     * DEPUIS L'EVENEMENT
909     * - action
910     * - delai
911     * - accord_tacite
912     * - etat
913     * - avis_decision
914     * - delai_notification
915     * - lettretype
916     * - autorite_competente
917     * DEPUIS LE DOSSIER D'INSTRUCTION
918     * - archive_delai
919     * - archive_accord_tacite
920     * - archive_etat
921     * - archive_avis
922     * - date_complet
923     * - date_rejet
924     * - date_limite
925     * - date_notification_delai
926     * - date_decision
927     * - date_validite
928     * - date_achevement
929     * - date_chantier
930     * - date_conformite
931     * - avis_decision
932     */
933     // Récupération de tous les paramètres de l'événement sélectionné
934     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
935     WHERE evenement=".$this->valF['evenement'];
936     $res = $db->query($sql);
937     $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);
938     if (database::isError($res)) {
939     die($res->getMessage());
940     }
941     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
942     // Récupération de l'identifiant de l'action
943     // si une action est paramétrée dans l'événement
944     $this->valF['action'] = NULL;
945     if (isset($row['action']) and !empty($row['action'])) {
946     $this->valF['action']=$row['action'];
947     }
948     // Récupération de la valeur du délai
949     $this->valF['delai'] = $row['delai'];
950     // Récupération de l'identifiant de l'état
951     // si un état est paramétré dans l'événement
952     $this->valF['etat']=NULL;
953     if (isset($row['etat']) and !empty($row['etat'])) {
954     $this->valF['etat']=$row['etat'];
955     }
956     // Récupération de la valeur d'accord tacite
957     $this->valF['accord_tacite']=$row['accord_tacite'];
958     // Récupération de la valeur du délai de notification
959     $this->valF['delai_notification']=$row['delai_notification'];
960     // Récupération de l'identifiant de l'avis
961     // si un avis est paramétré dans l'événement
962     $this->valF['avis_decision'] = NULL;
963     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
964     $this->valF['avis_decision']=$row['avis_decision'];
965     }
966     // Récupération de la valeur de l'autorité compétente
967     // si l'autorité compétente est paramétré dans l'événement
968     $this->valF['autorite_competente'] = NULL;
969     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
970     $this->valF['autorite_competente']=$row['autorite_competente'];
971     }
972     // Récupération de la valeur de la lettre type
973     $this->valF['lettretype']=$row['lettretype'];
974     }
975     // Récupération de toutes les valeurs du dossier d'instruction en cours
976     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
977     WHERE dossier='".$this->valF['dossier']."'";
978     $res = $db->query($sql);
979     $this->addToLog("triggerajouter(): db->query(\"".$sql."\");", VERBOSE_MODE);
980     if (database::isError($res)) {
981     die($res->getMessage());
982     }
983     $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
984     $this->updateArchiveData($row);
985    
986     // Récupération de la duree de validite du dossier d'autorisation
987     $sql = "SELECT duree_validite_parametrage
988     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
989     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
990     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
991     LEFT JOIN ".DB_PREFIXE."dossier
992     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
993     WHERE dossier.dossier='".$this->valF['dossier']."'";
994     $duree_validite_parametrage = $db->getOne($sql);
995     $this->addToLog("triggerajouter(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
996     database::isError($duree_validite_parametrage);
997     if ($duree_validite_parametrage != '') {
998     $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
999     }
1000    
1001     // Identifiant du type de courrier
1002     $idTypeCourrier = '11';
1003     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
1004     // Code barres
1005     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
1006     }
1007    
1008     // Test si une restriction est valide
1009     // return boolean
1010     function restrictionIsValid($restriction){
1011     if($this->restriction_valid != null) {
1012     return $this->restriction_valid;
1013     }
1014     if(empty($restriction)) {
1015     $this->restriction_valid = true;
1016     return $this->restriction_valid;
1017     }
1018 nmeucci 3873 // Liste des opérateurs possibles sans espace
1019     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
1020     // Liste identique mais avec le marqueur §
1021     $mark = "§";
1022     $operateurs_marked = array();
1023     foreach ($operateurs as $operateur) {
1024     $operateurs_marked[] = $mark.$operateur.$mark;
1025     }
1026 mbroquet 3730
1027     // Supprime tous les espaces de la chaîne de caractère
1028 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
1029 mbroquet 3730
1030 nmeucci 3873 // Met un marqueur avant et après les opérateurs
1031     // puis transforme la chaine en un tableau
1032     $restriction = str_replace($operateurs, $operateurs_marked,
1033 mbroquet 3730 $restriction);
1034    
1035 nmeucci 3873 // Pour chaque opérateur logique
1036     foreach (array('&&', '||') as $operator) {
1037    
1038     // S'il est absent on ne fait aucun traitement
1039     if (strpos($restriction, $mark.$operator.$mark) === false) {
1040     continue;
1041     }
1042     // Sinon on vérifie les deux conditions avec le OU/ET logique
1043     $restrictions = explode($mark.$operator.$mark, $restriction);
1044     $restrictions[0] = explode($mark, $restrictions[0]);
1045     $restrictions[1] = explode($mark, $restrictions[1]);
1046     $res_bool = false;
1047     if ($operator == '&&') {
1048     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
1049     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
1050     $res_bool = true;
1051     }
1052     }
1053     if ($operator == '||') {
1054     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
1055     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
1056     $res_bool = true;
1057     }
1058     }
1059     return $res_bool;
1060     }
1061     $tabRestriction = explode($mark, $restriction);
1062     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
1063    
1064     }
1065    
1066     function is_restriction_satisfied($restriction, $operateurs) {
1067 mbroquet 3730 // Tableau comprenant les résultat
1068     $res = array();
1069     // Compteur pour les résultat
1070     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
1071     $j = 1;
1072     // Comparateur du calcul
1073     $comparateur = '';
1074     // Booléen retourné
1075     $res_bool = true;
1076    
1077     // S'il y a un comparateur
1078 nmeucci 3873 if (in_array(">=", $restriction)
1079     || in_array("<=", $restriction)
1080     || in_array("==", $restriction)
1081     || in_array("!=", $restriction)) {
1082 mbroquet 3730
1083     // Si le tableau n'est pas vide
1084 nmeucci 3873 if (count($restriction) > 0) {
1085 mbroquet 3730
1086     // Boucle dans le tableau pour récupérer seulement les valeurs
1087 nmeucci 3873 foreach ($restriction as $key => $value) {
1088 mbroquet 3730 //
1089     if (!in_array($value, $operateurs)) {
1090     if ($this->getRestrictionValue($value) != false) {
1091     $res[] = $this->getRestrictionValue($value);
1092     } else {
1093     // Message d'erreur
1094     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
1095     $this->addToMessage($error_message);
1096     // Arrête le traitement
1097     return false;
1098     }
1099     }
1100     }
1101    
1102     // Boucle dans le tableau
1103     // commence à 1 car le 0 doit rester inchangé tout au long du
1104     // traitement
1105 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
1106 mbroquet 3730
1107     // Récupère le comparateur
1108 nmeucci 3873 if ($restriction[$i] === ">="
1109     || $restriction[$i] === "<="
1110     || $restriction[$i] === "=="
1111     || $restriction[$i] === "!=") {
1112     $comparateur = $restriction[$i];
1113 mbroquet 3730 }
1114    
1115     // Si l'opérateur qui suit est un "+"
1116 nmeucci 3873 if ($restriction[$i] === "+") {
1117 mbroquet 3730 $dateDep = $res[$j];
1118     unset($res[$j]);$j++;
1119     $duree = $res[$j];
1120     unset($res[$j]);
1121     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
1122     }
1123    
1124     // Si l'opérateur qui suit est un "-"
1125 nmeucci 3873 if ($restriction[$i] === "-") {
1126 mbroquet 3730 $dateDep = $res[$j];
1127     unset($res[$j]);$j++;
1128     $duree = $res[$j];
1129     unset($res[$j]);
1130     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
1131     }
1132     }
1133    
1134     }
1135    
1136     // Si les tableau des résultats n'est pas vide
1137     if (count($res) > 0) {
1138     //
1139     $res_bool = false;
1140     // Effectue le test
1141     if ($comparateur === ">=") {
1142     //
1143     if (strtotime($res[0]) >= strtotime($res[$j])) {
1144     $res_bool = true;
1145     }
1146     }
1147     if ($comparateur === "<=") {
1148 nmeucci 3873 //
1149 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
1150     $res_bool = true;
1151     }
1152     }
1153 nmeucci 3873 if ($comparateur === "==") {
1154     //
1155     if (strtotime($res[0]) == strtotime($res[$j])) {
1156     $res_bool = true;
1157     }
1158     }
1159     if ($comparateur === "!=") {
1160     //
1161     if (strtotime($res[0]) != strtotime($res[$j])) {
1162     $res_bool = true;
1163     }
1164     }
1165 mbroquet 3730 }
1166     // Sinon une erreur s'affiche
1167     } else {
1168    
1169     // Message d'erreur
1170     $error_message = _("Mauvais parametrage de la restriction.")." ".
1171     _("Contactez votre administrateur");
1172     $this->addToMessage($error_message);
1173     // Arrête le traitement
1174     return false;
1175     }
1176    
1177     return $res_bool;
1178    
1179     }
1180    
1181     /**
1182     * Permet de définir si l'événement passé en paramètre est un événement retour.
1183     * @param integer $evenement événement à tester
1184     *
1185     * @return boolean retourne true si événement retour sinon false
1186     */
1187     function is_evenement_retour($evenement) {
1188     if(empty($evenement) || !is_numeric($evenement)) {
1189     return "";
1190     }
1191     $sql = "SELECT retour
1192     FROM ".DB_PREFIXE."evenement
1193     WHERE evenement = ".$evenement;
1194     $retour = $this->db->getOne($sql);
1195     $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
1196     if (database::isError($retour)) {
1197     die($retour->getMessage());
1198     }
1199     if ($retour == 't') {
1200     return true;
1201     } else {
1202     return false;
1203     }
1204     }
1205    
1206     /**
1207     * Retourne le champ restriction de l'événement passé en paramètre.
1208     *
1209     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
1210     *
1211     * @return string contenu du champ restriction
1212     */
1213     function get_restriction($evenement) {
1214     if(empty($evenement) || !is_numeric($evenement)) {
1215     return "";
1216     }
1217     //Récupère la restriction
1218     $sql= "SELECT
1219     restriction
1220     FROM
1221     ".DB_PREFIXE."evenement
1222     WHERE
1223     evenement =".$evenement;
1224    
1225     $restriction = $this->db->getOne($sql);
1226     $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
1227     if (database::isError($restriction)) {
1228     die($restriction->getMessage());
1229     }
1230     return $restriction;
1231     }
1232    
1233     /**
1234     * Récupère la valeur du champ dans la restriction
1235     * @param string $restrictionValue Nom du champ
1236     * @return mixed Valeur du champ
1237     */
1238     function getRestrictionValue($restrictionValue){
1239    
1240     // Initialisation de la valeur de retour
1241     $return = false;
1242    
1243     // Récupére les valeurs du dossier
1244     $value_dossier = $this->get_dossier_actual();
1245    
1246     //
1247     if (is_numeric($restrictionValue)) {
1248     $return = $restrictionValue;
1249     }elseif (isset($value_dossier[$restrictionValue])) {
1250     $return = $value_dossier[$restrictionValue];
1251     }elseif (isset($this->valF[$restrictionValue])) {
1252     $return = $this->valF[$restrictionValue];
1253     }
1254    
1255     // Retourne la valeur du champ
1256     return $return;
1257     }
1258    
1259     /**
1260     * Calcul des règle d'action.
1261     * @param string $rule Règle d'action
1262     * @param string $rule_name Nom de la règle
1263     * @param string $type Type de la règle
1264     *
1265     * @return mixed Résultat de la règle
1266     */
1267     function regle($rule, $rule_name, $type = null) {
1268    
1269     // Supprime tous les espaces de la chaîne de caractère
1270     $rule = str_replace(' ', '', $rule);
1271     // Coupe la chaîne au niveau de l'opérateur
1272     $operands = explode ("+", $rule);
1273     // Nombre d'opérande
1274     $nb_operands = count($operands);
1275    
1276     // Règle à null
1277     if ($rule == "null") {
1278     return null;
1279     }
1280    
1281     // Si c'est une règle spécifique
1282     if ($rule_name == "regle_autorite_competente"
1283     || $rule_name == "regle_etat"
1284     || $rule_name == "regle_accord_tacite"
1285     || $rule_name == "regle_avis") {
1286     //
1287     return $this->valF[$rule];
1288     }
1289    
1290     // Tableau des champs de type date
1291     $rule_type_date = array(
1292     "regle_date_limite",
1293     "regle_date_notification_delai",
1294     "regle_date_complet",
1295     "regle_date_validite",
1296     "regle_date_decision",
1297     "regle_date_chantier",
1298     "regle_date_achevement",
1299     "regle_date_conformite",
1300     "regle_date_rejet",
1301     "regle_date_dernier_depot",
1302     "regle_date_limite_incompletude",
1303     );
1304     // Tableau des champs de type numérique
1305     $rule_type_numeric = array(
1306     "regle_delai",
1307     "regle_delai_incompletude",
1308     );
1309    
1310     // Définit le type du champ
1311     if (in_array($rule_name, $rule_type_date) == true) {
1312     $type = "date";
1313     }
1314     if (in_array($rule_name, $rule_type_numeric) == true) {
1315     $type = "numeric";
1316     }
1317    
1318     // Initialisation des variables
1319     $key_date = 0;
1320     $total_numeric = 0;
1321    
1322     // Pour chaque opérande
1323     foreach ($operands as $key => $operand) {
1324    
1325     // Si c'est une règle de type date
1326     if ($type == 'date') {
1327     // Vérifie si au moins une des opérandes est une date
1328     if (!is_numeric($operand)
1329     && isset($this->valF[$operand])
1330     && $this->f->check_date($this->valF[$operand]) == true) {
1331     // Récupère la position de la date
1332     $key_date = $key;
1333     }
1334     // Les autres opérandes doivent être que des numériques
1335     if (is_numeric($operand) == true) {
1336     // Ajoute l'opérande au total
1337     $total_numeric += $operand;
1338     }
1339     if (!is_numeric($operand)
1340     && isset($this->valF[$operand])
1341     && is_numeric($this->valF[$operand]) == true) {
1342     // Ajoute l'opérande au total
1343     $total_numeric += $this->valF[$operand];
1344     }
1345     }
1346    
1347     // Si c'est une règle de type numérique
1348     if ($type == 'numeric') {
1349     // Les opérandes doivent être que des numériques
1350     if (is_numeric($operand) == true) {
1351     // Ajoute l'opérande au total
1352     $total_numeric += $operand;
1353     }
1354     if (!is_numeric($operand)
1355     && isset($this->valF[$operand])
1356     && is_numeric($this->valF[$operand]) == true) {
1357     // Ajoute l'opérande au total
1358     $total_numeric += $this->valF[$operand];
1359     }
1360     }
1361     }
1362    
1363     // Résultat pour une règle de type date
1364     if ($type == 'date') {
1365     // Retourne le calcul de la date
1366     return $this->f->mois_date($this->valF[$operands[$key_date]],
1367     $total_numeric, "+");
1368     }
1369    
1370     // Résultat pour une règle de type numérique
1371     if ($type == 'numeric') {
1372     // Retourne le calcul
1373     return $total_numeric;
1374     }
1375    
1376     }
1377    
1378 fmichon 4708 /**
1379     * TRIGGER - triggerajouterapres.
1380     *
1381     * - Mise à jour des informations liées au workflow sur le dossier
1382     * - Interface avec le référentiel ERP [105][111]
1383     * - Mise à jour du DA
1384     * - Historisation de la vie du DI
1385     *
1386     * @return boolean
1387     */
1388     function triggerajouterapres($id, &$db, $val, $DEBUG) {
1389    
1390     // On a besoin de l'instance du dossier lié à l'événement d'instruction
1391     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
1392    
1393     // Instance de la classe evenement
1394     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
1395    
1396 mbroquet 3730 /**
1397     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
1398     * par l'action
1399     */
1400 fmichon 4708 // état de complétude actuel du dossier
1401     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
1402 mbroquet 3730 // Initialisation
1403     $valF = "";
1404 fmichon 4708 //
1405 mbroquet 3730 if($incompletude === FALSE) {
1406     // Si l'événement d'instruction est de type incompletude
1407 fmichon 4708 if($inst_evenement->getVal('type') == "incompletude") {
1408 mbroquet 3730 // On marque le dossier en incomplétude pour application des actions
1409     $incompletude = TRUE;
1410     // Set du flag incomplétude de la table dossier
1411     $valF['incompletude'] = TRUE;
1412     // Enregistrement de l'état dans la variable provisoire
1413     $valF['etat_pendant_incompletude'] = $this->valF['archive_etat'];
1414     }
1415     } else {
1416     // Si l'evenement d'instruction est de type retour ou contient une
1417     // decision, on sort d'incomplétude
1418 fmichon 4708 if($inst_evenement->getVal('type') == "retour" OR
1419     $inst_evenement->getVal('avis_decision') != NULL) {
1420 mbroquet 3730 // On enlève la marque d'incomplétude pour application des actions
1421     $incompletude = FALSE;
1422     // On enlève le flag d'incomplétude sur l'enregistrement de la table dossier
1423     $valF['incompletude'] = FALSE;
1424     $valF['incomplet_notifie'] = FALSE;
1425     // Restauration de l'état depuis l'état provisoire
1426     $valF['etat'] = $this->valF['archive_etat_pendant_incompletude'];
1427     // On vide la variable provisoire ainsi que le délai de complétude
1428     // et la date limite de complétude
1429     $valF['etat_pendant_incompletude'] = NULL;
1430     $valF['delai_incompletude'] = NULL;
1431     $valF['date_limite_incompletude'] = NULL;
1432     $valF['evenement_suivant_tacite_incompletude'] = NULL;
1433     }
1434     }
1435     // Récupération des paramètres de l'action
1436     $sql = "SELECT * FROM ".DB_PREFIXE."action
1437     WHERE action='".$this->valF['action']."'";
1438     $res = $db->query($sql);
1439     $this->addToLog("triggerajouterapres(): db->query(\"".$sql."\");", VERBOSE_MODE);
1440     if (database::isError($res)) {
1441     die($res->getMessage());
1442     }
1443     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1444    
1445     // pour chacune des regles, on applique la regle
1446     if($row['regle_delai']!=''){
1447     $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
1448     }
1449     if($row['regle_accord_tacite']!=''){
1450     $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
1451     }
1452     if($row['regle_avis']!=''){
1453     $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
1454     }
1455     if($row['regle_date_limite']!=''){
1456     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
1457     }
1458     if($row['regle_date_complet']!=''){
1459     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
1460     }
1461     if($row['regle_date_dernier_depot']!=''){
1462     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
1463     }
1464     if($row['regle_date_notification_delai']!=''){
1465     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
1466     }
1467     if($row['regle_date_decision']!=''){
1468     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
1469     }
1470     if($row['regle_date_rejet']!=''){
1471     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
1472     }
1473     if($row['regle_date_validite']!=''){
1474     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
1475     }
1476     if($row['regle_date_chantier']!=''){
1477     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
1478     }
1479     if($row['regle_date_achevement']!=''){
1480     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
1481     }
1482     if($row['regle_date_conformite']!=''){
1483     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
1484     }
1485     if($row['regle_date_limite_incompletude']!=''){
1486     $valF['date_limite_incompletude']= $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
1487     }
1488     if($row['regle_delai_incompletude']!=''){
1489     $valF['delai_incompletude']= $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
1490     }
1491     if($row['regle_autorite_competente']!=''){
1492     $valF['autorite_competente']= $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
1493     }
1494     if($row['regle_etat']!=''){
1495     // Si on est dans le cas général ou qu'on est en incomplétude et
1496     // qu'on a un événement de type incomplétude alors : on stocke
1497     // l'état dans la variable courante
1498 fmichon 4708 if ($incompletude == FALSE OR $inst_evenement->getVal('type') == "incompletude") {
1499 mbroquet 3730 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
1500     } else {
1501     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat'], 'regle_etat');
1502     }
1503     }
1504     }
1505 fmichon 4708 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
1506 mbroquet 3730 // Si on est pas en incomplétude on stocke l'événement tacite
1507     //de l'événement dans la variable courante
1508    
1509 fmichon 4708 if ($incompletude == FALSE OR $inst_evenement->getVal('type') != "incompletude") {
1510     $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
1511 mbroquet 3730 } else {
1512 fmichon 4708 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
1513 mbroquet 3730 }
1514     }
1515     // Si des valeurs ont été calculées alors on met à jour l'enregistrement
1516     if ($valF != "") {
1517     // On met à jour le dossier
1518     $cle = " dossier='".$this->valF['dossier']."'";
1519     $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
1520     $this->addToLog("triggerajouterapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
1521     if (database::isError($res1)) {
1522     die($res->getMessage());
1523     }
1524     // Affichage d'informations à l'utilisateur
1525     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
1526     }
1527    
1528     /**
1529 fmichon 4708 * Interface avec le référentiel ERP.
1530     *
1531     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
1532     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
1533     * Déclencheur :
1534     * - L'option ERP est activée
1535     * - Le dossier est marqué comme "connecté au référentiel ERP"
1536     * - Le dossier est de type PC
1537     * - Le formulaire d'ajout d'un événement d'instruction est validé
1538     * avec un événement pour lequel les services ERP doivent être
1539     * informé
1540 mbroquet 3730 */
1541 fmichon 4708 //
1542     if ($this->f->is_option_referentiel_erp_enabled() === true
1543     && $inst_di->is_connected_to_referentiel_erp() === true
1544     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
1545     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
1546 mbroquet 3730 //
1547 fmichon 4708 $infos = array(
1548     "dossier_instruction" => $this->valF['dossier'],
1549     "decision" => $inst_evenement->getVal("libelle"),
1550     );
1551 mbroquet 3730 //
1552 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
1553     if ($ret !== true) {
1554     $this->cleanMessage();
1555     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
1556     return false;
1557 mbroquet 3730 }
1558 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
1559     }
1560 mbroquet 3730
1561 fmichon 4708 /**
1562     * Mise à jour des données du DA.
1563     */
1564     //
1565     $inst_da = $inst_di->get_inst_dossier_autorisation();
1566     //
1567     if ($inst_da->majDossierAutorisation() === false) {
1568 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
1569     $this->correct = false;
1570     return false;
1571     }
1572 fmichon 4708
1573     /**
1574     * Historisation de la vie du DI.
1575     */
1576     //
1577 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
1578 nmeucci 3876 }
1579 mbroquet 3730
1580     function triggermodifierapres($id,&$db,$val,$DEBUG) {
1581     /**
1582     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
1583     * si la date de l'evenement est modifiee
1584     */
1585     // Initialisation
1586     $valF = "";
1587     // Initialisation du type d'événement
1588     $type_evmt = "";
1589     // Récupération de l'action correspondante à l'événement
1590     $sql = "SELECT action
1591     FROM ".DB_PREFIXE."evenement
1592     WHERE evenement=".$this->valF['evenement'];
1593     $action = $db->getOne($sql);
1594     $this->addToLog("triggermodifierapres(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1595     if (database::isError($action)) {
1596     die($action->getMessage());
1597     }
1598    
1599     // Récupération des paramètres de l'action
1600     $sql = "SELECT * FROM ".DB_PREFIXE."action
1601     WHERE action='".$action."'";
1602     $res = $db->query($sql);
1603     $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);
1604     if (database::isError($res)) {
1605     die($res->getMessage());
1606     }
1607     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
1608     // application des regles sur le courrier + delai
1609     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
1610     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
1611     }
1612     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
1613     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
1614     }
1615     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
1616     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
1617     }
1618     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
1619     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
1620     }
1621     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
1622     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
1623     }
1624     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
1625     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
1626     }
1627     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
1628     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
1629     }
1630     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
1631     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
1632     }
1633     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
1634     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
1635     }
1636     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
1637     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
1638     }
1639     }
1640     // Si des valeurs ont été calculées alors on met à jour l'enregistrement
1641     if ($valF != "") {
1642     // On met à jour le dossier
1643     $cle = " dossier='".$this->valF['dossier']."'";
1644     $res1 = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
1645     $this->addToLog("triggermodifierapres(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
1646     if (database::isError($res1)) {
1647     die($res->getMessage());
1648     }
1649     // Affichage d'informations à l'utilisateur
1650     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
1651     }
1652    
1653     $restriction = $this->get_restriction($val['evenement']);
1654     $this->restriction_valid = $this->restrictionIsValid($restriction);
1655    
1656     if($restriction == "" || $this->restriction_valid ){
1657     // Récupération de tous les paramètres de l'événement sélectionné
1658     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
1659     WHERE evenement=".$this->valF['evenement'];
1660     $res = $db->query($sql);
1661     $this->addToLog("triggermodifierapres(): db->query(\"".$sql."\");", VERBOSE_MODE);
1662     if (database::isError($res)) {
1663     die($res->getMessage());
1664     }
1665 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
1666 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1667     // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
1668     if ($this->getVal('date_retour_signature') == "" AND
1669     $this->valF['date_retour_signature'] != "" AND
1670     $row['evenement_retour_signature'] != "") {
1671     $new_instruction = new instruction("]", $db, $DEBUG);
1672     // Création d'un tableau avec la liste des champs de l'instruction
1673     foreach($new_instruction->champs as $champ) {
1674     $valNewInstr[$champ] = "";
1675     }
1676     // Définition des valeurs de la nouvelle instruction
1677     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
1678     $valNewInstr["destinataire"] = $this->valF['destinataire'];
1679     $valNewInstr["dossier"] = $this->valF['dossier'];
1680     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
1681     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
1682     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
1683     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
1684     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
1685     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
1686     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
1687 nmeucci 3965 $new_instruction->setParameter("maj", 0);
1688     $new_instruction->class_actions[0]["identifier"] =
1689     "retour signature de l'instruction $current_id";
1690 mbroquet 3730 $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);
1691    
1692     //Si une erreur s'est produite et qu'il s'agit d'un problème
1693     //de restriction
1694     if ($retour == false && !$new_instruction->restriction_valid){
1695     $error_message = $this->get_restriction_error_message($restriction);
1696     $this->f->displayMessage("error", $error_message);
1697     $this->addToLog("triggermodifierapres() : evenement retour ".
1698     "instruction ".$this->valF[$this->clePrimaire]." : ".
1699     $new_instruction->msg);
1700     }
1701     //Si une erreur s'est produite après le test de la restriction
1702     elseif ($retour == false && $new_instruction->restriction_valid){
1703     $this->correct = false ;
1704     $this->msg .= $new_instruction->msg;
1705     return false;
1706     }
1707     }
1708     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
1709     if ($this->getVal('date_retour_rar') == "" AND
1710     $this->valF['date_retour_rar'] != "") {
1711    
1712     if($row['evenement_retour_ar'] != "") {
1713     $new_instruction = new instruction("]", $db, $DEBUG);
1714     // Création d'un tableau avec la liste des champs de l'instruction
1715     foreach($new_instruction->champs as $champ) {
1716     $valNewInstr[$champ] = "";
1717     }
1718     // Définition des valeurs de la nouvelle instruction
1719     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
1720     $valNewInstr["destinataire"] = $this->valF['destinataire'];
1721     $valNewInstr["dossier"] = $this->valF['dossier'];
1722     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
1723     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
1724     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
1725     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
1726     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
1727     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
1728     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
1729 nmeucci 3965 $new_instruction->setParameter("maj", 0);
1730     $new_instruction->class_actions[0]["identifier"] =
1731     "retour RAR de l'instruction $current_id";
1732 mbroquet 3730 $retour = $new_instruction->ajouter($valNewInstr,$db, $DEBUG);
1733    
1734     //Si une erreur s'est produite et qu'il s'agit d'un problème
1735     //de restriction
1736     if ($retour == false && !$new_instruction->restriction_valid) {
1737     $error_message = $this->get_restriction_error_message($restriction);
1738     $this->f->displayMessage("error", $error_message);
1739     $this->addToLog(
1740     "triggermodifierapres() : evenement retour instruction ".
1741     $this->valF[$this->clePrimaire]." : ".
1742     $new_instruction->msg
1743     );
1744     }
1745     //Si une erreur s'est produite après le test de la restriction
1746     elseif ($retour == false && $new_instruction->restriction_valid){
1747     $this->correct = false ;
1748     $this->msg .= $new_instruction->msg;
1749     return false;
1750     }
1751     }
1752     // Mise à jour du flag incomplet_notifie dans dossier si la
1753     // date limite d'instruction n'est pas dépassée
1754     if($row['type']=='incompletude' &&
1755     ($this->valF['archive_date_notification_delai'] >= $this->valF['date_retour_rar'] ||
1756     $this->valF['archive_date_notification_delai'] == "")) {
1757     $valFIncomp['incomplet_notifie'] = true;
1758     $cle = " dossier='".$val['dossier']."'";
1759     $resIncomp = $db->autoExecute(
1760     DB_PREFIXE.'dossier',
1761     $valFIncomp,
1762     DB_AUTOQUERY_UPDATE,
1763     $cle
1764     );
1765     $this->addToLog(
1766     "triggersupprimer(): db->autoexecute(\"".
1767     DB_PREFIXE."dossier\", ".print_r($valFIncomp, true).
1768     ", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
1769     VERBOSE_MODE
1770     );
1771     if (database::isError($resIncomp)) {
1772     die($resIncomp->getMessage());
1773     }
1774     }
1775     }
1776     }
1777     }
1778    
1779     // Mise à jour des données du dossier d'autorisation
1780     require_once "../obj/dossier_autorisation.class.php";
1781     $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($this->valF['dossier']), $this->db, DEBUG);
1782     if($da->majDossierAutorisation() === false) {
1783     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
1784     $this->correct = false;
1785     return false;
1786     }
1787 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
1788 fmichon 4708 }
1789 mbroquet 3730
1790     function triggersupprimer($id,&$db,$val,$DEBUG) {
1791     /**
1792     * L'objectif ici est de repositionner les valeurs récupérées en
1793     * archive dans le dossier d'instruction avant de supprimer l'événement
1794     * d'instruction
1795     */
1796    
1797     // Mise à jour des 4 valeurs modifiées par l'action
1798     $valF['delai'] = $val['archive_delai'];
1799     $valF['accord_tacite'] = $val['archive_accord_tacite'];
1800     $valF['etat'] = $val['archive_etat'];
1801     if ($val['archive_avis'] != '') {
1802     $valF['avis_decision'] = $val['archive_avis'];
1803     } else {
1804     $valF['avis_decision'] = NULL;
1805     }
1806     // Mise à jour des 10 dates avec la valeur présente dans le formulaire
1807     // de suppression. Si la valeur de la date est vide alors on fixe
1808     // à la valeur NULL
1809     //
1810     if ($val['archive_date_complet'] != '') {
1811     $valF['date_complet'] = $val['archive_date_complet'];
1812     } else {
1813     $valF['date_complet'] = NULL;
1814     }
1815     if ($val['archive_date_dernier_depot'] != '') {
1816     $valF['date_dernier_depot'] = $val['archive_date_dernier_depot'];
1817     } else {
1818     $valF['date_dernier_depot'] = NULL;
1819     }
1820     if ($val['archive_date_rejet'] != '') {
1821     $valF['date_rejet'] = $val['archive_date_rejet'];
1822     } else {
1823     $valF['date_rejet'] = NULL;
1824     }
1825     if ($val['archive_date_limite'] != '') {
1826     $valF['date_limite'] = $val['archive_date_limite'];
1827     } else {
1828     $valF['date_limite'] = NULL;
1829     }
1830     if ($val['archive_date_notification_delai'] != '') {
1831     $valF['date_notification_delai'] = $val['archive_date_notification_delai'];
1832     } else {
1833     $valF['date_notification_delai'] = NULL;
1834     }
1835     if ($val['archive_date_decision'] != '') {
1836     $valF['date_decision'] = $val['archive_date_decision'];
1837     } else {
1838     $valF['date_decision'] = NULL;
1839     }
1840     if ($val['archive_date_validite'] != '') {
1841     $valF['date_validite'] = $val['archive_date_validite'];
1842     } else {
1843     $valF['date_validite'] = NULL;
1844     }
1845     if ($val['archive_date_achevement'] != '') {
1846     $valF['date_achevement'] = $val['archive_date_achevement'];
1847     } else {
1848     $valF['date_achevement'] = NULL;
1849     }
1850     if ($val['archive_date_chantier'] != '') {
1851     $valF['date_chantier'] = $val['archive_date_chantier'];
1852     } else {
1853     $valF['date_chantier'] = NULL;
1854     }
1855     if ($val['archive_date_conformite'] != '') {
1856     $valF['date_conformite'] = $val['archive_date_conformite'];
1857     } else {
1858     $valF['date_conformite'] = NULL;
1859     }
1860     if ($val['archive_incompletude'] != '') {
1861     $valF['incompletude'] = $val['archive_incompletude'];
1862     } else {
1863     $valF['incompletude'] = NULL;
1864     }
1865     if ($val['archive_incomplet_notifie'] != '') {
1866     $valF['incomplet_notifie'] = $val['archive_incomplet_notifie'];
1867     } else {
1868     $valF['incomplet_notifie'] = NULL;
1869     }
1870     if ($val['archive_evenement_suivant_tacite'] != '') {
1871     $valF['evenement_suivant_tacite'] = $val['archive_evenement_suivant_tacite'];
1872     } else {
1873     $valF['evenement_suivant_tacite'] = NULL;
1874     }
1875     if ($val['archive_evenement_suivant_tacite_incompletude'] != '') {
1876     $valF['evenement_suivant_tacite_incompletude'] = $val['archive_evenement_suivant_tacite_incompletude'];
1877     } else {
1878     $valF['evenement_suivant_tacite_incompletude'] = NULL;
1879     }
1880     if ($val['archive_etat_pendant_incompletude'] != '') {
1881     $valF['etat_pendant_incompletude'] = $val['archive_etat_pendant_incompletude'];
1882     } else {
1883     $valF['etat_pendant_incompletude'] = NULL;
1884     }
1885     if ($val['archive_date_limite_incompletude'] != '') {
1886     $valF['date_limite_incompletude'] = $val['archive_date_limite_incompletude'];
1887     } else {
1888     $valF['date_limite_incompletude'] = NULL;
1889     }
1890     if ($val['archive_delai_incompletude'] != '') {
1891     $valF['delai_incompletude'] = $val['archive_delai_incompletude'];
1892     } else {
1893     $valF['delai_incompletude'] = NULL;
1894     }
1895     if ($val['archive_autorite_competente'] != '') {
1896     $valF['autorite_competente'] = $val['archive_autorite_competente'];
1897     } else {
1898     $valF['autorite_competente'] = NULL;
1899     }
1900     // On met à jour le dossier
1901     $cle = " dossier='".$val['dossier']."'";
1902     $res = $db->autoExecute(DB_PREFIXE.'dossier', $valF, DB_AUTOQUERY_UPDATE, $cle);
1903     $this->addToLog("triggersupprimer(): db->autoexecute(\"".DB_PREFIXE."dossier\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
1904     if (database::isError($res)) {
1905     die($res->getMessage());
1906     }
1907     // Affichage d'informations à l'utilisateur
1908     $this->addToMessage(_("Suppression de l'instruction")." [".$db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
1909    
1910     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
1911     }
1912    
1913     function triggersupprimerapres($id,&$db,$val,$DEBUG) {
1914    
1915     // Mise à jour des données du dossier d'autorisation
1916     require_once "../obj/dossier_autorisation.class.php";
1917     $da = new dossier_autorisation($this->getNumDemandeAutorFromDossier($val["dossier"]), $this->db, DEBUG);
1918     if($da->majDossierAutorisation() === false) {
1919     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
1920     $this->correct = false;
1921     return false;
1922     }
1923 nmeucci 3963 $val['evenement'] = $this->getVal('evenement');
1924 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
1925 mbroquet 3730 }
1926    
1927     /**
1928     * Permet de composer un message d'erreur sur restriction non valide en
1929     * fonction du contexte.
1930     *
1931     * @param string $restriction formule de la restriction
1932     *
1933     * @return string message d'erreur
1934     */
1935     function get_restriction_error_message($restriction) {
1936     // Affichage du message si la restriction s'applique
1937     // Contexte du suivi des dates (message simple)
1938     $message_restrict = _("Probleme de dates :");
1939     // Split restriction
1940     $champs_restrict = preg_split(
1941     '/(\W+)/',
1942     $restriction,
1943     null,
1944     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
1945     );
1946     $formated_restrict = "";
1947     // Ajout des chaînes à traduire
1948     foreach ($champs_restrict as $value) {
1949     $formated_restrict .= _($value)." ";
1950     }
1951     $formated_restrict = substr($formated_restrict, 0, -1);
1952     // Message d'erreur dans le contexte du suivi des dates
1953     if($this->getParameter("maj") == 170) {
1954     $message_restrict .= " "._("contactez l'instructeur du dossier");
1955     $message_restrict .= "<br/>(".$formated_restrict.")";
1956     } else {
1957     // Affichage du message si la restriction s'applique
1958     // Contexte instruction
1959     $message_restrict .= "<br/>".$formated_restrict;
1960     }
1961    
1962     return $message_restrict;
1963     }
1964    
1965     /**
1966     * Vérifie la restriction sur l'événement.
1967     *
1968     * @param array $val valeurs du formulaire
1969     * @param database $db handler database
1970     * @param boolean $DEBUG NA
1971     *
1972     * @return [type] [description]
1973     */
1974     function verifier($val = array(), &$db, $DEBUG) {
1975     parent::verifier($val, $db, $DEBUG);
1976    
1977     if ( isset($val['evenement']) && is_numeric($val['evenement'])){
1978     $restriction = $this->get_restriction($val['evenement']);
1979    
1980     //Test qu'une restriction est présente
1981     if ($restriction != "" ){
1982    
1983     //Test si la restriction est valide
1984     $this->restriction_valid = $this->restrictionIsValid($restriction);
1985     if ( !$this->restriction_valid ){
1986    
1987     // Affichage du message si la restriction s'applique
1988     $this->addToMessage(
1989     $this->get_restriction_error_message($restriction)
1990     );
1991     $this->correct=false;
1992     return false;
1993     }
1994    
1995     // Liste des opérateurs possible
1996 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
1997 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
1998     $restriction = str_replace(' ', '', $restriction);
1999    
2000     // Met des espace avant et après les opérateurs puis transforme la
2001     // chaine en un tableau
2002     $tabRestriction = str_replace($operateurs, " ", $restriction);
2003     // Tableau des champ
2004     $tabRestriction = explode(" ", $tabRestriction);
2005     // Supprime les numériques du tableau
2006     foreach ($tabRestriction as $key => $value) {
2007     if (is_numeric($value)) {
2008     unset($tabRestriction[$key]);
2009     }
2010     }
2011    
2012     // Vérifie les champs utilisés pour la restriction
2013     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
2014     if ($check_field_exist !== true) {
2015    
2016     // Liste des champs en erreur
2017     $string_error_fields = implode(", ", $check_field_exist);
2018    
2019     // Message d'erreur
2020     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
2021     if (count($check_field_exist) > 1) {
2022     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
2023     }
2024    
2025     // Affiche l'erreur
2026     $this->correct=false;
2027     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
2028     $this->addToMessage(_("Veuillez contacter votre administrateur."));
2029     }
2030     }
2031    
2032     }
2033     if(!$this->updateDate("date_envoi_signature")) {
2034     return false;
2035     }
2036     if(!$this->updateDate("date_retour_signature")) {
2037     return false;
2038     }
2039     if(!$this->updateDate("date_envoi_rar")) {
2040     return false;
2041     }
2042     if(!$this->updateDate("date_retour_rar")) {
2043     return false;
2044     }
2045     if(!$this->updateDate("date_envoi_controle_legalite")) {
2046     return false;
2047     }
2048     if(!$this->updateDate("date_retour_controle_legalite")) {
2049     return false;
2050     }
2051    
2052     }
2053    
2054     /**
2055     * Finalisation des documents.
2056     * @param string $champ champ du fichier à finaliser
2057     * @param booleen $status permet de définir si on finalise ou définalise
2058     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
2059     */
2060     function manage_finalizing($mode = null, $val = array()) {
2061    
2062     // Si le mode n'existe pas on retourne false
2063     if ($mode != "finalize" && $mode != "unfinalize") {
2064     return false;
2065     }
2066    
2067     // Recuperation de la valeur de la cle primaire de l'objet
2068     $id = $this->getVal($this->clePrimaire);
2069    
2070     // Si on finalise le document
2071     if ($mode == "finalize"){
2072    
2073     // Récupère la collectivite du dossier d'instruction
2074     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2075    
2076     //
2077     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2078    
2079     // Génération du PDF
2080     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite);
2081     $pdf_output = $result['pdf_output'];
2082    
2083     //Métadonnées du document
2084     $metadata = array(
2085     'filename' => 'instruction_'.$id.'.pdf',
2086     'mimetype' => 'application/pdf',
2087     'size' => strlen($pdf_output)
2088     );
2089    
2090     // Récupération des métadonnées calculées après validation
2091     $spe_metadata = $this->getMetadata("om_fichier_instruction");
2092    
2093     //On vérifie si l'instruction à finaliser a un événement de type arrete
2094     $sql = "SELECT type
2095     FROM ".DB_PREFIXE."evenement
2096     WHERE evenement = ".$this->getVal("evenement");
2097     $typeEvenement = $this->db->getOne($sql);
2098     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2099     if (database::isError($typeEvenement, true)) {
2100     die();
2101     }
2102    
2103     //Initialisation de la variable
2104     $arrete_metadata = array();
2105     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
2106     if ( $typeEvenement === 'arrete' ){
2107     $arrete_metadata = $this->getMetadata("arrete");
2108     }
2109    
2110     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
2111    
2112     // Si le document a déjà été finalisé
2113     // met à jour le document mais pas son uid
2114     if ($this->getVal("om_fichier_instruction") != ''){
2115    
2116     // Met à jour le document
2117     $uid = $this->f->storage->update(
2118     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
2119     }
2120     //Sinon, ajoute le document et récupère son uid
2121     else {
2122    
2123     //Stockage du PDF
2124     $uid = $this->f->storage->create($pdf_output, $metadata);
2125     }
2126     }
2127    
2128     // Si on finalise le document
2129     if ($mode == "unfinalize") {
2130    
2131     // Récupération de l'uid du document finalisé
2132     $uid = $this->getVal("om_fichier_instruction");
2133     }
2134    
2135     //
2136     if ($uid == '' || $uid == 'OP_FAILURE' ) {
2137     // Stop le traitement
2138     return false;
2139    
2140     // Message d'echec (saut d'une ligne supplementaire avant le
2141     // message pour qu'il soit mis en evidence)
2142     $this->addToLog(
2143     _("Finalisation non enregistree")." - ".
2144     _("id instruction")." = ".$id." - ".
2145     _("uid fichier")." = ".$uid
2146     );
2147     }
2148    
2149     // Logger
2150     $this->addToLog(__METHOD__."() - begin", EXTRA_VERBOSE_MODE);
2151    
2152     //
2153     foreach ($this->champs as $key => $champ) {
2154     //
2155     $val[$champ] = $this->val[$key];
2156     }
2157    
2158     //
2159     $val['date_evenement']=$this->dateDBToForm($val['date_evenement']);
2160     $val['archive_date_complet']=$this->dateDBToForm($val['archive_date_complet']);
2161     $val['archive_date_rejet']=$this->dateDBToForm($val['archive_date_rejet']);
2162     $val['archive_date_limite']=$this->dateDBToForm($val['archive_date_limite']);
2163     $val['archive_date_notification_delai']=$this->dateDBToForm($val['archive_date_notification_delai']);
2164     $val['archive_date_decision']=$this->dateDBToForm($val['archive_date_decision']);
2165     $val['archive_date_validite']=$this->dateDBToForm($val['archive_date_validite']);
2166     $val['archive_date_achevement']=$this->dateDBToForm($val['archive_date_achevement']);
2167     $val['archive_date_chantier']=$this->dateDBToForm($val['archive_date_chantier']);
2168     $val['archive_date_conformite']=$this->dateDBToForm($val['archive_date_conformite']);
2169     $val['archive_date_dernier_depot']=$this->dateDBToForm($val['archive_date_dernier_depot']);
2170     $val['archive_date_limite_incompletude']=$this->dateDBToForm($val['archive_date_limite_incompletude']);
2171     $val['date_finalisation_courrier']=$this->dateDBToForm($val['date_finalisation_courrier']);
2172     $val['date_envoi_signature']=$this->dateDBToForm($val['date_envoi_signature']);
2173     $val['date_retour_signature']=$this->dateDBToForm($val['date_retour_signature']);
2174     $val['date_envoi_rar']=$this->dateDBToForm($val['date_envoi_rar']);
2175     $val['date_retour_rar']=$this->dateDBToForm($val['date_retour_rar']);
2176     $val['date_envoi_controle_legalite']=$this->dateDBToForm($val['date_envoi_controle_legalite']);
2177     $val['date_retour_controle_legalite']=$this->dateDBToForm($val['date_retour_controle_legalite']);
2178    
2179     $this->setvalF($val);
2180    
2181     // Verification de la validite des donnees
2182     $this->verifier($this->val, $this->db, DEBUG);
2183     // Si les verifications precedentes sont correctes, on procede a
2184     // la modification, sinon on ne fait rien et on retourne une erreur
2185     if ($this->correct) {
2186     // Execution du trigger 'before' specifique au MODE 'update'
2187     $this->triggermodifier($id, $this->db, $this->val, DEBUG);
2188    
2189     //
2190     $valF = array(
2191     "om_fichier_instruction" => $uid,
2192     "date_finalisation_courrier" => date('Y-m-d')
2193     );
2194     //
2195     if($mode=="finalize") {
2196     // état finalisé vrai
2197     $valF["om_final_instruction"] = 't';
2198     // ajout log utilisateur
2199     $login = $_SESSION['login'];
2200     $nom = "";
2201     $this->f->getUserInfos();
2202     if (isset($this->f->om_utilisateur["nom"])
2203     && !empty($this->f->om_utilisateur["nom"])) {
2204     $nom = $this->f->om_utilisateur["nom"];
2205     }
2206     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
2207     if ($nom != "") {
2208     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
2209     }
2210     } else {
2211     // état finalisé faux
2212     $valF["om_final_instruction"] = 'f';
2213     // suppression log utilisateur
2214     $valF["om_final_instruction_utilisateur"] = '';
2215     }
2216    
2217     // Execution de la requête de modification des donnees de l'attribut
2218     // valF de l'objet dans l'attribut table de l'objet
2219     $res = $this->db->autoExecute(DB_PREFIXE.$this->table, $valF,
2220     DB_AUTOQUERY_UPDATE, $this->getCle($id));
2221     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\")", VERBOSE_MODE);
2222     // Si une erreur survient
2223     if (database::isError($res, true)) {
2224     // Appel de la methode de recuperation des erreurs
2225     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
2226     } else {
2227     // Log
2228     $this->addToLog(_("Requete executee"), VERBOSE_MODE);
2229     // Log
2230     $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
2231     $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
2232     $message .= "[&nbsp;".$this->db->affectedRows()."&nbsp;";
2233     $message .= _("enregistrement(s) mis a jour")."&nbsp;]";
2234     $this->addToLog($message, VERBOSE_MODE);
2235     // Execution du trigger 'after' specifique au MODE 'update'
2236     //$this->triggermodifierapres($id, $this->db, $val, DEBUG);
2237    
2238     if($mode == "finalize") {
2239     $etat = _('finalisation');
2240     } else {
2241     $etat = _('definalisation');
2242     }
2243     $this->msg = "";
2244     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
2245    
2246 nmeucci 3943 return $this->add_log_to_dossier($id, $val);
2247 mbroquet 3730 }
2248     } else {
2249     // Message d'echec (saut d'une ligne supplementaire avant le
2250     // message pour qu'il soit mis en evidence)
2251     $this->addToLog(
2252     _("Finalisation non enregistree")." - ".
2253     _("id instruction")." = ".$id." - ".
2254     _("uid fichier")." = ".$uid
2255     );
2256     return false;
2257     }
2258     }
2259    
2260     /**
2261     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
2262     * @return string numéro de dossier d'instruction
2263     */
2264     protected function getDossier() {
2265     if(empty($this->specificMetadata)) {
2266     $this->getSpecificMetadata();
2267     }
2268     return $this->specificMetadata->dossier;
2269     }
2270     /**
2271     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
2272     * @return int Version
2273     */
2274     protected function getDossierVersion() {
2275     if(empty($this->specificMetadata)) {
2276     $this->getSpecificMetadata();
2277     }
2278     return $this->specificMetadata->version;
2279     }
2280     /**
2281     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
2282     * @return string numéro de dossier d'autorisation
2283     */
2284     protected function getNumDemandeAutor() {
2285     if(empty($this->specificMetadata)) {
2286     $this->getSpecificMetadata();
2287     }
2288     return $this->specificMetadata->dossier_autorisation;
2289     }
2290     /**
2291     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
2292     * @return date de la demande initiale
2293     */
2294     protected function getAnneemoisDemandeAutor() {
2295     if(empty($this->specificMetadata)) {
2296     $this->getSpecificMetadata();
2297     }
2298     return $this->specificMetadata->date_demande_initiale;
2299     }
2300     /**
2301     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
2302     * @return string type du dossier d'instruction
2303     */
2304     protected function getTypeInstruction() {
2305     if(empty($this->specificMetadata)) {
2306     $this->getSpecificMetadata();
2307     }
2308     return $this->specificMetadata->dossier_instruction_type;
2309     }
2310     /**
2311     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
2312     * @return string avis
2313     */
2314     protected function getStatutAutorisation() {
2315     if(empty($this->specificMetadata)) {
2316     $this->getSpecificMetadata();
2317     }
2318     return $this->specificMetadata->statut;
2319     }
2320     /**
2321     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
2322     * @return string type du dossier d'autorisation
2323     */
2324     protected function getTypeAutorisation() {
2325     if(empty($this->specificMetadata)) {
2326     $this->getSpecificMetadata();
2327     }
2328     return $this->specificMetadata->dossier_autorisation_type;
2329     }
2330     /**
2331     * Récupération de la date d'ajout de document à ajouter aux métadonnées
2332     * @return date de l'évènement
2333     */
2334     protected function getDateEvenementDocument() {
2335     return date("Y-m-d");
2336     }
2337     /**
2338     * Récupération du groupe d'instruction à ajouter aux métadonnées
2339     * @return string Groupe d'instruction
2340     */
2341     protected function getGroupeInstruction() {
2342     if(empty($this->specificMetadata)) {
2343     $this->getSpecificMetadata();
2344     }
2345     return $this->specificMetadata->groupe_instruction;
2346     }
2347     /**
2348     * Récupération du libellé du type du document à ajouter aux métadonnées
2349     * @return string Groupe d'instruction
2350     */
2351     protected function getTitle() {
2352    
2353     // Récupère le champ événement
2354     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
2355     $evenement = $this->valF["evenement"];
2356     } else {
2357     $evenement = $this->getVal("evenement");
2358     }
2359    
2360     // Requête sql
2361     $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
2362     WHERE evenement=".$evenement;
2363     $evenement_libelle = $this->db->getOne($sql);
2364     $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2365     if (database::isError($evenement_libelle)) {
2366     die();
2367     }
2368    
2369     // Retourne le libelle de l'événement
2370     return $evenement_libelle;
2371     }
2372    
2373     /**
2374     * Cette méthode permet de stocker en attribut toutes les métadonnées
2375     * nécessaire à l'ajout d'un document.
2376     */
2377     public function getSpecificMetadata() {
2378     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
2379     $dossier = $this->valF["dossier"];
2380     } else {
2381     $dossier = $this->getVal("dossier");
2382     }
2383     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
2384     $sql = "SELECT dossier.dossier as dossier,
2385     dossier_autorisation.dossier_autorisation as dossier_autorisation,
2386     to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
2387     dossier_instruction_type.code as dossier_instruction_type,
2388     etat_dossier_autorisation.libelle as statut,
2389     dossier_autorisation_type.code as dossier_autorisation_type,
2390     groupe.code as groupe_instruction
2391     FROM ".DB_PREFIXE."dossier
2392     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
2393     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2394     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2395     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2396     LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
2397     ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
2398     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
2399     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2400     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
2401     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
2402     LEFT JOIN ".DB_PREFIXE."groupe
2403     ON dossier_autorisation_type.groupe = groupe.groupe
2404     WHERE dossier.dossier = '".$dossier."'";
2405     $res = $this->db->query($sql);
2406     $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);
2407     if ( database::isError($res)){
2408     die();
2409     }
2410    
2411     //Le résultat est récupéré dans un objet
2412     $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
2413    
2414     //Si il y a un résultat
2415     if ($row !== null) {
2416    
2417 fmichon 3892 // Instrance de la classe dossier
2418     $inst_dossier = $this->get_inst_dossier($dossier);
2419    
2420     // Insère l'attribut version à l'objet
2421     $row->version = $inst_dossier->get_dossier_instruction_version();
2422    
2423 mbroquet 3730 //Alors on créé l'objet dossier_instruction
2424     $this->specificMetadata = $row;
2425    
2426     }
2427     }
2428    
2429     /**
2430     * Retourne le statut du dossier d'instruction
2431     * @param string $idx Identifiant du dossier d'instruction
2432     * @return string Le statut du dossier d'instruction
2433     */
2434     function getStatutAutorisationDossier($idx){
2435    
2436     $statut = '';
2437    
2438     //Si l'identifiant du dossier d'instruction fourni est correct
2439     if ( $idx != '' ){
2440    
2441     //On récupère le statut de l'état du dossier à partir de l'identifiant du
2442     //dossier
2443     $sql = "SELECT etat.statut
2444     FROM ".DB_PREFIXE."dossier
2445     LEFT JOIN
2446     ".DB_PREFIXE."etat
2447     ON
2448     dossier.etat = etat.etat
2449     WHERE dossier ='".$idx."'";
2450     $statut = $this->db->getOne($sql);
2451     $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2452     if ( database::isError($statut)){
2453     die();
2454     }
2455     }
2456     return $statut;
2457     }
2458    
2459     /**
2460     * Récupère les données du dossier
2461     * @return array
2462     */
2463     function get_dossier_actual() {
2464    
2465     // Initialisation de la valeur de retour
2466     $return = array();
2467    
2468     // Récupération de toutes les valeurs du dossier d'instruction en cours
2469     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2470     WHERE dossier='".$this->valF['dossier']."'";
2471     $res = $this->db->query($sql);
2472     $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);
2473     $this->f->isDatabaseError($res);
2474    
2475     //
2476     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2477    
2478     // Récupération de la valeur actuelle du délai, de l'accord tacite,
2479     // de l'état et de l'avis du dossier d'instruction
2480     $return['archive_delai']=$row['delai'];
2481     $return['archive_accord_tacite']=$row['accord_tacite'];
2482     $return['archive_etat']=$row['etat'];
2483     $return['archive_avis']=$row['avis_decision'];
2484     // Récupération de la valeur actuelle des 9 dates du dossier
2485     // d'instruction
2486     $return['archive_date_complet']=$row['date_complet'];
2487     $return['archive_date_dernier_depot']=$row['date_dernier_depot'];
2488     $return['archive_date_rejet']= $row['date_rejet'];
2489     $return['archive_date_limite']= $row['date_limite'];
2490     $return['archive_date_notification_delai']= $row['date_notification_delai'];
2491     $return['archive_date_decision']= $row['date_decision'];
2492     $return['archive_date_validite']= $row['date_validite'];
2493     $return['archive_date_achevement']= $row['date_achevement'];
2494     $return['archive_date_chantier']= $row['date_chantier'];
2495     $return['archive_date_conformite']= $row['date_conformite'];
2496     $return['archive_incompletude']= $row['incompletude'];
2497     $return['archive_incomplet_notifie']= $row['incomplet_notifie'];
2498     $return['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
2499     $return['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
2500     $return['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
2501     $return['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
2502     $return['archive_delai_incompletude']= $row['delai_incompletude'];
2503     $return['archive_autorite_competente']= $row['autorite_competente'];
2504     $return['duree_validite']= $row['duree_validite'];
2505 nmeucci 3873 $return['date_depot']= $row['date_depot'];
2506 mbroquet 3730 }
2507    
2508     // Retour de la fonction
2509     return $return;
2510    
2511     }
2512    
2513     /**
2514     * Permet de vérifier qu'un événement est verrouillable
2515     * @param integer $idx Identifiant de l'instruction
2516     * @return boolean
2517     */
2518     function checkEvenementNonVerrouillable($idx) {
2519    
2520     // Initialisation du résultat
2521     $non_verrouillable = false;
2522    
2523     // Si la condition n'est pas vide
2524     if ($idx != "") {
2525    
2526     // Requête SQL
2527     $sql = "SELECT evenement.non_verrouillable
2528     FROM ".DB_PREFIXE."evenement
2529     LEFT JOIN ".DB_PREFIXE."instruction
2530     ON instruction.evenement = evenement.evenement
2531     WHERE instruction.instruction = $idx";
2532     $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2533     $res = $this->db->getOne($sql);
2534     $this->f->isDatabaseError($res);
2535    
2536     // Si le retour de la requête est true
2537     if ($res == 't') {
2538     //
2539     $non_verrouillable = true;
2540     }
2541     }
2542    
2543     // Retourne résultat
2544     return $non_verrouillable;
2545     }
2546    
2547     /**
2548     * Mise à jour des champs archive_*
2549     * @param mixed $row La ligne de données
2550     */
2551     public function updateArchiveData($row){
2552    
2553     // Récupération de la valeur actuelle du délai, de l'accord tacite,
2554     // de l'état et de l'avis du dossier d'instruction
2555     $this->valF['archive_delai']=$row['delai'];
2556     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
2557     $this->valF['archive_etat']=$row['etat'];
2558     $this->valF['archive_avis']=$row['avis_decision'];
2559     // Récupération de la valeur actuelle des 9 dates du dossier
2560     // d'instruction
2561     if ($row['date_complet'] != '') {
2562     $this->valF['archive_date_complet']=$row['date_complet'];
2563     }
2564     if ($row['date_dernier_depot'] != '') {
2565     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
2566     }
2567     if ($row['date_rejet']!='') {
2568     $this->valF['archive_date_rejet']= $row['date_rejet'];
2569     }
2570     if ($row['date_limite']!='') {
2571     $this->valF['archive_date_limite']= $row['date_limite'];
2572     }
2573     if ($row['date_notification_delai']!='') {
2574     $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
2575     }
2576     if ($row['date_decision']!='') {
2577     $this->valF['archive_date_decision']= $row['date_decision'];
2578     }
2579     if ($row['date_validite']!='') {
2580     $this->valF['archive_date_validite']= $row['date_validite'];
2581     }
2582     if ($row['date_achevement']!='') {
2583     $this->valF['archive_date_achevement']= $row['date_achevement'];
2584     }
2585     if ($row['date_chantier']!='') {
2586     $this->valF['archive_date_chantier']= $row['date_chantier'];
2587     }
2588     if ($row['date_conformite']!='') {
2589     $this->valF['archive_date_conformite']= $row['date_conformite'];
2590     }
2591     if ($row['incompletude']!='') {
2592     $this->valF['archive_incompletude']= $row['incompletude'];
2593     }
2594     if ($row['incomplet_notifie']!='') {
2595     $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
2596     }
2597     if ($row['evenement_suivant_tacite']!='') {
2598     $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
2599     }
2600     if ($row['evenement_suivant_tacite_incompletude']!='') {
2601     $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
2602     }
2603     if ($row['etat_pendant_incompletude']!='') {
2604     $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
2605     }
2606     if ($row['date_limite_incompletude']!='') {
2607     $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
2608     }
2609     if ($row['delai_incompletude']!='') {
2610     $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
2611     }
2612     if ($row['autorite_competente']!='') {
2613     $this->valF['archive_autorite_competente']= $row['autorite_competente'];
2614     }
2615     if ($row['duree_validite']!='') {
2616     $this->valF['duree_validite']= $row['duree_validite'];
2617     }
2618 nmeucci 3873 if ($row['date_depot']!='') {
2619     $this->valF['date_depot']= $row['date_depot'];
2620     }
2621 mbroquet 3730 }
2622    
2623     // {{{
2624     // Méthodes de récupération des métadonnées arrêté
2625     /**
2626     * @return string Retourne le numéro d'arrêté
2627     */
2628     function getNumArrete() {
2629     return $this->getVal("numero_arrete");
2630     }
2631     /**
2632     * @return chaîne vide
2633     */
2634     function getReglementaireArrete() {
2635     return 'true';
2636     }
2637     /**
2638     * @return boolean de notification au pétitionnaire
2639     */
2640     function getNotificationArrete() {
2641     return 'true';
2642     }
2643     /**
2644     * @return date de notification au pétitionnaire
2645     */
2646     function getDateNotificationArrete() {
2647     if (empty($this->metadonneesArrete)) {
2648     $this->getArreteMetadata();
2649     }
2650     return $this->metadonneesArrete["datenotification"];
2651     }
2652     /**
2653     * @return boolean check si le document est passé au contrôle de légalité
2654     */
2655     function getControleLegalite() {
2656     return 'true';
2657     }
2658     /**
2659     * @return date de signature de l'arrêté
2660     */
2661     function getDateSignature() {
2662     if (empty($this->metadonneesArrete)) {
2663     $this->getArreteMetadata();
2664     }
2665     return $this->metadonneesArrete["datesignaturearrete"];
2666     }
2667     /**
2668     * @return string nom du signataire
2669     */
2670     function getNomSignataire() {
2671     if (empty($this->metadonneesArrete)) {
2672     $this->getArreteMetadata();
2673     }
2674     return $this->metadonneesArrete["nomsignataire"];
2675     }
2676     /**
2677     * @return string qualité du signataire
2678     */
2679     function getQualiteSignataire() {
2680     if (empty($this->metadonneesArrete)) {
2681     $this->getArreteMetadata();
2682     }
2683     return $this->metadonneesArrete["qualitesignataire"];
2684     }
2685     /**
2686     * @return string numéro du terrain
2687     */
2688     function getAp_numRue() {
2689     if (empty($this->metadonneesArrete)) {
2690     $this->getArreteMetadata();
2691     }
2692     return $this->metadonneesArrete["ap_numrue"];
2693     }
2694     /**
2695     * @return string nom de la rue du terrain
2696     */
2697     function getAp_nomDeLaVoie() {
2698     if (empty($this->metadonneesArrete)) {
2699     $this->getArreteMetadata();
2700     }
2701     return $this->metadonneesArrete["ap_nomdelavoie"];
2702     }
2703     /**
2704     * @return string code postal du terrain
2705     */
2706     function getAp_codePostal() {
2707     if (empty($this->metadonneesArrete)) {
2708     $this->getArreteMetadata();
2709     }
2710     return $this->metadonneesArrete["ap_codepostal"];
2711     }
2712     /**
2713     * @return string ville du terrain
2714     */
2715     function getAp_ville() {
2716     if (empty($this->metadonneesArrete)) {
2717     $this->getArreteMetadata();
2718     }
2719     return $this->metadonneesArrete["ap_ville"];
2720     }
2721     /**
2722     * @return string activité
2723     */
2724     function getActivite() {
2725     return "Droit du sol";
2726     }
2727     /**
2728     * @return string date du retour de controle légalité
2729     */
2730     function getDateControleLegalite() {
2731     if (empty($this->metadonneesArrete)) {
2732     $this->getArreteMetadata();
2733     }
2734     return $this->metadonneesArrete["datecontrolelegalite"];
2735     }
2736    
2737     // Fin des méthodes de récupération des métadonnées
2738     // }}}
2739    
2740     /**
2741     * Méthode de récupération des métadonnées arrêtés dans la base de données,
2742     * les données sont stockés dans l'attribut $this->metadonneesArrete
2743     */
2744     function getArreteMetadata() {
2745    
2746     //Récupération de la dernière instruction dont l'événement est de type 'arrete'
2747     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
2748     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
2749     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
2750     "ap_codepostal"=>"", "ap_ville"=>"");
2751    
2752     $sqlArrete = "SELECT signataire_arrete.nom as \"nomsignataire\",
2753     signataire_arrete.qualite as \"qualitesignataire\",
2754     instruction.etat as \"decisionarrete\",
2755     instruction.date_retour_rar as \"datenotification\",
2756     instruction.date_retour_signature as \"datesignaturearrete\",
2757     instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
2758     dossier.terrain_adresse_voie_numero as \"ap_numrue\",
2759     dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
2760     dossier.terrain_adresse_code_postal as \"ap_codepostal\",
2761     dossier.terrain_adresse_localite as \"ap_ville\"
2762     FROM ".DB_PREFIXE."instruction
2763     LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
2764     instruction.signataire_arrete = signataire_arrete.signataire_arrete
2765     LEFT JOIN ".DB_PREFIXE."dossier ON
2766     instruction.dossier = dossier.dossier
2767     LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
2768     donnees_techniques.dossier_instruction = dossier.dossier
2769     WHERE instruction.instruction = ".$this->getVal("instruction");
2770     $resArrete = $this->db->query($sqlArrete);
2771     $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
2772     if ( database::isError($resArrete)){
2773     die();
2774     }
2775    
2776     $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
2777     }
2778    
2779     /**
2780     * CONDITION - has_an_edition.
2781     *
2782     * Condition pour afficher le bouton de visualisation de l'édition.
2783     *
2784     * @return boolean
2785     */
2786     function has_an_edition() {
2787     // Récupère la valeur du champ lettretype
2788     $lettretype = $this->getVal("lettretype");
2789     // Si le champ est vide
2790     if (empty($lettretype)) {
2791     //
2792     return false;
2793     }
2794    
2795     //
2796     return true;
2797     }
2798    
2799     /**
2800     * CONDITION - is_editable.
2801     *
2802     * Condition pour la modification.
2803     *
2804     * @return boolean
2805     */
2806     function is_editable() {
2807     // Contrôle si l'utilisateur possède un bypass
2808     $bypass = $this->f->isAccredited(get_class()."_modifier_bypass");
2809     //
2810     if ($bypass == true) {
2811    
2812     //
2813     return true;
2814     }
2815    
2816     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2817     // division du dossier
2818     if ($this->f->isUserInstructeur()
2819     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2820 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2821 mbroquet 3730
2822     //
2823     return false;
2824     }
2825    
2826     // si instructeur commune
2827 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
2828 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2829     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
2830     || $this->getVal('created_by_commune') !== 't')) {
2831     return false;
2832     }
2833     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
2834     // que l'événement n'est pas identifié comme non verrouillable
2835     if ($this->f->isUserInstructeur()
2836     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
2837     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
2838    
2839     //
2840     return false;
2841     }
2842    
2843     //
2844     return true;
2845     }
2846    
2847     /**
2848     * CONDITION - is_deletable.
2849     *
2850     * Condition pour lma modification.
2851     *
2852     * @return boolean
2853     */
2854     function is_deletable() {
2855     // Contrôle si l'utilisateur possède un bypass
2856     $bypass = $this->f->isAccredited(get_class()."_supprimer_bypass");
2857     //
2858     if ($bypass == true) {
2859    
2860     //
2861     return true;
2862     }
2863    
2864     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2865     // division du dossier
2866     if ($this->f->isUserInstructeur()
2867     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) {
2868    
2869     //
2870     return false;
2871     }
2872    
2873     //
2874     return true;
2875     }
2876    
2877     /**
2878     * CONDITION - is_addable.
2879     *
2880     * Condition pour afficher les boutons modifier et supprimer.
2881     *
2882     * @return boolean
2883     */
2884     function is_addable() {
2885     // Contrôle si l'utilisateur possède un bypass
2886     $bypass = $this->f->isAccredited(get_class()."_ajouter_bypass");
2887     //
2888     if ($bypass == true) {
2889    
2890     //
2891     return true;
2892     }
2893    
2894     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2895     // division du dossier
2896     if ($this->f->isUserInstructeur()
2897     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2898 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2899 mbroquet 3730
2900     //
2901     return false;
2902     }
2903    
2904     // si instructeur commune
2905 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false
2906 mbroquet 3730 && $this->f->isInstrCanChangeDecision($this->getVal('dossier')) === true) {
2907     return false;
2908     }
2909    
2910    
2911     //
2912     return true;
2913     }
2914    
2915     /**
2916     * CONDITION - is_finalizable.
2917     *
2918     * Condition pour afficher le bouton.
2919     *
2920     * @return boolean
2921     */
2922     function is_finalizable() {
2923     // Contrôle si l'utilisateur possède un bypass
2924     $bypass = $this->f->isAccredited(get_class()."_finaliser_bypass");
2925     //
2926     if ($bypass == true) {
2927    
2928     //
2929     return true;
2930     }
2931    
2932     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2933     // division du dossier
2934     if ($this->f->isUserInstructeur()
2935     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2936 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2937 mbroquet 3730
2938     //
2939     return false;
2940     }
2941    
2942     // si instructeur commune
2943 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
2944 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2945     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
2946     || $this->getVal('created_by_commune') !== 't')) {
2947     return false;
2948     }
2949    
2950     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
2951     // que l'événement n'est pas identifié comme non verrouillable
2952     if ($this->f->isUserInstructeur()
2953     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
2954     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
2955    
2956     //
2957     return false;
2958     }
2959    
2960     //
2961     return true;
2962     }
2963    
2964     /**
2965     * CONDITION - is_finalize_without_bypass.
2966     *
2967     * Condition pour afficher le bouton sans le bypass.
2968     *
2969     * @return boolean [description]
2970     */
2971     function is_finalizable_without_bypass() {
2972     // Récupère la valeur du champ finalisé
2973     $om_final_instruction = $this->getVal('om_final_instruction');
2974    
2975     // Si le rapport n'est pas finalisé
2976     if (empty($om_final_instruction)
2977     || $om_final_instruction == 'f') {
2978     //
2979     return true;
2980     }
2981    
2982     //
2983     return false;
2984     }
2985    
2986     /**
2987     * CONDITION - is_unfinalizable.
2988     *
2989     * Condition pour afficher le bouton.
2990     *
2991     * @return boolean
2992     */
2993     function is_unfinalizable(){
2994     // Contrôle si l'utilisateur possède un bypass
2995     $bypass = $this->f->isAccredited(get_class()."_definaliser_bypass");
2996     //
2997     if ($bypass == true) {
2998    
2999     //
3000     return true;
3001     }
3002    
3003     // Si l'utilisateur est un intructeur qui ne correspond pas à la
3004     // division du dossier
3005     if ($this->f->isUserInstructeur()
3006     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
3007 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
3008 mbroquet 3730
3009     //
3010     return false;
3011     }
3012    
3013     // si instructeur commune
3014 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
3015 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
3016     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
3017     || $this->getVal('created_by_commune') !== 't')) {
3018     return false;
3019     }
3020    
3021     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
3022     // que l'événement n'est pas identifié comme non verrouillable
3023     if ($this->f->isUserInstructeur()
3024     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
3025     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
3026    
3027     //
3028     return false;
3029     }
3030    
3031     //
3032     return true;
3033     }
3034    
3035     /**
3036     * CONDITION - is_unfinalizable_without_bypass.
3037     *
3038     * Condition pour afficher le bouton sans le bypass.
3039     *
3040     * @return boolean
3041     */
3042     function is_unfinalizable_without_bypass() {
3043     // Récupère la valeur du champ finalisé
3044     $om_final_instruction = $this->getVal('om_final_instruction');
3045    
3046     // Si l'instruction est finalisée
3047     if ($om_final_instruction == 't') {
3048     //
3049     return true;
3050     }
3051    
3052     //
3053     return false;
3054     }
3055    
3056     /**
3057     * TREATMENT - finalize.
3058     *
3059     * Permet de finaliser un enregistrement.
3060     *
3061     * @param array $val valeurs soumises par le formulaire
3062     *
3063     * @return boolean
3064     */
3065     function finalize($val = array()) {
3066    
3067     // Cette méthode permet d'exécuter une routine en début des méthodes
3068     // dites de TREATMENT.
3069     $this->begin_treatment(__METHOD__);
3070    
3071     // Traitement de la finalisation
3072     $ret = $this->manage_finalizing("finalize", $val);
3073    
3074     // Si le traitement retourne une erreur
3075     if ($ret !== true) {
3076    
3077     // Termine le traitement
3078     $this->end_treatment(__METHOD__, false);
3079     }
3080    
3081     // Termine le traitement
3082     return $this->end_treatment(__METHOD__, true);
3083     }
3084    
3085     /**
3086     * TREATMENT - unfinalize.
3087     *
3088     * Permet de définaliser un enregistrement.
3089     *
3090     * @param array $val valeurs soumises par le formulaire
3091     *
3092     * @return boolean
3093     */
3094     function unfinalize($val = array()) {
3095    
3096     // Cette méthode permet d'exécuter une routine en début des méthodes
3097     // dites de TREATMENT.
3098     $this->begin_treatment(__METHOD__);
3099    
3100     // Traitement de la finalisation
3101     $ret = $this->manage_finalizing("unfinalize", $val);
3102    
3103     // Si le traitement retourne une erreur
3104     if ($ret !== true) {
3105    
3106     // Termine le traitement
3107     $this->end_treatment(__METHOD__, false);
3108     }
3109    
3110     // Termine le traitement
3111     return $this->end_treatment(__METHOD__, true);
3112     }
3113    
3114     /**
3115     * VIEW - view_edition
3116     *
3117     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
3118     *
3119     * @return null Si l'action est incorrecte
3120     */
3121     function view_edition() {
3122    
3123     // Si l'instruction est finalisée
3124     if($this->getVal("om_final_instruction") == 't'
3125     && $this->getVal("om_final_instruction") != null) {
3126    
3127     // Ouvre le document
3128     $lien = '../spg/file.php?obj='.$this->table.'&'.
3129     'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
3130     //
3131     header("Location: ".$lien);
3132     } else {
3133    
3134     // Récupère la collectivite du dossier d'instruction
3135     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3136    
3137     //
3138     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3139    
3140     // Paramètre du PDF
3141     $params = array(
3142     "watermark" => true,
3143     "specific" => array(
3144     "mode" => "previsualisation",
3145     ),
3146     );
3147    
3148     // Génération du PDF
3149     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
3150     // Affichage du PDF
3151     $this->expose_pdf_output(
3152     $result['pdf_output'],
3153     $result['filename']
3154     );
3155     }
3156     }
3157    
3158     /**
3159     * Récupère la collectivité du dossier d'instruction.
3160     *
3161     * @return integer
3162     */
3163     function get_dossier_instruction_om_collectivite() {
3164    
3165     //
3166     require_once "../obj/dossier_instruction.class.php";
3167     $dossier_instruction = new dossier_instruction($this->getVal('dossier'), $this->f->db, false);
3168    
3169     //
3170     return $dossier_instruction->getVal('om_collectivite');
3171     }
3172    
3173     /**
3174     * VIEW - view_bible
3175     *
3176     * Affiche la bible manuelle.
3177     *
3178     * @return void
3179     */
3180     function view_bible() {
3181     // Vérification de l'accessibilité sur l'élément
3182     $this->checkAccessibility();
3183    
3184     // XXX APP
3185    
3186     $f = $this->f;
3187    
3188     /**
3189     * Affichage de la structure HTML
3190     */
3191     //
3192     if ($f->isAjaxRequest()) {
3193     //
3194     header("Content-type: text/html; charset=".HTTPCHARSET."");
3195     } else {
3196     //
3197     $f->setFlag("htmlonly");
3198     $f->display();
3199     }
3200     //
3201     $f->displayStartContent();
3202     //
3203     $f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
3204     $f->displayTitle();
3205    
3206     /**
3207     *
3208     */
3209     //
3210     ($f->get_submitted_get_value("ev") ? $evenement = $f->get_submitted_get_value("ev") : $evenement = "");
3211     $evenement = intval($evenement);
3212     //
3213     ($f->get_submitted_get_value("idx") ? $idx = $f->get_submitted_get_value("idx") : $idx = "");
3214     $nature = substr($idx, 0, 2);
3215     //
3216     ($f->get_submitted_get_value("complement") ? $complement = $f->get_submitted_get_value("complement") : $complement = "1");
3217    
3218     // Récupération de la collectivité du dossier
3219     require_once "../obj/dossier.class.php";
3220     $dossier = new dossier($idx, $f->db, DEBUG);
3221    
3222     /**
3223     *
3224     */
3225     //
3226     $sql = "SELECT *, bible.libelle as bible_lib
3227     FROM ".DB_PREFIXE."bible
3228     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
3229     ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
3230     LEFT JOIN ".DB_PREFIXE."om_collectivite
3231     ON bible.om_collectivite = om_collectivite.om_collectivite
3232     WHERE evenement=".$evenement."
3233     AND complement=".$complement."
3234     AND (bible.dossier_autorisation_type IS NULL
3235     OR dossier_autorisation_type.code ='".$nature."')
3236     AND (om_collectivite.niveau = '2'
3237     OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
3238     ORDER BY bible_lib ASC";
3239     $res = $f->db->query($sql);
3240     $f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
3241     $f->isDatabaseError($res);
3242     //
3243     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
3244     //
3245     if ($res->numrows() > 0) {
3246     //
3247     echo "\t<table id='tab-bible' width='100%'>\n";
3248     //
3249     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
3250     echo "<th>"._("Choisir")."</th>";
3251     echo "<th>"._("Libelle")."</th>";
3252     echo "</tr>\n";
3253     //
3254     $i = 0;
3255     //
3256     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3257     //
3258     echo "\t\t<tr";
3259     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
3260     echo ">";
3261     //
3262     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
3263     // XXX utilisation de l'attribut titre pour afficher une infobulle
3264     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
3265     //
3266     echo "</tr>\n";
3267     //
3268     $i++;
3269     }
3270     echo "\t</table>\n";
3271     //
3272     echo "<div class=\"formControls\">\n";
3273     $f->layout->display_form_button(array(
3274     "value" => _("Valider"),
3275     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
3276     ));
3277     $f->displayLinkJsCloseWindow();
3278     echo "</div>\n";
3279    
3280     } else {
3281     //
3282     $message_class = "error";
3283     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
3284     $f->displayMessage($message_class, $message);
3285     //
3286     echo "<div class=\"formControls\">\n";
3287     $f->displayLinkJsCloseWindow();
3288     echo "</div>\n";
3289     }
3290     //
3291     echo "</form>\n";
3292    
3293     /**
3294     * Affichage de la structure HTML
3295     */
3296     //
3297     $f->displayEndContent();
3298     }
3299    
3300     /**
3301     * VIEW - view_bible
3302     *
3303     * Affiche la bible manuelle.
3304     *
3305     * @return void
3306     */
3307     function view_bible_auto() {
3308     // Vérification de l'accessibilité sur l'élément
3309     $this->checkAccessibility();
3310    
3311     // XXX APP
3312    
3313     $f = $this->f;
3314    
3315     //
3316     $f->disableLog();
3317    
3318     $formatDate="AAAA-MM-JJ";
3319    
3320     // Récupération des paramètres
3321     $idx = $f->get_submitted_get_value('idx');
3322     $evenement = $f->get_submitted_get_value('ev');
3323    
3324     // Initialisation de la variable de retour
3325     $retour['complement_om_html'] = '';
3326     $retour['complement2_om_html'] = '';
3327     $retour['complement3_om_html'] = '';
3328     $retour['complement4_om_html'] = '';
3329     // Vérification d'une consultation liée à l'événement
3330     $consultation = $f->db->getOne(
3331     "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
3332     );
3333     $f->isDatabaseError($consultation);
3334     // Si consultation liée, récupération du retour d'avis
3335     if($consultation=='Oui'){
3336     $sql="select date_retour,avis_consultation.libelle as avis_consultation,
3337     service.libelle as service
3338     from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service
3339     on consultation.service =service.service
3340     left join ".DB_PREFIXE."avis_consultation on
3341     consultation.avis_consultation = avis_consultation.avis_consultation
3342     where dossier ='".$idx."'";
3343     $res = $f->db->query($sql);
3344     $f->isDatabaseError($res);
3345     // Récupération des consultations
3346     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3347     $correct=false;
3348     // date retour
3349     if ($row['date_retour']<>""){
3350     if ($formatDate=="AAAA-MM-JJ"){
3351     $date = explode("-", $row['date_retour']);
3352     // controle de date
3353     if (count($date) == 3 and
3354     checkdate($date[1], $date[2], $date[0])) {
3355     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
3356     $correct=true;
3357     }else{
3358     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
3359     $correct=false;
3360     }
3361     }
3362     }
3363     //
3364     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
3365     if($correct == true){
3366     $temp=$temp." du ".$date_retour_f;
3367     }
3368     // Concaténation des retours d'avis de consultation
3369     $retour['complement_om_html'] .= $temp;
3370     } // while
3371    
3372     } // consultation
3373     // Récupération des bibles automatiques pour le champ complement_om_html
3374     $retour['complement_om_html'] .= $this->getBible($f, $evenement, $idx, '1');
3375     // Récupération des bibles automatiques pour le champ complement2_om_html
3376     $retour['complement2_om_html'] .= $this->getBible($f, $evenement, $idx, '2');
3377     // Récupération des bibles automatiques pour le champ complement3_om_html
3378     $retour['complement3_om_html'] .= $this->getBible($f, $evenement, $idx, '3');
3379     // Récupération des bibles automatiques pour le champ complement4_om_html
3380     $retour['complement4_om_html'] .= $this->getBible($f, $evenement, $idx, '4');
3381    
3382    
3383    
3384     echo json_encode($retour);
3385     }
3386    
3387     /**
3388     * Récupération des éléments de bible.
3389     *
3390     * @param utils $f handler de om_application
3391     * @param integer $event id de l'événement
3392     * @param string $idx id du dossier
3393     * @param integer $compnb numéro du champ complement
3394     *
3395     * @return string Chaîne de texte à insérer dans le champ complement
3396     */
3397     function getBible($f, $event, $idx, $compnb) {
3398     // Récupération de la collectivité du dossier
3399     require_once "../obj/dossier.class.php";
3400     $dossier = new dossier($idx, $f->db, DEBUG);
3401     //
3402     $sql = "SELECT * FROM ".DB_PREFIXE."bible
3403     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
3404     ON bible.dossier_autorisation_type=
3405     dossier_autorisation_type.dossier_autorisation_type
3406     LEFT JOIN
3407     ".DB_PREFIXE."om_collectivite
3408     ON bible.om_collectivite = om_collectivite.om_collectivite
3409     WHERE evenement =".$event." and
3410     complement=".$compnb." and
3411     automatique='Oui' and
3412     (dossier_autorisation_type.code ='".substr($idx, 0, 2)."' or
3413     bible.dossier_autorisation_type IS NULL) and
3414     (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
3415    
3416     $res = $f->db->query($sql);
3417     $f->isDatabaseError($res);
3418     $temp = "";
3419     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3420     // Remplacement des retours à la ligne par des br
3421     $temp .= preg_replace(
3422     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
3423     );
3424     } // fin while
3425     return $temp;
3426     }
3427    
3428     /**
3429     * VIEW - view_suivi_bordereaux.
3430     *
3431 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
3432     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
3433     * collectivité des dossiers affichés.
3434 mbroquet 3730 *
3435     * @return void
3436     */
3437     function view_suivi_bordereaux() {
3438     // Vérification de l'accessibilité sur l'élément
3439     $this->checkAccessibility();
3440    
3441     // XXX APP
3442    
3443     $f = $this->f;
3444    
3445     /**
3446     * Validation du formulaire
3447     */
3448     // Si le formulaire a été validé
3449     if ($f->get_submitted_post_value("validation") !== null) {
3450     // Si un bordereau à été sélectionné
3451     if ($f->get_submitted_post_value("bordereau") !== null && $f->get_submitted_post_value("bordereau") == "" ) {
3452     // Si aucun bordereau n'a été sélectionné
3453     $message_class = "error";
3454     $message = _("Veuillez selectionner un bordereau.");
3455     }
3456     // Sinon si les dates ne sont pas valide
3457     elseif (($f->get_submitted_post_value("date_bordereau_debut") !== null
3458     && $f->get_submitted_post_value("date_bordereau_debut") == "")
3459     || ($f->get_submitted_post_value("date_bordereau_fin") !== null
3460     && $f->get_submitted_post_value("date_bordereau_fin") == "")) {
3461     // Si aucune date n'a été saisie
3462     $message_class = "error";
3463     $message = _("Veuillez saisir une date valide.");
3464     }
3465     // Affiche le message de validation
3466     else {
3467     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
3468     $sql = "SELECT om_etat.libelle
3469     FROM ".DB_PREFIXE."om_etat
3470     WHERE om_etat.id = '".$f->get_submitted_post_value("bordereau")."'";
3471     $res = $f->db->getone($sql);
3472     $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
3473     $f->isDatabaseError($res);
3474     //
3475     $message_class = "valid";
3476     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
3477     $message .= " : <br/><br/>";
3478     $message .= "<a class='om-prev-icon pdf-16'";
3479     $message .= " title=\""._("Bordereau")."\"";
3480 nmeucci 4317 $message .= "href='../scr/form.php?obj=instruction";
3481     $message .= "&action=220";
3482     $message .= "&idx=0";
3483     $message .= "&type_bordereau=".$f->get_submitted_post_value("bordereau");
3484     $message .= "&date_bordereau_debut=".$f->get_submitted_post_value("date_bordereau_debut");
3485 mbroquet 3730 $message .= "&date_bordereau_fin=".$f->get_submitted_post_value("date_bordereau_fin");
3486     // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
3487     if ($f->get_submitted_post_value("om_collectivite") !== null) {
3488     $message .= "&collectivite=".$f->get_submitted_post_value("om_collectivite");
3489     }
3490     $message .= "'"." target='_blank'>";
3491     $message .= $res." "._("du")." ".$f->get_submitted_post_value("date_bordereau_debut")
3492     ." "._("au")." ".$f->get_submitted_post_value("date_bordereau_fin");
3493     $message .= "</a>";
3494     }
3495     }
3496    
3497     /**
3498     * Affichage des messages et du formulaire
3499     */
3500     // Affichage du message de validation ou d'erreur
3501     if (isset($message) && isset($message_class) && $message != "") {
3502     $f->displayMessage($message_class, $message);
3503     }
3504     // Inclusion de la classe de gestion des formulaires
3505     require_once "../obj/om_formulaire.class.php";
3506     // Ouverture du formulaire
3507     printf("\t<form");
3508     printf(" method=\"post\"");
3509     printf(" id=\"suivi_bordereaux_form\"");
3510     printf(" action=\"\"");
3511     printf(">\n");
3512     // Paramétrage des champs du formulaire
3513     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
3514     // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
3515     // collectivité dans le formulaire
3516     if($_SESSION["niveau"] == 2) {
3517     array_push($champs, "om_collectivite");
3518     }
3519     // Création d'un nouvel objet de type formulaire
3520     $form = new formulaire(NULL, 0, 0, $champs);
3521     // Paramétrage du champ date_bordereau_debut
3522     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
3523     $form->setType("date_bordereau_debut", "date");
3524     $form->setTaille("date_bordereau_debut", 12);
3525     $form->setMax("date_bordereau_debut", 12);
3526     $form->setRequired("date_bordereau_debut");
3527     $form->setOnchange("date_bordereau_debut", "fdate(this)");
3528     $form->setVal("date_bordereau_debut", date("d/m/Y"));
3529     // Paramétrage du champ date_bordereau_fin
3530     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
3531     $form->setType("date_bordereau_fin", "date");
3532     $form->setTaille("date_bordereau_fin", 12);
3533     $form->setMax("date_bordereau_fin", 12);
3534     $form->setRequired("date_bordereau_fin");
3535     $form->setOnchange("date_bordereau_fin", "fdate(this)");
3536     $form->setVal("date_bordereau_fin", date("d/m/Y"));
3537     // Paramétrage du champ bordereau
3538     $form->setLib("bordereau", _("bordereau"));
3539     $form->setType("bordereau", "select");
3540     $form->setRequired("bordereau");
3541     // Valeurs des champs
3542     if ($f->get_submitted_post_value("validation") !== null) {
3543     $form->setVal("date_bordereau_debut", $f->get_submitted_post_value("date_bordereau_debut"));
3544     $form->setVal("date_bordereau_fin", $f->get_submitted_post_value("date_bordereau_fin"));
3545     $form->setVal("bordereau", $f->get_submitted_post_value("bordereau"));
3546     $form->setVal("om_collectivite", $f->get_submitted_post_value("om_collectivite"));
3547     }
3548     // Données du select - On récupère ici la liste de tous les états disponibles
3549     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
3550     // 'bordereau_'
3551     $sql = "SELECT om_etat.id, om_etat.libelle
3552     FROM ".DB_PREFIXE."om_etat
3553     WHERE om_etat.id LIKE 'bordereau_%'
3554     ORDER BY om_etat.id";
3555     $res = $f->db->query($sql);
3556     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3557     $f->isDatabaseError($res);
3558     // Données du select
3559     $contenu = array(
3560     0 => array("", ),
3561     1 => array(_("choisir bordereau")),
3562     );
3563     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3564     $contenu[0][] = $row['id'];
3565     $contenu[1][] = $row['libelle'];
3566     }
3567     $form->setSelect("bordereau", $contenu);
3568     //
3569     if($_SESSION["niveau"] == 2) {
3570     $form->setLib("om_collectivite", _("collectivite"));
3571     $form->setType("om_collectivite", "select");
3572    
3573     // Données du select - On récupère ici la liste de tous toutes les collectivités
3574     // de niveau 1
3575     $sql = "SELECT om_collectivite, libelle
3576     FROM ".DB_PREFIXE."om_collectivite
3577     WHERE niveau = '1' ORDER BY libelle";
3578     $res = $f->db->query($sql);
3579     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3580     $f->isDatabaseError($res);
3581     // La valeur par défaut du select est Toutes
3582     $list_collectivites = array(
3583     0 => array("", ),
3584     1 => array(_("toutes"))
3585     );
3586    
3587     $id_colls = "";
3588     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
3589     // par des virgules, pour un traitement plus facile dans la requête de sous-état
3590     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3591     if ($id_colls != "") {
3592     $id_colls .= ",";
3593     }
3594     $id_colls .= $row['om_collectivite'];
3595     $list_collectivites[0][] = $row['om_collectivite'];
3596     $list_collectivites[1][] = $row['libelle'];
3597     }
3598     // On affecte la liste d'identifiants à l'option Toutes
3599     $list_collectivites[0][0] = $id_colls ;
3600     $form->setSelect("om_collectivite", $list_collectivites);
3601     }
3602    
3603     // Affichage du formulaire
3604     $form->entete();
3605     $form->afficher($champs, 0, false, false);
3606     $form->enpied();
3607     // Affichage du bouton
3608     printf("\t<div class=\"formControls\">\n");
3609     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
3610     printf("\t</div>\n");
3611     // Fermeture du formulaire
3612     printf("\t</form>\n");
3613    
3614     }
3615    
3616 nmeucci 4317
3617     /**
3618     * VIEW - view_generate_suivi_bordereaux.
3619     *
3620     * Génère et affiche les bordereaux de suivi.
3621     *
3622     * @return [void]
3623     */
3624     function view_generate_suivi_bordereaux() {
3625     // Vérification de l'accessibilité sur l'élément
3626     $this->checkAccessibility();
3627     // Récupération du type de bordereau
3628     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
3629     // Génération du PDF
3630     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
3631     // Affichage du PDF
3632     $this->expose_pdf_output(
3633     $result['pdf_output'],
3634     $result['filename']
3635     );
3636     }
3637    
3638    
3639 mbroquet 3730 /**
3640     * VIEW - view_suivi_envoi_lettre_rar.
3641     *
3642     * Vu pour imprimer les RAR.
3643     *
3644     * @return void
3645     */
3646     function view_suivi_envoi_lettre_rar() {
3647     // Vérification de l'accessibilité sur l'élément
3648     $this->checkAccessibility();
3649    
3650     // XXX APP
3651    
3652     $f = $this->f;
3653    
3654     //
3655     if ($f->get_submitted_post_value("date") !== null) {
3656     $date = $f->get_submitted_post_value("date");
3657     } else {
3658     $date = "";
3659     }
3660     //
3661     if ($f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
3662     $liste_code_barres_instruction = $f->get_submitted_post_value("liste_code_barres_instruction");
3663     } else {
3664     $liste_code_barres_instruction = "";
3665     }
3666    
3667     // Compteur du nombre de page générées
3668     $nbLettres = 0;
3669     // Liste d'id des instructions
3670     $id4Gen = array();
3671     //
3672     $error = "";
3673    
3674     /**
3675     * Validation du formulaire
3676     */
3677     // Si le formulaire a été validé
3678     if ($f->get_submitted_post_value('validation') !== null) {
3679     //
3680     if (empty($date) || empty($liste_code_barres_instruction)) {
3681     //
3682     $message_class = "error";
3683     $message = _("Tous les champs doivent etre remplis.");
3684     } else {
3685     // Création d'un tableau d'instruction
3686     $liste = explode("\r\n", $f->get_submitted_post_value("liste_code_barres_instruction"));
3687     //
3688     foreach ($liste as $code_barres) {
3689     // On enlève les éventuels espaces saisis
3690     $code_barres = trim($code_barres);
3691     // Vérification de l'existence de l'instruction
3692     if ($code_barres != "") {
3693     // Si la valeur transmise est numérique
3694     if (is_numeric($code_barres)) {
3695     //
3696     $sql = "SELECT count(*) FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
3697     $nbInstr = $f->db->getone($sql);
3698     $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
3699     $f->isDatabaseError($nbInstr);
3700     //
3701     if ($nbInstr == "1") {
3702     // Récupération de la date d'envoi de l'instruction bippé
3703     $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
3704     $res = $f->db->query($sql);
3705     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3706     $f->isDatabaseError($res);
3707     $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
3708     // Si pas de date ou correspond à la date du formulaire on
3709     // effectue le traitement
3710     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
3711    
3712     require_once '../obj/instruction.class.php';
3713    
3714     $instr = new instruction($row['instruction'], $f->db, DEBUG);
3715     $valF = array();
3716     foreach($instr->champs as $id => $champ) {
3717     $valF[$champ] = $instr->val[$id];
3718     }
3719     $valF['date_evenement']=
3720     $instr->dateDBToForm($valF['date_evenement']);
3721     $valF['archive_date_complet']=
3722     $instr->dateDBToForm($valF['archive_date_complet']);
3723     $valF['archive_date_rejet']=
3724     $instr->dateDBToForm($valF['archive_date_rejet']);
3725     $valF['archive_date_limite']=
3726     $instr->dateDBToForm($valF['archive_date_limite']);
3727     $valF['archive_date_notification_delai']=
3728     $instr->dateDBToForm($valF['archive_date_notification_delai']);
3729     $valF['archive_date_decision']=
3730     $instr->dateDBToForm($valF['archive_date_decision']);
3731     $valF['archive_date_validite']=
3732     $instr->dateDBToForm($valF['archive_date_validite']);
3733     $valF['archive_date_achevement']=
3734     $instr->dateDBToForm($valF['archive_date_achevement']);
3735     $valF['archive_date_chantier']=
3736     $instr->dateDBToForm($valF['archive_date_chantier']);
3737     $valF['archive_date_conformite']=
3738     $instr->dateDBToForm($valF['archive_date_conformite']);
3739     $valF['archive_date_dernier_depot']=
3740     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
3741     $valF['archive_date_limite_incompletude']=
3742     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
3743     $valF['date_finalisation_courrier']=
3744     $instr->dateDBToForm($valF['date_finalisation_courrier']);
3745     $valF['date_envoi_signature']=
3746     $instr->dateDBToForm($valF['date_envoi_signature']);
3747     $valF['date_retour_signature']=
3748     $instr->dateDBToForm($valF['date_retour_signature']);
3749     $valF['date_envoi_rar']=
3750     $instr->dateDBToForm($valF['date_envoi_rar']);
3751     $valF['date_retour_rar']=
3752     $instr->dateDBToForm($valF['date_retour_rar']);
3753     $valF['date_envoi_controle_legalite']=
3754     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
3755     $valF['date_retour_controle_legalite']=
3756     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
3757    
3758     $valF['date_envoi_rar'] = $date;
3759    
3760     // Vérification de la finalisation du document
3761     // correspondant au code barres
3762     if($instr->getVal("om_final_instruction") === 't') {
3763     $instr->setParameter('maj', 1);
3764 nmeucci 3971 $instr->class_actions[1]["identifier"] =
3765     "envoi lettre RAR (depuis le menu suivi des pièces)";
3766 mbroquet 3730 if ($instr->modifier($valF, $f->db, DEBUG) == true) {
3767     $id4Gen[] = $code_barres;
3768     $nbLettres ++;
3769     } else {
3770     //
3771     if ($error != "") {
3772     $error .= "<br/>";
3773     }
3774     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
3775     $code_barres);
3776     $error .= " ";
3777     $error .= _("Veuillez contacter votre administrateur.");
3778     }
3779     } else {
3780     //
3781     if ($error != "") {
3782     $error .= "<br/>";
3783     }
3784     $error .= sprintf(_("Le document correspondant au
3785     code barres %s n'est pas finalise,
3786     le bordereau ne sera pas genere."),
3787     $code_barres);
3788     }
3789    
3790     } else {
3791     //
3792     if ($error != "") {
3793     $error .= "<br/>";
3794     }
3795     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
3796     }
3797     } else {
3798     //
3799     if ($error != "") {
3800     $error .= "<br/>";
3801     }
3802     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
3803     }
3804     } else {
3805     //
3806     if ($error != "") {
3807     $error .= "<br/>";
3808     }
3809     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
3810     }
3811     }
3812     }
3813     }
3814     }
3815    
3816     /**
3817     * Affichage des messages et du formulaire
3818     */
3819     // Affichage du message de validation ou d'erreur
3820     if (isset($message) && isset($message_class) && $message != "") {
3821     $f->displayMessage($message_class, $message);
3822     }
3823     // Affichage du message d'erreur
3824     if(!empty($error)) {
3825     $f->displayMessage("error", $error);
3826     }
3827     // Affichage du message de validation de la saisie
3828     if ($nbLettres > 0) {
3829     //
3830     $message_class = "valid";
3831     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre document");
3832     $message .= " : <br/><br/>";
3833     $message .= "<a class='om-prev-icon pdf-16'";
3834     $message .= " title=\""._("imprimer les RAR")."\"";
3835     $message .= " href=\"../scr/form.php?obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
3836     $message .= " target='_blank'>";
3837     $message .= _("Telecharger le document pour")." ".$nbLettres." "._("RAR");
3838     $message .= "</a>";
3839     $f->displayMessage($message_class, $message);
3840     }
3841     // Inclusion de la classe de gestion des formulaires
3842     require_once "../obj/om_formulaire.class.php";
3843     // Ouverture du formulaire
3844     echo "\t<form";
3845     echo " method=\"post\"";
3846     echo " id=\"suivi_envoi_lettre_rar_form\"";
3847     echo " action=\"\"";
3848     echo ">\n";
3849     // Paramétrage des champs du formulaire
3850     $champs = array("date", "liste_code_barres_instruction");
3851     // Création d'un nouvel objet de type formulaire
3852     $form = new formulaire(NULL, 0, 0, $champs);
3853     // Paramétrage du champ date du formulaire
3854     $form->setLib("date", _("Date")."* :");
3855     $form->setType("date", "date");
3856     $form->setOnchange("date", "fdate(this)");
3857     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
3858     $form->setTaille("date", 10);
3859     $form->setMax("date", 10);
3860     // Paramétrage du champ liste_code_barres_instruction du formulaire
3861     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
3862     $form->setType("liste_code_barres_instruction", "textarea");
3863     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
3864     $form->setTaille("liste_code_barres_instruction", 20);
3865     $form->setMax("liste_code_barres_instruction", 20);
3866     // Affichage du formulaire
3867     $form->entete();
3868     $form->afficher($champs, 0, false, false);
3869     $form->enpied();
3870     // Affichage du bouton
3871     echo "\t<div class=\"formControls\">\n";
3872     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
3873     echo "\t</div>\n";
3874     // Fermeture du formulaire
3875     echo "\t</form>\n";
3876     }
3877    
3878     /**
3879     * VIEW - view_suivi_mise_a_jour_des_dates.
3880     *
3881     * Vu pour mettre à jour les dates de suivi de l'instruction.
3882     *
3883     * @return void
3884     */
3885     function view_suivi_mise_a_jour_des_dates() {
3886     // Vérification de l'accessibilité sur l'élément
3887     $this->checkAccessibility();
3888    
3889     // XXX APP
3890    
3891     $f = $this->f;
3892    
3893     // Récupération des valeur passées en POST ou GET
3894     if($f->get_submitted_post_value("type_mise_a_jour") !== null) {
3895     $type_mise_a_jour = $f->get_submitted_post_value("type_mise_a_jour");
3896     } elseif($f->get_submitted_get_value('type_mise_a_jour') !== null) {
3897     $type_mise_a_jour = $f->get_submitted_get_value('type_mise_a_jour');
3898     } else {
3899     $type_mise_a_jour = "";
3900     }
3901     if($f->get_submitted_post_value('date') !== null) {
3902     $date = $f->get_submitted_post_value('date');
3903     } elseif($f->get_submitted_get_value('date') !== null) {
3904     $date = $f->get_submitted_get_value('date');
3905     } else {
3906     $date = "";
3907     }
3908     if($f->get_submitted_post_value('code_barres') !== null) {
3909     $code_barres = $f->get_submitted_post_value('code_barres');
3910     } elseif($f->get_submitted_get_value('code_barres') !== null) {
3911     $code_barres = $f->get_submitted_get_value('code_barres');
3912     } else {
3913     $code_barres = "";
3914     }
3915     // Booléen permettant de définir si un enregistrement à eu lieu
3916     $correct = false;
3917     // Booléen permettant de définir si les dates peuvent êtres enregistrées
3918     $date_error = false;
3919     // Champs date à mettre à jour
3920     $liste_champs=array();
3921    
3922     // Si le formulaire a été validé
3923     if ($f->get_submitted_post_value('validation') !== null) {
3924     if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
3925    
3926     //Vérification de l'existance de l'instruction
3927     $sql = "SELECT instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
3928     $res = $f->db->query($sql);
3929     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3930     $f->isDatabaseError($res);
3931    
3932     if($res->numrows() == 1) {
3933     $liste_champs = explode(";", $type_mise_a_jour);
3934     // Mise à jour des dates après l'écran de verification
3935     if($f->get_submitted_post_value('is_valid') !== null and $f->get_submitted_post_value('is_valid') == "true") {
3936     require_once '../obj/instruction.class.php';
3937     $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
3938     $instr = new instruction($row['instruction'], $f->db, DEBUG);
3939     $valF = array();
3940     foreach($instr->champs as $id => $champ) {
3941     $valF[$champ] = $instr->val[$id];
3942     }
3943     $valF['date_evenement']=$instr->dateDBToForm($valF['date_evenement']);
3944     $valF['archive_date_complet']=$instr->dateDBToForm($valF['archive_date_complet']);
3945     $valF['archive_date_rejet']=$instr->dateDBToForm($valF['archive_date_rejet']);
3946     $valF['archive_date_limite']=$instr->dateDBToForm($valF['archive_date_limite']);
3947     $valF['archive_date_notification_delai']=$instr->dateDBToForm($valF['archive_date_notification_delai']);
3948     $valF['archive_date_decision']=$instr->dateDBToForm($valF['archive_date_decision']);
3949     $valF['archive_date_validite']=$instr->dateDBToForm($valF['archive_date_validite']);
3950     $valF['archive_date_achevement']=$instr->dateDBToForm($valF['archive_date_achevement']);
3951     $valF['archive_date_chantier']=$instr->dateDBToForm($valF['archive_date_chantier']);
3952     $valF['archive_date_conformite']=$instr->dateDBToForm($valF['archive_date_conformite']);
3953     $valF['archive_date_dernier_depot']=$instr->dateDBToForm($valF['archive_date_dernier_depot']);
3954     $valF['archive_date_limite_incompletude']=$instr->dateDBToForm($valF['archive_date_limite_incompletude']);
3955     $valF['date_finalisation_courrier']=$instr->dateDBToForm($valF['date_finalisation_courrier']);
3956     $valF['date_envoi_signature']=$instr->dateDBToForm($valF['date_envoi_signature']);
3957     $valF['date_retour_signature']=$instr->dateDBToForm($valF['date_retour_signature']);
3958     $valF['date_envoi_rar']=$instr->dateDBToForm($valF['date_envoi_rar']);
3959     $valF['date_retour_rar']=$instr->dateDBToForm($valF['date_retour_rar']);
3960     $valF['date_envoi_controle_legalite']=$instr->dateDBToForm($valF['date_envoi_controle_legalite']);
3961     $valF['date_retour_controle_legalite']=$instr->dateDBToForm($valF['date_retour_controle_legalite']);
3962    
3963     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
3964     $valF[$maj_date]=$date;
3965     }
3966    
3967     // Vérification de la finalisation du document
3968     // correspondant au code barres
3969     if($valF["om_final_instruction"] === 't' or
3970     $valF["lettretype"] == '') {
3971     $code_barres = "";
3972    
3973     //Désactivation de l'autocommit
3974     $f->db->autoCommit(false);
3975    
3976     //On modifie les valeurs de l'instruction
3977     $instr->setParameter('maj', 170);
3978 nmeucci 3965 $instr->class_actions[170]["identifier"] =
3979 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
3980 mbroquet 3730 $retour = $instr->modifier($valF, $f->db, DEBUG);
3981    
3982     //Si une erreur s'est produite, on défait les modifications
3983     //qui ont été faites
3984     if (!$retour){
3985     $instr->undoValidation();
3986     }
3987     //Sinon, on valide en base de données les modifications
3988     else {
3989     $f->db->commit();
3990     }
3991    
3992     // Variable correct retourné depuis la classe instruction
3993     $correct = $instr->correct;
3994    
3995     // Si la modification sur l'instruction a échoué
3996     if ($correct === false) {
3997    
3998     // Message d'erreur de la classe instruction
3999     $error = $instr->msg;
4000     }
4001    
4002     } else {
4003     // Indique que le traitement est en erreur
4004     $correct = false;
4005     // Message d'erreur
4006     $error = sprintf(_("Le document n'est pas finalise."),
4007     "<span class='bold'>".$code_barres."</span>");
4008     }
4009     } else {
4010     // Récupération des infos du dossier
4011     $sqlInfo = "SELECT dossier.dossier_libelle,
4012     evenement.libelle as evenement,
4013     autorite_competente.code as autorite_competente_code,
4014     autorite_competente.libelle as autorite_competente,
4015     evenement.type as evenement_type,
4016     to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
4017     to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
4018     to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
4019     to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
4020     to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
4021     to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
4022     FROM ".DB_PREFIXE."instruction
4023     INNER JOIN ".DB_PREFIXE."dossier ON
4024     dossier.dossier=instruction.dossier
4025     LEFT JOIN ".DB_PREFIXE."autorite_competente ON
4026     dossier.autorite_competente=autorite_competente.autorite_competente
4027     INNER JOIN ".DB_PREFIXE."evenement ON
4028     instruction.evenement=evenement.evenement
4029     WHERE code_barres='".$code_barres."'";
4030     $resInfo = $f->db->query($sqlInfo);
4031     $f->isDatabaseError($resInfo);
4032     $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
4033    
4034     // Vérification de la non modification des dates de suivi
4035     foreach(explode(";", $type_mise_a_jour) as $champ) {
4036     if($infos[$champ] != "" AND $infos[$champ] != $date) {
4037     $error = _("Les dates de suivis ne peuvent etre modifiees");
4038     $date_error = true;
4039     }
4040     }
4041     }
4042     } else {
4043     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
4044     }
4045    
4046     } else {
4047     $error = _("Tous les champs doivent etre remplis.");
4048     }
4049     }
4050    
4051     /**
4052     * Affichage des messages et du formulaire
4053     */
4054     // Affichage du message de validation ou d'erreur
4055     if (isset($message) && isset($message_class) && $message != "") {
4056     $f->displayMessage($message_class, $message);
4057     }
4058     // Affichage du message d'erreur
4059     if(!empty($error)) {
4060     $f->displayMessage("error", $error);
4061     }
4062    
4063     // Affichage du message de validation de la saisie
4064     if($correct === true) {
4065     $f->displayMessage("ok", _("Saisie enregistree"));
4066     }
4067     // Inclusion de la classe de gestion des formulaires
4068     require_once "../obj/om_formulaire.class.php";
4069     // Ouverture du formulaire
4070     echo "\t<form";
4071     echo " method=\"post\"";
4072     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
4073     echo " action=\"\"";
4074     echo ">\n";
4075     // Paramétrage des champs du formulaire
4076     if(isset($infos)) {
4077     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
4078     , "autorite_competente", "date_envoi_signature",
4079     "date_retour_signature", "date_envoi_controle_legalite",
4080     "date_retour_controle_legalite", "date_envoi_rar",
4081     "date_retour_rar", "is_valid");
4082     } else {
4083     $champs = array("type_mise_a_jour", "date", "code_barres");
4084     }
4085     // Création d'un nouvel objet de type formulaire
4086     $form = new formulaire(NULL, 0, 0, $champs);
4087     // Paramétrage des champs du formulaire
4088     // Parametrage du champ type_mise_a_jour
4089     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
4090     if(isset($infos)) {
4091     $form->setType("type_mise_a_jour", "selecthiddenstatic");
4092    
4093     } else {
4094     $form->setType("type_mise_a_jour", "select");
4095    
4096     }
4097     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
4098     $contenu = array();
4099    
4100     $contenu[0][0] = "date_envoi_signature";
4101     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
4102    
4103     $contenu[0][1] = "date_retour_signature";
4104     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
4105    
4106     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
4107     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
4108    
4109     $contenu[0][3] = "date_envoi_controle_legalite";
4110     $contenu[1][3] = _("date d'envoi au controle de legalite");
4111    
4112     $contenu[0][4] = "date_retour_controle_legalite";
4113     $contenu[1][4] = _("date de retour de controle de legalite");
4114    
4115     $contenu[0][5] = "date_retour_rar";
4116     $contenu[1][5] = _("date de retour de l'AR");
4117    
4118     $form->setSelect("type_mise_a_jour", $contenu);
4119    
4120     // Parametrage du champ date
4121     $form->setLib("date", _("Date")."* :");
4122     if(isset($infos)) {
4123     $form->setType("date", "hiddenstaticdate");
4124    
4125     } else {
4126     $form->setType("date", "date");
4127     }
4128     $form->setVal("date", $date);
4129     $form->setTaille("date", 10);
4130     $form->setMax("date", 10);
4131    
4132     // Parametrage du champ code_barres
4133     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
4134     if(isset($infos)) {
4135     $form->setType("code_barres", "hiddenstatic");
4136     } else {
4137     $form->setType("code_barres", "text");
4138     }
4139     $form->setVal("code_barres", $code_barres);
4140     $form->setTaille("code_barres", 20);
4141     $form->setMax("code_barres", 20);
4142    
4143     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
4144     if(isset($infos)) {
4145    
4146     // Tous les champs sont défini par defaut à static
4147     foreach ($infos as $key => $value) {
4148     $form->setType($key, "static");
4149     if(in_array($key, $liste_champs)) {
4150     $form->setVal($key, $date);
4151     } else {
4152     $form->setVal($key, $value);
4153     }
4154     }
4155    
4156     // Les champs dont on viens de définir la valeur sont en gras
4157     foreach ($liste_champs as $value) {
4158     $form->setBloc($value,'DF',"",'bold');
4159     }
4160    
4161     // Parametrage du champ dossier
4162     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
4163     $form->setType("dossier_libelle", "static");
4164     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
4165    
4166     // Parametrage du champ evenement
4167     $form->setLib("evenement", _("evenement")." :");
4168     $form->setType("evenement", "static");
4169     $form->setVal("evenement", $infos['evenement']);
4170    
4171     // Parametrage du champ autorite_competente
4172     $form->setLib("autorite_competente", _("Autorite competente")." :");
4173     $form->setType("autorite_competente", "static");
4174     $form->setVal("autorite_competente", $infos['autorite_competente']);
4175    
4176     // Parametrage des libellés d'envoi avec RAR
4177     $form->setLib("date_envoi_rar", _("date_envoi_rar")." :");
4178     $form->setLib("date_retour_rar", _("date_retour_rar")." :");
4179    
4180     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
4181     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
4182     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
4183     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
4184     // Configuration des libellé en fonction de l'autorité compétente
4185     if($infos['autorite_competente_code'] == 'ETAT') {
4186     $form->setType("date_envoi_controle_legalite", "hiddendate");
4187     $form->setType("date_retour_controle_legalite", "hiddendate");
4188     }
4189    
4190     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
4191     $form->setLib("is_valid", _("Valide")." :");
4192     $form->setType("is_valid", "hidden");
4193     $form->setVal("is_valid", 'true');
4194    
4195     $form->setFieldset('dossier_libelle','D',_('Synthese'));
4196     $form->setFieldset('is_valid','F');
4197    
4198     }
4199    
4200    
4201     // Création du fieldset regroupant les champs permettant la mise à jour des date
4202     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
4203     $form->setFieldset('code_barres','F');
4204     // Affichage du formulaire
4205     $form->entete();
4206     $form->afficher($champs, 0, false, false);
4207     $form->enpied();
4208     // Affichage du bouton
4209     echo "\t<div class=\"formControls\">\n";
4210     //
4211     if(!$date_error) {
4212     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
4213     }
4214     // Si pas sur l'écran de validation
4215     if(isset($infos)) {
4216     echo "<a class=\"retour\" href=\"../scr/form.php?obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
4217     echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
4218     echo "\">Retour</a>";
4219     }
4220     echo "\t</div>\n";
4221     // Fermeture du formulaire
4222     echo "\t</form>\n";
4223     }
4224    
4225     /**
4226     * [view_pdf_lettre_rar description]
4227     *
4228     * @return [type] [description]
4229     */
4230     function view_pdf_lettre_rar() {
4231     // Vérification de l'accessibilité sur l'élément
4232     $this->checkAccessibility();
4233    
4234     // XXX APP
4235    
4236     $f = $this->f;
4237    
4238     $f->disableLog();
4239    
4240     if($f->get_submitted_get_value('liste') != null) {
4241     $listeCodeBarres = explode(',',$f->get_submitted_get_value('liste'));
4242    
4243     // Classe permettant la mise en page de l'édition pdf
4244     require_once "../obj/pdf_lettre_rar.class.php";
4245     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
4246     // Initialisation de la mise en page
4247     $pdf_lettre_rar->init($f);
4248    
4249     foreach ($listeCodeBarres as $code_barres) {
4250    
4251     // Test si l'evenement est de type arrete et si un délégataire a été nommé
4252     $sql = "SELECT
4253     dossier.dossier_libelle,
4254     evenement.type,
4255 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
4256     CASE
4257     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
4258     THEN CONCAT(phase.code, ' - ', division.libelle)
4259     ELSE
4260     phase.code
4261     END AS code_phase
4262 mbroquet 3730 FROM ".DB_PREFIXE."instruction
4263     LEFT JOIN ".DB_PREFIXE."dossier
4264     ON instruction.dossier = dossier.dossier
4265 softime 3834 LEFT JOIN ".DB_PREFIXE."division
4266     ON dossier.division = division.division
4267 mbroquet 3730 INNER JOIN ".DB_PREFIXE."evenement ON
4268 softime 3834 instruction.evenement=evenement.evenement
4269     LEFT JOIN ".DB_PREFIXE."phase
4270     ON evenement.phase = phase.phase
4271 mbroquet 3730 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
4272     instruction.dossier=lien_dossier_demandeur.dossier
4273     inner join ".DB_PREFIXE."demandeur on
4274     demandeur.demandeur=lien_dossier_demandeur.demandeur
4275     WHERE code_barres='".$code_barres."'
4276     AND ((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire')
4277     OR demandeur.type_demandeur='delegataire')
4278 softime 3834 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
4279 mbroquet 3730
4280     $res = $f->db->query($sql);
4281     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
4282     $f->isDatabaseError($res);
4283     $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
4284    
4285    
4286     // Recuperation de l'adresse de destination
4287     $sqlAdresse = "SELECT
4288     CASE WHEN demandeur.qualite='particulier'
4289     THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
4290     ELSE TRIM(demandeur.personne_morale_denomination)
4291     END as ligne1,
4292     CASE WHEN demandeur.qualite='personne_morale'
4293     THEN TRIM(demandeur.personne_morale_raison_sociale)
4294     ELSE ''
4295     END as ligne1_1,
4296     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
4297     THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
4298     ELSE ''
4299     END as ligne1_2,
4300     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
4301     CASE demandeur.complement
4302     WHEN null THEN ''
4303     ELSE trim(demandeur.complement)
4304     END as ligne3,
4305     CASE demandeur.lieu_dit
4306     WHEN null THEN ''
4307     ELSE trim(demandeur.lieu_dit)
4308     END as ligne4,
4309     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
4310     (CASE WHEN demandeur.bp IS NOT NULL
4311     THEN CONCAT_WS(' ', 'BP', demandeur.bp)
4312     ELSE ''
4313     END),
4314     (CASE WHEN demandeur.cedex IS NOT NULL
4315     THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
4316     ELSE ''
4317     END))
4318     as ligne5,
4319     code_barres as code_barres
4320     FROM ".DB_PREFIXE."instruction
4321     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
4322     INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
4323     INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
4324     LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
4325     WHERE instruction.code_barres ='".$code_barres."'";
4326    
4327     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
4328     if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
4329     $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
4330     } else {
4331     $sqlAdresse .= " AND lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire'";
4332     }
4333    
4334     $resAdresse = $f->db->query($sqlAdresse);
4335     $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
4336     $f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
4337     $f->isDatabaseError($resAdresse);
4338    
4339     // Création adresse destinataire sans ligne vide
4340     $adresse_destinataire = array();
4341     if (!empty($adresse_dest['ligne1'])) {
4342     $adresse_destinataire[] = $adresse_dest['ligne1'];
4343     }
4344     if (!empty($adresse_dest['ligne1_1'])) {
4345     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
4346     }
4347     if (!empty($adresse_dest['ligne1_2'])) {
4348     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
4349     }
4350     $adresse_destinataire[] = $adresse_dest['ligne2'];
4351     if (!empty($adresse_dest['ligne3'])) {
4352     $adresse_destinataire[] = $adresse_dest['ligne3'];
4353     }
4354     if (!empty($adresse_dest['ligne4'])) {
4355     $adresse_destinataire[] = $adresse_dest['ligne4'];
4356     }
4357     $adresse_destinataire[] = $adresse_dest['ligne5'];
4358    
4359     // Création du champ specifique
4360     $specifique_content = array();
4361     $specifique_content[] = $adresse_dest['ligne1'];
4362     $specifique_content[] = $adresse_dest['ligne1_1'];
4363     $specifique_content[] = $adresse_dest['ligne1_2'];
4364     $specifique_content[] = $testDemandeur['dossier_libelle'];
4365     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
4366     unset($adresse_dest['code_barres']);
4367    
4368     // Ajout d'une page aux pdf
4369 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
4370 mbroquet 3730
4371     }
4372     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
4373     require_once PATH_OPENMAIRIE."om_edition.class.php";
4374     $om_edition = new edition();
4375     $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
4376     }
4377     }
4378    
4379     /**
4380     * VIEW - view_bordereau_envoi_maire.
4381     *
4382     * Formulaire demandant :
4383     * - le code-barres de l'événement d'instruction
4384     * - la date d'envoi du courrier pour signature par le maire
4385     *
4386     * Lors de la validation :
4387     * => met à jour cette date dans l'événement d'instruction
4388     * => crée un lien permettant de générer en PDF le bordereau
4389     *
4390     * @return void
4391     */
4392     function view_bordereau_envoi_maire() {
4393     // Vérification de l'accessibilité sur l'élément
4394     $this->checkAccessibility();
4395    
4396     // Récupération des valeur passées en POST ou GET
4397     $code_barres = "";
4398     if($this->f->get_submitted_post_value('code_barres') !== null) {
4399     $code_barres = $this->f->get_submitted_post_value('code_barres');
4400     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
4401     $code_barres = $this->f->get_submitted_get_value('code_barres');
4402     }
4403     $date = "";
4404     if($this->f->get_submitted_post_value('date') !== null) {
4405     $date = $this->f->get_submitted_post_value('date');
4406     } elseif($this->f->get_submitted_get_value('date') !== null) {
4407     $date = $this->f->get_submitted_get_value('date');
4408     }
4409     $validation = 0;
4410     if($this->f->get_submitted_post_value('validation') !== null) {
4411     $validation = $this->f->get_submitted_post_value('validation');
4412     } elseif($this->f->get_submitted_get_value('validation') !== null) {
4413     $validation = $this->f->get_submitted_get_value('validation');
4414     }
4415    
4416     // Si le formulaire a été validé
4417     if ($this->f->get_submitted_post_value('validation') !== null) {
4418     // Tous les champs doivent obligatoirement être remplis
4419     if (!empty($date) && !empty($code_barres)) {
4420     $date_en = $this->dateDB($date);
4421     // Si date valide
4422     if ($date_en != "") {
4423     $id_instruction = $this->get_instruction_by_barcode($code_barres);
4424     // Si un événement d'instruction a été trouvé pour ce code-barres
4425     if ($id_instruction !== null) {
4426     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
4427     // Si mise à jour réussie de la date d'envoi du courrier
4428     // pour signature par l'autorité compétente
4429     if($ret === true) {
4430     // Message de validation avec lien PDF
4431     $message_class = "valid";
4432     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
4433     $message .= " : <br/><br/>";
4434     $message .= "<a class='om-prev-icon pdf-16'";
4435     $message .= " id=\"generer_bordereau_envoi_maire\"";
4436     $message .= " title=\""._("Bordereau")."\"";
4437     $message .= " href='../scr/form.php?obj=instruction";
4438     $message .= "&action=200";
4439     $message .= "&idx=".$id_instruction."'";
4440     $message .= " target='_blank'>";
4441     $message .= _("Bordereau d'envoi au maire");
4442     $message .= "</a><br/><br/>";
4443     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
4444     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
4445     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
4446    
4447     } else {
4448     // Message d'erreur
4449     $message_class = "error";
4450     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
4451     $code_barres);
4452     }
4453     }
4454     else {
4455     $message_class = "error";
4456     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
4457     }
4458     }
4459     else {
4460     $message_class = "error";
4461     $message = _("La date est invalide.");
4462     }
4463     } else {
4464     $message_class = "error";
4465     $message = _("Tous les champs doivent etre remplis.");
4466     }
4467     }
4468    
4469     /**
4470     * Affichage des messages et du formulaire
4471     */
4472    
4473     // Affichage du message de validation ou d'erreur
4474     if (isset($message) && isset($message_class) && $message != "") {
4475     $this->f->displayMessage($message_class, $message);
4476     }
4477    
4478     // Inclusion de la classe de gestion des formulaires
4479     require_once "../obj/om_formulaire.class.php";
4480     // Ouverture du formulaire
4481     $datasubmit = $this->getDataSubmit();
4482     echo "\n<!-- ########## START DBFORM ########## -->\n";
4483     echo "<form";
4484     echo " id=\"bordereau_envoi_maire\"";
4485     echo " method=\"post\"";
4486     echo " name=\"f1\"";
4487     echo " action=\"";
4488     echo $datasubmit;
4489     echo "\"";
4490     echo ">\n";
4491    
4492     // Paramétrage des champs du formulaire
4493     $champs = array("code_barres","date");
4494    
4495     // Création d'un nouvel objet de type formulaire
4496     $form = new formulaire(NULL, 0, 0, $champs);
4497    
4498     $template_required_label = '%s *';
4499     // Parametrage du champ code_barres
4500     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
4501     $form->setType("code_barres", "text");
4502     $form->setVal("code_barres", $code_barres);
4503     $form->setTaille("code_barres", 20);
4504     $form->setMax("code_barres", 20);
4505     // Parametrage du champ date
4506     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
4507     $form->setType("date", "date") ;
4508     if (empty($date)) {
4509     $date = date('d/m/Y');
4510     }
4511     $form->setVal("date", $date);
4512     $form->setTaille("date", 10);
4513     $form->setMax("date", 10);
4514    
4515     // Création du bloc regroupant les champs
4516     $form->setBloc('code_barres','D');
4517     $form->setBloc('date','F');
4518     // Affichage du formulaire
4519     $form->entete();
4520     $form->afficher($champs, 0, false, false);
4521     $form->enpied();
4522     // Affichage du bouton
4523     printf("\t<div class=\"formControls\">\n");
4524     //
4525     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
4526     printf("\t</div>\n");
4527     // Fermeture du formulaire
4528     printf("\t</form>\n");
4529     }
4530    
4531     /**
4532     * VIEW - view_bordereau_envoi_maire.
4533     *
4534     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
4535     *
4536     * @return [void]
4537     */
4538     function view_generate_bordereau_envoi_maire() {
4539     // Vérification de l'accessibilité sur l'élément
4540     $this->checkAccessibility();
4541     // Récupération de la collectivité du dossier d'instruction
4542     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
4543     // Récupération de ses paramètres
4544     $collectivite = $this->f->getCollectivite($collectivite_di);
4545     // Génération du PDF
4546     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
4547     // Affichage du PDF
4548     $this->expose_pdf_output(
4549     $result['pdf_output'],
4550     $result['filename']
4551     );
4552     }
4553    
4554     /**
4555     * Retourne l'événement d'instruction dont on donne le code-barres
4556     *
4557     * @param [string] $barcode numéro du code-barres
4558     * @return [mixed] ID de son instruction ou null si aucun code
4559     */
4560     function get_instruction_by_barcode($barcode) {
4561     // Begin
4562     $this->begin_treatment(__METHOD__);
4563     // Vérification de l'existence de l'événement d'instruction
4564     // pour le code-barres donné
4565     $sql = "SELECT instruction
4566     FROM ".DB_PREFIXE."instruction
4567     WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
4568     $res = $this->f->db->getOne($sql);
4569     $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
4570     $this->f->isDatabaseError($res);
4571     // Retourne résultat
4572     return $this->end_treatment(__METHOD__, $res);
4573     }
4574    
4575     /**
4576     * Met à jour le champ date d'envoi signature
4577     * avec la date fournie et pour l'instruction donnée
4578     *
4579     * @param [string] $id ID de l'événement d'instruction
4580     * @param [string] $date date au format EN
4581     * @return [boolean] true si mise à jour avec succès
4582     */
4583     function update_date_envoi_signature($id, $date) {
4584     // Préparation du tableau
4585     $valF = array();
4586     $valF['date_envoi_signature'] = $date;
4587     // Begin
4588     $this->begin_treatment(__METHOD__);
4589     // Requête
4590     $res = $this->db->autoExecute(
4591     DB_PREFIXE.$this->table,
4592     $valF,
4593     DB_AUTOQUERY_UPDATE,
4594     $this->getCle($id)
4595     );
4596     // S'il y a eu une erreur
4597     if (database::isError($res, true)) {
4598     $this->end_treatment(__METHOD__, false);
4599     }
4600     //
4601     return $this->end_treatment(__METHOD__, true);
4602     }
4603    
4604     /**
4605     * Méthode permettant de définir des valeurs à envoyer en base après
4606     * validation du formulaire d'ajout.
4607     * @param array $val tableau des valeurs retournées par le formulaire
4608     */
4609     function setValFAjout($val) {
4610     // Mise à jour du flag created_by_commune lors d'un changement de décision
4611     // par un utilisateur de commune sur un dossier instruit par la comcom
4612     if($this->f->isInstrCanChangeDecision($this->valF["dossier"])) {
4613     $this->valF['created_by_commune'] = true;
4614     }
4615     }
4616 nmeucci 3876
4617     /**
4618 fmichon 3892 * Récupère l'instance du dossier d'instruction
4619     *
4620     * @param mixed Identifiant du dossier d'instruction
4621     *
4622     * @return object
4623     */
4624     function get_inst_dossier($dossier = null) {
4625     //
4626     return $this->get_inst_common("dossier", $dossier);
4627     }
4628    
4629 fmichon 4708 /**
4630     * Récupère l'instance d'un événement de workflow.
4631     *
4632     * @param mixed $evenement Identifiant de l'événement.
4633     *
4634     * @return object
4635     */
4636     function get_inst_evenement($evenement = null) {
4637     //
4638     return $this->get_inst_common("evenement", $evenement);
4639     }
4640 softime 3976
4641 fmichon 3892 /**
4642 softime 3976 * Logue l'action de l'instruction dans son DI.
4643 nmeucci 3933 *
4644 softime 3976 * @param string $id Clé primaire de l'instruction.
4645     * @param array $val Valeurs de l'instruction.
4646     *
4647     * @return bool Vrai si traitement effectué avec succès
4648 nmeucci 3876 */
4649 softime 3976 private function add_log_to_dossier($id, array $val) {
4650 nmeucci 3933 $maj = $this->getParameter("maj");
4651 nmeucci 3943 // Action = Trace par défaut
4652     $action = $this->get_backtrace();
4653     // Action = Identifant de l'action si contexte connu
4654     if (empty($maj) === false
4655     || (empty($maj) === true && $maj === 0)) {
4656     $action = $this->get_action_param($maj, 'identifier');
4657 nmeucci 3965 if ($action === 'modifier_suivi') {
4658     $action = "modifier (via l'action suivi des dates)";
4659     }
4660 nmeucci 4108 if ($action === 'notifier_commune'
4661     && isset($val['mails_destinataires']) === true) {
4662     $action = "notification de la commune (courriels : ";
4663     $action .= $val['mails_destinataires'].")";
4664     }
4665 nmeucci 3943 }
4666 nmeucci 3876 // Création du log
4667     $log = array(
4668     'date' => date('Y-m-d H:i:s'),
4669     'user' => $_SESSION['login'],
4670     'action' => $action,
4671     'values' => array(
4672     'date_evenement' => $this->dateDB($val['date_evenement']),
4673     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
4674     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
4675     'evenement' => $val['evenement'],
4676     'action' => $val['action'],
4677 nmeucci 3963 'instruction' => $id,
4678 nmeucci 3876 'etat' => $val['etat'],
4679     ),
4680     );
4681     // Ajout du log
4682 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
4683 nmeucci 3876 $ret = $di->add_log_instructions($log);
4684     if ($ret === false) {
4685     $this->correct = false;
4686     $this->msg = '';
4687     $this->addToMessage($di->msg);
4688     }
4689     return $ret;
4690     }
4691 nmeucci 3943
4692 softime 3976
4693 nmeucci 3943 /**
4694 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
4695 nmeucci 3943 *
4696 softime 3976 * @return string Une ligne par trace
4697 nmeucci 3943 */
4698     private function get_backtrace() {
4699     $trace = debug_backtrace();
4700 nmeucci 3957 $backtrace = '';
4701     $i = 1;
4702 nmeucci 3943 foreach ($trace as $key => $value) {
4703 nmeucci 3957 $func = $trace[$key]['function'];
4704     // On ne s'autolog pas
4705     if ($func === 'get_backtrace'
4706     || $func === 'add_log_to_dossier') {
4707     continue;
4708     }
4709     $backtrace .= $i.') ';
4710     // Si dans une classe
4711     if (isset($trace[$key]['class']) === true
4712     && empty($trace[$key]['class']) === false) {
4713 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
4714 nmeucci 3957 }
4715     // Si procédural
4716     else {
4717     $file = $trace[$key]['file'];
4718 nmeucci 3963 $line = $trace[$key]['line'];
4719 softime 3976 $truncated_file = $this->f->get_relative_path($file);
4720 nmeucci 3963 if ($truncated_file !== false) {
4721     $file = $truncated_file;
4722     }
4723     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
4724 nmeucci 3957 }
4725     $backtrace .= '<br/>';
4726     $i++;
4727 nmeucci 3943 }
4728 nmeucci 3957 return $backtrace;
4729 nmeucci 3943 }
4730 nmeucci 3963
4731 nmeucci 4108 /**
4732     * CONDITION - is_notifiable.
4733     *
4734     * Condition pour afficher l'action notifier_commune.
4735     *
4736     * @return boolean
4737     */
4738     public function is_notifiable() {
4739     // L'instruction doit être finalisée, ce qui revient à dire
4740     // définalisable sans bypass
4741     if ($this->is_unfinalizable_without_bypass() === false) {
4742     return false;
4743     }
4744     // La collectivité de l'utilisateur doit être de niveau multi
4745     if ($this->f->has_collectivite_multi() === false) {
4746     return false;
4747     }
4748     // Le paramètre multi de l'objet du courriel doit exister
4749     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
4750     return false;
4751     }
4752     // Le paramètre multi du modèle du courriel doit exister
4753     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
4754     return false;
4755     }
4756     // A ce stade toutes les conditions sont satisfaites
4757     return true;
4758     }
4759 nmeucci 3963
4760 nmeucci 4108 /**
4761     * TREATMENT - notifier_commune.
4762     *
4763     * Notifie aux communes et par courriel la finalisation d'une instruction.
4764     *
4765     * @return boolean
4766     */
4767     public function notifier_commune() {
4768     // Cette méthode permet d'exécuter une routine en début des méthodes
4769     // dites de TREATMENT.
4770     $this->begin_treatment(__METHOD__);
4771     // Définition des paramètres
4772     $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';
4773     $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';
4774     $p_courriel = 'param_courriel_de_notification_commune';
4775     // Définition des variables de substitution
4776     $id_di = $this->getVal('dossier');
4777     $id_inst = $this->getVal($this->clePrimaire);
4778     // Instanciation du DI
4779     $di = $this->get_inst_dossier($id_di);
4780     // Récupération du paramétrage de la collectivité du dossier
4781     $collectivite_di = $di->getVal('om_collectivite');
4782     $params_mono = $this->f->getCollectivite($collectivite_di);
4783     // Récupération du paramétrage de la collectivité multi
4784     $collectivite_multi = $this->f->get_idx_collectivite_multi();
4785     $params_multi = $this->f->getCollectivite($collectivite_multi);
4786     // Vérification de l'objet (obligatoirement multi)
4787     $objet = null;
4788     if (isset($params_multi[$p_objet]) === true
4789     && $params_multi[$p_objet] !== '') {
4790     $objet = $params_multi[$p_objet];
4791     }
4792     // Vérification du modèle mono en priorité
4793     $modele = null;
4794     if (isset($params_mono[$p_modele]) === true
4795     && $params_mono[$p_modele] !== '') {
4796     $modele = $params_mono[$p_modele];
4797    
4798     }
4799     // Sinon vérification du modèle multi
4800     if ($modele === null
4801     && isset($params_multi[$p_modele]) === true
4802     && $params_multi[$p_modele] !== '') {
4803     $modele = $params_multi[$p_modele];
4804     }
4805     // Vérification des adresses de courriel mono
4806     $courriels_valides = array();
4807     $courriels_invalides = array();
4808     if (isset($params_mono[$p_courriel]) === true
4809     && $params_mono[$p_courriel] !== '') {
4810     // Un mail par ligne
4811     $adresses = explode("\n", $params_mono[$p_courriel]);
4812     // Vérification de la validité de chaque mail avec preg_match
4813     foreach ($adresses as $adresse) {
4814     $adresse = trim($adresse);
4815     if ($this->f->checkValidEmailAddress($adresse) === 1) {
4816     $courriels_valides[] = $adresse;
4817     } else {
4818     $courriels_invalides[] = $adresse;
4819     }
4820     }
4821     }
4822     // Vérification du paramétrage global :
4823     // on stoppe le traitement si au moins un paramètre est incorrect
4824     if ($objet === null
4825     || $modele === null
4826     || count($courriels_valides) === 0
4827     || count($courriels_invalides) > 0) {
4828     // On construit le message d'erreur adéquat
4829     $this->addToMessage(_('Erreur de paramétrage :'));
4830     if ($objet === null) {
4831     $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));
4832     }
4833     if ($modele === null) {
4834     $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));
4835     }
4836     if (count($courriels_valides) === 0) {
4837     $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));
4838     }
4839     if (count($courriels_invalides) > 0) {
4840     $courriels_invalides = implode(', ', $courriels_invalides);
4841     $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);
4842     }
4843     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4844     return $this->end_treatment(__METHOD__, false);
4845     }
4846     // Remplacement des variables de substitution
4847     $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);
4848     $modele = $this->formater_modele($modele, $id_di, $id_inst);
4849     // Exécution du traitement d'envoi du/des mail(s)
4850     $fails = array();
4851     foreach ($courriels_valides as $email) {
4852     if ($this->f->sendMail(
4853     iconv("UTF-8", "CP1252", $objet),
4854     iconv("UTF-8", "CP1252", $modele),
4855     iconv("UTF-8", "CP1252", $email)) === false) {
4856     $fails[] = $email;
4857     }
4858     }
4859     // Si échec message d'erreur et arrêt du traitement
4860     if (count($fails) > 0) {
4861     $fails = implode(', ', $fails);
4862     $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);
4863     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4864     return $this->end_treatment(__METHOD__, false);
4865     }
4866     // Ajout du log
4867     $this->setValFFromVal();
4868     $val_inst = $this->valF;
4869     $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);
4870     if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {
4871     $this->addToMessage(_("Erreur lors de la notification."));
4872     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4873     return $this->end_treatment(__METHOD__, false);
4874     }
4875     // Message de validation
4876     $this->addToMessage(_('La commune a été notifiée.'));
4877     return $this->end_treatment(__METHOD__, true);
4878     }
4879    
4880     /**
4881     * Formatte le corps du courriel notifié aux communes
4882     *
4883     * @param string $modele template du modèle du courriel
4884     * @param string $id_di clé primaire du DI
4885     * @param string $id_inst clé primaire de l'instruction
4886     * @return string corps du mail au format HTML
4887     */
4888     public function formater_modele($modele, $id_di, $id_inst) {
4889     // Création du lien d'accès direct à l'instruction
4890     $url_inst = PATH_BASE_URL.'spg/direct_link.php?obj=dossier_instruction&action=3'.
4891     '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;
4892     $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';
4893     // Remplacement des champs de fusion
4894     $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);
4895     $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);
4896     $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);
4897     // Encodage HTML des sauts de ligne
4898     $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);
4899     //
4900     return $modele;
4901     }
4902 mbroquet 3730 }// fin classe
4903    
4904     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26