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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6929 - (show annotations)
Thu Jun 15 16:57:15 2017 UTC (7 years, 5 months ago) by softime
File size: 249304 byte(s)
Error occurred while calculating annotation data.
* Merge de la 4.2.0

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26