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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18407 - (show annotations)
Thu Aug 8 16:18:08 2024 UTC (5 months, 2 weeks ago) by softime
File size: 180201 byte(s)
chore(branch): fusion de la branche d'intégration 6.6.0-develop dans le trunk

1 <?php
2 /**
3 * DBFORM - 'consultation' - Surcharge gen.
4 *
5 * @package openads
6 * @version SVN : $Id: consultation.class.php 6046 2016-02-26 15:27:06Z fmichon $
7 */
8
9 require_once ("../gen/obj/consultation.class.php");
10 require_once "../obj/task.class.php";
11
12 class consultation extends consultation_gen {
13
14 // Champs contenant les UID des fichiers
15 var $abstract_type = array(
16 "fichier" => "file",
17 "om_fichier_consultation" => "file",
18 );
19
20 var $metadata = array(
21 "om_fichier_consultation" => array(
22 "dossier" => "getDossier",
23 "dossier_version" => "getDossierVersion",
24 "numDemandeAutor" => "getNumDemandeAutor",
25 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
26 "typeInstruction" => "getTypeInstruction",
27 "statutAutorisation" => "getStatutAutorisation",
28 "typeAutorisation" => "getTypeAutorisation",
29 "dateEvenementDocument" => "getDateEvenementDocument",
30 "groupeInstruction" => 'getGroupeInstruction',
31 "title" => 'getTitle',
32 'concerneERP' => 'get_concerne_erp',
33
34 'type' => 'getDocumentType',
35 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
36 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
37 'region' => 'getDossierRegion',
38 'departement' => 'getDossierDepartement',
39 'commune' => 'getDossierCommune',
40 'annee' => 'getDossierAnnee',
41 'division' => 'getDossierDivision',
42 'collectivite' => 'getDossierServiceOrCollectivite'
43 ),
44 "fichier" => array(
45 "filename" => "getFichierFilename",
46 "dossier" => "getDossier",
47 "dossier_version" => "getDossierVersion",
48 "numDemandeAutor" => "getNumDemandeAutor",
49 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
50 "typeInstruction" => "getTypeInstruction",
51 "statutAutorisation" => "getStatutAutorisation",
52 "typeAutorisation" => "getTypeAutorisation",
53 "dateEvenementDocument" => "getDateEvenementDocument",
54 "groupeInstruction" => 'getGroupeInstruction',
55 "title" => 'getTitle',
56 'concerneERP' => 'get_concerne_erp',
57
58 'type' => 'getDocumentType',
59 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
60 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
61 'region' => 'getDossierRegion',
62 'departement' => 'getDossierDepartement',
63 'commune' => 'getDossierCommune',
64 'annee' => 'getDossierAnnee',
65 'division' => 'getDossierDivision',
66 'collectivite' => 'getDossierServiceOrCollectivite'
67 ),
68 "fichier_pec" => array(
69 "filename" => "getFichierFilename",
70 "dossier" => "getDossier",
71 "dossier_version" => "getDossierVersion",
72 "numDemandeAutor" => "getNumDemandeAutor",
73 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
74 "typeInstruction" => "getTypeInstruction",
75 "statutAutorisation" => "getStatutAutorisation",
76 "typeAutorisation" => "getTypeAutorisation",
77 "dateEvenementDocument" => "getDateEvenementDocument",
78 "groupeInstruction" => 'getGroupeInstruction',
79 "title" => 'getTitle',
80 'concerneERP' => 'get_concerne_erp',
81
82 'type' => 'getDocumentType',
83 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
84 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
85 'region' => 'getDossierRegion',
86 'departement' => 'getDossierDepartement',
87 'commune' => 'getDossierCommune',
88 'annee' => 'getDossierAnnee',
89 'division' => 'getDossierDivision',
90 'collectivite' => 'getDossierServiceOrCollectivite'
91 ),
92 );
93
94 /**
95 * Cette variable permet de stocker le résultat de la méthode
96 * getDivisionFromDossier() afin de ne pas effectuer le recalcul à chacun de
97 * ces appels.
98 * @var string Code de la division du dossier en cours
99 */
100 var $_division_from_dossier = NULL;
101
102 /**
103 * Instance de la classe dossier
104 *
105 * @var mixed
106 */
107 var $inst_dossier = null;
108
109 /**
110 * Instance de la classe dossier
111 *
112 * @var mixed
113 */
114 protected $typeConsultation = null;
115
116 /**
117 * Instance de la classe dossier
118 *
119 * @var mixed
120 */
121 protected $valElementConsulte = array();
122
123 /**
124 * Définition des actions disponibles sur la classe.
125 *
126 * @return void
127 */
128 function init_class_actions() {
129
130 parent::init_class_actions();
131
132 // ACTION - 000 - ajouter
133 // Modifie la condition d'affichage du bouton ajouter
134 $this->class_actions[0]["condition"] = array("can_user_access_dossier_contexte_ajout");
135
136 // ACTION - 001 - modifier
137 //
138 $this->class_actions[1]["condition"] = array("is_editable", "can_user_access_dossier_contexte_modification");
139
140 // ACTION - 002 - supprimer
141 //
142 $this->class_actions[2]["condition"] = array("is_deletable", "can_user_access_dossier_contexte_modification");
143
144 // ACTION - 040 - ajout_multiple
145 // Ajout de consultations multiples
146 $this->class_actions[40] = array(
147 "identifier" => "ajout_multiple",
148 "view" => "view_ajout_multiple",
149 "method" => "ajouter_multiple",
150 "button" => "valider",
151 "permission_suffix" => "ajouter",
152 "condition" => array("is_multiaddable", "can_user_access_dossier_contexte_ajout"),
153 );
154 // ACTION - 041 - ajouter_consultation_tiers
155 // Ajout de consultations de tiers
156 $this->class_actions[41] = array(
157 "identifier" => "ajouter_consultation_tiers",
158 "permission_suffix" => "ajouter_consultation_tiers",
159 "crud" => "create",
160 "method" => "ajouter"
161 );
162 // ACTION - 050 - marquer_comme_lu
163 $this->class_actions[50] = array(
164 "identifier" => "marquer_comme_lu",
165 "portlet" => array(
166 "type" => "action-direct",
167 "libelle" => _("Marquer comme lu"),
168 "order" => 50,
169 "class" => "lu-16",
170 ),
171 "view" => "formulaire",
172 "method" => "marquer_comme_lu",
173 "permission_suffix" => "modifier_lu",
174 "condition" => array(
175 "is_markable",
176 "show_marquer_comme_lu_portlet_action",
177 "can_user_access_dossier_contexte_modification",
178 ),
179 );
180 // ACTION - 051 - marquer_comme_non_lu
181 $this->class_actions[51] = array(
182 "identifier" => "marquer_comme_non_lu",
183 "portlet" => array(
184 "type" => "action-direct",
185 "libelle" => __("Marquer comme non lu"),
186 "order" => 50,
187 "class" => "nonlu-16",
188 ),
189 "view" => "formulaire",
190 "method" => "marquer_comme_non_lu",
191 "permission_suffix" => "modifier_lu",
192 "condition" => array(
193 "is_markable",
194 "show_marquer_comme_non_lu_portlet_action",
195 "can_user_access_dossier_contexte_modification",
196 ),
197 );
198 // ACTION - 060 - finaliser
199 $this->class_actions[60] = array(
200 "identifier" => "finalise",
201 "portlet" => array(
202 "type" => "action-direct",
203 "libelle" => _("Finaliser le document"),
204 "order" => 60,
205 "class" => "finalise",
206 ),
207 "view" => "formulaire",
208 "method" => "finalize",
209 "permission_suffix" => "finaliser",
210 "condition" => array(
211 "show_consultation_finaliser_portlet_action",
212 "is_finalizable",
213 "can_user_access_dossier_contexte_modification",
214 ),
215 );
216
217 // ACTION - 070 - unfinaliser
218 $this->class_actions[70] = array(
219 "identifier" => "unfinalise",
220 "portlet" => array(
221 "type" => "action-direct",
222 "libelle" => _("Reprendre la redaction du document"),
223 "order" => 70,
224 "class" => "definalise",
225 ),
226 "view" => "formulaire",
227 "method" => "unfinalize",
228 "permission_suffix" => "definaliser",
229 "condition" => array(
230 "show_unfinalize_portlet_action",
231 "is_unfinalizable",
232 "can_user_access_dossier_contexte_modification",
233 ),
234 );
235
236 // ACTION - 080 - consulter_pdf
237 $this->class_actions[80] = array(
238 "identifier" => "consulter_pdf",
239 "portlet" => array(
240 "type" => "action-blank",
241 "libelle" => _("Editer la consultation PDF"),
242 "order" => 45,
243 "class" => "pdf-16",
244 ),
245 "view" => "view_consulter_pdf",
246 "permission_suffix" => "edition",
247 "condition" => array(
248 "can_user_access_dossier_contexte_modification",
249 "is_viewable",
250 ),
251 );
252
253 // ACTION - 090 - Générer l'édition PDF d'une consultation multiple
254 //
255 $this->class_actions[90] = array(
256 "identifier" => "generate_pdf_consultation_multiple",
257 "view" => "generate_pdf_consultation_multiple",
258 "permission_suffix" => "ajouter",
259 );
260
261 // ACTION - 100 - retour_consultation
262 // Lors de la saisie de retour d'avis par le profil suivi des dates
263 $this->class_actions[100] = array(
264 "identifier" => "retour_consultation",
265 "view" => "formulaire",
266 "method" => "modifier",
267 "button" => _("Modifier"),
268 "permission_suffix" => "modifier",
269 "condition" => array("is_suivi_retours_de_consultation, can_user_access_dossier_contexte_modification"),
270
271 );
272
273 $this->class_actions[110] = array(
274 "identifier" => "suivi_mise_a_jour_des_dates",
275 "view" => "view_suivi_mise_a_jour_des_dates",
276 "permission_suffix" => "suivi_mise_a_jour_des_dates",
277 );
278
279 $this->class_actions[120] = array(
280 "identifier" => "suivi_retours_de_consultation",
281 "view" => "view_suivi_retours_de_consultation",
282 "permission_suffix" => "suivi_retours_de_consultation",
283 );
284
285 // ACTION - 130 - Afficher la consultation dans les éditions
286 $this->class_actions[130] = array(
287 "identifier" => "afficher_dans_edition",
288 "portlet" => array(
289 "type" => "action-direct",
290 "libelle" => _("Afficher dans les éditions"),
291 "order" => 80,
292 "class" => "watch-16"
293 ),
294 "method" => "manage_visibilite_consultation",
295 "permission_suffix" => "visibilite_dans_edition",
296 "condition" => array(
297 "is_not_visible",
298 "can_show_or_hide_in_edition"),
299 );
300
301 // ACTION - 140 - Masquer la consultation dans les éditions
302 $this->class_actions[140] = array(
303 "identifier" => "masquer_dans_edition",
304 "portlet" => array(
305 "type" => "action-direct",
306 "libelle" => _("Masquer dans les éditions"),
307 "order" => 80,
308 "class" => "unwatch-16"
309 ),
310 "method" => "manage_visibilite_consultation",
311 "permission_suffix" => "visibilite_dans_edition",
312 "condition" => array(
313 "is_visible",
314 "can_show_or_hide_in_edition"),
315 );
316
317 // ACTION 400 - preview_edition
318 // /!\ ne pas changer le numéro d'action sinon la prévisualisation
319 // depuis l'onglet document ne sera plus dirigé vers la bonne action
320 $this->class_actions[400] = array(
321 "identifier" => "preview_edition",
322 "view" => "formulaire",
323 "permission_suffix" => "tab",
324 );
325 }
326
327 /**
328 * Clause select pour la requête de sélection des données de l'enregistrement.
329 *
330 * @return array
331 */
332 function get_var_sql_forminc__champs() {
333 return array(
334 "consultation",
335 "dossier.dossier",
336 "dossier_libelle",
337 "service",
338 "categorie_tiers_consulte",
339 "tiers_consulte",
340 "motif_consultation",
341 "commentaire",
342 "to_char(consultation.date_envoi ,'DD/MM/YYYY') as \"date_envoi\"",
343 "to_char(consultation.date_reception ,'DD/MM/YYYY') as \"date_reception\"",
344 "to_char(consultation.date_limite ,'DD/MM/YYYY') as \"date_limite\"",
345 "visible",
346 "motif_pec",
347 "fichier_pec",
348 "to_char(consultation.date_retour ,'DD/MM/YYYY') as \"date_retour\"",
349 "avis_consultation",
350 "motivation",
351 "fichier",
352 "lu",
353 "code_barres",
354 "om_fichier_consultation",
355 "om_final_consultation",
356 "marque",
357 "om_fichier_consultation_dossier_final",
358 "fichier_dossier_final",
359 // Fieldset sépcifique au service Plat'AU
360 "texte_fondement_avis",
361 "texte_avis",
362 "texte_hypotheses",
363 "nom_auteur",
364 "prenom_auteur",
365 "qualite_auteur",
366 "'' as live_preview",
367 );
368 }
369
370 /**
371 * Clause from pour la requête de sélection des données de l'enregistrement.
372 *
373 * @return string
374 */
375 function get_var_sql_forminc__tableSelect() {
376 return sprintf(
377 '%1$s%2$s
378 LEFT JOIN %1$sdossier
379 ON consultation.dossier = dossier.dossier',
380 DB_PREFIXE,
381 $this->table
382 );
383 }
384
385 /**
386 *
387 * @return string
388 */
389 function get_var_sql_forminc__sql_service_by_collectivite_from_di() {
390 $inst_dossier = $this->f->get_inst__om_dbform(array(
391 "obj" => "dossier_instruction",
392 "idx" => $this->getParameter('idxformulaire'),
393 ));
394 // Vérification du Status Plat'AU du dossier
395 $condition_transmission_platau = false;
396 if($inst_dossier->getVal('etat_transmission_platau') !== 'jamais_transmissible'){
397 $condition_transmission_platau = true;
398 }
399 $where_transmission_platau = $condition_transmission_platau === false ? "AND service.service_type = 'openads'" : '';
400
401 return "SELECT service.service, CONCAT(service.abrege, ' - ', service.libelle) FROM ".DB_PREFIXE."service LEFT JOIN ".DB_PREFIXE."om_collectivite ON service.om_collectivite = om_collectivite.om_collectivite WHERE ((service.om_validite_debut IS NULL AND (service.om_validite_fin IS NULL OR service.om_validite_fin > CURRENT_DATE)) OR (service.om_validite_debut <= CURRENT_DATE AND (service.om_validite_fin IS NULL OR service.om_validite_fin > CURRENT_DATE))) AND (om_collectivite.niveau = '2' OR service.om_collectivite = <collectivite_di>) ".$where_transmission_platau." ORDER BY service.abrege, service.libelle";
402 }
403
404 /**
405 *
406 * @return string
407 */
408 function get_var_sql_forminc__sql_service_by_id() {
409 return "SELECT service.service, CONCAT(service.abrege, ' - ', service.libelle) FROM ".DB_PREFIXE."service WHERE service = '<idx>' ";
410 }
411
412 /**
413 * Requête SQL servant à récupérer la liste des motifs de consultation en fonction de la
414 * collectivité de l'utilisateur :
415 * - Si l'utilisateur appartiens à la collectivité de niveau 2 alors il a accès à tous les motifs.
416 * - Sinon, il a uniquement accès aux motifs liés à sa collectivité ou à la collectivité de niveau 2.
417 *
418 * @return string
419 */
420 function get_var_sql_forminc__sql_motif_consultation() {
421 // Vérifie si l'utilisateur est connecté sur la collectivité de niveau 2 et gère le filtre en fonction.
422 $user_filter = '';
423 if ($_SESSION['niveau'] != '2') {
424 if (empty($this->f->om_utilisateur['om_collectivite'])) {
425 $this->f->getUserInfos();
426 }
427 $user_filter = sprintf(
428 '-- Garde les motifs liés à la collectivité de niveau 2 ou à la collectivité de l utilisateur
429 INNER JOIN %1$slien_motif_consultation_om_collectivite
430 ON lien_motif_consultation_om_collectivite.motif_consultation = motif_consultation.motif_consultation
431 INNER JOIN %1$som_collectivite
432 ON om_collectivite.om_collectivite = lien_motif_consultation_om_collectivite.om_collectivite
433 AND (om_collectivite.niveau = \'2\'
434 OR om_collectivite.om_collectivite = %2$d)',
435 DB_PREFIXE,
436 intval($this->f->om_utilisateur['om_collectivite'])
437 );
438 }
439
440 return sprintf(
441 'SELECT DISTINCT
442 motif_consultation.motif_consultation,
443 motif_consultation.libelle
444 FROM
445 %1$smotif_consultation
446 %2$s
447 WHERE
448 ((motif_consultation.om_validite_debut IS NULL
449 AND (motif_consultation.om_validite_fin IS NULL
450 OR motif_consultation.om_validite_fin > CURRENT_DATE))
451 OR (motif_consultation.om_validite_debut <= CURRENT_DATE
452 AND (motif_consultation.om_validite_fin IS NULL
453 OR motif_consultation.om_validite_fin > CURRENT_DATE)))
454 ORDER BY
455 motif_consultation.libelle ASC',
456 DB_PREFIXE,
457 $user_filter
458 );
459 }
460
461 /**
462 * Permet de modifier le fil d'Ariane depuis l'objet pour un formulaire
463 * @param string $ent Fil d'Ariane récupéréré
464 * @return Fil d'Ariane
465 */
466 function getFormTitle($ent) {
467 //
468 if ($this->getParameter('maj') == 120) {
469 //
470 return _("suivi")." -> "._("demandes d'avis")." -> "._("retours de consultation");
471 }
472 //
473 if ($this->getParameter('maj') == 110) {
474 //
475 return _("suivi")." -> "._("demandes d'avis")." -> "._("mise a jour des dates");
476 }
477 //
478 if ($this->getParameter('maj') == 100) {
479 //
480 return _("suivi")." -> "._("demandes d'avis")." -> "._("retours de consultation")." -> ".$this->getVal($this->clePrimaire);
481 }
482 //
483 return $ent;
484 }
485
486
487 /**
488 * Ce script permet de gérer l'interface de saisie rapide des retours de
489 * consultation par la cellule suivi l'aide d'un code barre.
490 */
491 function view_suivi_retours_de_consultation() {
492 //
493 $this->checkAccessibility();
494 /**
495 * Validation du formulaire
496 */
497 // Si le formulaire a été validé
498 if ($this->f->get_submitted_post_value('code_barres') !== null) {
499 // Si la valeur transmise est correcte
500 if ($this->f->get_submitted_post_value('code_barres') != ""
501 && is_numeric($this->f->get_submitted_post_value('code_barres'))) {
502 // Vérification de l'existence de la consultation
503 $qres = $this->f->get_all_results_from_db_query(
504 sprintf(
505 'SELECT
506 consultation
507 FROM
508 %sconsultation
509 WHERE
510 code_barres = \'%s\'',
511 DB_PREFIXE,
512 $this->f->db->escapesimple($this->f->get_submitted_post_value('code_barres'))
513 ),
514 array(
515 "origin" => __METHOD__,
516 )
517 );
518 // En fonction du nombre de consultations correspondantes
519 // on affiche un message d"erreur ou on redirige vers le formulaire de
520 // saisie du retour
521 if ($qres['row_count'] == 0) {
522 // Si
523 $message_class = "error";
524 $message = _("Ce code barres de consultation n'existe pas.");
525 } elseif ($qres['row_count'] > 1) {
526 // Si
527 $message_class = "error";
528 $message = _("Plusieurs consultations avec ce code barres.");
529 } else {
530 $row = array_shift($qres['result']);
531 header("Location: ".OM_ROUTE_FORM."&obj=consultation&action=100&retour=suivi_retours_de_consultation&idx=".$row['consultation']);
532 }
533 } elseif ($this->f->get_submitted_post_value('code_barres')!==null && $this->f->get_submitted_post_value('code_barres') == "") {
534 // Si aucune valeur n'a été saisie dans le champs consultation
535 $message_class = "error";
536 $message = _("Veuiller saisir un code barres de consultation.");
537 } else {
538 // Si
539 $message_class = "error";
540 $message = _("Cette consultation n'existe pas.");
541 }
542 }
543
544 /**
545 * Affichage des messages et du formulaire
546 */
547 // Affichage du message de validation ou d'erreur
548 if (isset($message) && isset($message_class) && $message != "") {
549 $this->f->displayMessage($message_class, $message);
550 }
551 //
552 $datasubmit = $this->getDataSubmit();
553 // Ouverture du formulaire
554 echo "\t<form";
555 echo " method=\"post\"";
556 echo " id=\"suivi_retours_de_consultation_form\"";
557 echo " action=\"".$datasubmit."\"";
558 echo ">\n";
559 // Paramétrage des champs du formulaire
560 $champs = array("code_barres");
561 // Création d'un nouvel objet de type formulaire
562 $form = $this->f->get_inst__om_formulaire(array(
563 "validation" => 0,
564 "maj" => 0,
565 "champs" => $champs,
566 ));
567 // Paramétrage des champs du formulaire
568 $form->setLib("code_barres", _("No de code barres de consultation"));
569 $form->setType("code_barres", "text");
570 $form->setTaille("code_barres", 25);
571 $form->setMax("code_barres", 25);
572 // Affichage du formulaire
573 $form->entete();
574 $form->afficher($champs, 0, false, false);
575 $form->enpied();
576 // Affichage du bouton
577 echo "\t<div class=\"formControls\">\n";
578 $this->f->layout->display_form_button(array("value" => _("Valider")));
579 echo "\t</div>\n";
580 // Fermeture du formulaire
581 echo "\t</form>\n";
582 }
583
584 /**
585 * Ce script permet de mettre à jour les dates de suivi du traitement
586 * des consultations.
587 */
588 function view_suivi_mise_a_jour_des_dates() {
589 //
590 $this->checkAccessibility();
591
592 // Récupération des valeur passées en POST ou GET
593 $date = "";
594 if($this->f->get_submitted_post_value('date') !== null) {
595 $date = $this->f->get_submitted_post_value('date');
596 } elseif($this->f->get_submitted_get_value('date') !== null) {
597 $date = $this->f->get_submitted_get_value('date');
598 }
599 $code_barres = "";
600 if($this->f->get_submitted_post_value('code_barres') !== null) {
601 $code_barres = $this->f->get_submitted_post_value('code_barres');
602 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
603 $code_barres = $this->f->get_submitted_get_value('code_barres');
604 }
605
606 // Booléen permettant de définir si un enregistrement à eu lieu
607 $correct = false;
608 // Booléen permettant de définir si les dates peuvent êtres enregistrées
609 $date_error = false;
610
611 // Si le formulaire a été validé
612 if ($this->f->get_submitted_post_value('validation') !== null) {
613 //Tous les champs doivent obligatoirement être remplis
614 if ( !empty($date) && !empty($code_barres) ){
615
616 //Vérification de l'existence de la consultation
617 $qres = $this->f->get_all_results_from_db_query(
618 sprintf(
619 'SELECT
620 consultation,
621 type_consultation
622 FROM
623 %1$sconsultation
624 LEFT JOIN %1$sservice
625 ON service.service = consultation.service
626 WHERE
627 code_barres = \'%2$s\'',
628 DB_PREFIXE,
629 $this->f->db->escapesimple($code_barres)
630 ),
631 array(
632 "origin" => __METHOD__,
633 )
634 );
635
636 //Si le code barres est correct
637 if($qres['row_count'] == 1) {
638
639 //Un retour de demande d'avis ne peut être saisie que si le type de
640 //consultation est "avec_avis_attendu"
641 $row = array_shift($qres['result']);
642 if ( strcasecmp($row['type_consultation'], "avec_avis_attendu") === 0 ){
643
644 //On met à jour la date après l'écran de vérification
645 if($this->f->get_submitted_post_value("is_valid") != null and $this->f->get_submitted_post_value("is_valid") == "true") {
646 $consultation = $this->f->get_inst__om_dbform(array(
647 "obj" => "consultation",
648 "idx" => $row['consultation'],
649 ));
650 $consultation->setParameter("maj", 1);
651 $valF = array();
652 foreach($consultation->champs as $id => $champ) {
653 $valF[$champ] = $consultation->val[$id];
654 }
655
656 $valF['date_reception']=$date;
657
658 $consultation->modifier($valF);
659 // Vérification de la finalisation du document
660 // correspondant au code barres
661 if($consultation->valF["om_final_consultation"] === true) {
662 $message_class = "valid";
663 $message = _("Saisie enregistree");
664 $code_barres = "";
665 } else {
666 //
667 $message_class = "error";
668 $message = sprintf(_("Le document correspondant au
669 code barres %s n'est pas finalise,
670 la date ne sera pas mise a jour."),
671 $code_barres);
672 }
673
674 }
675 //Sinon on récupère les infos du dossier pour les afficher
676 else {
677 // Récupération des infos du dossier
678 $qres = $this->f->get_all_results_from_db_query(
679 sprintf(
680 'SELECT
681 dossier_libelle,
682 libelle,
683 date_reception,
684 TO_CHAR(date_envoi, \'DD/MM/YYYY\') AS date_envoi
685 FROM
686 %1$sconsultation
687 LEFT JOIN %1$sdossier
688 ON dossier.dossier = consultation.dossier
689 LEFT JOIN %1$sservice
690 ON service.service = consultation.service
691 WHERE
692 code_barres = \'%2$s\'',
693 DB_PREFIXE,
694 $this->f->db->escapesimple($code_barres)
695 ),
696 array(
697 "origin" => __METHOD__,
698 )
699 );
700 $infos = array_shift($qres['result']);
701 }
702 }
703 //C'est un autre type de consultation
704 else{
705 $message_class = "error";
706 $message = _("Cette consultation n'a pas d'avis attendu.");
707 }
708 }
709 else {
710 $message_class = "error";
711 $message = _("Le numero saisi ne correspond a aucun code barres de consultation.");
712 }
713 } else {
714 $message_class = "error";
715 $message = _("Tous les champs doivent etre remplis.");
716 }
717 }
718
719 /**
720 * Affichage des messages et du formulaire
721 */
722 // Affichage du message de validation ou d'erreur
723 if (isset($message) && isset($message_class) && $message != "") {
724 $this->f->displayMessage($message_class, $message);
725 }
726 //
727 $datasubmit = $this->getDataSubmit();
728 // Ouverture du formulaire
729 printf("\t<form");
730 printf(" method=\"post\"");
731 printf(" id=\"demandes_avis_mise_a_jour_des_dates_form\"");
732 printf(" action=\"".$datasubmit."\"");
733 printf(">\n");
734 // Paramétrage des champs du formulaire
735 $champs = array("date", "code_barres");
736 if (isset($infos)) {
737 array_push(
738 $champs,
739 "dossier_libelle",
740 "service",
741 "date_envoi",
742 "date_reception",
743 "is_valid"
744 );
745 }
746 // Création d'un nouvel objet de type formulaire
747 $form = $this->f->get_inst__om_formulaire(array(
748 "validation" => 0,
749 "maj" => 0,
750 "champs" => $champs,
751 ));
752 // Paramétrage des champs du formulaire
753 // Parametrage du champ date
754 $form->setLib("date", _("Date")."* :");
755 if (isset($infos)) {
756 $form->setType("date", "hiddenstaticdate");
757 } else {
758 $form->setType("date", "date");
759 }
760 $form->setVal("date", $date);
761 $form->setTaille("date", 10);
762 $form->setMax("date", 10);
763
764 // Parametrage du champ code_barres
765 $form->setLib("code_barres", _("Code barres de consultation")."* :");
766 if (isset($infos)) {
767 $form->setType("code_barres", "hiddenstatic");
768 } else {
769 $form->setType("code_barres", "text");
770 }
771 $form->setVal("code_barres", $code_barres);
772 $form->setTaille("code_barres", 20);
773 $form->setMax("code_barres", 20);
774
775 // Ajout des infos du dossier correspondantes à la consultation séléctionnée
776 if (isset($infos)) {
777
778 // Tous les champs sont défini par defaut à static
779 foreach ($infos as $key => $value) {
780 $form->setType($key, "static");
781 $form->setVal($key, $value);
782 }
783
784 // Les champs dont on vient de définir la valeur sont en gras
785 $form->setBloc("date_reception", 'DF', "", 'bold');
786
787 // Parametrage du champ dossier
788 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
789 $form->setType("dossier_libelle", "static");
790 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
791
792 // Parametrage du champ service
793 $form->setLib("service", _("service")." :");
794 $form->setType("service", "static");
795 $form->setVal("service", $infos['libelle']);
796
797 // Parametrage des libellés d'envoi avec RAR
798 $form->setLib("date_envoi", _("Envoi demande d'avis")." :");
799 $form->setLib("date_reception", _("Retour demande d'avis")." :");
800 $form->setVal("date_reception", $date);
801
802 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
803 $form->setLib("is_valid", _("Valide")." :");
804 $form->setType("is_valid", "hidden");
805 $form->setVal("is_valid", 'true');
806
807 $form->setFieldset('dossier_libelle', 'D', _('Synthese'));
808 $form->setFieldset('is_valid', 'F');
809 }
810
811
812 // Création du fieldset regroupant les champs permettant la mise à jour des date
813 $form->setFieldset('date', 'D', _('Mise a jour'));
814 $form->setFieldset('code_barres', 'F');
815 // Affichage du formulaire
816 $form->entete();
817 $form->afficher($champs, 0, false, false);
818 $form->enpied();
819 // Affichage du bouton
820 printf("\t<div class=\"formControls\">\n");
821 //
822 if (!$date_error) {
823 $this->f->layout->display_form_button(
824 array("value" => _("Valider"), "name" => "validation")
825 );
826 }
827 // Si pas sur l'écran de validation
828 if (isset($infos)) {
829 printf(
830 '<a class="retour" href="%s&amp;date=%s&amp;code_barres=%s">Retour</a>',
831 $datasubmit,
832 $date,
833 $code_barres
834 );
835 }
836 printf("\t</div>\n");
837 // Fermeture du formulaire
838 printf("\t</form>\n");
839
840 }
841
842
843 /**
844 * Défini si l'utilisateur est de la cellule suivi.
845 *
846 * @return boolean true si correspond false sinon
847 */
848 function is_suivi_retours_de_consultation() {
849
850 if($this->f->can_bypass("consultation", "modifier")){
851 return true;
852 }
853
854 return $this->f->isAccredited("consultation_suivi_retours_de_consultation");
855 }
856
857 /**
858 * Si le champ lu est à true l'action "Marquer comme lu" n'est pas affichée
859 *
860 * @return boolean true sinon lu false sinon
861 */
862 function show_marquer_comme_lu_portlet_action() {
863 if (isset($this->val[array_search("lu", $this->champs)])
864 && $this->val[array_search("lu", $this->champs)]== "t") {
865 return false;
866 }
867 return true;
868 }
869
870 /**
871 * Si le champ lu est à false l'action "Marquer comme non lu" n'est pas affichée
872 *
873 * @return boolean true sinon lu false sinon
874 */
875 function show_marquer_comme_non_lu_portlet_action() {
876 if (isset($this->val[array_search("lu", $this->champs)])
877 && $this->val[array_search("lu", $this->champs)]== "f") {
878 return false;
879 }
880 return true;
881 }
882
883 /**
884 * Si le document est finalisé l'action "finaliser" n'est pas affichée
885 *
886 * @return boolean true sinon lu false sinon
887 */
888 function show_consultation_finaliser_portlet_action() {
889 if ($this->is_document_finalized("om_final_consultation")) {
890 return false;
891 }
892 return true;
893 }
894
895 /**
896 * Retourne is_document_finalized("om_final_consultation")
897 *
898 * @return boolean true si finalisé false sinon
899 */
900 function show_unfinalize_portlet_action() {
901 return $this->is_document_finalized("om_final_consultation");
902 }
903
904 /**
905 * Permet de savoir si le document passé en paramètre est finalisé
906 *
907 * @param string $field flag finalisé
908 *
909 * @return boolean true si finalisé false sinon
910 */
911 function is_document_finalized($field) {
912 if($this->getVal($field) == 't') {
913 return true;
914 }
915 return false;
916 }
917
918
919 /**
920 *
921 */
922 var $inst_service = null;
923
924 /**
925 *
926 */
927 var $inst_tiers_consulte = null;
928
929 /**
930 *
931 */
932 function get_inst_service($service = null) {
933 //
934 if ($service !== null) {
935 return $this->f->get_inst__om_dbform(array(
936 "obj" => "service",
937 "idx" => $service,
938 ));
939 }
940 //
941 if (isset($this->inst_service) === false or
942 $this->inst_service === null) {
943 $this->inst_service = $this->f->get_inst__om_dbform(array(
944 "obj" => "service",
945 "idx" => $this->getVal('service'),
946 ));
947 }
948 return $this->inst_service;
949 }
950
951 /**
952 *
953 */
954 protected function get_instance_objet_liee($cible, $idCible = null) {
955 // Récupère l'instance de l'élement cible
956 if ($idCible !== null) {
957 return $this->f->get_inst__om_dbform(array(
958 "obj" => $cible,
959 "idx" => $idCible
960 ));
961 }
962 //
963 $nomVarInstance = "inst_".$cible;
964 if (isset($this->$nomVarInstance) === false or
965 $this->$nomVarInstance === null) {
966 $this->$nomVarInstance = $this->f->get_inst__om_dbform(array(
967 "obj" => $cible,
968 "idx" => $this->getVal($cible)
969 ));
970 }
971
972 return $this->$nomVarInstance;
973 }
974
975 /**
976 * TREATMENT - marquer_comme_lu.
977 *
978 * Cette methode permet de passer la consultation en "lu"
979 *
980 * @return boolean true si maj effectué false sinon
981 */
982 function marquer_comme_lu() {
983 // Cette méthode permet d'exécuter une routine en début des méthodes
984 // dites de TREATMENT.
985 $this->begin_treatment(__METHOD__);
986
987 if($this->getVal("lu") == 'f') {
988 $this->correct = true;
989 $valF = array();
990 $valF["lu"] = true;
991
992 $res = $this->f->db->autoExecute(
993 DB_PREFIXE.$this->table,
994 $valF,
995 DB_AUTOQUERY_UPDATE,
996 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
997 );
998 if ($this->f->isDatabaseError($res, true)) {
999 // Appel de la methode de recuperation des erreurs
1000 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1001 $this->correct = false;
1002 // Termine le traitement
1003 return $this->end_treatment(__METHOD__, false);
1004 } else {
1005 $this->addToMessage(__("La consultation a été marquée comme lu."));
1006 return $this->end_treatment(__METHOD__, true);
1007 }
1008
1009 } else {
1010 $this->addToMessage(__("La consultation est déjà marquée comme lu."));
1011 }
1012
1013 // Termine le traitement
1014 return $this->end_treatment(__METHOD__, false);
1015 }
1016
1017 /**
1018 * TREATMENT - marquer_comme_non_lu.
1019 *
1020 * Cette methode permet de passer la message en "non lu"
1021 *
1022 * @return boolean true si maj effectué false sinon
1023 */
1024 public function marquer_comme_non_lu() {
1025 // Cette méthode permet d'exécuter une routine en début des méthodes
1026 // dites de TREATMENT.
1027 $this->begin_treatment(__METHOD__);
1028
1029 if($this->getVal("lu") == 't') {
1030 $this->correct = true;
1031 $valF = array();
1032 $valF["lu"] = false;
1033
1034 $res = $this->f->db->autoExecute(
1035 DB_PREFIXE.$this->table,
1036 $valF,
1037 DB_AUTOQUERY_UPDATE,
1038 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1039 );
1040 if ($this->f->isDatabaseError($res, true)) {
1041 // Appel de la methode de recuperation des erreurs
1042 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1043 $this->correct = false;
1044 // Termine le traitement
1045 return $this->end_treatment(__METHOD__, false);
1046 } else {
1047 $this->addToMessage(__("La consultation a été marquée comme non lu."));
1048 return $this->end_treatment(__METHOD__, true);
1049 }
1050
1051 } else {
1052 $this->addToMessage(__("La consultation est déjà marquée comme non lu."));
1053 }
1054
1055 // Termine le traitement
1056 return $this->end_treatment(__METHOD__, false);
1057 }
1058
1059 // }}}
1060
1061 /**
1062 * TREATMENT - ajouter_multiple.
1063 *
1064 * Cette methode permet d'ajouter plusieurs consultations.
1065 *
1066 * @return boolean true si ajouts effectués false sinon
1067 */
1068 function ajouter_multiple() {
1069 // Cette méthode permet d'exécuter une routine en début des méthodes
1070 // dites de TREATMENT.
1071 $this->begin_treatment(__METHOD__);
1072
1073 // Identifiant de l'objet metier a copier
1074 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $idx = $this->f->get_submitted_get_value('idxformulaire') : $idx = "");
1075 // Nom de l'objet metier
1076 ($this->f->get_submitted_get_value('obj') !== null ? $obj = $this->f->get_submitted_get_value('obj') : $obj = "");
1077 //formulaire retour
1078 ($this->f->get_submitted_get_value('ret') !== null ? $retourformulaire = $this->f->get_submitted_get_value('ret') : $retourformulaire = "");
1079 ($this->f->get_submitted_get_value('date_envoi') !== null ? $date_envoi = $this->f->get_submitted_get_value('date_envoi') : $date_envoi = "");
1080 /*Récupération des données et formatage.*/
1081 $donnees_temp = explode(';', $this->f->get_submitted_get_value('data'));
1082 for ( $i = 1 ; $i < count($donnees_temp) ; $i++ )
1083 $donnees[] = explode('_', $donnees_temp[$i]);
1084 /* Nombre de consultations papier à générer */
1085 $nbConsPap = 0;
1086
1087 /* Ajout des données en base de données
1088 * 0 : l'ID du service
1089 * 1 : consultation papier {0,1}
1090 * */
1091 if ( isset($donnees) && count($donnees) > 0 ) {
1092
1093 foreach ($donnees as $value) {
1094
1095 $qres = $this->f->get_all_results_from_db_query(
1096 sprintf(
1097 'SELECT
1098 delai,
1099 id,
1100 delai_type
1101 FROM
1102 %1$sservice
1103 LEFT JOIN %1$som_etat
1104 ON service.edition = om_etat.om_etat
1105 WHERE
1106 service = %2$s',
1107 DB_PREFIXE,
1108 $this->f->db->escapesimple($value[0])
1109 ),
1110 array(
1111 "origin" => __METHOD__,
1112 "force_return" => true,
1113 "mode" => DB_FETCHMODE_ORDERED
1114 )
1115 );
1116 // Si la récupération de la description de l'avis échoue
1117 if ($qres['result'] !== "OK") {
1118 // Appel de la methode de recuperation des erreurs
1119 $this->erreur_db($qres['message'], $qres['message'], '');
1120 $this->correct = false;
1121 // Termine le traitement
1122 $this->end_treatment(__METHOD__, false);
1123 }
1124 $row = array_shift($qres['result']);
1125 $delai = $row[0];
1126 $type_edition = $row[1];
1127 $delai_type = $row[2];
1128
1129 /*Calcul du delai de retour*/
1130 $date_envoi_temp = $this->datePHP($date_envoi);
1131 $delai = $this->dateDB($this->f->mois_date($date_envoi_temp, $delai, "+", $delai_type));
1132
1133 /*Les données à ajouter*/
1134 // Initialisation de tous les champs a null
1135 foreach ($this->champs as $champs) {
1136 $arrayVal[$champs] = null;
1137 }
1138 // Set les valeurs des champs
1139 $arrayVal = array_replace($arrayVal, array(
1140 'consultation' => "]",
1141 'dossier' => $idx,
1142 'date_envoi' => $date_envoi,
1143 'date_limite' => $delai,
1144 'service' => $value[0],
1145 'motivation' => "",
1146 'om_final_consultation' => false,
1147 'om_fichier_consultation' => '',
1148 'om_fichier_consultation_dossier_final' => false,
1149 'fichier_dossier_final' => false,
1150 'marque' => false,
1151 'visible' => true,
1152 ));
1153 $res_ajout = $this->ajouter($arrayVal);
1154 if($res_ajout != true) {
1155 // Termine le traitement
1156 $this->end_treatment(__METHOD__, false);
1157 }
1158
1159 /*Comptage du nombre de consultations papier demandées et récupération des ids des PDFs à éditer*/
1160 if ($value[1]==1){
1161 $idxConsultations[] = $this->valF['consultation'];
1162 $objConsultations[] = $type_edition;
1163 $nbConsPap++;
1164 }
1165 }
1166
1167 /*Génération du PDF*/
1168 if (isset($idxConsultations) && count($idxConsultations) > 0 ){
1169
1170 // Stockage de l'identifiant de chaque consultation dont on veut éditer la
1171 // version papier, séparés par un point-virgule
1172 $textIdsConsultations = "";
1173 foreach ($idxConsultations as $value) {
1174 if ($textIdsConsultations != "") {
1175 $textIdsConsultations .= ";";
1176 }
1177 $textIdsConsultations .= $value;
1178 }
1179 // Stockage de l'objet de chaque consultation dont on veut éditer la
1180 // version papier, séparés par un point-virgule
1181 $textObjConsultations = "";
1182 foreach ($objConsultations as $value) {
1183 if ($textObjConsultations != "") {
1184 $textObjConsultations .= ";";
1185 }
1186 $textObjConsultations .= $value;
1187 }
1188
1189 // Ouverture du PDF dans une nouvelle fenêtre
1190 printf("
1191 <script language='javascript' type='text/javascript'>
1192 window.open('%s','_blank')
1193 </script>
1194 ",
1195 OM_ROUTE_FORM."&obj=consultation&action=90&idx=0&dossier_instruction=".$this->getVal('dossier')."&textobj=".$textObjConsultations."&"."textids=".$textIdsConsultations
1196 );
1197 }
1198 $return_url = OM_ROUTE_SOUSTAB;
1199 $return_url .= "&obj=consultation";
1200 $return_url .= "&retourformulaire=".$this->getParameter("retourformulaire");
1201 $return_url .= "&idxformulaire=".$this->getParameter("idxformulaire");
1202 $return_url .= "&premier=".$this->getParameter("premiersf");
1203 $return_url .= "&tricol=".$this->getParameter("tricolsf");
1204
1205 /*Affichage du message d'information*/
1206 $this->f->displayMessage("valid", count($donnees)._(' service(s) selectionne(s) dont ').$nbConsPap._(' consultation(s) papier.'));
1207
1208
1209 // Termine le traitement
1210 return $this->end_treatment(__METHOD__, true);
1211 }
1212 }
1213
1214
1215 /**
1216 * VIEW - view_ajout_multiple.
1217 *
1218 * Formulaire specifique
1219 *
1220 * @return void
1221 */
1222 function view_ajout_multiple() {
1223
1224 if (count($this->f->get_submitted_get_value()) > 0
1225 && $this->f->get_submitted_get_value('data') !== null
1226 && $this->f->get_submitted_get_value('data') != "" ) {
1227 $this->f->disableLog();
1228 $this->ajouter_multiple();
1229
1230 } else {
1231
1232 // Vérification de l'accessibilité sur l'élément
1233 $this->checkAccessibility();
1234 //
1235 $datasubmit = $this->getDataSubmitSousForm();
1236 $return_url = OM_ROUTE_SOUSTAB;
1237 $return_url .= "&obj=consultation";
1238 $return_url .= "&retourformulaire=".$this->getParameter("retourformulaire");
1239 $return_url .= "&idxformulaire=".$this->getParameter("idxformulaire");
1240 $return_url .= "&premier=".$this->getParameter("premiersf");
1241 $return_url .= "&tricol=".$this->getParameter("tricolsf");
1242 // Légende du fieldset
1243 $title = _("Objet");
1244 /*Requête qui récupère les services qui sont dans des thématiques*/
1245 // Si c'est un sous-formulaire de dossier d'instruction ou une de ses surcharges
1246 // mes encours, mes clôtures...
1247 $is_in_context_of_foreign_key = $this->is_in_context_of_foreign_key("dossier", $this->getParameter('retourformulaire'));
1248 $sql_foreign_key = '';
1249 if ($is_in_context_of_foreign_key == true) {
1250
1251 // on recupère les services des multicollectivités et de celle
1252 // du DI
1253 $di = $this->f->get_inst__om_dbform(array(
1254 "obj" => "dossier_instruction",
1255 "idx" => $this->getParameter('idxformulaire'),
1256 ));
1257
1258 //
1259 $sql_foreign_key .= sprintf(" AND (om_collectivite.niveau = '2' OR ser.om_collectivite = %s) ", $di->getVal('om_collectivite'));
1260 }
1261
1262 $qres = $this->f->get_all_results_from_db_query(
1263 sprintf(
1264 'SELECT
1265 ser_cat.service_categorie,
1266 ser_cat.libelle AS them_lib,
1267 ser.service,
1268 CONCAT(ser.abrege, \' - \', ser.libelle) AS ser_lib,
1269 ser.consultation_papier
1270 FROM
1271 %1$slien_service_service_categorie lie,
1272 %1$sservice_categorie ser_cat,
1273 %1$sservice ser
1274 LEFT JOIN %1$som_collectivite
1275 ON ser.om_collectivite = om_collectivite.om_collectivite
1276 WHERE
1277 ser_cat.service_categorie = lie.service_categorie
1278 AND ser.service = lie.service
1279 AND (
1280 (
1281 ser.om_validite_debut IS NULL
1282 AND (
1283 ser.om_validite_fin IS NULL
1284 OR ser.om_validite_fin > CURRENT_DATE
1285 )
1286 )
1287 OR
1288 (
1289 ser.om_validite_debut <= CURRENT_DATE
1290 AND (
1291 ser.om_validite_fin IS NULL
1292 OR ser.om_validite_fin > CURRENT_DATE
1293 )
1294 )
1295 )
1296 %2$s
1297 %3$s
1298 ORDER BY
1299 them_lib,
1300 ser.abrege,
1301 ser.libelle',
1302 DB_PREFIXE,
1303 $sql_foreign_key,
1304 $di->getVal("etat_transmission_platau") == "jamais_transmissible" ?
1305 " AND ser.service_type = 'openads'" : ""
1306 ),
1307 array(
1308 "origin" => __METHOD__,
1309 )
1310 );
1311
1312 $temp_ser_cat = 0;
1313 $liste_gauche = "";
1314
1315 foreach ($qres['result'] as $row) {
1316 $name = $row['service_categorie'].'_'.
1317 $row['service'].'_'.
1318 (($row['consultation_papier'] == '' || $row['consultation_papier'] == 'f' ) ? '0' : '1' ).'_';
1319 // On change de thématique, donc rajoute le nom de la thématique
1320 if ( $temp_ser_cat != $row['service_categorie'] ){
1321
1322 $temp_ser_cat = $row['service_categorie'];
1323 $liste_gauche .= '
1324 <div id="them_'.$row['service_categorie'].'" class="liste_gauche_them" >'.
1325 $row['them_lib'].
1326 '</div>
1327 <div
1328 class="liste_gauche_service t'.$name.'"
1329 id="t'.$name.'" >
1330 '.$row['ser_lib'].'
1331 <input class="t'.$name.'" type="checkbox" '.(($row['consultation_papier'] == '' || $row['consultation_papier'] == 'f' ) ? '' : 'checked="checked"' ).'/>
1332 </div>
1333 ';
1334 }
1335
1336 /*On est dans la même thématique*/
1337 else {
1338
1339 $liste_gauche .= '
1340 <div
1341 class="liste_gauche_service t'.$name.'"
1342 id="t'.$name.'" >
1343 '.$row['ser_lib'].'
1344 <input class="t'.$name.'" type="checkbox" '.(($row['consultation_papier'] == '' || $row['consultation_papier'] == 'f' ) ? '' : 'checked="checked"' ).'/>
1345 </div>
1346 ';
1347 }
1348
1349 }
1350
1351 /*Requête qui récupère les services qui ne sont pas dans une thématique*/
1352 // Si c'est un sous-formulaire de dossier d'instruction ou une de ses surcharges
1353 // mes encours, mes clôtures...
1354 $is_in_context_of_foreign_key = $this->is_in_context_of_foreign_key("dossier", $this->getParameter('retourformulaire'));
1355 $sql_foreign_key = '';
1356 if ($is_in_context_of_foreign_key == true) {
1357
1358 // on recupère les services des multicollectivités et de celle
1359 // du DI
1360 $di = $this->f->get_inst__om_dbform(array(
1361 "obj" => "dossier_instruction",
1362 "idx" => $this->getParameter('idxformulaire'),
1363 ));
1364
1365 //
1366 $sql_foreign_key = sprintf(
1367 " AND (om_collectivite.niveau = '2' OR service.om_collectivite = %s) ",
1368 $this->f->db->escapeSimple($di->getVal('om_collectivite'))
1369 );
1370 }
1371
1372 $qres = $this->f->get_all_results_from_db_query(
1373 sprintf(
1374 'SELECT
1375 service.service,
1376 CONCAT(service.abrege, \' - \', service.libelle) AS ser_lib,
1377 service.consultation_papier
1378 FROM
1379 %1$sservice
1380 LEFT JOIN %1$som_collectivite
1381 ON service.om_collectivite = om_collectivite.om_collectivite
1382 WHERE
1383 service NOT IN (
1384 SELECT service
1385 FROM %1$slien_service_service_categorie
1386 )
1387 AND (
1388 (
1389 service.om_validite_debut IS NULL
1390 AND (
1391 service.om_validite_fin IS NULL
1392 OR service.om_validite_fin > CURRENT_DATE
1393 )
1394 )
1395 OR
1396 (
1397 service.om_validite_debut <= CURRENT_DATE
1398 AND (
1399 service.om_validite_fin IS NULL
1400 OR service.om_validite_fin > CURRENT_DATE
1401 )
1402 )
1403 )
1404 %2$s
1405 -- Tri des services qui ne sont pas dans une thématique par ordre alphabétique
1406 ORDER BY
1407 service.abrege,
1408 service.libelle',
1409 DB_PREFIXE,
1410 $sql_foreign_key
1411 ),
1412 array(
1413 "origin" => __METHOD__,
1414 )
1415 );
1416
1417 if ($qres['row_count'] > 0) {
1418 $liste_gauche .= '
1419 <div id="them_0" class="liste_gauche_them">Autres</div>';
1420 }
1421
1422 foreach ($qres['result'] as $row) {
1423 /*Ajout de tous les services qui n'ont pas de thématique*/
1424 $name = '0_'.
1425 $row['service'].'_'.
1426 (($row['consultation_papier'] == '' || $row['consultation_papier'] == 'f' ) ? '0' : '1' ).'_';
1427 $liste_gauche .= '
1428 <div
1429 class="liste_gauche_service t'.$name.'"
1430 id="t'.$name.'" >
1431 '.$row['ser_lib'].'&nbsp;
1432 <input class="t'.$name.'" type="checkbox" '.(($row['consultation_papier'] == '' || $row['consultation_papier'] == 'f' ) ? '' : 'checked="checked"' ).'/>
1433 </div>
1434 ';
1435 }
1436
1437 /*Affichage du formulaire*/
1438 echo "\n<!-- ########## START DBFORM ########## -->\n";
1439 echo "<form";
1440 echo " method=\"post\"";
1441 echo " name=\"f2\"";
1442 echo " action=\"\"";
1443 echo " id=\"form_val\"";
1444 //echo " onsubmit=\"ajaxIt('consultation', '');return false;\"";
1445
1446 //echo " onsubmit=\"affichersform('".$this->getParameter("objsf")."', '".$datasubmit."', this);\"";
1447 echo ">\n";
1448 echo '<div class="formEntete ui-corner-all">';
1449 echo "<div>";
1450 echo '<div class="bloc">';
1451 echo "<fieldset class='cadre ui-corner-all ui-widget-content'>\n";
1452 echo "\t<legend class='ui-corner-all ui-widget-content ui-state-active'>".
1453 _("Consultation par thematique ")."</legend>";
1454 echo "<div class='fieldsetContent' style='width:100%'>";
1455 echo '<div class="field-ser-them field-type-hiddenstatic">';
1456 echo '<div class="form-libelle">';
1457 echo '<label class="libelle-dossier" for="dossier">';
1458 echo _('dossier');
1459 echo '<span class="not-null-tag">*</span>';
1460 echo '</label>';
1461 echo '</div>';
1462 echo '<div class="form-content">';
1463 echo '<input class="champFormulaire" type="hidden" value="'.$this->getParameter("idxformulaire").'" name="dossier"/>';
1464 echo $this->getParameter("idxformulaire");
1465 echo '</div>';
1466 echo '</div>';
1467 /*Code du nouveau champ*/
1468 echo '<div class="field-ser-them ser-them">';
1469 echo '<div class="list-ser-them">';
1470 echo $liste_gauche;
1471 echo '</div>';
1472 echo '<div class="button-ser-them">';
1473 echo '<ul>';
1474 echo '<li>';
1475 echo '<input type="button" value="'._("Ajouter").' >>" id="add-ser-them"/>';
1476 echo '</li>';
1477 echo '<li>';
1478 echo '<input type="button" value="<< '._("Supprimer").'" id="del-ser-them"/>';
1479 echo '</li>';
1480 echo '</ul>';
1481 echo '</div>';
1482 echo '<div class="list-sel-ser-them">';
1483 echo '<div class=\'row row_title\'>';
1484 echo '<div class=\'cell1 liste_droite_title list-sel-ser-them-title\'>'._('Service a consulter').'</div>';
1485 echo '<div class=\'cell2 liste_droite_title list-sel-ser-them-title\'>'._('Version papier').'</div>';
1486 echo '</div>';
1487 echo '</div>';
1488 echo '</div>';
1489 /* -- FIN --*/
1490 // Le champ de date d'envoi est visible seulement aux ayant-droits
1491 if($this->f->isAccredited('consultation_saisir_date_envoi')) {
1492 echo '<div class="field-ser-them field-type-date2">';
1493 }
1494 else {
1495 echo '<div class="field field-type-hiddendate">';
1496 }
1497 echo '<div class="form-libelle">';
1498 echo '<label class="libelle-date_envoi" for="date_envoi">';
1499 echo _('date_envoi');
1500 echo '<span class="not-null-tag">*</span>';
1501 echo '</label>';
1502 echo '</div>';
1503 echo '<div class="form-content">';
1504 echo '<input id="date_envoi" class="champFormulaire datepicker"
1505 type="text" onkeyup="" onchange="fdate(this);"
1506 maxlength="10" size="12" value="'.date("d/m/Y").'"
1507 name="date_envoi">';
1508 echo '</div>';
1509 echo '</div>';
1510 echo "</div>";
1511 echo "</fieldset>";
1512 echo '</div>';
1513 echo '</div>';
1514 echo '</div>';
1515 echo '<div class="formControls">';
1516
1517 echo '<div class="formControls">';
1518 echo "<input class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
1519 type=\"button\"
1520
1521 value=\"Ajouter le(s) enregistrement(s) de la table : 'Consultation'\"
1522 id=\"button_val\">";
1523 $this->retoursousformulaire(
1524 $this->getParameter("idxformulaire"),
1525 $this->getParameter("retourformulaire"),
1526 null,
1527 $this->getParameter("objsf"),
1528 $this->getParameter("premiersf"),
1529 $this->getParameter("tricolsf"),
1530 $this->getParameter("validation"),
1531 $this->getParameter("idx"),
1532 $this->getParameter("maj"),
1533 $this->getParameter("retour")
1534 );
1535 echo '</div>';
1536 echo '</div>';
1537 echo '</form>';
1538
1539 echo "
1540 <script language='javascript' type='text/javascript'>
1541 $(function(){
1542 changeActionVal('');
1543 /*
1544 Sélectionne tous les services d'un thème au clique sur celui ci.
1545 */
1546 $('.liste_gauche_them').click(
1547 function(){
1548
1549 var id = $(this).attr('id').split('_')[1];
1550 var numSer = 0;
1551 var numSerWithClass = 0;
1552
1553 $('.list-ser-them div').each(
1554 function() {
1555
1556 if ( $(this).attr('id').indexOf('them') == -1 &&
1557 $(this).attr('id').indexOf(id) == 1 &&
1558 $(this).hasClass('liste_gauche_service_selected') )
1559
1560 numSerWithClass++;
1561
1562 if ( $(this).attr('id').indexOf('them') == -1 &&
1563 $(this).attr('id').indexOf(id) == 1 )
1564
1565 numSer++;
1566 }
1567 );
1568
1569 if ( numSerWithClass < numSer && numSerWithClass >= 0 ){
1570
1571 $('.list-ser-them div').each(
1572 function() {
1573
1574 if ( $(this).attr('id').indexOf('them') == -1 &&
1575 $(this).attr('id').indexOf(id) == 1 &&
1576 !$(this).hasClass('liste_gauche_service_selected') )
1577
1578 $(this).addClass('liste_gauche_service_selected');
1579 }
1580 );
1581 }
1582
1583 else {
1584
1585 $('.list-ser-them div').each(
1586 function() {
1587
1588 if ( $(this).attr('id').indexOf('them') == -1 &&
1589 $(this).attr('id').indexOf(id) == 1 &&
1590 $(this).hasClass('liste_gauche_service_selected') )
1591
1592 $(this).removeClass('liste_gauche_service_selected');
1593 }
1594 );
1595 }
1596 }
1597 );
1598
1599 /*
1600 Change la class CSS d'un service sur lequel on clique dans la liste de gauche.
1601 */
1602 $('.liste_gauche_service').click(
1603 function(){
1604 $(this).toggleClass('liste_gauche_service_selected');
1605 }
1606 );
1607
1608 /*
1609 Change la class CSS d'un service sur lequel on clique dans la liste de droite.
1610 */
1611 $('.field-ser-them').on(
1612 'click',
1613 '.cell1',
1614 function(){
1615 if ( !$(this).hasClass('liste_droite_title') )
1616 $(this).parent().toggleClass('liste_droite_service_selected');
1617 }
1618 );
1619
1620 $('.liste_droite_service input[type=checkbox]').live(
1621 'click',
1622 'input[type=checkbox]',
1623 function(){
1624
1625 old_id = $(this).attr('class');
1626
1627 tab_don = old_id.split('_');
1628
1629 new_id = tab_don[0] + '_' + tab_don[1] + '_' + ((tab_don[2] == 0 ) ? 1 : 0 ) + '_';
1630
1631 changeOneData( ';' + tab_don[1] + '_' + tab_don[2], ';' + tab_don[1] + '_' + ((tab_don[2] == 0) ? 1 : 0) );
1632 $('div[class=\"' + old_id + '\"]').attr('class', new_id);
1633 $(this).attr('class', new_id);
1634
1635 }
1636 );
1637
1638 $('#date_envoi').change(
1639 function (){
1640
1641 var listServ = new Array();
1642 var data = '';
1643
1644 $('.liste_gauche_service_selected').each(
1645 function(i) {
1646
1647 var id = $(this).attr('id');
1648
1649 if ( listServ.length > 0 && listServ.indexOf(id.split('_')[1]) != -1 )
1650 return;
1651 listServ[i] = id.split('_')[1];
1652 data += ';' + id.split('_')[1] + '_' + id.split('_')[2] ;
1653
1654 }
1655 );
1656
1657 changeActionVal(data);
1658 }
1659 );
1660
1661 /*
1662 Passe les services sélectionnés dans la liste de gauche dans celle de droite.
1663 */
1664 $('#add-ser-them').click(
1665 function() {
1666
1667 changeDataLeftColumn();
1668 }
1669 );
1670
1671 /*
1672 Passe les services sélectionnés dans la liste de droite dans celle de gauche.
1673 */
1674 $('#del-ser-them').click(
1675 function() {
1676
1677 var data = '';
1678
1679 //Supprime les éléments de la liste de droite
1680 $('.liste_droite_service_selected').each(
1681 function() {
1682
1683 var name = $('#'+ $(this).attr('id') + ' .cell1 div').attr('name');
1684
1685 manageListServ('.list-ser-them div', name, 1);
1686
1687 $(this).remove();
1688 }
1689 );
1690
1691 //Change les valeurs qui vont être renvoyées à la validation du formulaire
1692 $('.liste_droite_service').each(
1693 function(){
1694
1695 var name = $('#'+ $(this).attr('id') + ' .cell1 div').attr('name');
1696 data += ';' + name.split('_')[1] + '_' + name.split('_')[2] ;
1697 }
1698 );
1699
1700 changeActionVal(data);
1701 }
1702 );
1703 });
1704
1705 /*
1706 Vérifie que l'objet n'est pas une thématique et que son identifiant correspond.
1707 */
1708 function isNotthemIsOneServ( objet, id ){
1709 return ( $(objet).attr('id').indexOf('them') == -1 &&
1710 $(objet).attr('id').indexOf('_' + id.split('_')[1] + '_') != -1 );
1711 }
1712
1713 /*
1714 Affiche ou cache un élément qui n'est pas une thématique et dont son identifiant correspond.
1715 */
1716 function manageListServ( objet , name, type){
1717
1718 $(objet).each(
1719 function() {
1720
1721 if ( isNotthemIsOneServ(this, name) ){
1722 if ( type == 0 )
1723
1724 $(this).hide() ;
1725
1726 else {
1727
1728 if ( $(this).hasClass('liste_gauche_service_selected') )
1729
1730 $(this).toggleClass('liste_gauche_service_selected');
1731
1732 $(this).show() ;
1733
1734 }
1735 }
1736 }
1737 );
1738 }
1739
1740 /*
1741 Change les actions qui sont réalisées lors de la soumission du formulaire
1742 */
1743 function changeActionVal(data){
1744 date = $('#date_envoi').val();
1745
1746
1747
1748 $('#button_val').attr(
1749 'onclick',
1750 'if ( $(\'.liste_gauche_service_selected\').length > 0 && $(\'#date_envoi\').val() != \'\' ) { messageIt(\'consultation\', \'".html_entity_decode($datasubmit)."&data='+data+'&date_envoi='+date+'\',true);' +
1751 'messageIt(\'consultation\', \'".html_entity_decode($return_url)."\',false);} else alert(\'Veuillez choisir au moins un service et une date d envoi\');'
1752
1753 );
1754
1755 }
1756
1757 /*
1758 Change les actions qui sont réalisées lors de la soumission du formulaire
1759 */
1760 function changeOneData( oldData, newData) {
1761
1762 date = $('#date_envoi').val();
1763
1764 $('#button_val').attr(
1765 'onclick',
1766 $('#button_val').attr('onclick').replace(oldData,newData)
1767 );
1768
1769 }
1770
1771 function changeDataLeftColumn(){
1772
1773 $('.list-sel-ser-them').empty();
1774 $('.list-sel-ser-them').html(
1775 '<div class=\"row row_title\">' +
1776 '<div class=\"cell1 liste_droite_title list-sel-ser-them-title\">"._("Service a consulter")."</div>' +
1777 '<div class=\"cell2 liste_droite_title list-sel-ser-them-title\">"._("Version papier")."</div>' +
1778 '</div>'
1779 );
1780
1781 var listServ = new Array();
1782 var data = '';
1783
1784 $('.liste_gauche_service_selected').each(
1785 function(i) {
1786
1787 var id = $(this).attr('id');
1788
1789 if ( $.inArray(id.split('_')[1], listServ) != -1 )
1790 return;
1791
1792 data += ';' + id.split('_')[1] + '_' + id.split('_')[2] ;
1793 listServ[i] = id.split('_')[1];
1794
1795 $('.list-sel-ser-them').append(
1796 '<div id=\'s' + i + '\' class=\'row liste_droite_service\'>'+
1797 '<div class=\'cell1\'>'+
1798 '<div class=\'' + $(this).attr('id') + '\' name=\'' + $(this).attr('id') + '\'>'+
1799 $(this).html().split('<')[0]+
1800 '</div>'+
1801 '</div>' +
1802 '<div class=\'cell2\'>'+
1803 '<div>'+
1804 '<input class=\'' + $(this).attr('id') + '\''+$(this).html().split('<input')[1]+
1805 '</div>'+
1806 '</div>'+
1807 '</div>'
1808 );
1809
1810 $(this).hide();
1811
1812 manageListServ('.list-ser-them div', id, 0);
1813
1814 }
1815 );
1816 changeActionVal(data);
1817 }
1818 </script>";
1819 }
1820 }
1821
1822
1823 /**
1824 * TREATMENT - view_bordereau_envoi_maire.
1825 *
1826 * Génère et affiche l'édition PDF contenant une ou plusieurs consultations.
1827 *
1828 * @return [void]
1829 */
1830 function generate_pdf_consultation_multiple() {
1831 // Vérification de l'accessibilité sur l'élément
1832 $this->checkAccessibility();
1833 // Récupération de la collectivité du dossier d'instruction
1834 $collectivite = $this->f->getCollectivite($this->get_dossier_collectivite());
1835 // Identifiants des consultations à afficher
1836 $idsConsultations = $this->f->get_submitted_get_value('textids');
1837 // Type de chaque consultations (avec_avis_attendu, ...)
1838 $objConsultations = $this->f->get_submitted_get_value('textobj');
1839 // Génération du PDF
1840 $result = $this->compute_pdf_output('etat', $objConsultations, $collectivite, $idsConsultations);
1841 // Affichage du PDF
1842 $this->expose_pdf_output(
1843 $result['pdf_output'],
1844 $result['filename']
1845 );
1846 }
1847
1848 /**
1849 * SETTER_FORM - setValsousformulaire (setVal).
1850 *
1851 * @return void
1852 */
1853 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1854 parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1855 //
1856 $this->retourformulaire = $retourformulaire;
1857 //
1858 if ($validation == 0) {
1859 if ($maj == 0 or $maj == 40 or $maj == 41) {
1860 $form->setVal("dossier", $this->getParameter("idxformulaire"));
1861 $form->setVal("date_envoi", date("d/m/Y"));
1862 }
1863 if (($maj == 1 || $maj == 91 || $maj == 100) && $this->getVal("date_retour") == "") {
1864 if ($this->f->isAccredited("consultation_retour_avis_suivi")
1865 || $this->f->isAccredited("consultation_retour_avis_service")) {
1866 //
1867 $form->setVal("date_retour", date("d/m/Y"));
1868 }
1869 }
1870 }
1871 }
1872
1873 /**
1874 * SETTER_FORM - setVal (setVal).
1875 *
1876 * @return void
1877 */
1878 function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
1879 parent::setVal($form, $maj, $validation);
1880 //
1881 if (($maj == 1 || $maj == 91 || $maj == 100) && $this->getVal("date_retour") == "") {
1882 $form->setVal("date_retour", date('d/m/Y'));
1883 }
1884 }
1885
1886 function setvalF($val = array()) {
1887 //
1888 parent::setValF($val);
1889 //Si on crée une consultation on la met a visible
1890 if ($this->getParameter('maj') == 0 || $this->getParameter('maj') == 41) {
1891 $this->valF["visible"] = true;
1892 }
1893
1894 if ($this->getParameter('maj') == 0
1895 or $this->getParameter('maj') == 40
1896 or $this->getParameter('maj') == 41) {
1897 //
1898 if (isset($this->valF["date_envoi"])) {
1899 $this->valF["date_reception"] = $this->valF["date_envoi"];
1900 }
1901 //
1902 $this->valF["lu"] = true;
1903 }
1904
1905 // Si un retour d'avis est modifie on passe "lu" a false
1906 if(($this->getParameter('maj')==100 ) and (
1907 $this->val[array_search("avis_consultation",$this->champs)] != $val["avis_consultation"] OR
1908 $this->val[array_search("date_retour",$this->champs)] != $val["date_retour"] OR
1909 $this->val[array_search("motivation",$this->champs)] != $val["motivation"] OR
1910 $this->val[array_search("fichier",$this->champs)] != $val["fichier"])
1911 ) {
1912 $this->valF["lu"]=false;
1913 }
1914 }
1915
1916 /**
1917 * SETTER FORM - set_form_default_values
1918 *
1919 * @param formulaire $form Instance formulaire.
1920 * @param integer $maj Identifant numérique de l'action.
1921 * @param integer $validation Marqueur de validation du formulaire.
1922 *
1923 * @return void
1924 */
1925 function set_form_default_values(&$form, $maj, $validation) {
1926 if ($validation == 0 && $maj == 41) {
1927 foreach ($this->champs as $champ) {
1928 $form->setVal($champ, null, $validation);
1929 }
1930 }
1931 }
1932
1933 function setLib(&$form, $maj) {
1934 //
1935 parent::setLib($form, $maj);
1936 //
1937 $form->setLib($this->clePrimaire, _("id"));
1938 $form->setLib('visible', _("visible dans les éditions"));
1939 $form->setLib("live_preview", "");
1940
1941 $form->setLib('categorie_tiers_consulte', _('catégorie du tiers consulté'));
1942 $form->setLib('tiers_consulte', __('tiers consulté'));
1943 $form->setLib('motif_consultation', _('motif de la consultation'));
1944 $form->setLib('fichier_pec', __('Fichier'));
1945 $form->setLib('motif_pec', __('Motif'));
1946 }
1947
1948 function setType(&$form,$maj) {
1949 // Appel du parent
1950 parent::setType($form,$maj);
1951 $form->setType('consultation', 'hidden');
1952 $form->setType('dossier', 'hidden');
1953 $form->setType('marque', 'hidden');
1954 $form->setType('om_fichier_consultation_dossier_final', 'hidden');
1955 $form->setType('fichier_dossier_final', 'hidden');
1956 $form->setType('live_preview', 'hidden');
1957 //
1958 $form->setType('texte_fondement_avis', 'hidden');
1959 $form->setType('texte_avis', 'hidden');
1960 $form->setType('texte_hypotheses', 'hidden');
1961 $form->setType('nom_auteur', 'hidden');
1962 $form->setType('prenom_auteur', 'hidden');
1963 $form->setType('qualite_auteur', 'hidden');
1964 $form->setType('qualite_auteur', 'hidden');
1965 $form->setType('motif_pec', 'hidden');
1966 $form->setType('fichier_pec', 'hidden');
1967 // MODE - AJOUTER et MODE - AJOUTER CONSULTATION TIERS
1968 if ($maj == 0 || $maj == 41) {
1969 // On cache alors tous les champs que nous ne voulons pas voir
1970 // apparaître dans le formulaire d'ajout (principalement les
1971 // informations sur le retour d'avis)
1972 $form->setType('date_retour', 'hiddendate');
1973 $form->setType('date_reception', 'hiddendate');
1974 $form->setType('date_limite', 'hiddendate');
1975 $form->setType('avis_consultation', 'hidden');
1976 $form->setType('visible', 'hidden');
1977 $form->setType('motivation', 'hidden');
1978 $form->setType('fichier', 'hidden');
1979 $form->setType('lu', 'hidden');
1980 $form->setType('categorie_tiers_consulte', 'hidden');
1981 $form->setType('tiers_consulte', 'hidden');
1982 $form->setType('service', 'hidden');
1983 $form->setType('motif_consultation', 'hidden');
1984 // On permet la modification de certains champs
1985 $form->setType('dossier_libelle', 'hiddenstatic');
1986 $form->setType('commentaire', 'textarea');
1987 // Affichage des champs selon le type de consultation
1988 if ($maj == 0) { // consultation service
1989 $champsRecquis = array('service');
1990 $form->setType('service', 'select');
1991 } elseif ($maj == 41) { // consultation tiers
1992 $champsRecquis = array('categorie_tiers_consulte', 'tiers_consulte', 'motif_consultation');
1993 $form->setType('categorie_tiers_consulte', 'select');
1994 $form->setType('tiers_consulte', 'select');
1995 $form->setType('motif_consultation', 'select');
1996 }
1997 // Gestion de l'affichage des champs obligatoire selon le type de consultation
1998 // TODO : A voir si il existe une meilleur manière de gérer l'affichage des champs obligatoire
1999 foreach ($champsRecquis as $champs) {
2000 $this->required_field[] = $champs;
2001 }
2002 // Le champ "date d'envoi" est affiché seulement si l'utilisateur a la
2003 // permission
2004 if($this->f->isAccredited('consultation_saisir_date_envoi')) {
2005 $form->setType('date_envoi', 'date2');
2006 }
2007 else {
2008 $form->setType('date_envoi', 'hiddendate');
2009 }
2010 }
2011 // MODE - MODIFIER
2012 if ($maj == 1) {
2013 // On affiche en statique les informations qui ne sont plus
2014 // modifiables
2015 $form->setType('dossier_libelle', 'hiddenstatic');
2016 $form->setType('date_envoi', 'hiddenstaticdate');
2017 $form->setType('date_limite', 'hiddenstaticdate');
2018 $form->setType('visible', 'checkboxhiddenstatic');
2019 // Gestion de l'affichage des champs selon les consultations service et tiers
2020 if ($this->getVal('service') != null && $this->getVal('service') != '') {
2021 $form->setType('service', 'selecthiddenstatic');
2022 $form->setType('categorie_tiers_consulte', 'hidden');
2023 $form->setType('tiers_consulte', 'hidden');
2024 $form->setType('motif_consultation', 'hidden');
2025 } else {
2026 $form->setType('service', 'hidden');
2027 $form->setType('categorie_tiers_consulte', 'selecthiddenstatic');
2028 $form->setType('tiers_consulte', 'selecthiddenstatic');
2029 $form->setType('motif_consultation', 'selecthiddenstatic');
2030 }
2031
2032 // La date de réception ne peut être modifiée que par un
2033 // utilisateur en ayant spécifiquement la permission
2034 if($this->f->isAccredited(array('consultation','consultation_modifier_date_reception'), 'OR')) {
2035 $form->setType('date_reception', 'date2');
2036 } else {
2037 $form->setType('date_reception', 'hiddenstaticdate');
2038 }
2039
2040 // Le marqueur lu/non lu ne peut être modifié que par un
2041 // utilisateur en ayant spécifiquement la permission
2042 if ($this->f->isAccredited(array('consultation','consultation_modifier_lu'), 'OR')) {
2043 $form->setType('lu', 'checkbox');
2044 } else {
2045 $form->setType('lu', 'hidden');
2046 }
2047
2048 // Gestion du type du widget sur le champ fichier
2049 if($this->getVal("fichier") == "" OR
2050 $this->f->isAccredited(array('consultation', 'consultation_modifier_fichier'), 'OR')) {
2051 // Si il n'y a jamais eu de fichier enregistré ou que
2052 // l'utilisateur a spécifiquement les droits pour modifier
2053 // un fichier déjà enregistré alors on positionne un type
2054 // de widget modifiable
2055 $contexts = array(
2056 "demande_avis_encours",
2057 "dossier",
2058 "dossier_contentieux_mes_infractions",
2059 "dossier_contentieux_mes_recours",
2060 "dossier_contentieux_tous_recours",
2061 "dossier_contentieux_toutes_infractions",
2062 "dossier_instruction",
2063 "dossier_instruction_mes_clotures",
2064 "dossier_instruction_mes_encours",
2065 "dossier_instruction_tous_clotures",
2066 "dossier_instruction_tous_encours",
2067 "dossier_qualifier",
2068 );
2069 if (in_array($this->getParameter("retourformulaire"), $contexts) === true) {
2070 $form->setType('fichier', 'upload2');
2071 } else {
2072 $form->setType('fichier', 'upload');
2073 }
2074 } else {
2075 // Si non on affiche uniquement le nom du fichier
2076 $form->setType('fichier', 'filestaticedit');
2077 }
2078
2079 }
2080 // Mode supprimer
2081 if ($maj == 2) {
2082 $form->setType('fichier', 'filestatic');
2083 // L'affichage des champs différe pour les consultations de service et celle de tiers
2084 if ($this->getVal('service') != null && $this->getVal('service') != '') {
2085 $form->setType('categorie_tiers_consulte', 'hidden');
2086 $form->setType('tiers_consulte', 'hidden');
2087 $form->setType('motif_consultation', 'hidden');
2088 } else {
2089 $form->setType('service', 'hidden');
2090 }
2091 }
2092 // MODE - CONSULTER
2093 if ($maj == 3) {
2094 $form->setType('fichier', 'file');
2095 // Affichage d'une consultation vers un service
2096 if ($this->getVal('service') !== null && $this->getVal('service') != '') {
2097 $form->setType('categorie_tiers_consulte', 'hidden');
2098 $form->setType('tiers_consulte', 'hidden');
2099 $form->setType('motif_consultation', 'hidden');
2100 $inst_service = $this->get_inst_service($this->getVal('service'));
2101 if ($inst_service->getVal('service_type') === PLATAU) {
2102 $form->setType("texte_fondement_avis", "textareastatic");
2103 $form->setType("texte_avis", "textareastatic");
2104 $form->setType("texte_hypotheses", "textareastatic");
2105 $form->setType("nom_auteur", "static");
2106 $form->setType("prenom_auteur", "static");
2107 $form->setType("qualite_auteur", "static");
2108 $form->setType("motif_pec", "textareastatic");
2109 $form->setType("fichier_pec", "file");
2110 }
2111 } else { // Affichage d'un consultation d'un tiers
2112 $form->setType('service', 'hidden');
2113 $inst_motif = $this->f->get_inst__om_dbform(array(
2114 'idx' => $this->getVal('motif_consultation'),
2115 'obj' => 'motif_consultation'
2116 ));
2117 if ($inst_motif->getVal('service_type') === PLATAU) {
2118 $form->setType("texte_fondement_avis", "textareastatic");
2119 $form->setType("texte_avis", "textareastatic");
2120 $form->setType("texte_hypotheses", "textareastatic");
2121 $form->setType("nom_auteur", "static");
2122 $form->setType("prenom_auteur", "static");
2123 $form->setType("qualite_auteur", "static");
2124 }
2125 }
2126 }
2127
2128 // MODE - AJOUT MULTIPLE
2129 if ($maj == 40) {
2130 $form->setType('visible', 'hidden');
2131 }
2132
2133 // MODE - retour de consultation par suivi des date
2134 if ($maj == 100) {
2135 $form->setType("consultation", "hiddenstatic");
2136 $form->setType('dossier_libelle', 'hiddenstatic');
2137 $form->setType('date_envoi', 'hiddenstaticdate');
2138 $form->setType('date_limite', 'hiddenstaticdate');
2139 $form->setType('date_reception', 'hiddenstaticdate');
2140 $form->setType('service', 'selecthiddenstatic');
2141 $form->setType('categorie_tiers_consulte', 'selecthiddenstatic');
2142 $form->setType('tiers_consulte', 'selecthiddenstatic');
2143 $form->setType('motif_consultation', 'selecthiddenstatic');
2144 $form->setType('commentaire', 'hiddenstatic');
2145 $form->setType('date_retour', 'date');
2146 $form->setType('lu', 'hidden');
2147 $form->setType('visible', 'hidden');
2148 $form->setType("avis_consultation", "select");
2149 $form->setType("motivation", "textarea");
2150 $form->setType('fichier', 'upload');
2151 // Gestion du type du widget sur le champ fichier
2152 if($this->getVal("fichier") == "" OR
2153 $this->f->isAccredited(array('consultation', 'consultation_modifier_fichier'), 'OR')) {
2154 // Si il n'y a jamais eu de fichier enregistré ou que
2155 // l'utilisateur a spécifiquement les droits pour modifier
2156 // un fichier déjà enregistré alors on positionne un type
2157 // de widget modifiable
2158 $contexts = array(
2159 "demande_avis_encours",
2160 "dossier",
2161 "dossier_contentieux_mes_infractions",
2162 "dossier_contentieux_mes_recours",
2163 "dossier_contentieux_tous_recours",
2164 "dossier_contentieux_toutes_infractions",
2165 "dossier_instruction",
2166 "dossier_instruction_mes_clotures",
2167 "dossier_instruction_mes_encours",
2168 "dossier_instruction_tous_clotures",
2169 "dossier_instruction_tous_encours",
2170 "dossier_qualifier",
2171 );
2172 if (in_array($this->getParameter("retourformulaire"), $contexts) === true) {
2173 $form->setType('fichier', 'upload2');
2174 } else {
2175 $form->setType('fichier', 'upload');
2176 }
2177 } else {
2178 // Si non on affiche uniquement le nom du fichier
2179 $form->setType('fichier', 'filestaticedit');
2180 }
2181 }
2182 //// On cache la clé primaire
2183 //$form->setType('consultation', 'hidden');
2184 //
2185 if ($this->is_in_context_of_foreign_key("dossier", $this->getParameter("retourformulaire")) === true) {
2186 $form->setType('dossier_libelle', 'hidden');
2187 }
2188
2189 $form->setType('code_barres', 'hidden');
2190
2191 //Cache les champs pour la finalisation
2192 $form->setType('om_fichier_consultation', 'hidden');
2193 $form->setType('om_final_consultation', 'hidden');
2194
2195 if($maj == 50 OR $maj == 51 OR $maj == 60 OR $maj == 70 OR $maj == 120 OR $maj == 130 OR $maj == 140) {
2196 foreach ($this->champs as $value) {
2197 $form->setType($value, 'hidden');
2198 }
2199 }
2200
2201 if ($maj == 400) {
2202 foreach ($this->champs as $champ) {
2203 $form->setType($champ, 'hidden');
2204 }
2205 $form->setType('live_preview', 'previsualiser');
2206 }
2207 }
2208
2209 /**
2210 * Permet de définir l’attribut “onchange” sur chaque champ.
2211 *
2212 * @param object &$form Formumaire
2213 * @param integer $maj Mode d'insertion
2214 */
2215 function setOnchange(&$form, $maj) {
2216 parent::setOnchange($form, $maj);
2217
2218 // En cas de changement du champ categorie_tiers_consulte, appel
2219 // la méthode javascript filterSelect qui utilise (via l'URL) le
2220 // snippet__filterselect. Le snippet renvoie ensuite un json contenant la valeur du champ.
2221 // Cette valeur est ensuite utilisé pour récupèrer la liste des
2222 // tiers_consulte ayant la categorie sélectionné
2223 // Uniquement dans le formulaire d'ajout d'une consultation a un tiers
2224 if ($maj == '41') {
2225 $form->setOnchange(
2226 'categorie_tiers_consulte',
2227 "filterSelect(
2228 this.value,
2229 'tiers_consulte',
2230 'categorie_tiers_consulte',
2231 'consultation'
2232 )"
2233 );
2234 }
2235 }
2236
2237 /**
2238 * Cette méthode permet de calculer la date limite en fonction de la date
2239 * de réception et du délai de consultation.
2240 *
2241 * Met a jour les valeurs du formulaire en mettant a jour l'attribut valF.
2242 *
2243 * @param
2244 * @return void
2245 */
2246 function calculDateLimite() {
2247 // Vérifie si la variable contenant les informations nécessaire au calcul
2248 // de la date limite a bien été setter et si ce n'est pas le cas fait
2249 // appel au setter.
2250 if ($this->valElementConsulte == array()) {
2251 $this->set_val_element_consulte();
2252 }
2253
2254 // mise a jour instruction avec evenement [return delay]
2255 if (array_key_exists("date_reception", $this->valF)
2256 && $this->valF["date_reception"] != "") {
2257 // Calcul de la date limite a partir du délai et du type de délai
2258 $this->valF["date_limite"] = $this->f->mois_date(
2259 $this->valF["date_reception"],
2260 $this->valElementConsulte['delai'],
2261 "+",
2262 $this->valElementConsulte['delai_type']
2263 );
2264 //
2265 if ($this->valElementConsulte['delai_type'] == "mois") {
2266 $delai_type_trad = _("mois");
2267 } else {
2268 $delai_type_trad = _("jour(s)");
2269 }
2270 //
2271 $this->addToMessage(_("delai")." ".
2272 _("retour")." ".$this->valElementConsulte['delai']." ".$delai_type_trad." -> ".
2273 _("retour")." ".date("d/m/Y", strtotime($this->valF["date_limite"])));
2274 }
2275 }
2276
2277 /**
2278 * Identifie si la consultation est une consultation de tiers ou de service
2279 * a partir des valeurs envoyées dans le formulaire ou alors des valeurs
2280 * issue de la consultation.
2281 * Si il existe une valeur pour le champ service, le type de consultation sera setter
2282 * a "service".
2283 * Si il existe une valeur pour le champ tiers_consulte, le type de consultation sera setter
2284 * a "tiers_consulte"
2285 * Si aucun type de consultation n'a pu être défini renvoie false.
2286 *
2287 * Une fois le type de consultation récupéré effectue une requête pour récupérer
2288 * toutes les infos nécessaires pour créer / mettre à jour la consultation.
2289 * Set la variable valElementConsulte avec les valeurs ainsi récupérées.
2290 *
2291 * @return boolean indique si les informations ont été correctement récupérées
2292 */
2293 protected function set_val_element_consulte() {
2294 $typesConsultationPossible = array('service', 'tiers_consulte');
2295 $typeConsultation = null;
2296 // Pour tous les types de consultation possible vérifie si l'élément
2297 // consulté a bien une valeur enregistrée pour la consultation.
2298 // Si c'est le cas la consultation est de ce type
2299 // UNe fois le type de consultation récupéré il n'y a plus besoin de tester
2300 // les autres types car une consultation n'a qu'un seul type (tier ou service)
2301 foreach ($typesConsultationPossible as $typePossible) {
2302 if (isset($this->valF[$typePossible]) &&
2303 $this->valF[$typePossible] != null &&
2304 $this->valF[$typePossible] != '') {
2305 $typeConsultation = $typePossible;
2306 $idElement = $this->valF[$typePossible];
2307 break;
2308 } elseif ($this->getVal($typePossible) != null && $this->getVal($typePossible) != '') {
2309 $typeConsultation = $typePossible;
2310 $idElement = $this->getVal($typePossible);
2311 break;
2312 }
2313 }
2314
2315 // Renvoie une erreur si le type de consultation n'a pas pu être récupéré
2316 if ($typeConsultation == null) {
2317 $this->addToMessage(__('Erreur : le type de consultation n\'a pas pu être défini'));
2318 return false;
2319 }
2320 $this->typeConsultation = $typeConsultation;
2321 // Récuperation les infos lié à l'élement consulté de la consultation.
2322 $instance = $this->f->get_inst__om_dbform(array(
2323 'obj' => $typeConsultation,
2324 'idx' => $idElement
2325 ));
2326 $champARecupere = array(
2327 $typeConsultation,
2328 'libelle',
2329 'abrege',
2330 'generate_edition',
2331 'service_type',
2332 'delai',
2333 'delai_type',
2334 'notification_email',
2335 'email'
2336 );
2337 if ($typeConsultation == 'tiers_consulte') {
2338 // POur les tiers consulte, il faut récupérer le motif de consultation
2339 $idMotif = isset($this->valF['motif_consultation']) &&
2340 $this->valF['motif_consultation'] != null &&
2341 $this->valF['motif_consultation'] != '' ?
2342 $this->valF['motif_consultation'] :
2343 $this->getVal('motif_consultation');
2344 if ($idMotif == null || $idMotif == '') {
2345 $this->addToMessage(__('Erreur : le motif de consultation n\'a pas pu être récupéré'));
2346 return false;
2347 }
2348 $instanceMotif = $this->f->get_inst__om_dbform(array(
2349 'obj' => 'motif_consultation',
2350 'idx' => $idMotif
2351 ));
2352 foreach($champARecupere as $champ) {
2353 // On cherche les informations voulus dans la table tiers consulte et
2354 // si il n'existe pas c'est qu'ils sont dans la table motif_consultatio,
2355 if ($instance->getVal($champ) != null) {
2356 $valElementConsulte[$champ] = $instance->getVal($champ);
2357 } else {
2358 $valElementConsulte[$champ] = $instanceMotif->getVal($champ);
2359 }
2360 }
2361 // Le champ contenant les adresses mails n'a pas le même nom pour les
2362 // tiers et les services. Pour les tiers il faut donc récupèrer les mails
2363 // dans 'liste_diffusion'
2364 $valElementConsulte['email'] = $instance->getVal('liste_diffusion');
2365 } else {
2366 foreach($champARecupere as $champ) {
2367 $valElementConsulte[$champ] = $instance->getVal($champ);
2368 }
2369 }
2370 $this->valElementConsulte = $valElementConsulte;
2371 return true;
2372 }
2373
2374 /**
2375 * TRIGGER - triggerajouter.
2376 * Réalise le calcul de la date limite de consultation et
2377 *
2378 * @return boolean
2379 */
2380 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2381 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2382 $parent_res = parent::triggerajouter($id, $dnu1, $val);
2383 if ($parent_res === false) return $parent_res;
2384
2385 // Set le type de consultation (var typeConsultation) et les valeurs
2386 // issues de l'élement consulte (var valElementConsulte)
2387 if ($this->set_val_element_consulte() == false) {
2388 $this->addToMessage(__('Erreur : les informations de l\'élement consulté n\'ont pas pu être récupéré.'));
2389 return false;
2390 }
2391 $this->calculDateLimite();
2392
2393 if ($this->valElementConsulte['generate_edition'] === 't') {
2394 // Identifiant du type de courrier
2395 $idTypeCourrier = '12';
2396 $idCourrier = str_pad($this->valF["consultation"], 10, "0", STR_PAD_LEFT);
2397 // Code barres
2398 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2399 }
2400 }
2401
2402 /**
2403 * TRIGGER - triggermodifier.
2404 *
2405 * @return boolean
2406 */
2407 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2408 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2409 // Set le type de consultation (var typeConsultation) et les valeurs
2410 // issues de l'élement consulte (var valElementConsulte)
2411 if ($this->set_val_element_consulte() == false) {
2412 $this->addToMessage(__('Erreur : les informations de l\'élement consulté n\'ont pas pu être récupéré.'));
2413 return false;
2414 }
2415
2416 // Si la date de réception a été modifiée on recalcul les délais à partir de la nouvelle date
2417 if (array_key_exists("date_reception", $this->valF) === true
2418 && $this->getVal('date_reception') !== $this->valF['date_reception']) {
2419 $this->calculDateLimite();
2420 }
2421 }
2422
2423 /**
2424 * TRIGGER - triggerajouterapres.
2425 *
2426 * - Notification par courrier du service consulté
2427 * - Interface avec le référentiel ERP [104]
2428 * - Interface avec le référentiel ERP [106]
2429 * - Finalisation du document PDF de consultation
2430 *
2431 * @return boolean
2432 */
2433 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2434 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2435 // Set le type de consultation (var typeConsultation) et les valeurs
2436 // issues de l'élement consulte (var valElementConsulte)
2437 if ($this->set_val_element_consulte() == false) {
2438 $this->addToMessage(__('Erreur : les informations de l\'élement consulté n\'ont pas pu être récupéré.'));
2439 return false;
2440 }
2441 // On a besoin de l'instance du dossier lié à la consultation
2442 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2443
2444 /**
2445 * Notification par courriel du service consulté.
2446 *
2447 * Si il y a un problème lors de l'envoi du courriel, on prévient l'utilisateur
2448 * mais on ne bloque pas le traitement. Le courriel de notification n'a pas de
2449 * de caractère critique.
2450 */
2451 // On a besoin du nom de l'élement consulté pour l'affichage des messages
2452 $tradTypeConsultation = str_replace('_', ' ', $this->typeConsultation);
2453 if ($this->valElementConsulte['notification_email'] == 't') {
2454 // vérifie si il y a bien des adresses mail enregistrées dans la liste de diffusion
2455 // et si ce n'est pas le cas préviens l'utilisateur que l'envoi du mail n'est pas possible
2456 if ($this->valElementConsulte['email'] == '') {
2457 $this->addToMessage(sprintf(
2458 __("Erreur, il n'y a aucune adresse mail dans la liste de diffusion du %s (%s) %s. Envoi du mail non effectué."),
2459 $tradTypeConsultation,
2460 $this->valElementConsulte['abrege'],
2461 $this->valElementConsulte["libelle"]
2462 ));
2463 } else {
2464 // Composition du titre du courriel
2465 $title = sprintf(
2466 '%s %s',
2467 _("Consultation de ".$tradTypeConsultation." : dossier no"),
2468 $inst_di->getVal($inst_di->clePrimaire)
2469 );
2470 $title = iconv("UTF-8", "CP1252", $title);
2471 // Composition du corps du courriel
2472 $corps = sprintf(
2473 '%s %s<br/>%s %s %s %s %s<br/>%s <a href=\'%s\'>%s</a> %s <a href=\'%s\'>%s</a>',
2474 _("Votre ".$tradTypeConsultation." est consulte concernant le dossier no"),
2475 $inst_di->getVal($inst_di->clePrimaire),
2476 _("Il concerne le terrain situe a l'adresse :"),
2477 $inst_di->getVal('terrain_adresse_voie_numero'),
2478 $inst_di->getVal('terrain_adresse_voie'),
2479 $inst_di->getVal('terrain_adresse_code_postal'),
2480 $inst_di->getVal('terrain_adresse_localite'),
2481 _("Vous pouvez y acceder et rendre votre avis a l'adresse"),
2482 // Adresse interne, si l'adresse termine par &idx= alors on ajoute l'identifiant de la consultation
2483 $this->f->getParameter('services_consultes_lien_interne').((substr($this->f->getParameter('services_consultes_lien_interne'), -5) == "&idx=") ? $this->valF['consultation'] : ""),
2484 _("Lien interne"),
2485 _("ou"),
2486 // Adresse externe, si l'adresse termine par &idx= alors on ajoute l'identifiant de la consultation
2487 $this->f->getParameter('services_consultes_lien_externe').((substr($this->f->getParameter('services_consultes_lien_externe'), -5) == "&idx=") ? $this->valF['consultation'] : ""),
2488 _("Lien externe")
2489 );
2490 // Récupération des destinataire
2491 $email_list = explode("\r\n", $this->valElementConsulte['email']);
2492 $nb_destinataire = count($email_list);
2493 $nb_success = 0;
2494 $nb_error = 0;
2495 foreach ($email_list as $email) {
2496 // Envoi du mail avec message de retour
2497 if ($this->f->sendMail($title, $corps, $email)) {
2498 $this->f->addToLog(__METHOD__."() : senMail envoi de la notification au ".$tradTypeConsultation." effectué", VERBOSE_MODE);
2499 $nb_success++;
2500 } else {
2501 $this->f->addToLog(__METHOD__."() : ERROR - sendMail envoi de la notification au ".$tradTypeConsultation." n'a pas pu aboutir", DEBUG_MODE);
2502 $nb_error++;
2503 }
2504 }
2505 if ($nb_success != 0) {
2506 $this->addToMessage(
2507 sprintf(
2508 __("Envoi d'un mail de notification au %s (%s) %s."),
2509 $tradTypeConsultation,
2510 $this->valElementConsulte['abrege'],
2511 $this->valElementConsulte["libelle"]
2512 ));
2513 }
2514 if ($nb_error > 0 && $nb_error != $nb_destinataire) {
2515 $this->addToMessage(sprintf(
2516 __("Erreur lors de l'envoi du mail de notification à au moins un destinataire du %s (%s) %s."),
2517 $tradTypeConsultation,
2518 $this->valElementConsulte['abrege'],
2519 $this->valElementConsulte["libelle"]
2520 ));
2521 }
2522 if ($nb_error == $nb_destinataire) {
2523 $this->addToMessage(sprintf(
2524 __("Erreur lors de l'envoi du mail de notification aux destinataires du %s (%s) %s."),
2525 $tradTypeConsultation,
2526 $this->valElementConsulte['abrege'],
2527 $this->valElementConsulte["libelle"]
2528 ));
2529 }
2530 }
2531 }
2532
2533 // Récupère la collectivité du dossier d'instruction lié à la
2534 // consultation
2535 $om_collectivite = $this->get_dossier_collectivite();
2536
2537 // /!\ pour l'instant l'interface avec le référentiel erp concerne
2538 // uniquement les consultations faite à des service
2539 if ($this->typeConsultation === 'service') {
2540 // Récupération de l'instance du service en utilisant l'id du service stocké
2541 // dans valElementConsulte.
2542 $inst_service = $this->get_inst_service($this->valElementConsulte['service']);
2543 /**
2544 * Interface avec le référentiel ERP.
2545 *
2546 * (WS->ERP)[104] Demande d'instruction de dossier PC pour un ERP -> PC
2547 * Déclencheur :
2548 * - L'option ERP est activée
2549 * - Le dossier est de type PC
2550 * - Le formulaire d'ajout de consultation est validé avec un service
2551 * correspondant à un des services ERP pour avis
2552 */
2553 if ($this->f->is_option_referentiel_erp_enabled($om_collectivite) === true
2554 && $this->f->getDATCode($inst_di->getVal($inst_di->clePrimaire)) == $this->f->getParameter('erp__dossier__nature__pc')
2555 && in_array($inst_service->getVal($inst_service->clePrimaire), explode(";", $this->f->getParameter('erp__services__avis__pc')))) {
2556 //
2557 $infos = array(
2558 "dossier_instruction" => $inst_di->getVal($inst_di->clePrimaire),
2559 "consultation" => $this->valF['consultation'],
2560 "date_envoi" => $this->valF['date_envoi'],
2561 "service_abrege" => $inst_service->getVal('abrege'),
2562 "service_libelle" => $inst_service->getVal('libelle'),
2563 "date_limite" => $this->valF['date_limite'],
2564 );
2565 //
2566 $ret = $this->f->send_message_to_referentiel_erp(104, $infos);
2567 if ($ret !== true) {
2568 $this->cleanMessage();
2569 $this->addToMessage(_("Une erreur s'est produite lors de la notification (104) du référentiel ERP. Contactez votre administrateur."));
2570 return false;
2571 }
2572 $this->addToMessage(_("Notification (104) du référentiel ERP OK."));
2573 }
2574
2575 /**
2576 * Interface avec le référentiel ERP.
2577 *
2578 * (WS->ERP)[106] Consultation ERP pour conformité -> PC
2579 * Déclencheur :
2580 * - L'option ERP est activée
2581 * - Le dossier est de type PC
2582 * - Le formulaire d'ajout de consultation est validé avec un service
2583 * correspondant à un des services ERP pour conformité
2584 */
2585 //
2586 if ($this->f->is_option_referentiel_erp_enabled($om_collectivite) === true
2587 && $this->f->getDATCode($inst_di->getVal($inst_di->clePrimaire)) == $this->f->getParameter('erp__dossier__nature__pc')
2588 && in_array($inst_service->getVal($inst_service->clePrimaire), explode(";", $this->f->getParameter('erp__services__conformite__pc')))) {
2589 //
2590 $infos = array(
2591 "dossier_instruction" => $inst_di->getVal($inst_di->clePrimaire),
2592 "consultation" => $this->valF['consultation'],
2593 "date_envoi" => $this->valF['date_envoi'],
2594 "service_abrege" => $inst_service->getVal('abrege'),
2595 "service_libelle" => $inst_service->getVal('libelle'),
2596 "date_limite" => $this->valF['date_limite'],
2597 );
2598 //
2599 $ret = $this->f->send_message_to_referentiel_erp(106, $infos);
2600 if ($ret !== true) {
2601 $this->cleanMessage();
2602 $this->addToMessage(_("Une erreur s'est produite lors de la notification (106) du référentiel ERP. Contactez votre administrateur."));
2603 return false;
2604 }
2605 $this->addToMessage(_("Notification (106) du référentiel ERP OK."));
2606 }
2607 }
2608
2609 /**
2610 * Finalisation du document PDF de consultation.
2611 */
2612 if ($this->valElementConsulte['generate_edition'] === 't') {
2613 $finaliserAjouter = $this->finaliserAjouter($id);
2614 if ($finaliserAjouter === false) {
2615 return false;
2616 }
2617 }
2618
2619 /**
2620 * Gestion des tâches pour la dématérialisation
2621 */
2622 // Le service consulté fera sa réponse depuis Plat'AU
2623 if ($this->valElementConsulte['service_type'] === PLATAU
2624 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
2625 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
2626 //
2627 $inst_task = $this->f->get_inst__om_dbform(array(
2628 "obj" => "task",
2629 "idx" => 0,
2630 ));
2631 $task_val = array(
2632 'type' => 'creation_consultation',
2633 'object_id' => $id,
2634 'dossier' => $val['dossier'],
2635 );
2636 // Change l'état de la tâche de notification en fonction de l'état de
2637 // transmission du dossier d'instruction
2638 if ($this->f->is_option_mode_service_consulte_enabled() === false
2639 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
2640 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
2641 //
2642 $task_val['state'] = task::STATUS_DRAFT;
2643 }
2644 $add_task = $inst_task->add_task(array('val' => $task_val));
2645 if ($add_task === false) {
2646 $this->addToMessage(sprintf('%s %s',
2647 __("Une erreur s'est produite lors de la création tâche."),
2648 __("Veuillez contacter votre administrateur.")
2649 ));
2650 $this->correct = false;
2651 return false;
2652 }
2653 }
2654
2655 //
2656 return true;
2657 }
2658
2659 /**
2660 * TRIGGER - triggersupprimerapres.
2661 *
2662 * @return boolean
2663 */
2664 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2665 parent::triggersupprimerapres($id, $dnu1, $val, $dnu2);
2666
2667 /**
2668 * Gestion des tâches pour la dématérialisation
2669 */
2670 $inst_task_empty = $this->f->get_inst__om_dbform(array(
2671 "obj" => "task",
2672 "idx" => 0,
2673 ));
2674 $task_exists = $inst_task_empty->task_exists('creation_consultation', $id);
2675 if ($task_exists !== false) {
2676 $inst_task = $this->f->get_inst__om_dbform(array(
2677 "obj" => "task",
2678 "idx" => $task_exists,
2679 ));
2680 // Si il existe une tâche non traitée associé à la consultation elle est annulée.
2681 if ($inst_task->getVal('state') !== task::STATUS_DONE) {
2682 $task_val = array(
2683 'state' => task::STATUS_CANCELED,
2684 );
2685 $update_task = $inst_task->update_task(array('val' => $task_val));
2686 if ($update_task === false) {
2687 $this->addToMessage(sprintf('%s %s',
2688 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
2689 __("Veuillez contacter votre administrateur.")
2690 ));
2691 $this->correct = false;
2692 return false;
2693 }
2694 }
2695 }
2696
2697 //
2698 return true;
2699 }
2700
2701 // =============================================
2702 // Ajout du fielset
2703 // Add fieldset
2704 // =============================================
2705 function setLayout(&$form, $maj){
2706
2707 //Champs sur lequel s'ouvre le fieldset
2708 $form->setBloc('dossier','D',"");
2709 $form->setFieldset('dossier','D',_('Consultation'));
2710
2711 //Champs sur lequel se ferme le fieldset
2712 $form->setFieldset('visible','F','');
2713 $form->setBloc('visible','F');
2714
2715 $form->setBloc('motif_pec','D',"");
2716 $form->setFieldset('motif_pec','D',_('Prise en compte'));
2717 $form->setFieldset('fichier_pec','F','');
2718 $form->setBloc('fichier_pec','F');
2719
2720
2721 // MODE - autre que AJOUTER alors on affiche un fieldset retour
2722 // d'avis
2723 if ($maj != 0 && $maj != 41) {
2724
2725 //Champs sur lequel s'ouvre le fieldset
2726 $form->setBloc('date_retour','D',"");
2727 $form->setFieldset('date_retour','D',_('Retour d\'avis'));
2728
2729 //Champs sur lequel se ferme le fieldset
2730 $form->setFieldset('lu','F','');
2731 $form->setBloc('lu','F');
2732
2733 }
2734
2735 $form->setBloc('texte_fondement_avis','D',"");
2736 $form->setFieldset('texte_fondement_avis','D',_("Informations Plat'AU"));
2737 $form->setFieldset('qualite_auteur','F','');
2738 $form->setBloc('qualite_auteur','F');
2739 }
2740
2741 /** Surcharge de la methode retour afin de retourner sur la page de saisie de
2742 * code barre si besoin
2743 **/
2744 function retour($premier = 0, $recherche = "", $tricol = "") {
2745 $params ="obj=".$this->get_absolute_class_name();
2746 if($this->getParameter("retour")=="form") {
2747 $params .= "&amp;idx=".$this->getParameter("idx");
2748 $params .= "&amp;action=3";
2749 }
2750 $params .= "&amp;premier=".$this->getParameter("premier");
2751 $params .= "&amp;tricol=".$this->getParameter("tricol");
2752 $params .= "&amp;advs_id=".$this->getParameter("advs_id");
2753 $params .= "&amp;valide=".$this->getParameter("valide");
2754 echo "\n<a class=\"retour\" ";
2755 echo "href=\"";
2756 //
2757
2758 if($this->getParameter("retour")=="form" AND !($this->getParameter("validation")>0 AND $this->getParameter("maj")==2 AND $this->correct)) {
2759 echo OM_ROUTE_FORM."&".$params;
2760 } elseif($this->getParameter("retour")=="suivi_retours_de_consultation") {
2761 echo OM_ROUTE_FORM."&obj=consultation&idx=0&action=120";
2762 } else {
2763 echo OM_ROUTE_TAB."&".$params;
2764 }
2765 //
2766 echo "\"";
2767 echo ">";
2768 //
2769 echo _("Retour");
2770 //
2771 echo "</a>\n";
2772 }
2773
2774 /**
2775 * Surcharge du bouton retour pour popup
2776 */
2777 function retoursousformulaire($idxformulaire = NULL, $retourformulaire = NULL, $val = NULL,
2778 $objsf = NULL, $premiersf = NULL, $tricolsf = NULL, $validation = NULL,
2779 $idx = NULL, $maj = NULL, $retour = NULL) {
2780 if ($this->getParameter("retourformulaire") === "demande_avis_encours") {
2781 echo "\n<a class=\"retour\" ";
2782 echo "href=\"";
2783 echo "#";
2784 echo "\" ";
2785 echo ">";
2786 //
2787 echo _("Retour");
2788 //
2789 echo "</a>\n";
2790 } else {
2791 parent::retoursousformulaire($idxformulaire, $retourformulaire, $val,
2792 $objsf, $premiersf, $tricolsf, $validation,
2793 $idx, $maj, $retour);
2794 }
2795 }
2796
2797 /**
2798 * SETTER_FORM - setSelect.
2799 *
2800 * @return void
2801 */
2802 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
2803 // TODO : ajouter un commentaire expliquant pourquoi l'appel a la méthode parent
2804 // est commenté et voir si on peut quand même appeler le parents pour réduire
2805 // le code de cette méthode
2806 //parent::setSelect($form, $maj);
2807 // avis_consultation
2808 $this->init_select(
2809 $form,
2810 $this->f->db,
2811 $maj,
2812 null,
2813 "avis_consultation",
2814 $this->get_var_sql_forminc__sql("avis_consultation"),
2815 $this->get_var_sql_forminc__sql("avis_consultation_by_id"),
2816 true
2817 );
2818 // service
2819 $sql_service = $this->get_var_sql_forminc__sql("service");
2820 // si contexte DI, ou surcharge (mes_encours, mes_clotures...)
2821 $is_in_context_of_foreign_key = $this->is_in_context_of_foreign_key("dossier", $this->getParameter('retourformulaire'));
2822 if ($is_in_context_of_foreign_key == true) {
2823 // on recupÚre les services des multicollectivités et de celle du DI
2824 $di = $this->f->get_inst__om_dbform(array(
2825 "obj" => "dossier_instruction",
2826 "idx" => $this->getParameter('idxformulaire'),
2827 ));
2828 $sql_service = str_replace(
2829 '<collectivite_di>',
2830 $di->getVal("om_collectivite"),
2831 $this->get_var_sql_forminc__sql("service_by_collectivite_from_di")
2832 );
2833
2834 // Si l'option référentiel ERP est activée, et que le type du
2835 // dossier d'instruction en contexte n'est pas autorisé à être
2836 // interfacé avec le référentiel ERP, alors les services à consulter
2837 // représentant les services ERP ne doivent pas être proposés dans
2838 // la liste à choix
2839 if ($this->f->is_option_referentiel_erp_enabled($di->getVal("om_collectivite")) === true
2840 && $this->f->getDATCode($di->getVal('dossier')) == $this->f-> getParameter ('erp__dossier__nature__pc')
2841 &&($this->f->getParameter('erp__dossier__type_di__pc')) !== null) {
2842 //
2843 $query_where_service_pc = "";
2844 $erp_di_pc = $this->f->getParameter('erp__dossier__type_di__pc');
2845 $erp_di_pc = explode(";", $erp_di_pc);
2846 $type_di = $di->getVal('dossier_instruction_type') ;
2847
2848 if (in_array($type_di, $erp_di_pc) === false) {
2849 // Dans le cas d'une consultation pour avis
2850 // Si les identifiant des services à consulter sont définis
2851 // dans le paramètre erp__services__avis__pc
2852 if ($this->f->getParameter('erp__services__avis__pc') !== null) {
2853 $erp_service_pc = $this->f->getParameter('erp__services__avis__pc');
2854 $erp_service_pc = explode(";", $erp_service_pc);
2855
2856 if (is_array($erp_service_pc) === true
2857 && empty($erp_service_pc) !== true) {
2858 //
2859 $query_where_service_pc .= sprintf(
2860 ' AND service.service NOT IN (%s) ',
2861 implode(", ", $erp_service_pc)
2862 );
2863 }
2864 }
2865
2866 // Dans le cas d'une consultation pour conformité
2867 // Si les identifiant des services à consulter sont définis
2868 // dans le paramètre erp__services__avis__pc
2869 if ($this->f->getParameter('erp__services__conformite__pc') !== null) {
2870 $erp_service_pc = $this->f->getParameter('erp__services__conformite__pc');
2871 $erp_service_pc = explode(";", $erp_service_pc);
2872
2873 if (is_array($erp_service_pc) === true
2874 && empty($erp_service_pc) !== true) {
2875 //
2876 $query_where_service_pc .= sprintf(
2877 ' AND service.service NOT IN (%s) ',
2878 implode(", ", $erp_service_pc)
2879 );
2880 }
2881 }
2882 }
2883
2884 $sql_service = str_replace('ORDER BY', $query_where_service_pc."ORDER BY", $sql_service);
2885 }
2886 //
2887 $sql_categorie_tiers_consulte = str_replace(
2888 '<om_collectivite_idx>',
2889 $di->getVal("om_collectivite"),
2890 $this->get_var_sql_forminc__sql("categorie_tiers_consulte")
2891 );
2892 // categorie_tiers_consulte
2893 // (Initialisation du Select dans le contexte d'apparition de clefs étrangères,
2894 // afin d'inclure à la requête l'identifiant om_collectivité du DI)
2895 $this->init_select(
2896 $form,
2897 $this->f->db,
2898 $maj,
2899 null,
2900 "categorie_tiers_consulte",
2901 $sql_categorie_tiers_consulte,
2902 $this->get_var_sql_forminc__sql("categorie_tiers_consulte_by_id"),
2903 true
2904 );
2905 }
2906 $this->init_select(
2907 $form,
2908 $this->f->db,
2909 $maj,
2910 null,
2911 "service",
2912 $sql_service,
2913 $this->get_var_sql_forminc__sql("service_by_id"),
2914 true
2915 );
2916 //Seulement dans le cas d'un retour d'avis
2917 // Ajout des contraintes spécifiques pour l'ajout d'un fichier en retour de
2918 // consultation
2919 if ($this->getParameter("retourformulaire") == "demande_avis_encours"
2920 || $this->getParameter("maj") == 100
2921 || $this->getParameter("maj") == 91) {
2922 // avis_consultation
2923 $this->init_select(
2924 $form,
2925 $this->f->db,
2926 1,
2927 null,
2928 "avis_consultation",
2929 $this->get_var_sql_forminc__sql("avis_consultation"),
2930 $this->get_var_sql_forminc__sql("avis_consultation_by_id"),
2931 true
2932 );
2933 //Tableau des contraintes spécifiques
2934 $params = array(
2935 "constraint" => array(
2936 "size_max" => 2,
2937 "extension" => ".pdf"
2938 ),
2939 );
2940
2941 $form->setSelect("fichier", $params);
2942 }
2943
2944 //
2945 if ($maj == 400) {
2946 $champ_uid = 'om_fichier_consultation';
2947 if (! empty($this->f->get_submitted_get_value('champ_uid'))) {
2948 $champ_uid = $this->f->get_submitted_get_value('champ_uid');
2949 }
2950 $file = $this->f->storage->get($this->getVal($champ_uid));
2951 $form->setSelect('live_preview', array(
2952 'base64' => base64_encode($file['file_content']),
2953 'mimetype' => $file['metadata']['mimetype'],
2954 'label' => 'document de consultation',
2955 'href' => sprintf(
2956 '../app/index.php?module=form&snippet=file&obj=consultation&champ=%2$s&id=%1$s',
2957 $this->getVal($this->clePrimaire),
2958 $champ_uid
2959 )
2960 ));
2961 }
2962 // tiers_consulte
2963 $this->init_select(
2964 $form,
2965 $this->f->db,
2966 $maj,
2967 null,
2968 "motif_consultation",
2969 $this->get_var_sql_forminc__sql("tiers_consulte"),
2970 $this->get_var_sql_forminc__sql("tiers_consulte"),
2971 true
2972 );
2973 // Initialise le select en fonction de la valeur du champs categorie_tiers_consulte
2974 $form->setSelect(
2975 'tiers_consulte',
2976 $this->loadSelect_tiers_consulte($form, $maj, "categorie_tiers_consulte")
2977 );
2978 // motif_consultation
2979 $this->init_select(
2980 $form,
2981 $this->f->db,
2982 $maj,
2983 null,
2984 "motif_consultation",
2985 $this->get_var_sql_forminc__sql("motif_consultation"),
2986 $this->get_var_sql_forminc__sql("motif_consultation_by_id"),
2987 true
2988 );
2989 }
2990
2991 /**
2992 * Renvoie les valeurs possible des options du select "tiers_consulte".
2993 *
2994 * Ce select liste toutes les unités qui ont le type recherché
2995 * par l'unité parente.
2996 *
2997 * @param object $form Formulaire.
2998 * @param integer $maj Mode d'insertion.
2999 * @param string $champ Champ activant le filtre.
3000 *
3001 * @return array Tableau des valeurs possible du select.
3002 */
3003 protected function loadSelect_tiers_consulte($form, $maj, $champ) {
3004 // Initialisation du tableau de paramétrage du select :
3005 // - la clé 0 contient le tableau des valeurs,
3006 // - la clé 1 contient le tableau des labels,
3007 // - les clés des tableaux doivent faire correspondre le couple valeur/label.
3008 $contenu = array(
3009 0 => array('', ),
3010 1 => array(__('choisir')." ".__("tiers_consulte"), ),
3011 );
3012
3013 // Récupération de l'identifiant de la catégorie du tiers consulté :
3014 // (par ordre de priorité)
3015 // - si une valeur est postée : c'est le cas lors du rechargement d'un
3016 // formulaire et que le select doit être peuplé par rapport aux
3017 // données saisies dans le formulaire,
3018 // - si la valeur est passée en paramètre : c'est le cas lors d'un
3019 // appel via le snippet filterselect qui effectue un
3020 // $object->setParameter($linkedField, $idx); lors d'un appel ajax
3021 // depuis le formulaire,
3022 // - si la valeur est dans l'enregistrement de la consultation sur laquelle on se
3023 // trouve : c'est le cas lors de la première ouverture du formulaire
3024 // en modification par exemple.
3025 $idCategorieTiers = "";
3026 if ($this->f->get_submitted_post_value($champ) !== null) {
3027 $idCategorieTiers = $this->f->get_submitted_post_value($champ);
3028 } elseif ($this->getParameter($champ) != "") {
3029 $idCategorieTiers = $this->getParameter($champ);
3030 } elseif (isset($form->val[$champ])) {
3031 $idCategorieTiers = $form->val[$champ];
3032 }
3033
3034 // Si on ne récupère pas la categorie de tiers alors on ne peut pas savoir
3035 // le type attendu, on renvoi donc un select vide
3036 if ($idCategorieTiers == "" || ! is_numeric($idCategorieTiers)) {
3037 return $contenu;
3038 }
3039
3040 // on récupère la liste de tous les tiers ayant la catégorie voulue
3041 $qres = $this->f->get_all_results_from_db_query(
3042 sprintf(
3043 'SELECT
3044 tiers_consulte,
3045 CONCAT(abrege, \' - \', libelle) AS libelle
3046 FROM
3047 %1$stiers_consulte
3048 WHERE
3049 categorie_tiers_consulte = %2$d
3050 ORDER BY
3051 tiers_consulte.libelle ASC',
3052 DB_PREFIXE,
3053 intval($idCategorieTiers)
3054 ),
3055 array(
3056 "origin" => __METHOD__,
3057 )
3058 );
3059
3060 // Préparation du tableau de paramétrage du select avec les résultats récupérés
3061 foreach ($qres['result'] as $row) {
3062 $contenu[0][] = $row['tiers_consulte'];
3063 $contenu[1][] = $row['libelle'];
3064 }
3065
3066 // on renvoie le tableau de paramètrage du select contenant la liste des unités
3067 // respectant la contrainte de type
3068 return $contenu;
3069 }
3070
3071 /**
3072 * Finalisation du document lors de l'ajout d'une consultation.
3073 *
3074 * @param integer $id_consult indentifiant de l'objet
3075 */
3076 function finaliserAjouter($id_consult){
3077 //
3078 $this->begin_treatment(__METHOD__);
3079
3080 //
3081 $admin_msg_error = _("Veuillez contacter votre administrateur.");
3082 $file_msg_error = _("La finalisation du document a échoué.")
3083 ." ".$admin_msg_error;
3084 $bdd_msg_error = _("Erreur de base de données.")
3085 ." ".$admin_msg_error;
3086 $log_msg_error = "Finalisation non enregistrée - id consultation = %s - uid fichier = %s";
3087
3088 $uid = $this->file_finalizing($id_consult);
3089 // Comme pour le fonctionnement de l'envoi de mail,
3090 // Si échec cela ne stoppe pas la création de la consultation.
3091 // L'utilisateur en est tout de même informé dans l'IHM
3092 // et l'erreur est loguée.
3093 if ($uid == '' || $uid == 'OP_FAILURE' ) {
3094 $this->addToMessage($file_msg_error);
3095 $this->addToLog(sprintf($log_msg_error, $id_consult, $uid), VERBOSE_MODE);
3096 return $this->end_treatment(__METHOD__, true);
3097 }
3098
3099 // Si succès mise à jour de la consultation
3100 $valF = array(
3101 "om_final_consultation" => true,
3102 "om_fichier_consultation" => $uid
3103 );
3104 //
3105 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
3106 DB_AUTOQUERY_UPDATE, $this->getCle($id_consult));
3107 //
3108 $this->addToLog(
3109 "finaliserAjouter() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_consult)."\")",
3110 VERBOSE_MODE
3111 );
3112 //
3113 if ($this->f->isDatabaseError($res, true) === true) {
3114 $this->correct = false;
3115 // Remplacement du message de validation
3116 $this->msg = '';
3117 $this->addToMessage($bdd_msg_error);
3118 return $this->end_treatment(__METHOD__, false);
3119 }
3120 //
3121 return $this->end_treatment(__METHOD__, true);
3122 }
3123
3124 /**
3125 * Finalisation du fichier.
3126 *
3127 * @param integer $id indentifiant de l'objet
3128 *
3129 * @return string uid du fichier finalisé
3130 */
3131 function file_finalizing($id){
3132 if ( ! ($pdf = $this->generate_pdf_consultation())) {
3133 $this->addToMessage(__('Erreur lors de la génération du document'));
3134 return '';
3135 }
3136
3137 if(isset($this->valF["om_final_consultation"])) {
3138 $finalized = $this->valF["om_final_consultation"];
3139 } else {
3140 $finalized = $this->getVal("om_final_consultation");
3141 }
3142
3143 // Métadonnées du document
3144 $metadata = array(
3145 'filename' => $pdf["filename"],
3146 'mimetype' => 'application/pdf',
3147 'size' => strlen($pdf["pdf_output"])
3148 );
3149
3150 // Récupération des métadonnées calculées après validation
3151 $spe_metadata = $this->getMetadata("om_fichier_consultation");
3152
3153 $metadata = array_merge($metadata, $spe_metadata);
3154
3155 // Si le document a déjà été finalisé (vaudra 'f', ou false sinon)
3156 if ( $finalized != '' ){
3157
3158 // Met à jour le document mais pas son uid
3159 $uid = $this->f->storage->update(
3160 $this->getVal("om_fichier_consultation"), $pdf["pdf_output"], $metadata);
3161 }
3162 // Sinon, ajoute le document et récupère son uid
3163 else {
3164
3165 // Stockage du PDF
3166 $uid = $this->f->storage->create($pdf["pdf_output"], $metadata, "from_content", $this->table.".om_fichier_consultation");
3167 }
3168
3169 return $uid;
3170
3171 }
3172
3173
3174 /**
3175 * TREATMENT - finalize.
3176 *
3177 * Permet de finaliser un enregistrement
3178 *
3179 * @param array $val valeurs soumises par le formulaire
3180 * @param null $dnu1 @deprecated Ancienne ressource de base de données.
3181 * @param null $dnu2 @deprecated Ancien marqueur de débogage.
3182 *
3183 * @return boolean
3184 */
3185 function finalize($val = array(), &$dnu1 = null, $dnu2 = null) {
3186
3187 // Cette méthode permet d'exécuter une routine en début des méthodes
3188 // dites de TREATMENT.
3189 $this->begin_treatment(__METHOD__);
3190
3191 // Traitement de la finalisation
3192 $ret = $this->manage_finalizing("finalize", $val);
3193
3194 // Si le traitement retourne une erreur
3195 if ($ret !== true) {
3196
3197 // Termine le traitement
3198 $this->end_treatment(__METHOD__, false);
3199 }
3200
3201 // Termine le traitement
3202 return $this->end_treatment(__METHOD__, true);
3203 }
3204
3205 /**
3206 * TREATMENT - unfinalize.
3207 *
3208 * Permet de definaliser un enregistrement
3209 *
3210 * @param array $val valeurs soumises par le formulaire
3211 * @param null $dnu1 @deprecated Ancienne ressource de base de données.
3212 * @param null $dnu2 @deprecated Ancien marqueur de débogage.
3213 *
3214 * @return boolean
3215 */
3216 function unfinalize($val = array(), &$dnu1 = null, $dnu2 = null) {
3217
3218 // Cette méthode permet d'exécuter une routine en début des méthodes
3219 // dites de TREATMENT.
3220 $this->begin_treatment(__METHOD__);
3221
3222 // Traitement de la finalisation
3223 $ret = $this->manage_finalizing("unfinalize", $val);
3224
3225 // Si le traitement retourne une erreur
3226 if ($ret !== true) {
3227
3228 // Termine le traitement
3229 $this->end_treatment(__METHOD__, false);
3230 }
3231
3232 // Termine le traitement
3233 return $this->end_treatment(__METHOD__, true);
3234 }
3235
3236 /**
3237 * TREATMENT - manage_visibilite_consultation.
3238 *
3239 * Permet de masquer la consultation dans les éditions si elle est actuellement
3240 * affichée, ou de l'afficher si elle est actuellement masquée.
3241 *
3242 *
3243 * @param array $val valeurs soumises par le formulaire
3244 * @param null $dnu1 @deprecated Ancienne ressource de base de données.
3245 * @param null $dnu2 @deprecated Ancien marqueur de débogage.
3246 *
3247 * @return boolean
3248 */
3249 function manage_visibilite_consultation($val = array(), &$dnu1 = null, $dnu2 = null) {
3250
3251 // Cette méthode permet d'exécuter une routine en début des méthodes
3252 // dites de TREATMENT.
3253 $this->begin_treatment(__METHOD__);
3254
3255 // Recuperation de la valeur de la cle primaire de l'objet
3256 $id = $this->getVal($this->clePrimaire);
3257
3258 if($this->getVal("visible") == 'f') {
3259 $valF["visible"] = true;
3260 }
3261 else {
3262 $valF["visible"] = false;
3263 }
3264
3265 // Execution de la requête de modification des donnees de l'attribut
3266 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
3267 DB_AUTOQUERY_UPDATE, $this->getCle($id));
3268 $this->addToLog(
3269 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\")",
3270 VERBOSE_MODE
3271 );
3272 if ($this->f->isDatabaseError($res, true) !== false) {
3273 // Appel de la methode de recuperation des erreurs
3274 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
3275 $this->correct = false;
3276 $this->addToMessage(_("Erreur de base de donnees. Contactez votre administrateur."));
3277 // Termine le traitement
3278 return $this->end_treatment(__METHOD__, false);
3279 }
3280
3281 if ($valF["visible"] === false) {
3282 $this->addToMessage(_("La consultation est masquée dans les éditions."));
3283 }
3284 else {
3285 $this->addToMessage(_("La consultation est affichée dans les éditions."));
3286 }
3287 // Termine le traitement
3288 return $this->end_treatment(__METHOD__, true);
3289 }
3290
3291
3292 /**
3293 * Finalisation des documents.
3294 *
3295 * @param string $mode finalize/unfinalize
3296 * @param array $val valeurs soumises par le formulaire
3297 */
3298 function manage_finalizing($mode = null, $val = array()) {
3299 //
3300 $this->begin_treatment(__METHOD__);
3301
3302 // Recuperation de la valeur de la cle primaire de l'objet
3303 $id_consult = $this->getVal($this->clePrimaire);
3304
3305 //
3306 $admin_msg_error = _("Veuillez contacter votre administrateur.");
3307 $file_msg_error = _("Erreur de traitement de fichier.")
3308 ." ".$admin_msg_error;
3309 $bdd_msg_error = _("Erreur de base de données.")
3310 ." ".$admin_msg_error;
3311 $log_msg_error = "Finalisation non enregistrée - id consultation = %s - uid fichier = %s";
3312
3313 // Si on finalise le document
3314 if ($mode == "finalize") {
3315 //
3316 $etat = _('finalisation');
3317 // Finalisation du fichier
3318 $uid = $this->file_finalizing($id_consult);
3319 }
3320 //
3321 else {
3322 //
3323 $etat = _('définalisation');
3324 //Récupération de l'uid du document finalisé
3325 $uid = $this->getVal("om_fichier_consultation");
3326 }
3327
3328 // Si on définalise l'UID doit être défini
3329 // Si on finalise la création/modification du fichier doit avoir réussi
3330 if ($uid == '' || $uid == 'OP_FAILURE' ) {
3331 $this->correct = false;
3332 $this->addToMessage($file_msg_error);
3333 $this->addToLog(sprintf($log_msg_error, $id_consult, $uid), VERBOSE_MODE);
3334 return $this->end_treatment(__METHOD__, false);
3335 }
3336
3337 foreach ($this->champs as $key => $value) {
3338 //
3339 $val[$value] = $this->val[$key];
3340 }
3341 $this->setvalF($val);
3342
3343 // Verification de la validite des donnees
3344 $this->verifier($this->val);
3345 // Si les verifications precedentes sont correctes, on procede a
3346 // la modification, sinon on ne fait rien et on retourne une erreur
3347 if ($this->correct === true) {
3348
3349 // Execution du trigger 'before' specifique au MODE 'update'
3350 $this->triggermodifier($id_consult, $this->f->db, $this->val, DEBUG);
3351 // Suppression de son message de validation
3352 $this->msg = '';
3353
3354 //
3355 $valF = array();
3356 if ($mode == "finalize") {
3357 $valF["om_final_consultation"] = true;
3358 } else {
3359 $valF["om_final_consultation"] = false;
3360 }
3361 $valF["om_fichier_consultation"] = $uid;
3362
3363 // Execution de la requête de modification des donnees de l'attribut
3364 // valF de l'objet dans l'attribut table de l'objet
3365 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
3366 DB_AUTOQUERY_UPDATE, $this->getCle($id_consult));
3367 $this->addToLog(
3368 "finaliser() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_consult)."\")",
3369 VERBOSE_MODE
3370 );
3371 //
3372 if ($this->f->isDatabaseError($res, true) === true) {
3373 $this->correct = false;
3374 $this->addToMessage($bdd_msg_error);
3375 return $this->end_treatment(__METHOD__, false);
3376 }
3377 //
3378 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
3379 return $this->end_treatment(__METHOD__, true);
3380 }
3381 // L'appel de verifier() a déjà positionné correct à false
3382 // et défini un message d'erreur.
3383 $this->addToLog(sprintf($log_msg_error, $id_consult, $uid), DEBUG_MODE);
3384 return $this->end_treatment(__METHOD__, false);
3385 }
3386
3387 /**
3388 * Permet de récupérer l'édition de la consultation.
3389 *
3390 * @param string $output type de sortie
3391 *
3392 * @return string si le type de sortie est string, le contenu du pdf est retourné.
3393 */
3394 function generate_pdf_consultation() {
3395 if(isset($this->valF[$this->clePrimaire])) {
3396 $id = $this->valF[$this->clePrimaire];
3397 } else {
3398 $id = $this->getVal($this->clePrimaire);
3399 }
3400 // Requête qui récupère le type de consultation
3401 $qres = $this->f->get_one_result_from_db_query(
3402 sprintf(
3403 '(SELECT
3404 id
3405 FROM
3406 %1$sservice
3407 LEFT JOIN %1$som_etat ON service.edition = om_etat.om_etat
3408 WHERE
3409 service = (
3410 SELECT
3411 service
3412 FROM
3413 %1$sconsultation
3414 WHERE
3415 consultation = %2$d
3416 )
3417 )
3418 UNION
3419 (SELECT
3420 id
3421 FROM
3422 %1$smotif_consultation
3423 LEFT JOIN %1$som_etat ON motif_consultation.om_etat = om_etat.om_etat
3424 WHERE
3425 motif_consultation = (
3426 SELECT
3427 motif_consultation
3428 FROM
3429 %1$sconsultation
3430 WHERE
3431 consultation = %2$d
3432 )
3433 )',
3434 DB_PREFIXE,
3435 intval($id)
3436 ),
3437 array(
3438 "origin" => __METHOD__,
3439 "force_return" => true,
3440 )
3441 );
3442 if ($qres["code"] !== "OK") {
3443 $this->addToMessage(_("Aucun document genere."));
3444 $this->addToMessage(_("Finalisation non enregistree"));
3445 return false;
3446 }
3447 return $this->compute_pdf_output(
3448 "etat",
3449 $qres["result"],
3450 $this->f->getCollectivite($this->get_dossier_collectivite()),
3451 $id
3452 );
3453 }
3454
3455 function get_dossier_collectivite() {
3456 if(isset($this->valF["dossier"])) {
3457 $dossier = $this->valF["dossier"];
3458 } elseif (! empty($this->f->get_submitted_get_value('dossier_instruction')) ) {
3459 $dossier = $this->f->get_submitted_get_value('dossier_instruction');
3460 } else {
3461 $dossier = $this->getVal("dossier");
3462 }
3463 $qres = $this->f->get_one_result_from_db_query(
3464 sprintf(
3465 'SELECT
3466 om_collectivite
3467 FROM
3468 %1$sdossier
3469 WHERE
3470 dossier.dossier = \'%2$s\'',
3471 DB_PREFIXE,
3472 $this->f->db->escapeSimple($dossier)
3473 ),
3474 array(
3475 "origin" => __METHOD__,
3476 "force_return" => true,
3477 )
3478 );
3479 if ($qres["code"] !== "OK") {
3480 $this->addToMessage(_("Aucun document genere."));
3481 $this->addToMessage(_("Finalisation non enregistree"));
3482 return false;
3483 }
3484 return $qres["result"];
3485 }
3486
3487 function view_consulter_pdf(){
3488 if ($this->getVal("om_final_consultation") == 't') {
3489 $lien = '../app/index.php?module=form&snippet=file&obj=consultation&'.
3490 'champ=om_fichier_consultation&id='.$this->getVal($this->clePrimaire);
3491 header("Location: ".$lien);
3492 } else {
3493
3494 $output = $this->generate_pdf_consultation();
3495 $this->expose_pdf_output($output["pdf_output"], $output["filename"]);
3496 }
3497 exit();
3498 }
3499
3500
3501 /**
3502 * Création du nom de fichier
3503 * @return string Nom du fichier
3504 */
3505 protected function getFichierFilename() {
3506 return $this->generate_filename();
3507 }
3508
3509 /**
3510 * Génère le nom du fichier (retour d'avis).
3511 *
3512 * @param string $p_fichier Identifiant du fichier dans le filestorage
3513 * @param integer $p_consultation_id Identifiant de la consultation
3514 * @param string $p_extension Extension du fichier
3515 * @param boolean $is_pec Si c'est une pec
3516 *
3517 * @return string Nom du fichier
3518 */
3519 public function generate_filename($p_fichier = null, $p_consultation_id = null, $p_extension = null, $is_pec = false) {
3520 // Le fichier est soit passé en paramètre, soit récupéré des valeurs validées
3521 // du formulaire en cours, soit récupéré des valeurs enregistrées de l'objet courant
3522 // Le fichier est soit passé en paramètre, soit récupéré des valeurs validées
3523 // du formulaire en cours, soit récupéré des valeurs enregistrées de l'objet courant
3524 $fichier = $p_fichier;
3525 if ($p_fichier === null) {
3526 $fichier = isset($this->valF['fichier']) === true && $this->valF['fichier'] !== null ? $this->valF['fichier'] : $this->getVal('fichier');
3527 }
3528 // L'identifiant de la consultation est soit passé en paramètre, soit récupéré
3529 // des valeurs validées du formulaire en cours, soit récupéré des valeurs
3530 // enregistrées de l'objet courant
3531 $consultation_id = $p_consultation_id;
3532 if ($p_consultation_id === null) {
3533 $consultation_id = isset($this->valF[$this->clePrimaire]) === true && $this->valF[$this->clePrimaire] !== null ? $this->valF[$this->clePrimaire] : $this->getVal($this->clePrimaire);
3534 }
3535 $extension = $p_extension;
3536 if ($p_extension === null) {
3537 $extension = '';
3538 if ($fichier !== null && $fichier !== '') {
3539 // Si le fichier déjà existant est stocké de façon temporaire
3540 $temporary_test = explode("|", $fichier);
3541 if (isset($temporary_test[0]) === true && $temporary_test[0] == "tmp") {
3542 if (isset($temporary_test[1]) === true) {
3543 $tmp_filename = $this->f->storage->getFilename_temporary($temporary_test[1]);
3544 $posExtension = strpos($tmp_filename, ".");
3545 if ($posExtension !== false) {
3546 $extension = strtolower(substr($tmp_filename, $posExtension));
3547 }
3548 }
3549 // Sinon récupération depuis le stockage principal ou alternatif
3550 } else {
3551 $filename = $this->f->storage->getFilename($fichier);
3552 $posExtension = strpos($filename, ".");
3553 if ($posExtension !== false) {
3554 $extension = strtolower(substr($filename, $posExtension));
3555 }
3556 }
3557 }
3558 }
3559 // Retourne le nom du fichier
3560 if ($is_pec == true) {
3561 return "consultation_pec_".$consultation_id.$extension;
3562 }
3563 return "consultation_avis_".$consultation_id.$extension;
3564 }
3565
3566 /**
3567 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
3568 * @return string numéro de dossier d'instruction
3569 */
3570 protected function getDossier($champ = null) {
3571 if(empty($this->specificMetadata)) {
3572 $this->getSpecificMetadata();
3573 }
3574 return $this->specificMetadata->dossier;
3575 }
3576 /**
3577 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
3578 * @return int Version
3579 */
3580 protected function getDossierVersion() {
3581 if(empty($this->specificMetadata)) {
3582 $this->getSpecificMetadata();
3583 }
3584 return $this->specificMetadata->version;
3585 }
3586 /**
3587 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
3588 * @return string numéro de dossier d'autorisation
3589 */
3590 protected function getNumDemandeAutor() {
3591 if(empty($this->specificMetadata)) {
3592 $this->getSpecificMetadata();
3593 }
3594 return $this->specificMetadata->dossier_autorisation;
3595 }
3596 /**
3597 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
3598 * @return date demande initiale
3599 */
3600 protected function getAnneemoisDemandeAutor() {
3601 if(empty($this->specificMetadata)) {
3602 $this->getSpecificMetadata();
3603 }
3604 return $this->specificMetadata->date_demande_initiale;
3605 }
3606 /**
3607 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
3608 * @return string type de dossier d'instruction
3609 */
3610 protected function getTypeInstruction() {
3611 if(empty($this->specificMetadata)) {
3612 $this->getSpecificMetadata();
3613 }
3614 return $this->specificMetadata->dossier_instruction_type;
3615 }
3616 /**
3617 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
3618 * @return string avis
3619 */
3620 protected function getStatutAutorisation() {
3621 if(empty($this->specificMetadata)) {
3622 $this->getSpecificMetadata();
3623 }
3624 return $this->specificMetadata->statut;
3625 }
3626 /**
3627 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
3628 * @return string type d'autorisation
3629 */
3630 protected function getTypeAutorisation() {
3631 if(empty($this->specificMetadata)) {
3632 $this->getSpecificMetadata();
3633 }
3634 return $this->specificMetadata->dossier_autorisation_type;
3635 }
3636 /**
3637 * Récupération de la date d'ajout de document à ajouter aux métadonnées
3638 * @return date de l'évènement
3639 */
3640 protected function getDateEvenementDocument() {
3641 return date("Y-m-d");
3642 }
3643 /**
3644 * Récupération du groupe d'instruction à ajouter aux métadonnées
3645 * @return string Groupe d'instruction
3646 */
3647 protected function getGroupeInstruction() {
3648 if(empty($this->specificMetadata)) {
3649 $this->getSpecificMetadata();
3650 }
3651 return $this->specificMetadata->groupe_instruction;
3652 }
3653 /**
3654 * Récupération du type de document à ajouter aux métadonnées
3655 * @return string Type de document
3656 */
3657 protected function getTitle() {
3658 if ($this->getParameter("retourformulaire") == "demande_avis_encours") {
3659 return 'Retour de consultation';
3660 } else {
3661 return 'Demande de consultation';
3662 }
3663 }
3664
3665
3666 /**
3667 * Récupération du champ ERP du dossier d'instruction.
3668 *
3669 * @return boolean
3670 */
3671 public function get_concerne_erp() {
3672 //
3673 if(empty($this->specificMetadata)) {
3674 $this->getSpecificMetadata();
3675 }
3676 //
3677 return $this->specificMetadata->erp;
3678 }
3679
3680
3681 /**
3682 * Cette méthode permet de stocker en attribut toutes les métadonnées
3683 * nécessaire à l'ajout d'un document.
3684 */
3685 public function getSpecificMetadata() {
3686 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
3687 $dossier = $this->valF["dossier"];
3688 } else {
3689 $dossier = $this->getVal("dossier");
3690 }
3691 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
3692 $qres = $this->f->get_all_results_from_db_query(
3693 sprintf(
3694 'SELECT
3695 dossier.dossier AS dossier,
3696 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
3697 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
3698 dossier_instruction_type.code AS dossier_instruction_type,
3699 etat_dossier_autorisation.libelle AS statut,
3700 dossier_autorisation_type.code AS dossier_autorisation_type,
3701 groupe.code AS groupe_instruction,
3702 CASE WHEN dossier.erp IS TRUE
3703 THEN \'true\'
3704 ELSE \'false\'
3705 END AS erp
3706 FROM
3707 %1$sdossier
3708 LEFT JOIN %1$sdossier_instruction_type
3709 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
3710 LEFT JOIN %1$sdossier_autorisation
3711 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
3712 LEFT JOIN %1$setat_dossier_autorisation
3713 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
3714 LEFT JOIN %1$sdossier_autorisation_type_detaille
3715 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
3716 LEFT JOIN %1$sdossier_autorisation_type
3717 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
3718 LEFT JOIN %1$sgroupe
3719 ON dossier_autorisation_type.groupe = groupe.groupe
3720 WHERE
3721 dossier.dossier = \'%2$s\'',
3722 DB_PREFIXE,
3723 $this->f->db->escapeSimple($dossier)
3724 ),
3725 array(
3726 "origin" => __METHOD__,
3727 "mode" => DB_FETCHMODE_OBJECT
3728 )
3729 );
3730
3731 //Le résultat est récupéré dans un objet
3732 $row = array_shift($qres['result']);
3733
3734 //Si il y a un résultat
3735 if ($row !== null) {
3736
3737 // Instrance de la classe dossier
3738 $inst_dossier = $this->get_inst_dossier($dossier);
3739
3740 // Insère l'attribut version à l'objet
3741 $row->version = $inst_dossier->get_di_numero_suffixe();
3742
3743 //Alors on créé l'objet dossier_instruction
3744 $this->specificMetadata = $row;
3745
3746 }
3747 }
3748
3749 /**
3750 *
3751 * @return boolean
3752 */
3753 function is_instructeur(){
3754
3755 //Si l'utilisateur est un instructeur
3756 if ($this->f->isUserInstructeur()){
3757 return true;
3758 }
3759 return false;
3760 }
3761
3762 function is_editable(){
3763 // Impossible de modifier si la consultation est liée à un service Plat'AU
3764 $inst_service = $this->get_inst_service($this->getVal('service'));
3765 if ($inst_service->getVal('service_type') !== null
3766 && $inst_service->getVal('service_type') === PLATAU) {
3767 //
3768 return false;
3769 }
3770
3771 // Si bypass
3772 if ($this->f->can_bypass("consultation", "modifier")){
3773 return true;
3774 }
3775
3776 // Tester si le dossier est cloturé ,
3777 // et si l'instructeur est de la même division
3778 if ($this->is_instructeur_from_division_dossier() === true and
3779 $this->is_dossier_instruction_not_closed() === true) {
3780 return true;
3781 }
3782 return false;
3783 }
3784
3785 function is_deletable(){
3786 // Impossible de supprimer si la tâche Plat'AU de la consultation a été consommée
3787 $inst_task_empty = $this->f->get_inst__om_dbform(array(
3788 "obj" => "task",
3789 "idx" => 0,
3790 ));
3791 $task_exists = $inst_task_empty->task_exists('creation_consultation', $this->getVal($this->clePrimaire));
3792 if ($task_exists !== false) {
3793 $inst_task = $this->f->get_inst__om_dbform(array(
3794 "obj" => "task",
3795 "idx" => $task_exists,
3796 ));
3797 // Si une tâche est lié à la consultation et qu'elle n'est pas à l'état
3798 // "new" la suppression de la consultation n'est pas possible.
3799 if ($inst_task->getVal('state') !== task::STATUS_NEW) {
3800 return false;
3801 }
3802 }
3803
3804 // Suppression possible pour l'instructeur de la division si pas d'avis
3805 if ($this->is_dossier_instruction_not_closed() === true &&
3806 $this->is_instructeur_from_division_dossier() === true &&
3807 $this->getVal("avis_consultation") == "" &&
3808 $this->getVal('fichier') == ""
3809 ){
3810 return true;
3811 }
3812
3813 // Si un avis a été rendu il faut que l'utilisateur ai le droit
3814 // specifique de suppression avec avis rendu et le bypass de division
3815 if ($this->getVal("avis_consultation") != "" or $this->getVal('fichier') != "") {
3816
3817 if ($this->f->can_bypass("consultation", "supprimer") and
3818 $this->f->isAccredited("consultation_supprimer_avec_avis_rendu") == true){
3819 return true;
3820 }
3821 } else {
3822 // Si pas d'avis rendu, le bypass suffit
3823 if ($this->f->can_bypass("consultation", "supprimer")){
3824 return true;
3825 }
3826 }
3827
3828 return false;
3829 }
3830
3831 function is_multiaddable(){
3832
3833 if ($this->f->can_bypass("consultation", "ajouter")){
3834 return true;
3835 }
3836
3837 if ($this->is_instructeur_from_division_dossier() === true){
3838 return true;
3839 }
3840 return false;
3841 }
3842
3843 function is_markable(){
3844
3845 if($this->f->can_bypass("consultation", "modifier_lu")){
3846 return true;
3847 }
3848
3849 if ($this->is_instructeur_from_division_dossier() === true){
3850 return true;
3851 }
3852 return false;
3853 }
3854
3855 // Si la consultation est visible alors on peut afficher le lien pour la masquer
3856 function is_visible() {
3857 if($this->getVal("visible") == 't') {
3858 return true;
3859 }
3860 return false;
3861 }
3862
3863 // Si la consultation n'est pas visible alors on peut afficher le lien pour l'afficher
3864 function is_not_visible() {
3865 if($this->getVal("visible") == 'f') {
3866 return true;
3867 }
3868 return false;
3869 }
3870
3871 function is_finalizable(){
3872 // Vérifie si la variable contenant les informations nécessaire pour la
3873 // vérification est initialisé et si ce n'est pas le cas elle est initialisée
3874 if ($this->valElementConsulte == array()) {
3875 if (! $this->set_val_element_consulte()) {
3876 return false;
3877 }
3878 }
3879
3880 // Vérifie si la génération d'édition est disponible pour le service / motif
3881 if ($this->valElementConsulte['generate_edition'] !== 't') {
3882 return false;
3883 }
3884
3885 if($this->f->can_bypass("consultation", "finaliser")){
3886 return true;
3887 }
3888
3889 if ($this->is_instructeur_from_division_dossier() === true &&
3890 $this->is_dossier_instruction_not_closed() === true){
3891 return true;
3892 }
3893
3894 return false;
3895 }
3896
3897 function is_unfinalizable(){
3898 // Vérifie si la variable contenant les informations nécessaire pour la
3899 // vérification est initialisé et si ce n'est pas le cas elle est initalisée
3900 if ($this->valElementConsulte == array()) {
3901 if (! $this->set_val_element_consulte()) {
3902 return false;
3903 }
3904 }
3905
3906 if ($this->valElementConsulte['generate_edition'] !== 't') {
3907 return false;
3908 }
3909
3910 if ($this->valElementConsulte['service_type'] === PLATAU) {
3911 return false;
3912 }
3913
3914 if($this->f->can_bypass("consultation", "definaliser")){
3915 return true;
3916 }
3917
3918 if ($this->is_instructeur_from_division_dossier() === true &&
3919 $this->is_dossier_instruction_not_closed() === true){
3920 return true;
3921 }
3922
3923 return false;
3924 }
3925
3926 /**
3927 * Cette méthode vérifie à l'aide d'une requête sql si des tiers ont été paramétrés.
3928 * Si c'est le cas on renvoie true sinon renvoie false.
3929 *
3930 * Si la requête échoue la méthode renverra false.
3931 *
3932 * @return boolean
3933 */
3934 public function is_tiers_parametre() {
3935 // Récupère la requête de remplissage de la liste de sélection des tiers
3936 // consulté
3937 $qres = $this->f->get_all_results_from_db_query(
3938 $this->get_var_sql_forminc__sql_tiers_consulte(),
3939 array(
3940 "origin" => __METHOD__
3941 )
3942 );
3943 // Récupère les résultats de la requête. Si on ne récupère pas de résultats ou
3944 // que la requête est en erreur renvoie false.
3945 // PP : vérification du retour de isDatabaseError sans activer le retour
3946 if ($qres['code'] !== 'OK') {
3947 return false;
3948 }
3949 if ($qres['row_count'] == 0) {
3950 return false;
3951 }
3952 // Si on a des résultats alors des tiers ont été paramétrés
3953 return true;
3954 }
3955
3956 /*
3957 * CONDITION - can_show_or_hide_in_edition
3958 *
3959 * Vérifie que l'utilisateur possède la permission bypass.
3960 * Vérifie que l'utilisateur est un instructeur, qu'il fait partie de la
3961 * division du dossier et que le dossier n'est pas clôturé.
3962 *
3963 * Cette méthode est identique aux conditions dans consultation.inc.php
3964 * permettant l'affichage des actions depuis le listing des consultations.
3965 * Il est nécessaire que cette méthode ainsi que la condition if restent
3966 * concordants en tout point afin que le comportement des actions soit
3967 * identique depuis le formulaire et depuis le listing.
3968 *
3969 * @return boolean
3970 *
3971 */
3972 function can_show_or_hide_in_edition() {
3973
3974 //
3975 if ($this->f->can_bypass("consultation", "visibilite_dans_edition") === true){
3976 return true;
3977 }
3978
3979 //
3980 if ($this->is_instructeur_from_division_dossier() === true and
3981 $this->is_dossier_instruction_not_closed() === true) {
3982 return true;
3983 }
3984 return false;
3985 }
3986
3987 /*
3988 * CONDITION - can_user_access_dossier_contexte_ajout
3989 *
3990 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
3991 * formulaire d'ajout.
3992 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
3993 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
3994 *
3995 */
3996 function can_user_access_dossier_contexte_ajout() {
3997
3998 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
3999 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
4000 //
4001 if ($id_dossier !== "") {
4002 $dossier = $this->f->get_inst__om_dbform(array(
4003 "obj" => "dossier_instruction",
4004 "idx" => $id_dossier,
4005 ));
4006 //
4007 return $dossier->can_user_access_dossier();
4008 }
4009 return false;
4010 }
4011
4012 /*
4013 * CONDITION - can_user_access_dossier_contexte_modification
4014 *
4015 * Vérifie que l'utilisateur a bien accès au dossier lié à la consultation.
4016 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
4017 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
4018 *
4019 */
4020 function can_user_access_dossier_contexte_modification() {
4021
4022 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
4023 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
4024
4025 if ($id_dossier != "") {
4026 $dossier = $this->f->get_inst__om_dbform(array(
4027 "obj" => "dossier",
4028 "idx" => $id_dossier,
4029 ));
4030 //
4031 return $dossier->can_user_access_dossier();
4032 }
4033 return false;
4034 }
4035
4036 /**
4037 * [is_viewable description]
4038 * @return boolean [description]
4039 */
4040 function is_viewable() {
4041 // Vérifie si la variable contenant les informations nécessaire pour la
4042 // vérification est initialisé et si ce n'est pas le cas elle est initalisée
4043 if ($this->valElementConsulte == array()) {
4044 if (! $this->set_val_element_consulte()) {
4045 return false;
4046 }
4047 }
4048 if ($this->valElementConsulte['generate_edition'] !== 't') {
4049 return false;
4050 }
4051
4052 return true;
4053 }
4054
4055 /**
4056 * Indique si la redirection vers le lien de retour est activée ou non.
4057 *
4058 * L'objectif de cette méthode est de permettre d'activer ou de désactiver
4059 * la redirection dans certains contextes.
4060 *
4061 * @return boolean
4062 */
4063 function is_back_link_redirect_activated() {
4064 //
4065 if ($this->getParameter("maj") == 100) {
4066 //
4067 return false;
4068 }
4069 //
4070 return true;
4071 }
4072
4073 // XXX WIP
4074 public function get_json_data() {
4075 $val = array_combine($this->champs, $this->val);
4076 foreach ($val as $key => $value) {
4077 $val[$key] = strip_tags($value);
4078 }
4079 return $val;
4080 }
4081
4082 protected function getDocumentType($champ = null) {
4083 $serviceId = $this->getVal('service');
4084 if (empty($serviceId) && isset($this->valF['service'])) {
4085 $serviceId = $this->valF['service'];
4086 }
4087 if (! empty($serviceId)) {
4088 $service = $this->f->findObjectById('service', $serviceId);
4089 if (! empty($service)) {
4090 return __("Consultation").':'.$service->getVal('libelle');
4091 }
4092 }
4093 return parent::getDocumentType();
4094 }
4095
4096 /**
4097 * Affiche la page de téléchargement du document de la notification.
4098 *
4099 * @param boolean $content_only Affiche le contenu seulement.
4100 *
4101 * @return void
4102 */
4103 public function view_telecharger_document_anonym() {
4104 // Par défaut on considère qu'on va afficher le formulaire
4105 $idx = 0;
4106 // Flag d'erreur
4107 $error = false;
4108 // Message d'erreur
4109 $message = '';
4110
4111 // Paramètres GET : récupération de la clé d'accès
4112 $cle_acces_document = $this->f->get_submitted_get_value('key');
4113 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
4114 // Vérification de l'existence de la clé et récupération de l'uid du fichier
4115 $uidFichier = $this->getUidDocumentConsultationWithKey($cle_acces_document);
4116 if ($uidFichier != null) {
4117 // Récupération du document
4118 $file = $this->f->storage->get($uidFichier);
4119
4120 // Headers
4121 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
4122 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
4123 header("Content-Type: ".$file['metadata']['mimetype']);
4124 header("Accept-Ranges: bytes");
4125 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
4126 // Affichage du document
4127 echo $file['file_content'];
4128
4129 // Récupération de la date de premier accès et maj du suivi uniquement
4130 // si la date de 1er accès n'a pas encore été remplis
4131 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
4132 if ($inst_notif->getVal('date_premier_acces') == null ||
4133 $inst_notif->getVal('date_premier_acces') == '') {
4134 $notif_val = array();
4135 foreach ($inst_notif->champs as $champ) {
4136 $notif_val[$champ] = $inst_notif->getVal($champ);
4137 }
4138 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
4139 $notif_val['statut'] = 'vu';
4140 $notif_val['commentaire'] = 'Le document a été vu';
4141 $suivi_notif = $inst_notif->modifier($notif_val);
4142 }
4143
4144 } else {
4145 // Page vide 404
4146 printf('Ressource inexistante');
4147 header('HTTP/1.0 404 Not Found');
4148 }
4149 }
4150 /**
4151 * Récupère une clé et renvoie l'uid du document liée à cette
4152 * clé. Si la clé n'existe pas renvoie null.
4153 *
4154 * @param string $cleGen clé dont on cherche l'instruction
4155 * @return integer|null
4156 */
4157 protected function getUidDocumentConsultationWithKey($cleGen) {
4158 $qres = $this->f->get_one_result_from_db_query(
4159 sprintf(
4160 'SELECT
4161 consultation.fichier
4162 FROM
4163 %1$sinstruction_notification_document
4164 LEFT JOIN %1$sconsultation
4165 ON instruction_notification_document.document_id = consultation.consultation
4166 WHERE
4167 instruction_notification_document.cle = \'%2$s\'',
4168 DB_PREFIXE,
4169 $this->f->db->escapeSimple($cleGen)
4170 ),
4171 array(
4172 "origin" => __METHOD__,
4173 )
4174 );
4175 return $qres["result"];
4176 }
4177
4178 /**
4179 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
4180 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
4181 *
4182 * @param string $cleGen
4183 * @return instruction_notification
4184 */
4185 protected function getInstanceNotificationWithKey($key) {
4186 // TODO : refactoriser pour éviter d'avoir a réecrire cette méthode dans chaque classe
4187 // a laquelle la consultation anonyme des documents est associée
4188 $qres = $this->f->get_one_result_from_db_query(
4189 sprintf(
4190 'SELECT
4191 instruction_notification
4192 FROM
4193 %1$sinstruction_notification_document
4194 WHERE
4195 cle = \'%2$s\'',
4196 DB_PREFIXE,
4197 $this->f->db->escapeSimple($key)
4198 ),
4199 array(
4200 "origin" => __METHOD__,
4201 )
4202 );
4203 // Récupération de l'instance de notification
4204 $instNotif = $this->f->get_inst__om_dbform(array(
4205 "obj" => "instruction_notification",
4206 "idx" => $qres["result"],
4207 ));
4208 return $instNotif;
4209 }
4210
4211
4212 /**
4213 * Vérifie la validité des valeurs en mode CREATE & UPDATE.
4214 * (Surcharge)
4215 *
4216 * Les consultations pouvant être des consultations
4217 * de tiers ou de service selon le type de consultations
4218 * certain champs ne doivent pas être null.
4219 * Consultation tiers :
4220 * - categorie tiers consulte
4221 * - tiers consulte
4222 * - motif consultation
4223 * Consultation service :
4224 * - service
4225 * Cette surcharge permet de vérifier que selon le contexte
4226 * les valeurs voulues sont bien renseigné.
4227 *
4228 * @param array $val Tableau des valeurs brutes.
4229 * @param null &$dnu1 @deprecated Ne pas utiliser.
4230 * @param null $dnu2 @deprecated Ne pas utiliser.
4231 *
4232 * @return void
4233 */
4234 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4235 // Ajout des champs concerné à la liste des champs requis
4236 // pour que la vérification de présence des champs requis se fasse aussi
4237 // sur ces champs
4238 $maj = $this->getParameter("maj");
4239 $champsNonNull = array();
4240 // Action liées à l'ajout et la modification de consultation d'un service
4241 if ($maj == '0' || ($maj == '1' && ($this->getVal('service') != null && $this->getVal('service') != ''))) {
4242 $champsNonNull = array('service');
4243 } elseif ($maj == '41'|| ($maj == '1' && ($this->getVal('tiers_consulte') != null && $this->getVal('tiers_consulte') != ''))) {
4244 // Actions liées à l'ajout et la modification de consultation d'un tiers
4245 $champsNonNull = array('categorie_tiers_consulte', 'tiers_consulte', 'motif_consultation');
4246 }
4247 foreach($champsNonNull as $champs) {
4248 $this->required_field[] = $champs;
4249 }
4250 parent::verifier($val, $dnu1, $dnu2);
4251 }
4252
4253 /**
4254 * Vérifie lors de l'ajout de consultation d'un tiers,
4255 * que la liste des catégories de tiers
4256 * correspond aux services (collectivités)
4257 * du dossier d'instruction en cours.
4258 * (Surcharge)
4259 *
4260 * @return string
4261 */
4262 function get_var_sql_forminc__sql_categorie_tiers_consulte() {
4263 return sprintf(
4264 'SELECT DISTINCT
4265 categorie_tiers_consulte.categorie_tiers_consulte,
4266 categorie_tiers_consulte.libelle
4267 FROM
4268 %1$scategorie_tiers_consulte
4269 INNER JOIN %1$slien_categorie_tiers_consulte_om_collectivite
4270 ON lien_categorie_tiers_consulte_om_collectivite.categorie_tiers_consulte = categorie_tiers_consulte.categorie_tiers_consulte
4271 INNER JOIN %1$som_collectivite
4272 ON om_collectivite.om_collectivite = lien_categorie_tiers_consulte_om_collectivite.om_collectivite AND
4273 om_collectivite.om_collectivite = <om_collectivite_idx>
4274 WHERE
4275 ((categorie_tiers_consulte.om_validite_debut IS NULL AND
4276 (categorie_tiers_consulte.om_validite_fin IS NULL OR categorie_tiers_consulte.om_validite_fin > CURRENT_DATE)) OR (categorie_tiers_consulte.om_validite_debut <= CURRENT_DATE AND
4277 (categorie_tiers_consulte.om_validite_fin IS NULL OR categorie_tiers_consulte.om_validite_fin > CURRENT_DATE)))
4278 ORDER BY categorie_tiers_consulte.libelle ASC',
4279 DB_PREFIXE
4280 );
4281 }
4282
4283 }// fin classe

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26