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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6272 - (show annotations)
Fri Mar 3 15:27:53 2017 UTC (7 years, 10 months ago) by softime
File size: 225290 byte(s)
* Merge de la branche 3.36.0

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26