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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6063 - (show annotations)
Thu Feb 9 17:29:05 2017 UTC (7 years, 9 months ago) by softime
File size: 224749 byte(s)
Error occurred while calculating annotation data.
* Merge de la branche de développement de la 3.35.3.

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26