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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5254 - (hide annotations)
Fri Nov 25 10:59:14 2016 UTC (8 years, 2 months ago) by nhaye
File size: 219635 byte(s)
Merge de la branche d'application des nouvelles actions (passage des lots en nouvelles actions)

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26