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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5024 - (hide annotations)
Wed Nov 2 14:39:23 2016 UTC (8 years, 3 months ago) by softime
File size: 215001 byte(s)
* Merge de la branche de développement 3.33.x

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 softime 5024 $this->class_actions[0]["condition"] = array("is_addable");
98 mbroquet 3730
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 softime 5024 // 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 mbroquet 3730 }
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 softime 5024 //
2062     $this->begin_treatment(__METHOD__);
2063 mbroquet 3730
2064 softime 5024 //
2065     $id_inst = $this->getVal($this->clePrimaire);
2066 mbroquet 3730
2067 softime 5024 //
2068     $admin_msg_error = _("Veuillez contacter votre administrateur.");
2069     $file_msg_error = _("Erreur de traitement de fichier.")
2070     ." ".$admin_msg_error;
2071     $bdd_msg_error = _("Erreur de base de données.")
2072     ." ".$admin_msg_error;
2073     $log_msg_error = "Finalisation non enregistrée
2074     - id instruction = %s
2075     - uid fichier = %s";
2076 mbroquet 3730
2077     // Si on finalise le document
2078     if ($mode == "finalize"){
2079 softime 5024 //
2080     $etat = _('finalisation');
2081 mbroquet 3730
2082     // Récupère la collectivite du dossier d'instruction
2083     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2084    
2085     //
2086     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2087    
2088     // Génération du PDF
2089     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite);
2090     $pdf_output = $result['pdf_output'];
2091    
2092     //Métadonnées du document
2093     $metadata = array(
2094 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
2095 mbroquet 3730 'mimetype' => 'application/pdf',
2096     'size' => strlen($pdf_output)
2097     );
2098    
2099     // Récupération des métadonnées calculées après validation
2100     $spe_metadata = $this->getMetadata("om_fichier_instruction");
2101    
2102     //On vérifie si l'instruction à finaliser a un événement de type arrete
2103     $sql = "SELECT type
2104     FROM ".DB_PREFIXE."evenement
2105     WHERE evenement = ".$this->getVal("evenement");
2106     $typeEvenement = $this->db->getOne($sql);
2107     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2108 softime 5024 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
2109     $this->correct = false;
2110     $this->addToMessage($bdd_msg_error);
2111     return $this->end_treatment(__METHOD__, false);
2112 mbroquet 3730 }
2113    
2114     //Initialisation de la variable
2115     $arrete_metadata = array();
2116     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
2117     if ( $typeEvenement === 'arrete' ){
2118     $arrete_metadata = $this->getMetadata("arrete");
2119     }
2120    
2121     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
2122    
2123 softime 5024 // Si le document a déjà été finalisé on le met à jour
2124     // en conservant son UID
2125 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
2126     $uid = $this->f->storage->update(
2127     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
2128     }
2129 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
2130 mbroquet 3730 else {
2131     $uid = $this->f->storage->create($pdf_output, $metadata);
2132     }
2133     }
2134    
2135 softime 5024 // Si on définalise le document
2136 mbroquet 3730 if ($mode == "unfinalize") {
2137 softime 5024 //
2138     $etat = _('définalisation');
2139 mbroquet 3730 // Récupération de l'uid du document finalisé
2140     $uid = $this->getVal("om_fichier_instruction");
2141     }
2142 softime 5024
2143     // Si on définalise l'UID doit être défini
2144     // Si on finalise la création/modification du fichier doit avoir réussi
2145 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
2146 softime 5024 $this->correct = false;
2147     $this->addToMessage($file_msg_error);
2148     $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));
2149     return $this->end_treatment(__METHOD__, false);
2150 mbroquet 3730 }
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     $this->setvalF($val);
2179    
2180     // Verification de la validite des donnees
2181     $this->verifier($this->val, $this->db, DEBUG);
2182     // Si les verifications precedentes sont correctes, on procede a
2183     // la modification, sinon on ne fait rien et on retourne une erreur
2184 softime 5024 if ($this->correct === true) {
2185 mbroquet 3730 //
2186     $valF = array(
2187     "om_fichier_instruction" => $uid,
2188     "date_finalisation_courrier" => date('Y-m-d')
2189     );
2190     //
2191     if($mode=="finalize") {
2192     // état finalisé vrai
2193 softime 5024 $valF["om_final_instruction"] = true;
2194 mbroquet 3730 // ajout log utilisateur
2195     $login = $_SESSION['login'];
2196     $nom = "";
2197     $this->f->getUserInfos();
2198     if (isset($this->f->om_utilisateur["nom"])
2199     && !empty($this->f->om_utilisateur["nom"])) {
2200     $nom = $this->f->om_utilisateur["nom"];
2201     }
2202     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
2203     if ($nom != "") {
2204     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
2205     }
2206     } else {
2207     // état finalisé faux
2208 softime 5024 $valF["om_final_instruction"] = false;
2209 mbroquet 3730 // suppression log utilisateur
2210     $valF["om_final_instruction_utilisateur"] = '';
2211     }
2212    
2213     // Execution de la requête de modification des donnees de l'attribut
2214     // valF de l'objet dans l'attribut table de l'objet
2215     $res = $this->db->autoExecute(DB_PREFIXE.$this->table, $valF,
2216 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
2217     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
2218     //
2219     if ($this->f->isDatabaseError($res, true) === true) {
2220     $this->correct = false;
2221     $this->addToMessage($bdd_msg_error);
2222     return $this->end_treatment(__METHOD__, false);
2223     }
2224 mbroquet 3730
2225 softime 5024 //
2226     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
2227     //
2228     if ($this->add_log_to_dossier($id_inst, $val) === false) {
2229     return $this->end_treatment(__METHOD__, false);
2230     }
2231     //
2232     return $this->end_treatment(__METHOD__, true);
2233 mbroquet 3730 }
2234 softime 5024 // L'appel de verifier() a déjà positionné correct à false
2235     // et défini un message d'erreur.
2236     $this->addToLog(sprintf($log_msg_error, $id_inst, $uid));
2237     return $this->end_treatment(__METHOD__, false);
2238 mbroquet 3730 }
2239    
2240     /**
2241     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
2242     * @return string numéro de dossier d'instruction
2243     */
2244     protected function getDossier() {
2245     if(empty($this->specificMetadata)) {
2246     $this->getSpecificMetadata();
2247     }
2248     return $this->specificMetadata->dossier;
2249     }
2250     /**
2251     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
2252     * @return int Version
2253     */
2254     protected function getDossierVersion() {
2255     if(empty($this->specificMetadata)) {
2256     $this->getSpecificMetadata();
2257     }
2258     return $this->specificMetadata->version;
2259     }
2260     /**
2261     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
2262     * @return string numéro de dossier d'autorisation
2263     */
2264     protected function getNumDemandeAutor() {
2265     if(empty($this->specificMetadata)) {
2266     $this->getSpecificMetadata();
2267     }
2268     return $this->specificMetadata->dossier_autorisation;
2269     }
2270     /**
2271     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
2272     * @return date de la demande initiale
2273     */
2274     protected function getAnneemoisDemandeAutor() {
2275     if(empty($this->specificMetadata)) {
2276     $this->getSpecificMetadata();
2277     }
2278     return $this->specificMetadata->date_demande_initiale;
2279     }
2280     /**
2281     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
2282     * @return string type du dossier d'instruction
2283     */
2284     protected function getTypeInstruction() {
2285     if(empty($this->specificMetadata)) {
2286     $this->getSpecificMetadata();
2287     }
2288     return $this->specificMetadata->dossier_instruction_type;
2289     }
2290     /**
2291     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
2292     * @return string avis
2293     */
2294     protected function getStatutAutorisation() {
2295     if(empty($this->specificMetadata)) {
2296     $this->getSpecificMetadata();
2297     }
2298     return $this->specificMetadata->statut;
2299     }
2300     /**
2301     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
2302     * @return string type du dossier d'autorisation
2303     */
2304     protected function getTypeAutorisation() {
2305     if(empty($this->specificMetadata)) {
2306     $this->getSpecificMetadata();
2307     }
2308     return $this->specificMetadata->dossier_autorisation_type;
2309     }
2310     /**
2311     * Récupération de la date d'ajout de document à ajouter aux métadonnées
2312     * @return date de l'évènement
2313     */
2314     protected function getDateEvenementDocument() {
2315     return date("Y-m-d");
2316     }
2317     /**
2318     * Récupération du groupe d'instruction à ajouter aux métadonnées
2319     * @return string Groupe d'instruction
2320     */
2321     protected function getGroupeInstruction() {
2322     if(empty($this->specificMetadata)) {
2323     $this->getSpecificMetadata();
2324     }
2325     return $this->specificMetadata->groupe_instruction;
2326     }
2327     /**
2328     * Récupération du libellé du type du document à ajouter aux métadonnées
2329     * @return string Groupe d'instruction
2330     */
2331     protected function getTitle() {
2332    
2333     // Récupère le champ événement
2334     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
2335     $evenement = $this->valF["evenement"];
2336     } else {
2337     $evenement = $this->getVal("evenement");
2338     }
2339    
2340     // Requête sql
2341     $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
2342     WHERE evenement=".$evenement;
2343     $evenement_libelle = $this->db->getOne($sql);
2344     $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2345     if (database::isError($evenement_libelle)) {
2346     die();
2347     }
2348    
2349     // Retourne le libelle de l'événement
2350     return $evenement_libelle;
2351     }
2352    
2353     /**
2354     * Cette méthode permet de stocker en attribut toutes les métadonnées
2355     * nécessaire à l'ajout d'un document.
2356     */
2357     public function getSpecificMetadata() {
2358     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
2359     $dossier = $this->valF["dossier"];
2360     } else {
2361     $dossier = $this->getVal("dossier");
2362     }
2363     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
2364     $sql = "SELECT dossier.dossier as dossier,
2365     dossier_autorisation.dossier_autorisation as dossier_autorisation,
2366     to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
2367     dossier_instruction_type.code as dossier_instruction_type,
2368     etat_dossier_autorisation.libelle as statut,
2369     dossier_autorisation_type.code as dossier_autorisation_type,
2370     groupe.code as groupe_instruction
2371     FROM ".DB_PREFIXE."dossier
2372     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
2373     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
2374     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2375     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2376     LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
2377     ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
2378     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
2379     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2380     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
2381     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
2382     LEFT JOIN ".DB_PREFIXE."groupe
2383     ON dossier_autorisation_type.groupe = groupe.groupe
2384     WHERE dossier.dossier = '".$dossier."'";
2385     $res = $this->db->query($sql);
2386     $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);
2387     if ( database::isError($res)){
2388     die();
2389     }
2390    
2391     //Le résultat est récupéré dans un objet
2392     $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
2393    
2394     //Si il y a un résultat
2395     if ($row !== null) {
2396    
2397 fmichon 3892 // Instrance de la classe dossier
2398     $inst_dossier = $this->get_inst_dossier($dossier);
2399    
2400     // Insère l'attribut version à l'objet
2401     $row->version = $inst_dossier->get_dossier_instruction_version();
2402    
2403 mbroquet 3730 //Alors on créé l'objet dossier_instruction
2404     $this->specificMetadata = $row;
2405    
2406     }
2407     }
2408    
2409     /**
2410     * Retourne le statut du dossier d'instruction
2411     * @param string $idx Identifiant du dossier d'instruction
2412     * @return string Le statut du dossier d'instruction
2413     */
2414     function getStatutAutorisationDossier($idx){
2415    
2416     $statut = '';
2417    
2418     //Si l'identifiant du dossier d'instruction fourni est correct
2419     if ( $idx != '' ){
2420    
2421     //On récupère le statut de l'état du dossier à partir de l'identifiant du
2422     //dossier
2423     $sql = "SELECT etat.statut
2424     FROM ".DB_PREFIXE."dossier
2425     LEFT JOIN
2426     ".DB_PREFIXE."etat
2427     ON
2428     dossier.etat = etat.etat
2429     WHERE dossier ='".$idx."'";
2430     $statut = $this->db->getOne($sql);
2431     $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2432     if ( database::isError($statut)){
2433     die();
2434     }
2435     }
2436     return $statut;
2437     }
2438    
2439     /**
2440     * Récupère les données du dossier
2441     * @return array
2442     */
2443     function get_dossier_actual() {
2444    
2445     // Initialisation de la valeur de retour
2446     $return = array();
2447    
2448     // Récupération de toutes les valeurs du dossier d'instruction en cours
2449     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2450     WHERE dossier='".$this->valF['dossier']."'";
2451     $res = $this->db->query($sql);
2452     $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);
2453     $this->f->isDatabaseError($res);
2454    
2455     //
2456     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2457    
2458     // Récupération de la valeur actuelle du délai, de l'accord tacite,
2459     // de l'état et de l'avis du dossier d'instruction
2460     $return['archive_delai']=$row['delai'];
2461     $return['archive_accord_tacite']=$row['accord_tacite'];
2462     $return['archive_etat']=$row['etat'];
2463     $return['archive_avis']=$row['avis_decision'];
2464     // Récupération de la valeur actuelle des 9 dates du dossier
2465     // d'instruction
2466     $return['archive_date_complet']=$row['date_complet'];
2467     $return['archive_date_dernier_depot']=$row['date_dernier_depot'];
2468     $return['archive_date_rejet']= $row['date_rejet'];
2469     $return['archive_date_limite']= $row['date_limite'];
2470     $return['archive_date_notification_delai']= $row['date_notification_delai'];
2471     $return['archive_date_decision']= $row['date_decision'];
2472     $return['archive_date_validite']= $row['date_validite'];
2473     $return['archive_date_achevement']= $row['date_achevement'];
2474     $return['archive_date_chantier']= $row['date_chantier'];
2475     $return['archive_date_conformite']= $row['date_conformite'];
2476     $return['archive_incompletude']= $row['incompletude'];
2477     $return['archive_incomplet_notifie']= $row['incomplet_notifie'];
2478     $return['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
2479     $return['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
2480     $return['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
2481     $return['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
2482     $return['archive_delai_incompletude']= $row['delai_incompletude'];
2483     $return['archive_autorite_competente']= $row['autorite_competente'];
2484     $return['duree_validite']= $row['duree_validite'];
2485 nmeucci 3873 $return['date_depot']= $row['date_depot'];
2486 mbroquet 3730 }
2487    
2488     // Retour de la fonction
2489     return $return;
2490    
2491     }
2492    
2493     /**
2494     * Permet de vérifier qu'un événement est verrouillable
2495     * @param integer $idx Identifiant de l'instruction
2496     * @return boolean
2497     */
2498     function checkEvenementNonVerrouillable($idx) {
2499    
2500     // Initialisation du résultat
2501     $non_verrouillable = false;
2502    
2503     // Si la condition n'est pas vide
2504     if ($idx != "") {
2505    
2506     // Requête SQL
2507     $sql = "SELECT evenement.non_verrouillable
2508     FROM ".DB_PREFIXE."evenement
2509     LEFT JOIN ".DB_PREFIXE."instruction
2510     ON instruction.evenement = evenement.evenement
2511     WHERE instruction.instruction = $idx";
2512     $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2513     $res = $this->db->getOne($sql);
2514     $this->f->isDatabaseError($res);
2515    
2516     // Si le retour de la requête est true
2517     if ($res == 't') {
2518     //
2519     $non_verrouillable = true;
2520     }
2521     }
2522    
2523     // Retourne résultat
2524     return $non_verrouillable;
2525     }
2526    
2527     /**
2528     * Mise à jour des champs archive_*
2529     * @param mixed $row La ligne de données
2530     */
2531     public function updateArchiveData($row){
2532    
2533     // Récupération de la valeur actuelle du délai, de l'accord tacite,
2534     // de l'état et de l'avis du dossier d'instruction
2535     $this->valF['archive_delai']=$row['delai'];
2536     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
2537     $this->valF['archive_etat']=$row['etat'];
2538     $this->valF['archive_avis']=$row['avis_decision'];
2539     // Récupération de la valeur actuelle des 9 dates du dossier
2540     // d'instruction
2541     if ($row['date_complet'] != '') {
2542     $this->valF['archive_date_complet']=$row['date_complet'];
2543     }
2544     if ($row['date_dernier_depot'] != '') {
2545     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
2546     }
2547     if ($row['date_rejet']!='') {
2548     $this->valF['archive_date_rejet']= $row['date_rejet'];
2549     }
2550     if ($row['date_limite']!='') {
2551     $this->valF['archive_date_limite']= $row['date_limite'];
2552     }
2553     if ($row['date_notification_delai']!='') {
2554     $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
2555     }
2556     if ($row['date_decision']!='') {
2557     $this->valF['archive_date_decision']= $row['date_decision'];
2558     }
2559     if ($row['date_validite']!='') {
2560     $this->valF['archive_date_validite']= $row['date_validite'];
2561     }
2562     if ($row['date_achevement']!='') {
2563     $this->valF['archive_date_achevement']= $row['date_achevement'];
2564     }
2565     if ($row['date_chantier']!='') {
2566     $this->valF['archive_date_chantier']= $row['date_chantier'];
2567     }
2568     if ($row['date_conformite']!='') {
2569     $this->valF['archive_date_conformite']= $row['date_conformite'];
2570     }
2571     if ($row['incompletude']!='') {
2572     $this->valF['archive_incompletude']= $row['incompletude'];
2573     }
2574     if ($row['incomplet_notifie']!='') {
2575     $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
2576     }
2577     if ($row['evenement_suivant_tacite']!='') {
2578     $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
2579     }
2580     if ($row['evenement_suivant_tacite_incompletude']!='') {
2581     $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
2582     }
2583     if ($row['etat_pendant_incompletude']!='') {
2584     $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
2585     }
2586     if ($row['date_limite_incompletude']!='') {
2587     $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
2588     }
2589     if ($row['delai_incompletude']!='') {
2590     $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
2591     }
2592     if ($row['autorite_competente']!='') {
2593     $this->valF['archive_autorite_competente']= $row['autorite_competente'];
2594     }
2595     if ($row['duree_validite']!='') {
2596     $this->valF['duree_validite']= $row['duree_validite'];
2597     }
2598 nmeucci 3873 if ($row['date_depot']!='') {
2599     $this->valF['date_depot']= $row['date_depot'];
2600     }
2601 mbroquet 3730 }
2602    
2603     // {{{
2604     // Méthodes de récupération des métadonnées arrêté
2605     /**
2606     * @return string Retourne le numéro d'arrêté
2607     */
2608     function getNumArrete() {
2609     return $this->getVal("numero_arrete");
2610     }
2611     /**
2612     * @return chaîne vide
2613     */
2614     function getReglementaireArrete() {
2615     return 'true';
2616     }
2617     /**
2618     * @return boolean de notification au pétitionnaire
2619     */
2620     function getNotificationArrete() {
2621     return 'true';
2622     }
2623     /**
2624     * @return date de notification au pétitionnaire
2625     */
2626     function getDateNotificationArrete() {
2627     if (empty($this->metadonneesArrete)) {
2628     $this->getArreteMetadata();
2629     }
2630     return $this->metadonneesArrete["datenotification"];
2631     }
2632     /**
2633     * @return boolean check si le document est passé au contrôle de légalité
2634     */
2635     function getControleLegalite() {
2636     return 'true';
2637     }
2638     /**
2639     * @return date de signature de l'arrêté
2640     */
2641     function getDateSignature() {
2642     if (empty($this->metadonneesArrete)) {
2643     $this->getArreteMetadata();
2644     }
2645     return $this->metadonneesArrete["datesignaturearrete"];
2646     }
2647     /**
2648     * @return string nom du signataire
2649     */
2650     function getNomSignataire() {
2651     if (empty($this->metadonneesArrete)) {
2652     $this->getArreteMetadata();
2653     }
2654     return $this->metadonneesArrete["nomsignataire"];
2655     }
2656     /**
2657     * @return string qualité du signataire
2658     */
2659     function getQualiteSignataire() {
2660     if (empty($this->metadonneesArrete)) {
2661     $this->getArreteMetadata();
2662     }
2663     return $this->metadonneesArrete["qualitesignataire"];
2664     }
2665     /**
2666     * @return string numéro du terrain
2667     */
2668     function getAp_numRue() {
2669     if (empty($this->metadonneesArrete)) {
2670     $this->getArreteMetadata();
2671     }
2672     return $this->metadonneesArrete["ap_numrue"];
2673     }
2674     /**
2675     * @return string nom de la rue du terrain
2676     */
2677     function getAp_nomDeLaVoie() {
2678     if (empty($this->metadonneesArrete)) {
2679     $this->getArreteMetadata();
2680     }
2681     return $this->metadonneesArrete["ap_nomdelavoie"];
2682     }
2683     /**
2684     * @return string code postal du terrain
2685     */
2686     function getAp_codePostal() {
2687     if (empty($this->metadonneesArrete)) {
2688     $this->getArreteMetadata();
2689     }
2690     return $this->metadonneesArrete["ap_codepostal"];
2691     }
2692     /**
2693     * @return string ville du terrain
2694     */
2695     function getAp_ville() {
2696     if (empty($this->metadonneesArrete)) {
2697     $this->getArreteMetadata();
2698     }
2699     return $this->metadonneesArrete["ap_ville"];
2700     }
2701     /**
2702     * @return string activité
2703     */
2704     function getActivite() {
2705     return "Droit du sol";
2706     }
2707     /**
2708     * @return string date du retour de controle légalité
2709     */
2710     function getDateControleLegalite() {
2711     if (empty($this->metadonneesArrete)) {
2712     $this->getArreteMetadata();
2713     }
2714     return $this->metadonneesArrete["datecontrolelegalite"];
2715     }
2716    
2717     // Fin des méthodes de récupération des métadonnées
2718     // }}}
2719    
2720     /**
2721     * Méthode de récupération des métadonnées arrêtés dans la base de données,
2722     * les données sont stockés dans l'attribut $this->metadonneesArrete
2723     */
2724     function getArreteMetadata() {
2725    
2726     //Récupération de la dernière instruction dont l'événement est de type 'arrete'
2727     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
2728     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
2729     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
2730     "ap_codepostal"=>"", "ap_ville"=>"");
2731    
2732     $sqlArrete = "SELECT signataire_arrete.nom as \"nomsignataire\",
2733     signataire_arrete.qualite as \"qualitesignataire\",
2734     instruction.etat as \"decisionarrete\",
2735     instruction.date_retour_rar as \"datenotification\",
2736     instruction.date_retour_signature as \"datesignaturearrete\",
2737     instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
2738     dossier.terrain_adresse_voie_numero as \"ap_numrue\",
2739     dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
2740     dossier.terrain_adresse_code_postal as \"ap_codepostal\",
2741     dossier.terrain_adresse_localite as \"ap_ville\"
2742     FROM ".DB_PREFIXE."instruction
2743     LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
2744     instruction.signataire_arrete = signataire_arrete.signataire_arrete
2745     LEFT JOIN ".DB_PREFIXE."dossier ON
2746     instruction.dossier = dossier.dossier
2747     LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
2748     donnees_techniques.dossier_instruction = dossier.dossier
2749     WHERE instruction.instruction = ".$this->getVal("instruction");
2750     $resArrete = $this->db->query($sqlArrete);
2751     $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
2752     if ( database::isError($resArrete)){
2753     die();
2754     }
2755    
2756     $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
2757     }
2758    
2759     /**
2760     * CONDITION - has_an_edition.
2761     *
2762     * Condition pour afficher le bouton de visualisation de l'édition.
2763     *
2764     * @return boolean
2765     */
2766     function has_an_edition() {
2767     // Récupère la valeur du champ lettretype
2768     $lettretype = $this->getVal("lettretype");
2769     // Si le champ est vide
2770     if (empty($lettretype)) {
2771     //
2772     return false;
2773     }
2774    
2775     //
2776     return true;
2777     }
2778    
2779     /**
2780     * CONDITION - is_editable.
2781     *
2782     * Condition pour la modification.
2783     *
2784     * @return boolean
2785     */
2786     function is_editable() {
2787     // Contrôle si l'utilisateur possède un bypass
2788     $bypass = $this->f->isAccredited(get_class()."_modifier_bypass");
2789     //
2790     if ($bypass == true) {
2791    
2792     //
2793     return true;
2794     }
2795    
2796     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2797     // division du dossier
2798     if ($this->f->isUserInstructeur()
2799     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2800 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2801 mbroquet 3730
2802     //
2803     return false;
2804     }
2805    
2806     // si instructeur commune
2807 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
2808 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2809     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
2810     || $this->getVal('created_by_commune') !== 't')) {
2811     return false;
2812     }
2813     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
2814     // que l'événement n'est pas identifié comme non verrouillable
2815     if ($this->f->isUserInstructeur()
2816     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
2817     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
2818    
2819     //
2820     return false;
2821     }
2822    
2823     //
2824     return true;
2825     }
2826    
2827     /**
2828     * CONDITION - is_deletable.
2829     *
2830     * Condition pour lma modification.
2831     *
2832     * @return boolean
2833     */
2834     function is_deletable() {
2835     // Contrôle si l'utilisateur possède un bypass
2836     $bypass = $this->f->isAccredited(get_class()."_supprimer_bypass");
2837     //
2838     if ($bypass == true) {
2839    
2840     //
2841     return true;
2842     }
2843    
2844     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2845     // division du dossier
2846     if ($this->f->isUserInstructeur()
2847     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) {
2848    
2849     //
2850     return false;
2851     }
2852 softime 5024
2853     // l'événement est-il le dernier ?
2854     $dernier_evenement = false;
2855     // instanciation dossier
2856     require_once "../obj/dossier.class.php";
2857     $dossier = new dossier($this->getVal('dossier'), $this->db, DEBUG);
2858     // récupération dernier événement
2859     $id_dernier_evenement = $dossier->get_dernier_evenement();
2860     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
2861     $dernier_evenement = true;
2862     }
2863 mbroquet 3730
2864 softime 5024 // Si dossier cloturé ou si pas dernier événement
2865     // ou de type retour ou si une date est renseignée
2866     // ET utilisateur non administrateur
2867     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
2868     || $dernier_evenement == false
2869     || $this->is_evenement_retour($this->getVal("evenement")) == true
2870     || $this->getVal('date_envoi_signature') != ''
2871     || $this->getVal('date_retour_signature') != ''
2872     || $this->getVal('date_envoi_rar') != ''
2873     || $this->getVal('date_retour_rar') != ''
2874     || $this->getVal('date_envoi_controle_legalite') != ''
2875     || $this->getVal('date_retour_controle_legalite') != '') {
2876     // pas le droit de supprimer
2877     return false;;
2878     }
2879    
2880 mbroquet 3730 //
2881     return true;
2882     }
2883    
2884     /**
2885     * CONDITION - is_addable.
2886     *
2887     * Condition pour afficher les boutons modifier et supprimer.
2888     *
2889     * @return boolean
2890     */
2891     function is_addable() {
2892     // Contrôle si l'utilisateur possède un bypass
2893     $bypass = $this->f->isAccredited(get_class()."_ajouter_bypass");
2894     //
2895     if ($bypass == true) {
2896    
2897     //
2898     return true;
2899     }
2900    
2901     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2902     // division du dossier
2903     if ($this->f->isUserInstructeur()
2904     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2905 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2906 mbroquet 3730
2907     //
2908     return false;
2909     }
2910    
2911     // si instructeur commune
2912 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false
2913 mbroquet 3730 && $this->f->isInstrCanChangeDecision($this->getVal('dossier')) === true) {
2914     return false;
2915     }
2916    
2917    
2918     //
2919     return true;
2920     }
2921    
2922     /**
2923     * CONDITION - is_finalizable.
2924     *
2925     * Condition pour afficher le bouton.
2926     *
2927     * @return boolean
2928     */
2929     function is_finalizable() {
2930     // Contrôle si l'utilisateur possède un bypass
2931     $bypass = $this->f->isAccredited(get_class()."_finaliser_bypass");
2932     //
2933     if ($bypass == true) {
2934    
2935     //
2936     return true;
2937     }
2938    
2939     // Si l'utilisateur est un intructeur qui ne correspond pas à la
2940     // division du dossier
2941     if ($this->f->isUserInstructeur()
2942     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2943 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
2944 mbroquet 3730
2945     //
2946     return false;
2947     }
2948    
2949     // si instructeur commune
2950 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
2951 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
2952     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
2953     || $this->getVal('created_by_commune') !== 't')) {
2954     return false;
2955     }
2956    
2957     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
2958     // que l'événement n'est pas identifié comme non verrouillable
2959     if ($this->f->isUserInstructeur()
2960     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
2961     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
2962    
2963     //
2964     return false;
2965     }
2966    
2967     //
2968     return true;
2969     }
2970    
2971     /**
2972     * CONDITION - is_finalize_without_bypass.
2973     *
2974     * Condition pour afficher le bouton sans le bypass.
2975     *
2976     * @return boolean [description]
2977     */
2978     function is_finalizable_without_bypass() {
2979     // Récupère la valeur du champ finalisé
2980     $om_final_instruction = $this->getVal('om_final_instruction');
2981    
2982     // Si le rapport n'est pas finalisé
2983     if (empty($om_final_instruction)
2984     || $om_final_instruction == 'f') {
2985     //
2986     return true;
2987     }
2988    
2989     //
2990     return false;
2991     }
2992    
2993     /**
2994     * CONDITION - is_unfinalizable.
2995     *
2996     * Condition pour afficher le bouton.
2997     *
2998     * @return boolean
2999     */
3000     function is_unfinalizable(){
3001     // Contrôle si l'utilisateur possède un bypass
3002     $bypass = $this->f->isAccredited(get_class()."_definaliser_bypass");
3003     //
3004     if ($bypass == true) {
3005    
3006     //
3007     return true;
3008     }
3009    
3010     // Si l'utilisateur est un intructeur qui ne correspond pas à la
3011     // division du dossier
3012     if ($this->f->isUserInstructeur()
3013     && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
3014 softime 4667 && $this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === false) {
3015 mbroquet 3730
3016     //
3017     return false;
3018     }
3019    
3020     // si instructeur commune
3021 softime 4667 if($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") === true
3022 mbroquet 3730 && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()
3023     && ($this->f->isInstrCanChangeDecision($this->getVal('dossier')) !== true
3024     || $this->getVal('created_by_commune') !== 't')) {
3025     return false;
3026     }
3027    
3028     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
3029     // que l'événement n'est pas identifié comme non verrouillable
3030     if ($this->f->isUserInstructeur()
3031     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
3032     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
3033    
3034     //
3035     return false;
3036     }
3037    
3038     //
3039     return true;
3040     }
3041    
3042     /**
3043     * CONDITION - is_unfinalizable_without_bypass.
3044     *
3045     * Condition pour afficher le bouton sans le bypass.
3046     *
3047     * @return boolean
3048     */
3049     function is_unfinalizable_without_bypass() {
3050     // Récupère la valeur du champ finalisé
3051     $om_final_instruction = $this->getVal('om_final_instruction');
3052    
3053     // Si l'instruction est finalisée
3054     if ($om_final_instruction == 't') {
3055     //
3056     return true;
3057     }
3058    
3059     //
3060     return false;
3061     }
3062    
3063     /**
3064     * TREATMENT - finalize.
3065     *
3066     * Permet de finaliser un enregistrement.
3067     *
3068     * @param array $val valeurs soumises par le formulaire
3069     *
3070     * @return boolean
3071     */
3072     function finalize($val = array()) {
3073    
3074     // Cette méthode permet d'exécuter une routine en début des méthodes
3075     // dites de TREATMENT.
3076     $this->begin_treatment(__METHOD__);
3077    
3078     // Traitement de la finalisation
3079     $ret = $this->manage_finalizing("finalize", $val);
3080    
3081     // Si le traitement retourne une erreur
3082     if ($ret !== true) {
3083    
3084     // Termine le traitement
3085 softime 5024 return $this->end_treatment(__METHOD__, false);
3086 mbroquet 3730 }
3087    
3088     // Termine le traitement
3089     return $this->end_treatment(__METHOD__, true);
3090     }
3091    
3092     /**
3093     * TREATMENT - unfinalize.
3094     *
3095     * Permet de définaliser un enregistrement.
3096     *
3097     * @param array $val valeurs soumises par le formulaire
3098     *
3099     * @return boolean
3100     */
3101     function unfinalize($val = array()) {
3102    
3103     // Cette méthode permet d'exécuter une routine en début des méthodes
3104     // dites de TREATMENT.
3105     $this->begin_treatment(__METHOD__);
3106    
3107     // Traitement de la finalisation
3108     $ret = $this->manage_finalizing("unfinalize", $val);
3109    
3110     // Si le traitement retourne une erreur
3111     if ($ret !== true) {
3112    
3113     // Termine le traitement
3114 softime 5024 return $this->end_treatment(__METHOD__, false);
3115 mbroquet 3730 }
3116    
3117     // Termine le traitement
3118     return $this->end_treatment(__METHOD__, true);
3119     }
3120    
3121     /**
3122     * VIEW - view_edition
3123     *
3124     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
3125     *
3126     * @return null Si l'action est incorrecte
3127     */
3128     function view_edition() {
3129    
3130     // Si l'instruction est finalisée
3131     if($this->getVal("om_final_instruction") == 't'
3132     && $this->getVal("om_final_instruction") != null) {
3133    
3134     // Ouvre le document
3135     $lien = '../spg/file.php?obj='.$this->table.'&'.
3136     'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
3137     //
3138     header("Location: ".$lien);
3139     } else {
3140    
3141     // Récupère la collectivite du dossier d'instruction
3142     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3143    
3144     //
3145     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3146    
3147     // Paramètre du PDF
3148     $params = array(
3149     "watermark" => true,
3150     "specific" => array(
3151     "mode" => "previsualisation",
3152     ),
3153     );
3154    
3155     // Génération du PDF
3156     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
3157     // Affichage du PDF
3158     $this->expose_pdf_output(
3159     $result['pdf_output'],
3160     $result['filename']
3161     );
3162     }
3163     }
3164    
3165     /**
3166     * Récupère la collectivité du dossier d'instruction.
3167     *
3168     * @return integer
3169     */
3170     function get_dossier_instruction_om_collectivite() {
3171    
3172     //
3173     require_once "../obj/dossier_instruction.class.php";
3174     $dossier_instruction = new dossier_instruction($this->getVal('dossier'), $this->f->db, false);
3175    
3176     //
3177     return $dossier_instruction->getVal('om_collectivite');
3178     }
3179    
3180     /**
3181     * VIEW - view_bible
3182     *
3183     * Affiche la bible manuelle.
3184     *
3185     * @return void
3186     */
3187     function view_bible() {
3188     // Vérification de l'accessibilité sur l'élément
3189     $this->checkAccessibility();
3190    
3191     // XXX APP
3192    
3193     $f = $this->f;
3194    
3195     /**
3196     * Affichage de la structure HTML
3197     */
3198     //
3199     if ($f->isAjaxRequest()) {
3200     //
3201     header("Content-type: text/html; charset=".HTTPCHARSET."");
3202     } else {
3203     //
3204     $f->setFlag("htmlonly");
3205     $f->display();
3206     }
3207     //
3208     $f->displayStartContent();
3209     //
3210     $f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
3211     $f->displayTitle();
3212    
3213     /**
3214     *
3215     */
3216     //
3217     ($f->get_submitted_get_value("ev") ? $evenement = $f->get_submitted_get_value("ev") : $evenement = "");
3218     $evenement = intval($evenement);
3219     //
3220     ($f->get_submitted_get_value("idx") ? $idx = $f->get_submitted_get_value("idx") : $idx = "");
3221     $nature = substr($idx, 0, 2);
3222     //
3223     ($f->get_submitted_get_value("complement") ? $complement = $f->get_submitted_get_value("complement") : $complement = "1");
3224    
3225     // Récupération de la collectivité du dossier
3226     require_once "../obj/dossier.class.php";
3227     $dossier = new dossier($idx, $f->db, DEBUG);
3228    
3229     /**
3230     *
3231     */
3232     //
3233     $sql = "SELECT *, bible.libelle as bible_lib
3234     FROM ".DB_PREFIXE."bible
3235     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
3236     ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
3237     LEFT JOIN ".DB_PREFIXE."om_collectivite
3238     ON bible.om_collectivite = om_collectivite.om_collectivite
3239     WHERE evenement=".$evenement."
3240     AND complement=".$complement."
3241     AND (bible.dossier_autorisation_type IS NULL
3242     OR dossier_autorisation_type.code ='".$nature."')
3243     AND (om_collectivite.niveau = '2'
3244     OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
3245     ORDER BY bible_lib ASC";
3246     $res = $f->db->query($sql);
3247     $f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
3248     $f->isDatabaseError($res);
3249     //
3250     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
3251     //
3252     if ($res->numrows() > 0) {
3253     //
3254     echo "\t<table id='tab-bible' width='100%'>\n";
3255     //
3256     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
3257     echo "<th>"._("Choisir")."</th>";
3258     echo "<th>"._("Libelle")."</th>";
3259     echo "</tr>\n";
3260     //
3261     $i = 0;
3262     //
3263     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3264     //
3265     echo "\t\t<tr";
3266     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
3267     echo ">";
3268     //
3269     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
3270     // XXX utilisation de l'attribut titre pour afficher une infobulle
3271     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
3272     //
3273     echo "</tr>\n";
3274     //
3275     $i++;
3276     }
3277     echo "\t</table>\n";
3278     //
3279     echo "<div class=\"formControls\">\n";
3280     $f->layout->display_form_button(array(
3281     "value" => _("Valider"),
3282     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
3283     ));
3284     $f->displayLinkJsCloseWindow();
3285     echo "</div>\n";
3286    
3287     } else {
3288     //
3289     $message_class = "error";
3290     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
3291     $f->displayMessage($message_class, $message);
3292     //
3293     echo "<div class=\"formControls\">\n";
3294     $f->displayLinkJsCloseWindow();
3295     echo "</div>\n";
3296     }
3297     //
3298     echo "</form>\n";
3299    
3300     /**
3301     * Affichage de la structure HTML
3302     */
3303     //
3304     $f->displayEndContent();
3305     }
3306    
3307     /**
3308     * VIEW - view_bible
3309     *
3310     * Affiche la bible manuelle.
3311     *
3312     * @return void
3313     */
3314     function view_bible_auto() {
3315     // Vérification de l'accessibilité sur l'élément
3316     $this->checkAccessibility();
3317    
3318     // XXX APP
3319    
3320     $f = $this->f;
3321    
3322     //
3323     $f->disableLog();
3324    
3325     $formatDate="AAAA-MM-JJ";
3326    
3327     // Récupération des paramètres
3328     $idx = $f->get_submitted_get_value('idx');
3329     $evenement = $f->get_submitted_get_value('ev');
3330    
3331     // Initialisation de la variable de retour
3332     $retour['complement_om_html'] = '';
3333     $retour['complement2_om_html'] = '';
3334     $retour['complement3_om_html'] = '';
3335     $retour['complement4_om_html'] = '';
3336     // Vérification d'une consultation liée à l'événement
3337     $consultation = $f->db->getOne(
3338     "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
3339     );
3340     $f->isDatabaseError($consultation);
3341     // Si consultation liée, récupération du retour d'avis
3342     if($consultation=='Oui'){
3343     $sql="select date_retour,avis_consultation.libelle as avis_consultation,
3344     service.libelle as service
3345     from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service
3346     on consultation.service =service.service
3347     left join ".DB_PREFIXE."avis_consultation on
3348     consultation.avis_consultation = avis_consultation.avis_consultation
3349     where dossier ='".$idx."'";
3350     $res = $f->db->query($sql);
3351     $f->isDatabaseError($res);
3352     // Récupération des consultations
3353     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3354     $correct=false;
3355     // date retour
3356     if ($row['date_retour']<>""){
3357     if ($formatDate=="AAAA-MM-JJ"){
3358     $date = explode("-", $row['date_retour']);
3359     // controle de date
3360     if (count($date) == 3 and
3361     checkdate($date[1], $date[2], $date[0])) {
3362     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
3363     $correct=true;
3364     }else{
3365     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
3366     $correct=false;
3367     }
3368     }
3369     }
3370     //
3371     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
3372     if($correct == true){
3373     $temp=$temp." du ".$date_retour_f;
3374     }
3375     // Concaténation des retours d'avis de consultation
3376     $retour['complement_om_html'] .= $temp;
3377     } // while
3378    
3379     } // consultation
3380     // Récupération des bibles automatiques pour le champ complement_om_html
3381     $retour['complement_om_html'] .= $this->getBible($f, $evenement, $idx, '1');
3382     // Récupération des bibles automatiques pour le champ complement2_om_html
3383     $retour['complement2_om_html'] .= $this->getBible($f, $evenement, $idx, '2');
3384     // Récupération des bibles automatiques pour le champ complement3_om_html
3385     $retour['complement3_om_html'] .= $this->getBible($f, $evenement, $idx, '3');
3386     // Récupération des bibles automatiques pour le champ complement4_om_html
3387     $retour['complement4_om_html'] .= $this->getBible($f, $evenement, $idx, '4');
3388    
3389    
3390    
3391     echo json_encode($retour);
3392     }
3393    
3394     /**
3395     * Récupération des éléments de bible.
3396     *
3397     * @param utils $f handler de om_application
3398     * @param integer $event id de l'événement
3399     * @param string $idx id du dossier
3400     * @param integer $compnb numéro du champ complement
3401     *
3402     * @return string Chaîne de texte à insérer dans le champ complement
3403     */
3404     function getBible($f, $event, $idx, $compnb) {
3405     // Récupération de la collectivité du dossier
3406     require_once "../obj/dossier.class.php";
3407     $dossier = new dossier($idx, $f->db, DEBUG);
3408     //
3409     $sql = "SELECT * FROM ".DB_PREFIXE."bible
3410     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
3411     ON bible.dossier_autorisation_type=
3412     dossier_autorisation_type.dossier_autorisation_type
3413     LEFT JOIN
3414     ".DB_PREFIXE."om_collectivite
3415     ON bible.om_collectivite = om_collectivite.om_collectivite
3416     WHERE evenement =".$event." and
3417     complement=".$compnb." and
3418     automatique='Oui' and
3419     (dossier_autorisation_type.code ='".substr($idx, 0, 2)."' or
3420     bible.dossier_autorisation_type IS NULL) and
3421     (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
3422    
3423     $res = $f->db->query($sql);
3424     $f->isDatabaseError($res);
3425     $temp = "";
3426     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3427     // Remplacement des retours à la ligne par des br
3428     $temp .= preg_replace(
3429     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
3430     );
3431     } // fin while
3432     return $temp;
3433     }
3434    
3435     /**
3436     * VIEW - view_suivi_bordereaux.
3437     *
3438 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
3439     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
3440     * collectivité des dossiers affichés.
3441 mbroquet 3730 *
3442     * @return void
3443     */
3444     function view_suivi_bordereaux() {
3445     // Vérification de l'accessibilité sur l'élément
3446     $this->checkAccessibility();
3447    
3448     // XXX APP
3449    
3450     $f = $this->f;
3451    
3452     /**
3453     * Validation du formulaire
3454     */
3455     // Si le formulaire a été validé
3456     if ($f->get_submitted_post_value("validation") !== null) {
3457     // Si un bordereau à été sélectionné
3458     if ($f->get_submitted_post_value("bordereau") !== null && $f->get_submitted_post_value("bordereau") == "" ) {
3459     // Si aucun bordereau n'a été sélectionné
3460     $message_class = "error";
3461     $message = _("Veuillez selectionner un bordereau.");
3462     }
3463     // Sinon si les dates ne sont pas valide
3464     elseif (($f->get_submitted_post_value("date_bordereau_debut") !== null
3465     && $f->get_submitted_post_value("date_bordereau_debut") == "")
3466     || ($f->get_submitted_post_value("date_bordereau_fin") !== null
3467     && $f->get_submitted_post_value("date_bordereau_fin") == "")) {
3468     // Si aucune date n'a été saisie
3469     $message_class = "error";
3470     $message = _("Veuillez saisir une date valide.");
3471     }
3472     // Affiche le message de validation
3473     else {
3474     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
3475     $sql = "SELECT om_etat.libelle
3476     FROM ".DB_PREFIXE."om_etat
3477     WHERE om_etat.id = '".$f->get_submitted_post_value("bordereau")."'";
3478     $res = $f->db->getone($sql);
3479     $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
3480     $f->isDatabaseError($res);
3481     //
3482     $message_class = "valid";
3483     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
3484     $message .= " : <br/><br/>";
3485     $message .= "<a class='om-prev-icon pdf-16'";
3486     $message .= " title=\""._("Bordereau")."\"";
3487 nmeucci 4317 $message .= "href='../scr/form.php?obj=instruction";
3488     $message .= "&action=220";
3489     $message .= "&idx=0";
3490     $message .= "&type_bordereau=".$f->get_submitted_post_value("bordereau");
3491     $message .= "&date_bordereau_debut=".$f->get_submitted_post_value("date_bordereau_debut");
3492 mbroquet 3730 $message .= "&date_bordereau_fin=".$f->get_submitted_post_value("date_bordereau_fin");
3493     // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
3494     if ($f->get_submitted_post_value("om_collectivite") !== null) {
3495     $message .= "&collectivite=".$f->get_submitted_post_value("om_collectivite");
3496     }
3497     $message .= "'"." target='_blank'>";
3498     $message .= $res." "._("du")." ".$f->get_submitted_post_value("date_bordereau_debut")
3499     ." "._("au")." ".$f->get_submitted_post_value("date_bordereau_fin");
3500     $message .= "</a>";
3501     }
3502     }
3503    
3504     /**
3505     * Affichage des messages et du formulaire
3506     */
3507     // Affichage du message de validation ou d'erreur
3508     if (isset($message) && isset($message_class) && $message != "") {
3509     $f->displayMessage($message_class, $message);
3510     }
3511     // Inclusion de la classe de gestion des formulaires
3512     require_once "../obj/om_formulaire.class.php";
3513     // Ouverture du formulaire
3514     printf("\t<form");
3515     printf(" method=\"post\"");
3516     printf(" id=\"suivi_bordereaux_form\"");
3517     printf(" action=\"\"");
3518     printf(">\n");
3519     // Paramétrage des champs du formulaire
3520     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
3521     // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
3522     // collectivité dans le formulaire
3523     if($_SESSION["niveau"] == 2) {
3524     array_push($champs, "om_collectivite");
3525     }
3526     // Création d'un nouvel objet de type formulaire
3527     $form = new formulaire(NULL, 0, 0, $champs);
3528     // Paramétrage du champ date_bordereau_debut
3529     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
3530     $form->setType("date_bordereau_debut", "date");
3531     $form->setTaille("date_bordereau_debut", 12);
3532     $form->setMax("date_bordereau_debut", 12);
3533     $form->setRequired("date_bordereau_debut");
3534     $form->setOnchange("date_bordereau_debut", "fdate(this)");
3535     $form->setVal("date_bordereau_debut", date("d/m/Y"));
3536     // Paramétrage du champ date_bordereau_fin
3537     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
3538     $form->setType("date_bordereau_fin", "date");
3539     $form->setTaille("date_bordereau_fin", 12);
3540     $form->setMax("date_bordereau_fin", 12);
3541     $form->setRequired("date_bordereau_fin");
3542     $form->setOnchange("date_bordereau_fin", "fdate(this)");
3543     $form->setVal("date_bordereau_fin", date("d/m/Y"));
3544     // Paramétrage du champ bordereau
3545     $form->setLib("bordereau", _("bordereau"));
3546     $form->setType("bordereau", "select");
3547     $form->setRequired("bordereau");
3548     // Valeurs des champs
3549     if ($f->get_submitted_post_value("validation") !== null) {
3550     $form->setVal("date_bordereau_debut", $f->get_submitted_post_value("date_bordereau_debut"));
3551     $form->setVal("date_bordereau_fin", $f->get_submitted_post_value("date_bordereau_fin"));
3552     $form->setVal("bordereau", $f->get_submitted_post_value("bordereau"));
3553     $form->setVal("om_collectivite", $f->get_submitted_post_value("om_collectivite"));
3554     }
3555     // Données du select - On récupère ici la liste de tous les états disponibles
3556     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
3557     // 'bordereau_'
3558     $sql = "SELECT om_etat.id, om_etat.libelle
3559     FROM ".DB_PREFIXE."om_etat
3560     WHERE om_etat.id LIKE 'bordereau_%'
3561     ORDER BY om_etat.id";
3562     $res = $f->db->query($sql);
3563     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3564     $f->isDatabaseError($res);
3565     // Données du select
3566     $contenu = array(
3567     0 => array("", ),
3568     1 => array(_("choisir bordereau")),
3569     );
3570     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3571     $contenu[0][] = $row['id'];
3572     $contenu[1][] = $row['libelle'];
3573     }
3574     $form->setSelect("bordereau", $contenu);
3575     //
3576     if($_SESSION["niveau"] == 2) {
3577     $form->setLib("om_collectivite", _("collectivite"));
3578     $form->setType("om_collectivite", "select");
3579    
3580     // Données du select - On récupère ici la liste de tous toutes les collectivités
3581     // de niveau 1
3582     $sql = "SELECT om_collectivite, libelle
3583     FROM ".DB_PREFIXE."om_collectivite
3584     WHERE niveau = '1' ORDER BY libelle";
3585     $res = $f->db->query($sql);
3586     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3587     $f->isDatabaseError($res);
3588     // La valeur par défaut du select est Toutes
3589     $list_collectivites = array(
3590     0 => array("", ),
3591     1 => array(_("toutes"))
3592     );
3593    
3594     $id_colls = "";
3595     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
3596     // par des virgules, pour un traitement plus facile dans la requête de sous-état
3597     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3598     if ($id_colls != "") {
3599     $id_colls .= ",";
3600     }
3601     $id_colls .= $row['om_collectivite'];
3602     $list_collectivites[0][] = $row['om_collectivite'];
3603     $list_collectivites[1][] = $row['libelle'];
3604     }
3605     // On affecte la liste d'identifiants à l'option Toutes
3606     $list_collectivites[0][0] = $id_colls ;
3607     $form->setSelect("om_collectivite", $list_collectivites);
3608     }
3609    
3610     // Affichage du formulaire
3611     $form->entete();
3612     $form->afficher($champs, 0, false, false);
3613     $form->enpied();
3614     // Affichage du bouton
3615     printf("\t<div class=\"formControls\">\n");
3616     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
3617     printf("\t</div>\n");
3618     // Fermeture du formulaire
3619     printf("\t</form>\n");
3620    
3621     }
3622    
3623 nmeucci 4317
3624     /**
3625     * VIEW - view_generate_suivi_bordereaux.
3626     *
3627     * Génère et affiche les bordereaux de suivi.
3628     *
3629     * @return [void]
3630     */
3631     function view_generate_suivi_bordereaux() {
3632     // Vérification de l'accessibilité sur l'élément
3633     $this->checkAccessibility();
3634     // Récupération du type de bordereau
3635     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
3636     // Génération du PDF
3637     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
3638     // Affichage du PDF
3639     $this->expose_pdf_output(
3640     $result['pdf_output'],
3641     $result['filename']
3642     );
3643     }
3644    
3645    
3646 mbroquet 3730 /**
3647     * VIEW - view_suivi_envoi_lettre_rar.
3648     *
3649     * Vu pour imprimer les RAR.
3650     *
3651     * @return void
3652     */
3653     function view_suivi_envoi_lettre_rar() {
3654     // Vérification de l'accessibilité sur l'élément
3655     $this->checkAccessibility();
3656    
3657     // XXX APP
3658    
3659     $f = $this->f;
3660    
3661     //
3662     if ($f->get_submitted_post_value("date") !== null) {
3663     $date = $f->get_submitted_post_value("date");
3664     } else {
3665     $date = "";
3666     }
3667     //
3668     if ($f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
3669     $liste_code_barres_instruction = $f->get_submitted_post_value("liste_code_barres_instruction");
3670     } else {
3671     $liste_code_barres_instruction = "";
3672     }
3673    
3674     // Compteur du nombre de page générées
3675     $nbLettres = 0;
3676     // Liste d'id des instructions
3677     $id4Gen = array();
3678     //
3679     $error = "";
3680    
3681     /**
3682     * Validation du formulaire
3683     */
3684     // Si le formulaire a été validé
3685     if ($f->get_submitted_post_value('validation') !== null) {
3686     //
3687     if (empty($date) || empty($liste_code_barres_instruction)) {
3688     //
3689     $message_class = "error";
3690     $message = _("Tous les champs doivent etre remplis.");
3691     } else {
3692     // Création d'un tableau d'instruction
3693     $liste = explode("\r\n", $f->get_submitted_post_value("liste_code_barres_instruction"));
3694     //
3695     foreach ($liste as $code_barres) {
3696     // On enlève les éventuels espaces saisis
3697     $code_barres = trim($code_barres);
3698     // Vérification de l'existence de l'instruction
3699     if ($code_barres != "") {
3700     // Si la valeur transmise est numérique
3701     if (is_numeric($code_barres)) {
3702     //
3703     $sql = "SELECT count(*) FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
3704     $nbInstr = $f->db->getone($sql);
3705     $f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
3706     $f->isDatabaseError($nbInstr);
3707     //
3708     if ($nbInstr == "1") {
3709     // Récupération de la date d'envoi de l'instruction bippé
3710     $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
3711     $res = $f->db->query($sql);
3712     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3713     $f->isDatabaseError($res);
3714     $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
3715     // Si pas de date ou correspond à la date du formulaire on
3716     // effectue le traitement
3717     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
3718    
3719     require_once '../obj/instruction.class.php';
3720    
3721     $instr = new instruction($row['instruction'], $f->db, DEBUG);
3722     $valF = array();
3723     foreach($instr->champs as $id => $champ) {
3724     $valF[$champ] = $instr->val[$id];
3725     }
3726     $valF['date_evenement']=
3727     $instr->dateDBToForm($valF['date_evenement']);
3728     $valF['archive_date_complet']=
3729     $instr->dateDBToForm($valF['archive_date_complet']);
3730     $valF['archive_date_rejet']=
3731     $instr->dateDBToForm($valF['archive_date_rejet']);
3732     $valF['archive_date_limite']=
3733     $instr->dateDBToForm($valF['archive_date_limite']);
3734     $valF['archive_date_notification_delai']=
3735     $instr->dateDBToForm($valF['archive_date_notification_delai']);
3736     $valF['archive_date_decision']=
3737     $instr->dateDBToForm($valF['archive_date_decision']);
3738     $valF['archive_date_validite']=
3739     $instr->dateDBToForm($valF['archive_date_validite']);
3740     $valF['archive_date_achevement']=
3741     $instr->dateDBToForm($valF['archive_date_achevement']);
3742     $valF['archive_date_chantier']=
3743     $instr->dateDBToForm($valF['archive_date_chantier']);
3744     $valF['archive_date_conformite']=
3745     $instr->dateDBToForm($valF['archive_date_conformite']);
3746     $valF['archive_date_dernier_depot']=
3747     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
3748     $valF['archive_date_limite_incompletude']=
3749     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
3750     $valF['date_finalisation_courrier']=
3751     $instr->dateDBToForm($valF['date_finalisation_courrier']);
3752     $valF['date_envoi_signature']=
3753     $instr->dateDBToForm($valF['date_envoi_signature']);
3754     $valF['date_retour_signature']=
3755     $instr->dateDBToForm($valF['date_retour_signature']);
3756     $valF['date_envoi_rar']=
3757     $instr->dateDBToForm($valF['date_envoi_rar']);
3758     $valF['date_retour_rar']=
3759     $instr->dateDBToForm($valF['date_retour_rar']);
3760     $valF['date_envoi_controle_legalite']=
3761     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
3762     $valF['date_retour_controle_legalite']=
3763     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
3764    
3765     $valF['date_envoi_rar'] = $date;
3766    
3767     // Vérification de la finalisation du document
3768     // correspondant au code barres
3769     if($instr->getVal("om_final_instruction") === 't') {
3770     $instr->setParameter('maj', 1);
3771 nmeucci 3971 $instr->class_actions[1]["identifier"] =
3772     "envoi lettre RAR (depuis le menu suivi des pièces)";
3773 mbroquet 3730 if ($instr->modifier($valF, $f->db, DEBUG) == true) {
3774     $id4Gen[] = $code_barres;
3775     $nbLettres ++;
3776     } else {
3777     //
3778     if ($error != "") {
3779     $error .= "<br/>";
3780     }
3781     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
3782     $code_barres);
3783     $error .= " ";
3784     $error .= _("Veuillez contacter votre administrateur.");
3785     }
3786     } else {
3787     //
3788     if ($error != "") {
3789     $error .= "<br/>";
3790     }
3791     $error .= sprintf(_("Le document correspondant au
3792     code barres %s n'est pas finalise,
3793     le bordereau ne sera pas genere."),
3794     $code_barres);
3795     }
3796    
3797     } else {
3798     //
3799     if ($error != "") {
3800     $error .= "<br/>";
3801     }
3802     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
3803     }
3804     } else {
3805     //
3806     if ($error != "") {
3807     $error .= "<br/>";
3808     }
3809     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
3810     }
3811     } else {
3812     //
3813     if ($error != "") {
3814     $error .= "<br/>";
3815     }
3816     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
3817     }
3818     }
3819     }
3820     }
3821     }
3822    
3823     /**
3824     * Affichage des messages et du formulaire
3825     */
3826     // Affichage du message de validation ou d'erreur
3827     if (isset($message) && isset($message_class) && $message != "") {
3828     $f->displayMessage($message_class, $message);
3829     }
3830     // Affichage du message d'erreur
3831     if(!empty($error)) {
3832     $f->displayMessage("error", $error);
3833     }
3834     // Affichage du message de validation de la saisie
3835     if ($nbLettres > 0) {
3836     //
3837     $message_class = "valid";
3838     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre document");
3839     $message .= " : <br/><br/>";
3840     $message .= "<a class='om-prev-icon pdf-16'";
3841     $message .= " title=\""._("imprimer les RAR")."\"";
3842     $message .= " href=\"../scr/form.php?obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
3843     $message .= " target='_blank'>";
3844     $message .= _("Telecharger le document pour")." ".$nbLettres." "._("RAR");
3845     $message .= "</a>";
3846     $f->displayMessage($message_class, $message);
3847     }
3848     // Inclusion de la classe de gestion des formulaires
3849     require_once "../obj/om_formulaire.class.php";
3850     // Ouverture du formulaire
3851     echo "\t<form";
3852     echo " method=\"post\"";
3853     echo " id=\"suivi_envoi_lettre_rar_form\"";
3854     echo " action=\"\"";
3855     echo ">\n";
3856     // Paramétrage des champs du formulaire
3857     $champs = array("date", "liste_code_barres_instruction");
3858     // Création d'un nouvel objet de type formulaire
3859     $form = new formulaire(NULL, 0, 0, $champs);
3860     // Paramétrage du champ date du formulaire
3861     $form->setLib("date", _("Date")."* :");
3862     $form->setType("date", "date");
3863     $form->setOnchange("date", "fdate(this)");
3864     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
3865     $form->setTaille("date", 10);
3866     $form->setMax("date", 10);
3867     // Paramétrage du champ liste_code_barres_instruction du formulaire
3868     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
3869     $form->setType("liste_code_barres_instruction", "textarea");
3870     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
3871     $form->setTaille("liste_code_barres_instruction", 20);
3872     $form->setMax("liste_code_barres_instruction", 20);
3873     // Affichage du formulaire
3874     $form->entete();
3875     $form->afficher($champs, 0, false, false);
3876     $form->enpied();
3877     // Affichage du bouton
3878     echo "\t<div class=\"formControls\">\n";
3879     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
3880     echo "\t</div>\n";
3881     // Fermeture du formulaire
3882     echo "\t</form>\n";
3883     }
3884    
3885     /**
3886     * VIEW - view_suivi_mise_a_jour_des_dates.
3887     *
3888     * Vu pour mettre à jour les dates de suivi de l'instruction.
3889     *
3890     * @return void
3891     */
3892     function view_suivi_mise_a_jour_des_dates() {
3893     // Vérification de l'accessibilité sur l'élément
3894     $this->checkAccessibility();
3895    
3896     // XXX APP
3897    
3898     $f = $this->f;
3899    
3900     // Récupération des valeur passées en POST ou GET
3901     if($f->get_submitted_post_value("type_mise_a_jour") !== null) {
3902     $type_mise_a_jour = $f->get_submitted_post_value("type_mise_a_jour");
3903     } elseif($f->get_submitted_get_value('type_mise_a_jour') !== null) {
3904     $type_mise_a_jour = $f->get_submitted_get_value('type_mise_a_jour');
3905     } else {
3906     $type_mise_a_jour = "";
3907     }
3908     if($f->get_submitted_post_value('date') !== null) {
3909     $date = $f->get_submitted_post_value('date');
3910     } elseif($f->get_submitted_get_value('date') !== null) {
3911     $date = $f->get_submitted_get_value('date');
3912     } else {
3913     $date = "";
3914     }
3915     if($f->get_submitted_post_value('code_barres') !== null) {
3916     $code_barres = $f->get_submitted_post_value('code_barres');
3917     } elseif($f->get_submitted_get_value('code_barres') !== null) {
3918     $code_barres = $f->get_submitted_get_value('code_barres');
3919     } else {
3920     $code_barres = "";
3921     }
3922     // Booléen permettant de définir si un enregistrement à eu lieu
3923     $correct = false;
3924     // Booléen permettant de définir si les dates peuvent êtres enregistrées
3925     $date_error = false;
3926     // Champs date à mettre à jour
3927     $liste_champs=array();
3928    
3929     // Si le formulaire a été validé
3930     if ($f->get_submitted_post_value('validation') !== null) {
3931     if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
3932    
3933     //Vérification de l'existance de l'instruction
3934     $sql = "SELECT instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
3935     $res = $f->db->query($sql);
3936     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
3937     $f->isDatabaseError($res);
3938    
3939     if($res->numrows() == 1) {
3940     $liste_champs = explode(";", $type_mise_a_jour);
3941     // Mise à jour des dates après l'écran de verification
3942     if($f->get_submitted_post_value('is_valid') !== null and $f->get_submitted_post_value('is_valid') == "true") {
3943     require_once '../obj/instruction.class.php';
3944     $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
3945     $instr = new instruction($row['instruction'], $f->db, DEBUG);
3946     $valF = array();
3947     foreach($instr->champs as $id => $champ) {
3948     $valF[$champ] = $instr->val[$id];
3949     }
3950     $valF['date_evenement']=$instr->dateDBToForm($valF['date_evenement']);
3951     $valF['archive_date_complet']=$instr->dateDBToForm($valF['archive_date_complet']);
3952     $valF['archive_date_rejet']=$instr->dateDBToForm($valF['archive_date_rejet']);
3953     $valF['archive_date_limite']=$instr->dateDBToForm($valF['archive_date_limite']);
3954     $valF['archive_date_notification_delai']=$instr->dateDBToForm($valF['archive_date_notification_delai']);
3955     $valF['archive_date_decision']=$instr->dateDBToForm($valF['archive_date_decision']);
3956     $valF['archive_date_validite']=$instr->dateDBToForm($valF['archive_date_validite']);
3957     $valF['archive_date_achevement']=$instr->dateDBToForm($valF['archive_date_achevement']);
3958     $valF['archive_date_chantier']=$instr->dateDBToForm($valF['archive_date_chantier']);
3959     $valF['archive_date_conformite']=$instr->dateDBToForm($valF['archive_date_conformite']);
3960     $valF['archive_date_dernier_depot']=$instr->dateDBToForm($valF['archive_date_dernier_depot']);
3961     $valF['archive_date_limite_incompletude']=$instr->dateDBToForm($valF['archive_date_limite_incompletude']);
3962     $valF['date_finalisation_courrier']=$instr->dateDBToForm($valF['date_finalisation_courrier']);
3963     $valF['date_envoi_signature']=$instr->dateDBToForm($valF['date_envoi_signature']);
3964     $valF['date_retour_signature']=$instr->dateDBToForm($valF['date_retour_signature']);
3965     $valF['date_envoi_rar']=$instr->dateDBToForm($valF['date_envoi_rar']);
3966     $valF['date_retour_rar']=$instr->dateDBToForm($valF['date_retour_rar']);
3967     $valF['date_envoi_controle_legalite']=$instr->dateDBToForm($valF['date_envoi_controle_legalite']);
3968     $valF['date_retour_controle_legalite']=$instr->dateDBToForm($valF['date_retour_controle_legalite']);
3969    
3970     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
3971     $valF[$maj_date]=$date;
3972     }
3973    
3974     // Vérification de la finalisation du document
3975     // correspondant au code barres
3976     if($valF["om_final_instruction"] === 't' or
3977     $valF["lettretype"] == '') {
3978     $code_barres = "";
3979    
3980     //Désactivation de l'autocommit
3981     $f->db->autoCommit(false);
3982    
3983     //On modifie les valeurs de l'instruction
3984     $instr->setParameter('maj', 170);
3985 nmeucci 3965 $instr->class_actions[170]["identifier"] =
3986 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
3987 mbroquet 3730 $retour = $instr->modifier($valF, $f->db, DEBUG);
3988    
3989     //Si une erreur s'est produite, on défait les modifications
3990     //qui ont été faites
3991     if (!$retour){
3992     $instr->undoValidation();
3993     }
3994     //Sinon, on valide en base de données les modifications
3995     else {
3996     $f->db->commit();
3997     }
3998    
3999     // Variable correct retourné depuis la classe instruction
4000     $correct = $instr->correct;
4001    
4002     // Si la modification sur l'instruction a échoué
4003     if ($correct === false) {
4004    
4005     // Message d'erreur de la classe instruction
4006     $error = $instr->msg;
4007     }
4008    
4009     } else {
4010     // Indique que le traitement est en erreur
4011     $correct = false;
4012     // Message d'erreur
4013     $error = sprintf(_("Le document n'est pas finalise."),
4014     "<span class='bold'>".$code_barres."</span>");
4015     }
4016     } else {
4017     // Récupération des infos du dossier
4018     $sqlInfo = "SELECT dossier.dossier_libelle,
4019     evenement.libelle as evenement,
4020     autorite_competente.code as autorite_competente_code,
4021     autorite_competente.libelle as autorite_competente,
4022     evenement.type as evenement_type,
4023     to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
4024     to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
4025     to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
4026     to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
4027     to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
4028     to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
4029     FROM ".DB_PREFIXE."instruction
4030     INNER JOIN ".DB_PREFIXE."dossier ON
4031     dossier.dossier=instruction.dossier
4032     LEFT JOIN ".DB_PREFIXE."autorite_competente ON
4033     dossier.autorite_competente=autorite_competente.autorite_competente
4034     INNER JOIN ".DB_PREFIXE."evenement ON
4035     instruction.evenement=evenement.evenement
4036     WHERE code_barres='".$code_barres."'";
4037     $resInfo = $f->db->query($sqlInfo);
4038     $f->isDatabaseError($resInfo);
4039     $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
4040    
4041     // Vérification de la non modification des dates de suivi
4042     foreach(explode(";", $type_mise_a_jour) as $champ) {
4043     if($infos[$champ] != "" AND $infos[$champ] != $date) {
4044     $error = _("Les dates de suivis ne peuvent etre modifiees");
4045     $date_error = true;
4046     }
4047     }
4048     }
4049     } else {
4050     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
4051     }
4052    
4053     } else {
4054     $error = _("Tous les champs doivent etre remplis.");
4055     }
4056     }
4057    
4058     /**
4059     * Affichage des messages et du formulaire
4060     */
4061     // Affichage du message de validation ou d'erreur
4062     if (isset($message) && isset($message_class) && $message != "") {
4063     $f->displayMessage($message_class, $message);
4064     }
4065     // Affichage du message d'erreur
4066     if(!empty($error)) {
4067     $f->displayMessage("error", $error);
4068     }
4069    
4070     // Affichage du message de validation de la saisie
4071     if($correct === true) {
4072     $f->displayMessage("ok", _("Saisie enregistree"));
4073     }
4074     // Inclusion de la classe de gestion des formulaires
4075     require_once "../obj/om_formulaire.class.php";
4076     // Ouverture du formulaire
4077     echo "\t<form";
4078     echo " method=\"post\"";
4079     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
4080     echo " action=\"\"";
4081     echo ">\n";
4082     // Paramétrage des champs du formulaire
4083     if(isset($infos)) {
4084     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
4085     , "autorite_competente", "date_envoi_signature",
4086     "date_retour_signature", "date_envoi_controle_legalite",
4087     "date_retour_controle_legalite", "date_envoi_rar",
4088     "date_retour_rar", "is_valid");
4089     } else {
4090     $champs = array("type_mise_a_jour", "date", "code_barres");
4091     }
4092     // Création d'un nouvel objet de type formulaire
4093     $form = new formulaire(NULL, 0, 0, $champs);
4094     // Paramétrage des champs du formulaire
4095     // Parametrage du champ type_mise_a_jour
4096     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
4097     if(isset($infos)) {
4098     $form->setType("type_mise_a_jour", "selecthiddenstatic");
4099    
4100     } else {
4101     $form->setType("type_mise_a_jour", "select");
4102    
4103     }
4104     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
4105     $contenu = array();
4106    
4107     $contenu[0][0] = "date_envoi_signature";
4108     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
4109    
4110     $contenu[0][1] = "date_retour_signature";
4111     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
4112    
4113     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
4114     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
4115    
4116     $contenu[0][3] = "date_envoi_controle_legalite";
4117     $contenu[1][3] = _("date d'envoi au controle de legalite");
4118    
4119     $contenu[0][4] = "date_retour_controle_legalite";
4120     $contenu[1][4] = _("date de retour de controle de legalite");
4121    
4122     $contenu[0][5] = "date_retour_rar";
4123     $contenu[1][5] = _("date de retour de l'AR");
4124    
4125     $form->setSelect("type_mise_a_jour", $contenu);
4126    
4127     // Parametrage du champ date
4128     $form->setLib("date", _("Date")."* :");
4129     if(isset($infos)) {
4130     $form->setType("date", "hiddenstaticdate");
4131    
4132     } else {
4133     $form->setType("date", "date");
4134     }
4135     $form->setVal("date", $date);
4136     $form->setTaille("date", 10);
4137     $form->setMax("date", 10);
4138    
4139     // Parametrage du champ code_barres
4140     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
4141     if(isset($infos)) {
4142     $form->setType("code_barres", "hiddenstatic");
4143     } else {
4144     $form->setType("code_barres", "text");
4145     }
4146     $form->setVal("code_barres", $code_barres);
4147     $form->setTaille("code_barres", 20);
4148     $form->setMax("code_barres", 20);
4149    
4150     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
4151     if(isset($infos)) {
4152    
4153     // Tous les champs sont défini par defaut à static
4154     foreach ($infos as $key => $value) {
4155     $form->setType($key, "static");
4156     if(in_array($key, $liste_champs)) {
4157     $form->setVal($key, $date);
4158     } else {
4159     $form->setVal($key, $value);
4160     }
4161     }
4162    
4163     // Les champs dont on viens de définir la valeur sont en gras
4164     foreach ($liste_champs as $value) {
4165     $form->setBloc($value,'DF',"",'bold');
4166     }
4167    
4168     // Parametrage du champ dossier
4169     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
4170     $form->setType("dossier_libelle", "static");
4171     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
4172    
4173     // Parametrage du champ evenement
4174     $form->setLib("evenement", _("evenement")." :");
4175     $form->setType("evenement", "static");
4176     $form->setVal("evenement", $infos['evenement']);
4177    
4178     // Parametrage du champ autorite_competente
4179     $form->setLib("autorite_competente", _("Autorite competente")." :");
4180     $form->setType("autorite_competente", "static");
4181     $form->setVal("autorite_competente", $infos['autorite_competente']);
4182    
4183     // Parametrage des libellés d'envoi avec RAR
4184     $form->setLib("date_envoi_rar", _("date_envoi_rar")." :");
4185     $form->setLib("date_retour_rar", _("date_retour_rar")." :");
4186    
4187     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
4188     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
4189     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
4190     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
4191     // Configuration des libellé en fonction de l'autorité compétente
4192     if($infos['autorite_competente_code'] == 'ETAT') {
4193     $form->setType("date_envoi_controle_legalite", "hiddendate");
4194     $form->setType("date_retour_controle_legalite", "hiddendate");
4195     }
4196    
4197     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
4198     $form->setLib("is_valid", _("Valide")." :");
4199     $form->setType("is_valid", "hidden");
4200     $form->setVal("is_valid", 'true');
4201    
4202     $form->setFieldset('dossier_libelle','D',_('Synthese'));
4203     $form->setFieldset('is_valid','F');
4204    
4205     }
4206    
4207    
4208     // Création du fieldset regroupant les champs permettant la mise à jour des date
4209     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
4210     $form->setFieldset('code_barres','F');
4211     // Affichage du formulaire
4212     $form->entete();
4213     $form->afficher($champs, 0, false, false);
4214     $form->enpied();
4215     // Affichage du bouton
4216     echo "\t<div class=\"formControls\">\n";
4217     //
4218     if(!$date_error) {
4219     $f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
4220     }
4221     // Si pas sur l'écran de validation
4222     if(isset($infos)) {
4223     echo "<a class=\"retour\" href=\"../scr/form.php?obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
4224     echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
4225     echo "\">Retour</a>";
4226     }
4227     echo "\t</div>\n";
4228     // Fermeture du formulaire
4229     echo "\t</form>\n";
4230     }
4231    
4232     /**
4233     * [view_pdf_lettre_rar description]
4234     *
4235     * @return [type] [description]
4236     */
4237     function view_pdf_lettre_rar() {
4238     // Vérification de l'accessibilité sur l'élément
4239     $this->checkAccessibility();
4240    
4241     // XXX APP
4242    
4243     $f = $this->f;
4244    
4245     $f->disableLog();
4246    
4247     if($f->get_submitted_get_value('liste') != null) {
4248     $listeCodeBarres = explode(',',$f->get_submitted_get_value('liste'));
4249    
4250     // Classe permettant la mise en page de l'édition pdf
4251     require_once "../obj/pdf_lettre_rar.class.php";
4252     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
4253     // Initialisation de la mise en page
4254     $pdf_lettre_rar->init($f);
4255    
4256     foreach ($listeCodeBarres as $code_barres) {
4257    
4258     // Test si l'evenement est de type arrete et si un délégataire a été nommé
4259     $sql = "SELECT
4260     dossier.dossier_libelle,
4261     evenement.type,
4262 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
4263     CASE
4264     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
4265     THEN CONCAT(phase.code, ' - ', division.libelle)
4266     ELSE
4267     phase.code
4268     END AS code_phase
4269 mbroquet 3730 FROM ".DB_PREFIXE."instruction
4270     LEFT JOIN ".DB_PREFIXE."dossier
4271     ON instruction.dossier = dossier.dossier
4272 softime 3834 LEFT JOIN ".DB_PREFIXE."division
4273     ON dossier.division = division.division
4274 mbroquet 3730 INNER JOIN ".DB_PREFIXE."evenement ON
4275 softime 3834 instruction.evenement=evenement.evenement
4276     LEFT JOIN ".DB_PREFIXE."phase
4277     ON evenement.phase = phase.phase
4278 mbroquet 3730 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
4279     instruction.dossier=lien_dossier_demandeur.dossier
4280     inner join ".DB_PREFIXE."demandeur on
4281     demandeur.demandeur=lien_dossier_demandeur.demandeur
4282     WHERE code_barres='".$code_barres."'
4283     AND ((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire')
4284     OR demandeur.type_demandeur='delegataire')
4285 softime 3834 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
4286 mbroquet 3730
4287     $res = $f->db->query($sql);
4288     $f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
4289     $f->isDatabaseError($res);
4290     $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
4291    
4292    
4293     // Recuperation de l'adresse de destination
4294     $sqlAdresse = "SELECT
4295     CASE WHEN demandeur.qualite='particulier'
4296     THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
4297     ELSE TRIM(demandeur.personne_morale_denomination)
4298     END as ligne1,
4299     CASE WHEN demandeur.qualite='personne_morale'
4300     THEN TRIM(demandeur.personne_morale_raison_sociale)
4301     ELSE ''
4302     END as ligne1_1,
4303     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
4304     THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
4305     ELSE ''
4306     END as ligne1_2,
4307     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
4308     CASE demandeur.complement
4309     WHEN null THEN ''
4310     ELSE trim(demandeur.complement)
4311     END as ligne3,
4312     CASE demandeur.lieu_dit
4313     WHEN null THEN ''
4314     ELSE trim(demandeur.lieu_dit)
4315     END as ligne4,
4316     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
4317     (CASE WHEN demandeur.bp IS NOT NULL
4318     THEN CONCAT_WS(' ', 'BP', demandeur.bp)
4319     ELSE ''
4320     END),
4321     (CASE WHEN demandeur.cedex IS NOT NULL
4322     THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
4323     ELSE ''
4324     END))
4325     as ligne5,
4326     code_barres as code_barres
4327     FROM ".DB_PREFIXE."instruction
4328     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
4329     INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
4330     INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
4331     LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
4332     WHERE instruction.code_barres ='".$code_barres."'";
4333    
4334     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
4335     if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
4336     $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
4337     } else {
4338     $sqlAdresse .= " AND lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire'";
4339     }
4340    
4341     $resAdresse = $f->db->query($sqlAdresse);
4342     $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
4343     $f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
4344     $f->isDatabaseError($resAdresse);
4345    
4346     // Création adresse destinataire sans ligne vide
4347     $adresse_destinataire = array();
4348     if (!empty($adresse_dest['ligne1'])) {
4349     $adresse_destinataire[] = $adresse_dest['ligne1'];
4350     }
4351     if (!empty($adresse_dest['ligne1_1'])) {
4352     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
4353     }
4354     if (!empty($adresse_dest['ligne1_2'])) {
4355     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
4356     }
4357     $adresse_destinataire[] = $adresse_dest['ligne2'];
4358     if (!empty($adresse_dest['ligne3'])) {
4359     $adresse_destinataire[] = $adresse_dest['ligne3'];
4360     }
4361     if (!empty($adresse_dest['ligne4'])) {
4362     $adresse_destinataire[] = $adresse_dest['ligne4'];
4363     }
4364     $adresse_destinataire[] = $adresse_dest['ligne5'];
4365    
4366     // Création du champ specifique
4367     $specifique_content = array();
4368     $specifique_content[] = $adresse_dest['ligne1'];
4369     $specifique_content[] = $adresse_dest['ligne1_1'];
4370     $specifique_content[] = $adresse_dest['ligne1_2'];
4371     $specifique_content[] = $testDemandeur['dossier_libelle'];
4372     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
4373     unset($adresse_dest['code_barres']);
4374    
4375     // Ajout d'une page aux pdf
4376 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
4377 mbroquet 3730
4378     }
4379     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
4380     require_once PATH_OPENMAIRIE."om_edition.class.php";
4381     $om_edition = new edition();
4382     $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
4383     }
4384     }
4385    
4386     /**
4387     * VIEW - view_bordereau_envoi_maire.
4388     *
4389     * Formulaire demandant :
4390     * - le code-barres de l'événement d'instruction
4391     * - la date d'envoi du courrier pour signature par le maire
4392     *
4393     * Lors de la validation :
4394     * => met à jour cette date dans l'événement d'instruction
4395     * => crée un lien permettant de générer en PDF le bordereau
4396     *
4397     * @return void
4398     */
4399     function view_bordereau_envoi_maire() {
4400     // Vérification de l'accessibilité sur l'élément
4401     $this->checkAccessibility();
4402    
4403     // Récupération des valeur passées en POST ou GET
4404     $code_barres = "";
4405     if($this->f->get_submitted_post_value('code_barres') !== null) {
4406     $code_barres = $this->f->get_submitted_post_value('code_barres');
4407     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
4408     $code_barres = $this->f->get_submitted_get_value('code_barres');
4409     }
4410     $date = "";
4411     if($this->f->get_submitted_post_value('date') !== null) {
4412     $date = $this->f->get_submitted_post_value('date');
4413     } elseif($this->f->get_submitted_get_value('date') !== null) {
4414     $date = $this->f->get_submitted_get_value('date');
4415     }
4416     $validation = 0;
4417     if($this->f->get_submitted_post_value('validation') !== null) {
4418     $validation = $this->f->get_submitted_post_value('validation');
4419     } elseif($this->f->get_submitted_get_value('validation') !== null) {
4420     $validation = $this->f->get_submitted_get_value('validation');
4421     }
4422    
4423     // Si le formulaire a été validé
4424     if ($this->f->get_submitted_post_value('validation') !== null) {
4425     // Tous les champs doivent obligatoirement être remplis
4426     if (!empty($date) && !empty($code_barres)) {
4427     $date_en = $this->dateDB($date);
4428     // Si date valide
4429     if ($date_en != "") {
4430     $id_instruction = $this->get_instruction_by_barcode($code_barres);
4431     // Si un événement d'instruction a été trouvé pour ce code-barres
4432     if ($id_instruction !== null) {
4433     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
4434     // Si mise à jour réussie de la date d'envoi du courrier
4435     // pour signature par l'autorité compétente
4436     if($ret === true) {
4437     // Message de validation avec lien PDF
4438     $message_class = "valid";
4439     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
4440     $message .= " : <br/><br/>";
4441     $message .= "<a class='om-prev-icon pdf-16'";
4442     $message .= " id=\"generer_bordereau_envoi_maire\"";
4443     $message .= " title=\""._("Bordereau")."\"";
4444     $message .= " href='../scr/form.php?obj=instruction";
4445     $message .= "&action=200";
4446     $message .= "&idx=".$id_instruction."'";
4447     $message .= " target='_blank'>";
4448     $message .= _("Bordereau d'envoi au maire");
4449     $message .= "</a><br/><br/>";
4450     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
4451     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
4452     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
4453    
4454     } else {
4455     // Message d'erreur
4456     $message_class = "error";
4457     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
4458     $code_barres);
4459     }
4460     }
4461     else {
4462     $message_class = "error";
4463     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
4464     }
4465     }
4466     else {
4467     $message_class = "error";
4468     $message = _("La date est invalide.");
4469     }
4470     } else {
4471     $message_class = "error";
4472     $message = _("Tous les champs doivent etre remplis.");
4473     }
4474     }
4475    
4476     /**
4477     * Affichage des messages et du formulaire
4478     */
4479    
4480     // Affichage du message de validation ou d'erreur
4481     if (isset($message) && isset($message_class) && $message != "") {
4482     $this->f->displayMessage($message_class, $message);
4483     }
4484    
4485     // Inclusion de la classe de gestion des formulaires
4486     require_once "../obj/om_formulaire.class.php";
4487     // Ouverture du formulaire
4488     $datasubmit = $this->getDataSubmit();
4489     echo "\n<!-- ########## START DBFORM ########## -->\n";
4490     echo "<form";
4491     echo " id=\"bordereau_envoi_maire\"";
4492     echo " method=\"post\"";
4493     echo " name=\"f1\"";
4494     echo " action=\"";
4495     echo $datasubmit;
4496     echo "\"";
4497     echo ">\n";
4498    
4499     // Paramétrage des champs du formulaire
4500     $champs = array("code_barres","date");
4501    
4502     // Création d'un nouvel objet de type formulaire
4503     $form = new formulaire(NULL, 0, 0, $champs);
4504    
4505     $template_required_label = '%s *';
4506     // Parametrage du champ code_barres
4507     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
4508     $form->setType("code_barres", "text");
4509     $form->setVal("code_barres", $code_barres);
4510     $form->setTaille("code_barres", 20);
4511     $form->setMax("code_barres", 20);
4512     // Parametrage du champ date
4513     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
4514     $form->setType("date", "date") ;
4515     if (empty($date)) {
4516     $date = date('d/m/Y');
4517     }
4518     $form->setVal("date", $date);
4519     $form->setTaille("date", 10);
4520     $form->setMax("date", 10);
4521    
4522     // Création du bloc regroupant les champs
4523     $form->setBloc('code_barres','D');
4524     $form->setBloc('date','F');
4525     // Affichage du formulaire
4526     $form->entete();
4527     $form->afficher($champs, 0, false, false);
4528     $form->enpied();
4529     // Affichage du bouton
4530     printf("\t<div class=\"formControls\">\n");
4531     //
4532     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
4533     printf("\t</div>\n");
4534     // Fermeture du formulaire
4535     printf("\t</form>\n");
4536     }
4537    
4538     /**
4539     * VIEW - view_bordereau_envoi_maire.
4540     *
4541     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
4542     *
4543     * @return [void]
4544     */
4545     function view_generate_bordereau_envoi_maire() {
4546     // Vérification de l'accessibilité sur l'élément
4547     $this->checkAccessibility();
4548     // Récupération de la collectivité du dossier d'instruction
4549     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
4550     // Récupération de ses paramètres
4551     $collectivite = $this->f->getCollectivite($collectivite_di);
4552     // Génération du PDF
4553     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
4554     // Affichage du PDF
4555     $this->expose_pdf_output(
4556     $result['pdf_output'],
4557     $result['filename']
4558     );
4559     }
4560    
4561     /**
4562     * Retourne l'événement d'instruction dont on donne le code-barres
4563     *
4564     * @param [string] $barcode numéro du code-barres
4565     * @return [mixed] ID de son instruction ou null si aucun code
4566     */
4567     function get_instruction_by_barcode($barcode) {
4568     // Begin
4569     $this->begin_treatment(__METHOD__);
4570     // Vérification de l'existence de l'événement d'instruction
4571     // pour le code-barres donné
4572     $sql = "SELECT instruction
4573     FROM ".DB_PREFIXE."instruction
4574     WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
4575     $res = $this->f->db->getOne($sql);
4576     $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
4577     $this->f->isDatabaseError($res);
4578     // Retourne résultat
4579     return $this->end_treatment(__METHOD__, $res);
4580     }
4581    
4582     /**
4583     * Met à jour le champ date d'envoi signature
4584     * avec la date fournie et pour l'instruction donnée
4585     *
4586     * @param [string] $id ID de l'événement d'instruction
4587     * @param [string] $date date au format EN
4588     * @return [boolean] true si mise à jour avec succès
4589     */
4590     function update_date_envoi_signature($id, $date) {
4591     // Préparation du tableau
4592     $valF = array();
4593     $valF['date_envoi_signature'] = $date;
4594     // Begin
4595     $this->begin_treatment(__METHOD__);
4596     // Requête
4597     $res = $this->db->autoExecute(
4598     DB_PREFIXE.$this->table,
4599     $valF,
4600     DB_AUTOQUERY_UPDATE,
4601     $this->getCle($id)
4602     );
4603     // S'il y a eu une erreur
4604     if (database::isError($res, true)) {
4605     $this->end_treatment(__METHOD__, false);
4606     }
4607     //
4608     return $this->end_treatment(__METHOD__, true);
4609     }
4610    
4611     /**
4612     * Méthode permettant de définir des valeurs à envoyer en base après
4613     * validation du formulaire d'ajout.
4614     * @param array $val tableau des valeurs retournées par le formulaire
4615     */
4616     function setValFAjout($val) {
4617     // Mise à jour du flag created_by_commune lors d'un changement de décision
4618     // par un utilisateur de commune sur un dossier instruit par la comcom
4619     if($this->f->isInstrCanChangeDecision($this->valF["dossier"])) {
4620     $this->valF['created_by_commune'] = true;
4621     }
4622     }
4623 nmeucci 3876
4624     /**
4625 fmichon 3892 * Récupère l'instance du dossier d'instruction
4626     *
4627     * @param mixed Identifiant du dossier d'instruction
4628     *
4629     * @return object
4630     */
4631     function get_inst_dossier($dossier = null) {
4632     //
4633     return $this->get_inst_common("dossier", $dossier);
4634     }
4635    
4636 fmichon 4708 /**
4637     * Récupère l'instance d'un événement de workflow.
4638     *
4639     * @param mixed $evenement Identifiant de l'événement.
4640     *
4641     * @return object
4642     */
4643     function get_inst_evenement($evenement = null) {
4644     //
4645     return $this->get_inst_common("evenement", $evenement);
4646     }
4647 softime 3976
4648 fmichon 3892 /**
4649 softime 3976 * Logue l'action de l'instruction dans son DI.
4650 nmeucci 3933 *
4651 softime 3976 * @param string $id Clé primaire de l'instruction.
4652     * @param array $val Valeurs de l'instruction.
4653     *
4654     * @return bool Vrai si traitement effectué avec succès
4655 nmeucci 3876 */
4656 softime 3976 private function add_log_to_dossier($id, array $val) {
4657 nmeucci 3933 $maj = $this->getParameter("maj");
4658 nmeucci 3943 // Action = Trace par défaut
4659     $action = $this->get_backtrace();
4660     // Action = Identifant de l'action si contexte connu
4661     if (empty($maj) === false
4662     || (empty($maj) === true && $maj === 0)) {
4663     $action = $this->get_action_param($maj, 'identifier');
4664 nmeucci 3965 if ($action === 'modifier_suivi') {
4665     $action = "modifier (via l'action suivi des dates)";
4666     }
4667 nmeucci 4108 if ($action === 'notifier_commune'
4668     && isset($val['mails_destinataires']) === true) {
4669     $action = "notification de la commune (courriels : ";
4670     $action .= $val['mails_destinataires'].")";
4671     }
4672 nmeucci 3943 }
4673 nmeucci 3876 // Création du log
4674     $log = array(
4675     'date' => date('Y-m-d H:i:s'),
4676     'user' => $_SESSION['login'],
4677     'action' => $action,
4678     'values' => array(
4679     'date_evenement' => $this->dateDB($val['date_evenement']),
4680     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
4681     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
4682     'evenement' => $val['evenement'],
4683     'action' => $val['action'],
4684 nmeucci 3963 'instruction' => $id,
4685 nmeucci 3876 'etat' => $val['etat'],
4686     ),
4687     );
4688     // Ajout du log
4689 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
4690 nmeucci 3876 $ret = $di->add_log_instructions($log);
4691     if ($ret === false) {
4692     $this->correct = false;
4693     $this->msg = '';
4694     $this->addToMessage($di->msg);
4695     }
4696     return $ret;
4697     }
4698 nmeucci 3943
4699 softime 3976
4700 nmeucci 3943 /**
4701 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
4702 nmeucci 3943 *
4703 softime 3976 * @return string Une ligne par trace
4704 nmeucci 3943 */
4705     private function get_backtrace() {
4706     $trace = debug_backtrace();
4707 nmeucci 3957 $backtrace = '';
4708     $i = 1;
4709 nmeucci 3943 foreach ($trace as $key => $value) {
4710 nmeucci 3957 $func = $trace[$key]['function'];
4711     // On ne s'autolog pas
4712     if ($func === 'get_backtrace'
4713     || $func === 'add_log_to_dossier') {
4714     continue;
4715     }
4716     $backtrace .= $i.') ';
4717     // Si dans une classe
4718     if (isset($trace[$key]['class']) === true
4719     && empty($trace[$key]['class']) === false) {
4720 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
4721 nmeucci 3957 }
4722     // Si procédural
4723     else {
4724     $file = $trace[$key]['file'];
4725 nmeucci 3963 $line = $trace[$key]['line'];
4726 softime 3976 $truncated_file = $this->f->get_relative_path($file);
4727 nmeucci 3963 if ($truncated_file !== false) {
4728     $file = $truncated_file;
4729     }
4730     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
4731 nmeucci 3957 }
4732     $backtrace .= '<br/>';
4733     $i++;
4734 nmeucci 3943 }
4735 nmeucci 3957 return $backtrace;
4736 nmeucci 3943 }
4737 nmeucci 3963
4738 nmeucci 4108 /**
4739     * CONDITION - is_notifiable.
4740     *
4741     * Condition pour afficher l'action notifier_commune.
4742     *
4743     * @return boolean
4744     */
4745     public function is_notifiable() {
4746     // L'instruction doit être finalisée, ce qui revient à dire
4747     // définalisable sans bypass
4748     if ($this->is_unfinalizable_without_bypass() === false) {
4749     return false;
4750     }
4751     // La collectivité de l'utilisateur doit être de niveau multi
4752     if ($this->f->has_collectivite_multi() === false) {
4753     return false;
4754     }
4755     // Le paramètre multi de l'objet du courriel doit exister
4756     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
4757     return false;
4758     }
4759     // Le paramètre multi du modèle du courriel doit exister
4760     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
4761     return false;
4762     }
4763     // A ce stade toutes les conditions sont satisfaites
4764     return true;
4765     }
4766 nmeucci 3963
4767 nmeucci 4108 /**
4768     * TREATMENT - notifier_commune.
4769     *
4770     * Notifie aux communes et par courriel la finalisation d'une instruction.
4771     *
4772     * @return boolean
4773     */
4774     public function notifier_commune() {
4775     // Cette méthode permet d'exécuter une routine en début des méthodes
4776     // dites de TREATMENT.
4777     $this->begin_treatment(__METHOD__);
4778     // Définition des paramètres
4779     $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';
4780     $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';
4781     $p_courriel = 'param_courriel_de_notification_commune';
4782     // Définition des variables de substitution
4783     $id_di = $this->getVal('dossier');
4784     $id_inst = $this->getVal($this->clePrimaire);
4785     // Instanciation du DI
4786     $di = $this->get_inst_dossier($id_di);
4787     // Récupération du paramétrage de la collectivité du dossier
4788     $collectivite_di = $di->getVal('om_collectivite');
4789     $params_mono = $this->f->getCollectivite($collectivite_di);
4790     // Récupération du paramétrage de la collectivité multi
4791     $collectivite_multi = $this->f->get_idx_collectivite_multi();
4792     $params_multi = $this->f->getCollectivite($collectivite_multi);
4793     // Vérification de l'objet (obligatoirement multi)
4794     $objet = null;
4795     if (isset($params_multi[$p_objet]) === true
4796     && $params_multi[$p_objet] !== '') {
4797     $objet = $params_multi[$p_objet];
4798     }
4799     // Vérification du modèle mono en priorité
4800     $modele = null;
4801     if (isset($params_mono[$p_modele]) === true
4802     && $params_mono[$p_modele] !== '') {
4803     $modele = $params_mono[$p_modele];
4804    
4805     }
4806     // Sinon vérification du modèle multi
4807     if ($modele === null
4808     && isset($params_multi[$p_modele]) === true
4809     && $params_multi[$p_modele] !== '') {
4810     $modele = $params_multi[$p_modele];
4811     }
4812     // Vérification des adresses de courriel mono
4813     $courriels_valides = array();
4814     $courriels_invalides = array();
4815     if (isset($params_mono[$p_courriel]) === true
4816     && $params_mono[$p_courriel] !== '') {
4817     // Un mail par ligne
4818     $adresses = explode("\n", $params_mono[$p_courriel]);
4819     // Vérification de la validité de chaque mail avec preg_match
4820     foreach ($adresses as $adresse) {
4821     $adresse = trim($adresse);
4822     if ($this->f->checkValidEmailAddress($adresse) === 1) {
4823     $courriels_valides[] = $adresse;
4824     } else {
4825     $courriels_invalides[] = $adresse;
4826     }
4827     }
4828     }
4829     // Vérification du paramétrage global :
4830     // on stoppe le traitement si au moins un paramètre est incorrect
4831     if ($objet === null
4832     || $modele === null
4833     || count($courriels_valides) === 0
4834     || count($courriels_invalides) > 0) {
4835     // On construit le message d'erreur adéquat
4836     $this->addToMessage(_('Erreur de paramétrage :'));
4837     if ($objet === null) {
4838     $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));
4839     }
4840     if ($modele === null) {
4841     $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));
4842     }
4843     if (count($courriels_valides) === 0) {
4844     $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));
4845     }
4846     if (count($courriels_invalides) > 0) {
4847     $courriels_invalides = implode(', ', $courriels_invalides);
4848     $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);
4849     }
4850     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4851     return $this->end_treatment(__METHOD__, false);
4852     }
4853     // Remplacement des variables de substitution
4854     $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);
4855     $modele = $this->formater_modele($modele, $id_di, $id_inst);
4856     // Exécution du traitement d'envoi du/des mail(s)
4857     $fails = array();
4858     foreach ($courriels_valides as $email) {
4859     if ($this->f->sendMail(
4860     iconv("UTF-8", "CP1252", $objet),
4861     iconv("UTF-8", "CP1252", $modele),
4862     iconv("UTF-8", "CP1252", $email)) === false) {
4863     $fails[] = $email;
4864     }
4865     }
4866     // Si échec message d'erreur et arrêt du traitement
4867     if (count($fails) > 0) {
4868     $fails = implode(', ', $fails);
4869     $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);
4870     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4871     return $this->end_treatment(__METHOD__, false);
4872     }
4873     // Ajout du log
4874     $this->setValFFromVal();
4875     $val_inst = $this->valF;
4876     $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);
4877     if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {
4878     $this->addToMessage(_("Erreur lors de la notification."));
4879     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4880     return $this->end_treatment(__METHOD__, false);
4881     }
4882     // Message de validation
4883     $this->addToMessage(_('La commune a été notifiée.'));
4884     return $this->end_treatment(__METHOD__, true);
4885     }
4886    
4887     /**
4888     * Formatte le corps du courriel notifié aux communes
4889     *
4890     * @param string $modele template du modèle du courriel
4891     * @param string $id_di clé primaire du DI
4892     * @param string $id_inst clé primaire de l'instruction
4893     * @return string corps du mail au format HTML
4894     */
4895     public function formater_modele($modele, $id_di, $id_inst) {
4896     // Création du lien d'accès direct à l'instruction
4897     $url_inst = PATH_BASE_URL.'spg/direct_link.php?obj=dossier_instruction&action=3'.
4898     '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;
4899     $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';
4900     // Remplacement des champs de fusion
4901     $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);
4902     $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);
4903     $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);
4904     // Encodage HTML des sauts de ligne
4905     $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);
4906     //
4907     return $modele;
4908     }
4909 mbroquet 3730 }// fin classe
4910    
4911     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26