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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8989 - (show annotations)
Thu Oct 31 15:09:51 2019 UTC (5 years, 1 month ago) by softime
File size: 288622 byte(s)
Error occurred while calculating annotation data.
* Merge de la branche d'intégration 4.12.0-develop vers le trunk

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26