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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19307 - (show annotations)
Wed Nov 6 10:57:56 2024 UTC (4 weeks ago) by softime
File size: 519684 byte(s)
merge: fusion de la branche d'intégration 6.9.0-develop dans 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 require_once "../obj/task.class.php";
25 require_once "../obj/action.class.php";
26
27 //
28 class instruction extends instruction_gen {
29
30 // Champs contenant les UID des fichiers
31 var $abstract_type = array(
32 "om_fichier_instruction" => "file",
33 );
34
35 var $valEvenement;
36 var $restriction_valid = null;
37 // Tableau contenant une partie des métadonnées arrêtés
38 var $metadonneesArrete;
39
40 /**
41 * Instance de la classe dossier
42 *
43 * @var mixed
44 */
45 var $inst_dossier = null;
46
47 /**
48 * Instance de la classe instructeur
49 *
50 * @var mixed
51 */
52 var $inst_instructeur = null;
53
54 /**
55 * Instance de la classe om_utilisateur
56 *
57 * @var mixed
58 */
59 var $inst_om_utilisateur = null;
60
61 var $metadata = array(
62 "om_fichier_instruction" => array(
63 "dossier" => "getDossier",
64 "dossier_version" => "getDossierVersion",
65 "numDemandeAutor" => "getNumDemandeAutor",
66 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
67 "typeInstruction" => "getTypeInstruction",
68 "statutAutorisation" => "getStatutAutorisation",
69 "typeAutorisation" => "getTypeAutorisation",
70 "dateEvenementDocument" => "getDateEvenementDocument",
71 "groupeInstruction" => 'getGroupeInstruction',
72 "title" => 'getTitle',
73 'concerneERP' => 'get_concerne_erp',
74
75 'date_cloture_metier' => 'getDossierDateDecision',
76 'type' => 'getDocumentType',
77 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
78 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
79 'region' => 'getDossierRegion',
80 'departement' => 'getDossierDepartement',
81 'commune' => 'getDossierCommune',
82 'annee' => 'getDossierAnnee',
83 'division' => 'getDossierDivision',
84 'collectivite' => 'getDossierServiceOrCollectivite',
85 ),
86 "arrete" => array(
87 "numArrete" => "getNumArrete",
88 "ReglementaireArrete" => "getReglementaireArrete",
89 "NotificationArrete" => "getNotificationArrete",
90 "dateNotificationArrete" => "getDateNotificationArrete",
91 "controleLegalite" => "getControleLegalite",
92 "dateSignature" => "getDateSignature",
93 "nomSignataire" => "getNomSignataire",
94 "qualiteSignataire" => "getQualiteSignataire",
95 "ap_numRue" => "getAp_numRue",
96 "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
97 "ap_codePostal" => "getAp_codePostal",
98 "ap_ville" => "getAp_ville",
99 "activite" => "getActivite",
100 "dateControleLegalite" => "getDateControleLegalite",
101 )
102 );
103
104 /**
105 * Flag pour identifier la reprise de l'instruction d'un dossier.
106 * Le statut de l'état passe de "cloture" à "encours".
107 *
108 * @var boolean
109 */
110 var $di_reopened = null;
111
112 /**
113 * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
114 * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
115 *
116 * @param bool $only_for_class Ne renvoie que les modules pour la classe de l'objet
117 *
118 * @return array Liste de modules supplémentaires pour cet objet
119 */
120 public function get_modules_append(bool $only_for_class = false) {
121 $modules = array();
122
123 // si on est sur un dossier d'instruction
124 if ($this->f->contexte_dossier_instruction()) {
125 $idx = $this->f->get_submitted_get_value('idxformulaire');
126
127 $object_id = $this->getVal($this->clePrimaire);
128
129 $evenements_ids = array();
130
131 // Dans le cas ou on a un identifiant de dossier et que
132 // l'objet courant n'a pas de cle primaire définie
133 // ou qu'on est dans le contexte d'une classe d'objet
134 if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
135
136 // Utilise la valeur evenement si elle est déterminé,
137 $evenement = $this->f->get_submitted_post_value('evenement');
138 if (! empty($evenement)) $evenements_ids = array($evenement);
139 // On déclenche soit lors du premier affichage d'un instruction,
140 // soit dans le cas retour en refus de la validation du formulaire.
141 $action = $this->f->get_submitted_get_value('action');
142
143 if (empty($evenements_ids) || ($this->correct !== true && $action == '0')){
144 // si on est dans le cadre de l'affichage d'une nouvelle instruction
145 if ($action == '0') {
146
147 // ajoute les modules des évènements possible sur le dossier courant
148 $evenements_data = $this->get_var_sql_forminc__sql_evenement();
149 $evenements_ids = array_column($evenements_data, 'evenement');
150 }
151
152 // si on est dans le cadre d'un listing
153 else if (is_null($action) || $action === '') {
154
155 // récupère la liste des évènements d'instructions du dossier d'instruction
156 $sql = sprintf("
157 SELECT
158 evenement
159 FROM
160 ".DB_PREFIXE."instruction
161 WHERE
162 dossier = '%s'
163 ", $this->f->db->escapeSimple($idx));
164 $qres = $this->f->get_all_results_from_db_query(
165 $sql, array('origin' => __METHOD__));
166 if ($qres['code'] !== 'OK') {
167 $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
168 $this->f->log(__METHOD__, $err_msg, 'ERROR');
169 throw new RuntimeException($err_msg);
170 }
171
172 // ajoute les modules des évènements des instructions du dossier courant
173 $evenements_ids = array_column($qres['result'], 'evenement');
174 }
175 }
176 }
177 if (!empty($evenements_ids)){
178 $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
179 $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
180 'evenement', $evenements_ids, $this, false);
181 }
182 }
183 return $modules;
184 }
185
186 // {{{ Gestion de la confidentialité des données spécifiques
187
188 /**
189 * Définition des actions disponibles sur la classe.
190 *
191 * @return void
192 */
193 function init_class_actions() {
194
195 parent::init_class_actions();
196
197 // ACTION - 000 - ajouter
198 // Modifie la condition d'affichage du bouton ajouter
199 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
200
201 // ACTION - 001 - modifier
202 // Modifie la condition et le libellé du bouton modifier
203 $this->class_actions[1]["condition"] = array(
204 "is_editable",
205 "is_finalizable_without_bypass",
206 "can_user_access_dossier_contexte_modification",
207 "is_evenement_modifiable",
208 );
209 $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
210
211 // ACTION - 002 - supprimer
212 // Modifie la condition et le libellé du bouton supprimer
213 $this->class_actions[2]["condition"] = array(
214 "is_deletable",
215 "is_finalizable_without_bypass",
216 "can_user_access_dossier_contexte_modification",
217 "is_evenement_supprimable",
218 );
219 $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
220
221 // ACTION - 003 - consulter
222 //
223 $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
224
225 // ACTION - 100 - finaliser
226 // Finalise l'enregistrement
227 $this->class_actions[100] = array(
228 "identifier" => "finaliser",
229 "portlet" => array(
230 "type" => "action-direct",
231 "libelle" => __("Finaliser le document"),
232 "order" => 110,
233 "class" => "finalise",
234 ),
235 "view" => "formulaire",
236 "method" => "finalize",
237 "button" => "finaliser",
238 "permission_suffix" => "finaliser",
239 "condition" => array(
240 "is_finalizable",
241 "is_finalizable_without_bypass",
242 "has_an_edition",
243 "can_user_access_dossier_contexte_modification",
244 ),
245 );
246
247 // ACTION - 110 - definaliser
248 // Finalise l'enregistrement
249 $this->class_actions[110] = array(
250 "identifier" => "definaliser",
251 "portlet" => array(
252 "type" => "action-direct",
253 "libelle" => __("Reprendre la redaction du document"),
254 "order" => 110,
255 "class" => "definalise",
256 ),
257 "view" => "formulaire",
258 "method" => "unfinalize",
259 "button" => "definaliser",
260 "permission_suffix" => "definaliser",
261 "condition" => array(
262 "is_unfinalizable",
263 "is_unfinalizable_without_bypass",
264 "can_user_access_dossier_contexte_modification",
265 "is_not_sent_for_signature",
266 "is_not_signed",
267 ),
268 );
269
270 // ACTION - 115 - Modification d'un document généré par une instruction
271 // Permet à un instructeur de modifier un document généré par une instruction
272 $this->class_actions[115] = array(
273 "identifier" => "modale_selection_document_signe",
274 "portlet" => array(
275 "type" => "action-self",
276 "libelle" => __("Remplacer par le document signé"),
277 "order" => 115,
278 "class" => "selection-document-signé",
279 ),
280 "view" => "view_modale_selection_document_signe",
281 "permission_suffix" => "selection_document_signe",
282 "condition" => array(
283 "is_finalized",
284 "is_not_date_retour_signature_set",
285 ),
286 );
287
288 // ACTION - 120 - edition
289 // Affiche l'édition
290 $this->class_actions[120] = array(
291 "identifier" => "edition",
292 "portlet" => array(
293 "type" => "action-blank",
294 "libelle" => __("Edition"),
295 "order" => 100,
296 "class" => "pdf-16",
297 ),
298 "view" => "view_edition",
299 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
300 "permission_suffix" => "om_fichier_instruction_telecharger",
301 );
302
303 // ACTION - 125 - modifier_suivi
304 // Suivi des dates
305 $this->class_actions[125] = array(
306 "identifier" => "modifier_suivi",
307 "portlet" => array(
308 "type" => "action-self",
309 "libelle" => __("Suivi des dates"),
310 "order" => 125,
311 "class" => "suivi-dates-16",
312 ),
313 "crud" => "update",
314 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
315 "permission_suffix" => "modification_dates",
316 );
317
318 // ACTION - 130 - bible
319 // Affiche la bible
320 $this->class_actions[130] = array(
321 "identifier" => "bible",
322 "view" => "view_bible",
323 "permission_suffix" => "modifier",
324 );
325
326 // ACTION - 140 - bible_auto
327 // Active la bible automatique
328 $this->class_actions[140] = array(
329 "identifier" => "bible_auto",
330 "view" => "view_bible_auto",
331 "permission_suffix" => "modifier",
332 );
333
334 // ACTION - 150 - suivi_bordereaux
335 // Imprimer un bordereau d'envoi
336 $this->class_actions[150] = array(
337 "identifier" => "suivi_bordereaux",
338 "view" => "view_suivi_bordereaux",
339 "permission_suffix" => "consulter",
340 );
341
342 // ACTION - 160 - suivi_envoi_lettre_rar
343 // Imprimer un bordereau d'envoi
344 $this->class_actions[160] = array(
345 "identifier" => "suivi_envoi_lettre_rar",
346 "view" => "view_suivi_envoi_lettre_rar",
347 "permission_suffix" => "consulter",
348 );
349
350 // ACTION - 170 - suivi_mise_a_jour_des_dates
351 // Mettre à jour les dates de l'instruction
352 $this->class_actions[170] = array(
353 "identifier" => "suivi_mise_a_jour_des_dates",
354 "view" => "view_suivi_mise_a_jour_des_dates",
355 "permission_suffix" => "consulter",
356 );
357
358 // ACTION - 175 - edit_by_notification_task
359 // Action à utiliser lors de la mise à jour des instructions par notification
360 $this->class_actions[175] = array(
361 "identifier" => "edit_by_notification_task",
362 "view" => "formulaire",
363 "permission_suffix" => "modifier",
364 "crud" => "update",
365 );
366
367 // ACTION - 176 - add_by_evenement_retour_after_notification_task
368 // Action à utiliser lors de l'ajout des instructions par événement suivant
369 // suite à une notification par tâche (donc notification dématerialisée)
370 $this->class_actions[176] = array(
371 "identifier" => "add_by_evenement_retour_after_notification_task",
372 "view" => "formulaire",
373 "permission_suffix" => "ajouter",
374 "crud" => "create",
375 );
376
377 // ACTION - 180 - pdf_lettre_rar
378 // Génère PDF sur bordereaux de lettres AR
379 $this->class_actions[180] = array(
380 "identifier" => "pdf_lettre_rar",
381 "view" => "view_pdf_lettre_rar",
382 "permission_suffix" => "consulter",
383 );
384
385 // ACTION - 190 - bordereau_envoi_maire
386 // Formulaire pour générer le bordereau d'envoi au maire
387 // Met à jour la date d'envoi à signature du maire
388 $this->class_actions[190] = array(
389 "identifier" => "bordereau_envoi_maire",
390 "view" => "view_bordereau_envoi_maire",
391 "permission_suffix" => "bordereau_envoi_maire",
392 );
393
394 // ACTION - 200 - generate_bordereau_envoi_maire
395 // Génère PDF bordereau d'envoi au maire
396 $this->class_actions[200] = array(
397 "identifier" => "generate_bordereau_envoi_maire",
398 "view" => "view_generate_bordereau_envoi_maire",
399 "permission_suffix" => "bordereau_envoi_maire",
400 );
401
402 // ACTION - 210 - notifier_commune
403 // Notifie la commune par mail d'un évément d'instruction finalisé
404 $this->class_actions[210] = array(
405 "identifier" => "notifier_commune",
406 "portlet" => array(
407 "type" => "action-direct-with-confirmation",
408 "libelle" => __("Notifier la commune par courriel"),
409 "order" => 210,
410 "class" => "notifier_commune-16",
411 ),
412 "view" => "formulaire",
413 "method" => "notifier_commune",
414 "permission_suffix" => "notifier_commune",
415 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
416 );
417
418 // ACTION - 220 - generate_suivi_bordereaux
419 // GénÚre PDF bordereaux
420 $this->class_actions[220] = array(
421 "identifier" => "generate_suivi_bordereaux",
422 "view" => "view_generate_suivi_bordereaux",
423 "permission_suffix" => "consulter",
424 );
425
426 // ACTION - 777 - pdf_temp
427 // Crée un PDF temporaire et affiche son contenu en base64
428 $this->class_actions[777] = array(
429 "identifier" => "pdf_temp",
430 "view" => "view_pdf_temp",
431 "permission_suffix" => "modifier",
432 "condition" => array("can_user_access_dossier_contexte_modification"),
433 );
434
435 // ACTION - 701
436 $this->class_actions[701] = array(
437 "identifier" => "enable-edition-integrale",
438 "portlet" => array(
439 "type" => "action-direct-with-confirmation",
440 "libelle" => __("Rédaction libre"),
441 "order" => 50,
442 "class" => "redac-libre-16",
443 ),
444 "view" => "formulaire",
445 "method" => "enable_edition_integrale",
446 "permission_suffix" => "modifier",
447 "condition" => array(
448 "is_editable",
449 "is_finalizable_without_bypass",
450 "can_user_access_dossier_contexte_modification",
451 "is_edition_integrale_not_enabled",
452 "is_option_redaction_libre_enabled",
453 "has_an_edition",
454 ),
455 );
456 // ACTION - 702
457 $this->class_actions[702] = array(
458 "identifier" => "disable-edition-integrale",
459 "portlet" => array(
460 "type" => "action-direct-with-confirmation",
461 "libelle" => __("Rédaction par compléments"),
462 "order" => 50,
463 "class" => "redac-complement-16",
464 ),
465 "view" => "formulaire",
466 "method" => "disable_edition_integrale",
467 "permission_suffix" => "modifier",
468 "condition" => array(
469 "is_editable",
470 "is_finalizable_without_bypass",
471 "can_user_access_dossier_contexte_modification",
472 "is_edition_integrale_enabled",
473 "is_option_redaction_libre_enabled",
474 "has_an_edition",
475 ),
476 );
477 // ACTION - 300 - evenement_has_an_edition_json
478 //
479 $this->class_actions[300] = array(
480 "identifier" => "evenement_has_an_edition_json",
481 "view" => "view_evenement_has_an_edition_json",
482 "permission_suffix" => "consulter",
483 );
484
485 // ACTION - 301 - evenement_has_a_commentaire
486 //
487 $this->class_actions[301] = array(
488 "identifier" => "evenement_has_a_commentaire_json",
489 "view" => "view_evenement_has_a_commentaire_json",
490 "permission_suffix" => "consulter",
491 );
492
493 // ACTION - 400 - Envoyer en signature
494 // Cet évenement permet d'envoyer le document au parapheur pour signature
495 $this->class_actions[400] = array(
496 "identifier" => "envoyer_a_signature",
497 "portlet" => array(
498 "libelle" => __("Envoyer à signature"),
499 "type" => "action-direct-with-confirmation",
500 "class" => "envoyer_a_signature-16",
501 ),
502 "view" => "formulaire",
503 "method" => "envoyer_a_signature_sans_relecture",
504 "condition" => array(
505 "can_be_signed",
506 ),
507 "permission_suffix" => "envoyer_a_signature",
508 );
509
510 // ACTION - 402 - Envoyer en signature avec relecture
511 // Cet évenement permet d'envoyer le document au parapheur pour signature
512 $this->class_actions[402] = array(
513 "identifier" => "envoyer_a_signature_relecture",
514 "portlet" => array(
515 "libelle" => __("Envoyer à signature avec relecture"),
516 "type" => "action-direct-with-confirmation",
517 "class" => "envoyer_a_signature-16",
518 ),
519 "view" => "formulaire",
520 "method" => "envoyer_a_signature_avec_relecture",
521 "condition" => array(
522 "can_be_signed",
523 "is_parapheur_relecture_parameter_enabled"
524 ),
525 "permission_suffix" => "envoyer_a_signature",
526 );
527
528 // ACTION - 404 - Annuler l'envoi en signature
529 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
530 $this->class_actions[404] = array(
531 "identifier" => "annuler_envoi_signature",
532 "portlet" => array(
533 "libelle" => __("Annuler l'envoi en signature"),
534 "type" => "action-direct-with-confirmation",
535 "class" => "annuler_envoi_signature-16",
536 ),
537 "view" => "formulaire",
538 "method" => "annuler_envoi_en_signature",
539 "condition" => array(
540 "is_sent_for_signature",
541 "is_parapheur_annulation_parameter_enabled"
542 ),
543 "permission_suffix" => "envoyer_a_signature",
544 );
545
546 //
547 $this->class_actions[401] = array(
548 "identifier" => "preview_edition",
549 "view" => "formulaire",
550 "permission_suffix" => "tab",
551 );
552
553 //
554 $this->class_actions[405] = array(
555 "identifier" => "telecharger_editions",
556 "view" => "view_telecharger_editions",
557 "permission_suffix" => "om_fichier_instruction_telecharger",
558 );
559
560 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
561 $this->class_actions[410] = array(
562 "identifier" => "overlay_notification_manuelle",
563 "portlet" => array(
564 "libelle" => __("Notifier les pétitionnaires"),
565 "type" => "action-self",
566 "class" => "notifier_commune-16",
567 ),
568 "condition" => array(
569 "is_notifiable_by_task_manual",
570 "is_not_portail_notification_sans_annexe"
571 ),
572 "view" => "view_overlay_notification_manuelle",
573 "permission_suffix" => "modifier",
574 );
575
576 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
577 $this->class_actions[411] = array(
578 "identifier" => "notification_manuelle_portal",
579 "portlet" => array(
580 "libelle" => __("Notifier les pétitionnaires"),
581 "type" => "action-direct-with-confirmation",
582 "class" => "notifier_commune-16",
583 ),
584 "condition" => array(
585 "is_notifiable_by_task_manual",
586 "is_portail_notification_sans_annexe"
587 ),
588 "method" => "notifier_demandeur_principal_via_portal",
589 "permission_suffix" => "modifier",
590 );
591
592 // ACTION - 412 - Vérifie le dépassement de la date limite de notification
593 $this->class_actions[412] = array(
594 "identifier" => "is_date_limite_notification_dossier_depasse",
595 "view" => "is_date_limite_notification_dossier_depasse",
596 "permission_suffix" => "modifier",
597 );
598
599 // ACTION - 420 - Notifier les services consultés (mail)
600 $this->class_actions[420] = array(
601 "identifier" => "overlay_notification_service_consulte",
602 "portlet" => array(
603 "libelle" => __("Notifier les services consultés"),
604 "type" => "action-self",
605 "class" => "notifier_commune-16",
606 ),
607 "condition" => array(
608 "is_service_notifiable"
609 ),
610 "view" => "view_overlay_notification_service_consulte",
611 "permission_suffix" => "tab",
612 );
613
614 // ACTION - 430 - Notifier les tiers consultés (mail)
615 $this->class_actions[430] = array(
616 "identifier" => "overlay_notification_tiers_consulte",
617 "portlet" => array(
618 "libelle" => __("Notifier les tiers consultés"),
619 "type" => "action-self",
620 "class" => "notifier_commune-16",
621 ),
622 "condition" => array(
623 "is_tiers_notifiable"
624 ),
625 "view" => "view_overlay_notification_tiers_consulte",
626 "permission_suffix" => "tab",
627 );
628
629 //
630 $this->class_actions[403] = array(
631 "identifier" => "envoyer_au_controle_de_legalite",
632 "portlet" => array(
633 "libelle" => __("Envoyer au contrôle de légalité"),
634 "type" => "action-direct-with-confirmation",
635 "class" => "envoyer_au_controle_de_legalite-16",
636 ),
637 "view" => "formulaire",
638 "method" => "envoyer_au_controle_de_legalite",
639 "condition" => array(
640 "can_be_sent_to_cl"
641 ),
642 "permission_suffix" => "envoyer_au_controle_de_legalite",
643 );
644
645 //
646 $this->class_actions[998] = array(
647 "identifier" => "json_data",
648 "view" => "view_json_data",
649 "permission_suffix" => "consulter",
650 );
651 }
652
653 /**
654 * Clause select pour la requête de sélection des données de l'enregistrement.
655 *
656 * @return array
657 */
658 function get_var_sql_forminc__champs() {
659 return array(
660 "instruction",
661 "destinataire",
662 "instruction.evenement",
663 "instruction.commentaire",
664 "date_evenement",
665 "document_type_instruction",
666 "fichier_instruction_name",
667 "instruction.lettretype",
668 "signataire_arrete",
669 "flag_edition_integrale",
670 "om_final_instruction_utilisateur",
671 "date_finalisation_courrier",
672 "date_envoi_signature",
673 "date_retour_signature",
674 "date_envoi_rar",
675
676 "date_retour_rar",
677 "date_envoi_controle_legalite",
678 "date_retour_controle_legalite",
679
680 "numero_arrete",
681
682 "complement_om_html",
683 "'' as bible_auto",
684 "'' as bible",
685 "complement2_om_html",
686 "'' as bible2",
687 "complement3_om_html",
688 "'' as bible3",
689 "complement4_om_html",
690 "'' as bible4",
691
692 "titre_om_htmletat",
693 "corps_om_htmletatex",
694
695 "'' as btn_preview",
696 "'' as btn_redaction",
697
698 "'' as btn_refresh",
699 "'' as live_preview",
700
701 "dossier",
702 "instruction.action",
703 "instruction.delai",
704 "instruction.etat",
705 "instruction.autorite_competente",
706 "instruction.accord_tacite",
707 "instruction.delai_notification",
708 "instruction.avis_decision",
709 "archive_delai",
710 "archive_accord_tacite",
711 "archive_etat",
712 "archive_avis",
713 "archive_date_complet",
714 "archive_date_rejet",
715 "archive_date_limite",
716 "archive_date_notification_delai",
717 "archive_date_decision",
718 "archive_date_validite",
719 "archive_date_achevement",
720 "archive_date_conformite",
721 "archive_date_chantier",
722 "archive_date_dernier_depot",
723 "date_depot",
724 "date_depot_mairie",
725 "complement5_om_html",
726 "'' as bible5",
727 "complement6_om_html",
728 "'' as bible6",
729 "complement7_om_html",
730 "'' as bible7",
731 "complement8_om_html",
732 "'' as bible8",
733 "complement9_om_html",
734 "'' as bible9",
735 "complement10_om_html",
736 "'' as bible10",
737 "complement11_om_html",
738 "'' as bible11",
739 "complement12_om_html",
740 "complement13_om_html",
741 "complement14_om_html",
742 "complement15_om_html",
743 "archive_incompletude",
744 "archive_incomplet_notifie",
745 "archive_evenement_suivant_tacite",
746 "archive_evenement_suivant_tacite_incompletude",
747 "archive_etat_pendant_incompletude",
748 "archive_date_limite_incompletude",
749 "archive_delai_incompletude",
750 "archive_autorite_competente",
751 "code_barres",
752 "om_fichier_instruction",
753 "om_final_instruction",
754 "om_fichier_instruction_dossier_final",
755 "document_numerise",
756 "duree_validite_parametrage",
757 "duree_validite",
758 "created_by_commune",
759 "archive_date_cloture_instruction",
760 "archive_date_premiere_visite",
761 "archive_date_derniere_visite",
762 "archive_date_contradictoire",
763 "archive_date_retour_contradictoire",
764 "archive_date_ait",
765 "archive_date_transmission_parquet",
766 "archive_dossier_instruction_type",
767 "archive_date_affichage",
768 "pec_metier",
769 "archive_pec_metier",
770 "archive_a_qualifier",
771 "id_parapheur_signature",
772 "statut_signature",
773 "commentaire_signature",
774 "historique_signature",
775 "'' as suivi_notification",
776 "'' as suivi_notification_service",
777 "'' as suivi_notification_tiers",
778 "'' as suivi_notification_commune",
779
780 "'' as preview_edition",
781 "envoye_cl_platau",
782 "'' as log_instruction",
783 "parapheur_lien_page_signature"
784 );
785 }
786
787 /**
788 * CONDITION - is_edition_integrale_enabled
789 *
790 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
791 *
792 * @return boolean
793 */
794 function is_edition_integrale_enabled() {
795 if ($this->getVal("flag_edition_integrale") == 't') {
796 return true;
797 }
798 return false;
799 }
800
801 /**
802 * CONDITION - is_edition_integrale_not_enabled
803 *
804 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
805 *
806 * @return boolean
807 */
808 function is_edition_integrale_not_enabled() {
809 return !$this->is_edition_integrale_enabled();
810 }
811
812 /**
813 * CONDITION - is_option_redaction_libre_enabled
814 *
815 * Vérifie que l'option de rédaction libre est activée.
816 *
817 * @return boolean
818 */
819 function is_option_redaction_libre_enabled() {
820 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
821 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
822 }
823
824 /**
825 * CONDITION - is_option_parapheur_relecture_enabled
826 *
827 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
828 *
829 * @return boolean
830 */
831 function is_parapheur_relecture_parameter_enabled() {
832 //Instanciation de la classe electronicsignature
833 $inst_es = $this->get_electronicsignature_instance();
834 if ($inst_es === false) {
835 return false;
836 }
837
838 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
839 return false;
840 }
841
842 return true;
843 }
844
845 /**
846 * CONDITION - is_parapheur_annulation_parameter_enabled
847 *
848 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
849 *
850 * @return boolean
851 */
852 function is_parapheur_annulation_parameter_enabled() {
853 //Instanciation de la classe electronicsignature
854 $inst_es = $this->get_electronicsignature_instance();
855 if ($inst_es === false) {
856 return false;
857 }
858
859 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
860 return false;
861 }
862
863 return true;
864 }
865
866
867 /**
868 * CONDITION - is_sent_for_signature
869 *
870 * Vérifie que l'instruction a été envoyé à signature
871 *
872 * @return boolean
873 */
874 function is_sent_for_signature() {
875 // Si un parapheur a été configuré
876 // et que le champ id_parapheur_signature n'est pas vide
877 // que le status est différent de "canceled" ou "expired"
878 // alors l'évènement a été envoyé en signature
879 if ($this->has_connector_electronicsignature() === true
880 && empty($this->getVal("id_parapheur_signature")) === false
881 && ($this->getVal("statut_signature") != "canceled"
882 && $this->getVal("statut_signature") != "expired"
883 && $this->getVal("statut_signature") != "finished")) {
884 //
885 return true;
886 }
887
888 return false;
889 }
890
891 /**
892 * CONDITION - is_not_sent_for_signature
893 *
894 * Vérifie que l'instruction n'a pas été envoyé à signature
895 *
896 * @return boolean
897 */
898 function is_not_sent_for_signature() {
899 // Contrôle si l'utilisateur possède un bypass
900 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
901 if ($bypass == true) {
902 return true;
903 }
904
905 return !$this->is_sent_for_signature();
906 }
907
908
909 /**
910 * CONDITION - is_signed
911 *
912 * Vérifie que l'instruction a été signé
913 *
914 * @return boolean
915 */
916 function is_signed() {
917 // Si un parapheur a été configuré
918 // et que le champ id_parapheur_signature n'est pas vide
919 // et que le statut est égal à "finished"
920 // alors le document de l'instruciton à été signé
921 if ($this->has_connector_electronicsignature() === true
922 && empty($this->getVal("id_parapheur_signature")) === false
923 && $this->getVal("statut_signature") == "finished") {
924 //
925 return true;
926 }
927
928 return false;
929 }
930
931 /**
932 * CONDITION - is_signed
933 *
934 * Vérifie que l'instruction n'a pas été signée
935 *
936 * @return boolean
937 */
938 function is_not_signed() {
939 // Contrôle si l'utilisateur possède un bypass
940 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
941 if ($bypass == true) {
942 return true;
943 }
944
945 return !$this->is_signed();
946 }
947
948
949 /**
950 * is_sent_to_cl
951 *
952 * Vérifie que l'instruction a été envoyé au contrôle de légalité
953 *
954 * @return boolean
955 */
956 function is_sent_to_cl() {
957 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
958 if ($this->getVal('envoye_cl_platau') === 't') {
959 //
960 return true;
961 }
962 //
963 return false;
964 }
965
966 /**
967 * CONDITION - is_portail_notification
968 *
969 * Vérifie si la notification est une notification de catégorie portail
970 *
971 * @return boolean
972 */
973 function is_portail_notification_sans_annexe() {
974 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
975 $ev = $this->get_inst_evenement($this->getVal('evenement'));
976 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
977 && $ev->getVal('notification') != 'notification_manuelle_annexe'
978 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
979 ) {
980 return true;
981 }
982 return false;
983 }
984
985 /**
986 * CONDITION - is_not_portail_notification
987 *
988 * Vérifie si la notification n'est pas une notification de catégorie portail
989 *
990 * @return boolean
991 */
992 function is_not_portail_notification_sans_annexe() {
993 return (! $this->is_portail_notification_sans_annexe());
994 }
995
996 /**
997 * CONDITION - can_be_signed
998 *
999 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
1000 *
1001 * @return boolean
1002 */
1003 function can_be_signed() {
1004 // Instanciation de l'objet signataire_arrete
1005 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1006 "obj" => "signataire_arrete",
1007 "idx" => $this->getVal("signataire_arrete"),
1008 ));
1009 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1010 // possède une adresse email, on vérifie le champ id_parapheur_signature
1011 // S'il est vide l'évènement peut être envoyé en signature
1012 // S'il ne l'est pas, alors on vérifie le champ statut_signature
1013 // Si la valeur de ce champ est égal à "canceled" ou "expired"
1014 // alors l'évènement peut être envoyé en signature
1015 if ($this->has_connector_electronicsignature() === true
1016 && $this->getVal("om_final_instruction") == 't'
1017 && empty($inst_signataire_arrete->getVal('email')) === false) {
1018 //
1019 if (empty($this->getVal("id_parapheur_signature")) === true
1020 || $this->getVal("statut_signature") == "canceled"
1021 || $this->getVal("statut_signature") == "expired") {
1022 //
1023 return true;
1024 }
1025 }
1026
1027 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1028 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1029 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1030 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1031 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1032
1033 return false;
1034 }
1035
1036 /**
1037 * CONDITION - has_connector_electronicsignature
1038 *
1039 * Vérifie qu'un parapheur est paramétré
1040 *
1041 * @return boolean
1042 */
1043 function has_connector_electronicsignature() {
1044 $inst_es = $this->get_electronicsignature_instance(false);
1045 if ($inst_es === false) {
1046 return false;
1047 }
1048 return true;
1049 }
1050
1051 /**
1052 * CONDITION - can_display_parapheur
1053 *
1054 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1055 *
1056 * @return boolean
1057 */
1058 function can_display_parapheur() {
1059 $evenement_id = $this->getVal("evenement");
1060 $inst_evenement = $this->get_inst_evenement($evenement_id);
1061 if ($this->has_connector_electronicsignature() === true
1062 && $inst_evenement->getVal('lettretype') !== ''
1063 && $inst_evenement->getVal('lettretype') !== null
1064 && (empty($this->getVal("id_parapheur_signature")) === false
1065 || empty($this->getVal("historique_signature")) === false)) {
1066 //
1067 return true;
1068 }
1069
1070 return false;
1071 }
1072
1073 /**
1074 * CONDITION - can_display_notification
1075 *
1076 * Vérifie que le champs "Suivi notification" est affichable
1077 *
1078 * @return boolean
1079 */
1080 function can_display_notification_demandeur() {
1081 // Le suivi des notification est affiché si l'instruction a
1082 // des notifications de demandeurs associées
1083 $idsNotifs = $this->get_instruction_notification(
1084 $this->getVal($this->clePrimaire),
1085 array(
1086 'notification_recepisse',
1087 'notification_instruction',
1088 'notification_decision',
1089 ),
1090 true
1091 );
1092 return isset($idsNotifs) && $idsNotifs !== array();
1093 }
1094
1095 /**
1096 * CONDITION - can_display_notification
1097 *
1098 * Vérifie que le champs "suivi_notification_service" est affichable
1099 *
1100 * @return boolean
1101 */
1102 function can_display_notification_service() {
1103 // Le suivi des notification est affiché si l'événement est notifiable
1104 // et si des notifications ont été envoyées
1105 $evenement_id = $this->getVal("evenement");
1106 $inst_evenement = $this->get_inst_evenement($evenement_id);
1107 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1108 // Des notifications ont été envoyé si il existe au moins une notification
1109 // de type notification_service_consulte liées à l'instruction
1110 $idsNotifs = $this->get_instruction_notification(
1111 $this->getVal($this->clePrimaire),
1112 'notification_service_consulte'
1113 );
1114 if (isset($idsNotifs) && $idsNotifs !== array()) {
1115 return true;
1116 }
1117 }
1118 return false;
1119 }
1120
1121
1122 /**
1123 * CONDITION - can_display_notification_tiers
1124 *
1125 * Vérifie que le champs "suivi_notification_tiers" est affichable
1126 *
1127 * @return boolean
1128 */
1129 function can_display_notification_tiers() {
1130 // Le suivi des notification est affiché si l'instruction a
1131 // des notifications de tiers associées
1132 $idsNotifs = $this->get_instruction_notification(
1133 $this->getVal($this->clePrimaire),
1134 'notification_tiers_consulte'
1135 );
1136 return isset($idsNotifs) && $idsNotifs !== array();
1137 }
1138
1139 /**
1140 * CONDITION - can_display_notification_commune
1141 *
1142 * Vérifie que le champs "suivi_notification_commune" est affichable
1143 *
1144 * @return boolean
1145 */
1146 function can_display_notification_commune() {
1147 // Le suivi des notification si il existe au moins une notification
1148 // de type notification_depot_demat liées à l'instruction
1149 $idsNotifs = $this->get_instruction_notification(
1150 $this->getVal($this->clePrimaire),
1151 array('notification_depot_demat', 'notification_commune')
1152 );
1153 if (isset($idsNotifs) && $idsNotifs !== array()) {
1154 return true;
1155 }
1156 return false;
1157 }
1158
1159 /**
1160 * TREATMENT - disable_edition_integrale.
1161 *
1162 * Cette methode permet de passer la consultation en "lu"
1163 *
1164 * @return boolean true si maj effectué false sinon
1165 */
1166 function disable_edition_integrale() {
1167 // Cette méthode permet d'exécuter une routine en début des méthodes
1168 // dites de TREATMENT.
1169 $this->begin_treatment(__METHOD__);
1170 $this->correct = true;
1171 $valF = array(
1172 "flag_edition_integrale" => false,
1173 "titre_om_htmletat" => null,
1174 "corps_om_htmletatex" => null,
1175 );
1176 $res = $this->f->db->autoExecute(
1177 DB_PREFIXE.$this->table,
1178 $valF,
1179 DB_AUTOQUERY_UPDATE,
1180 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1181 );
1182 if ($this->f->isDatabaseError($res, true)) {
1183 // Appel de la methode de recuperation des erreurs
1184 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1185 $this->correct = false;
1186 // Termine le traitement
1187 return $this->end_treatment(__METHOD__, false);
1188 } else {
1189 $this->addToMessage(__("Rédaction par compléments activé."));
1190 return $this->end_treatment(__METHOD__, true);
1191 }
1192
1193 // Termine le traitement
1194 return $this->end_treatment(__METHOD__, false);
1195 }
1196
1197 /**
1198 * TREATMENT - enable_edition_integrale.
1199 *
1200 * Cette methode permet de passer la consultation en "lu"
1201 *
1202 * @return boolean true si maj effectué false sinon
1203 */
1204 function enable_edition_integrale() {
1205 // Cette méthode permet d'exécuter une routine en début des méthodes
1206 // dites de TREATMENT.
1207 $this->begin_treatment(__METHOD__);
1208 $this->correct = true;
1209
1210 // Récupère la collectivite du dossier d'instruction
1211 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1212 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1213 //
1214 $params = array(
1215 "specific" => array(
1216 "corps" => array(
1217 "mode" => "get",
1218 )
1219 ),
1220 );
1221 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1222 $corps = $result['pdf_output'];
1223 //
1224 $params = array(
1225 "specific" => array(
1226 "titre" => array(
1227 "mode" => "get",
1228 )
1229 ),
1230 );
1231 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1232 $titre = $result['pdf_output'];
1233 //
1234 $valF = array(
1235 "flag_edition_integrale" => true,
1236 "titre_om_htmletat" => $titre,
1237 "corps_om_htmletatex" => $corps,
1238 );
1239 $res = $this->f->db->autoExecute(
1240 DB_PREFIXE.$this->table,
1241 $valF,
1242 DB_AUTOQUERY_UPDATE,
1243 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1244 );
1245 if ($this->f->isDatabaseError($res, true)) {
1246 // Appel de la methode de recuperation des erreurs
1247 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1248 $this->correct = false;
1249 // Termine le traitement
1250 return $this->end_treatment(__METHOD__, false);
1251 } else {
1252 $this->addToMessage(__("Rédaction libre activé."));
1253 return $this->end_treatment(__METHOD__, true);
1254 }
1255
1256 // Termine le traitement
1257 return $this->end_treatment(__METHOD__, false);
1258 }
1259
1260 /**
1261 * Cette méthode instancie le dossier à partir de l'identifiant passé
1262 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1263 * associé au dossier.
1264 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1265 * renverra NULL
1266 *
1267 * @param string identifiant du dossier
1268 * @return null|string null ou identifiant du DA
1269 */
1270 function getNumDemandeAutorFromDossier($id) {
1271 if (!isset($id)) {
1272 return NULL;
1273 }
1274
1275 $dossier = $this->f->get_inst__om_dbform(array(
1276 'obj' => 'dossier',
1277 'idx' => $id,
1278 ));
1279
1280 return $dossier->getVal('dossier_autorisation');
1281 }
1282
1283
1284 /**
1285 * Cette méthode permet de récupérer le libelle du type de document
1286 * en instanciant l'objet document_type.
1287 *
1288 * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1289 * on le récupère pour l'afficher.
1290 *
1291 * @return string|NULL Retourne le libelle du type de document ou vide
1292 */
1293 function get_type_document_linked_with_instruction(){
1294 //
1295 $document_type = $this->f->get_inst__om_dbform(array(
1296 'obj' => 'document_type',
1297 'idx' => $this->getVal("document_type_instruction"),
1298 ));
1299 if ($document_type->exists() === true) {
1300 return $document_type->getVal("libelle");
1301 }
1302 return NULL;
1303 }
1304
1305
1306 function setType(&$form, $maj) {
1307 $data = array('form' => &$form, 'maj' => &$maj);
1308 $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1309
1310 // Récupération du mode de l'action
1311 $crud = $this->get_action_crud($maj);
1312 // Récupère la collectivité du dossier d'instruction
1313 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1314
1315 // Cache tous les champs
1316 foreach ($this->champs as $value) {
1317 $form->setType($value, 'hidden');
1318 }
1319
1320 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1321 if ($this->can_display_parapheur() === true && $maj == 3) {
1322 $form->setType('statut_signature', 'selectstatic');
1323 $form->setType('historique_signature', 'jsontotab');
1324 if ($this->getVal('commentaire_signature') == null) {
1325 $form->setType('commentaire_signature', 'hidden');
1326 } else {
1327 $form->setType('commentaire_signature', 'hiddenstatic');
1328 }
1329 }
1330
1331 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1332 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1333 $form->setType('suivi_notification', 'jsontotab');
1334 }
1335 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1336 if ($maj == 3 && $this->can_display_notification_service() === true) {
1337 $form->setType('suivi_notification_service', 'jsontotab');
1338 }
1339 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1340 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1341 $form->setType('suivi_notification_tiers', 'jsontotab');
1342 }
1343 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1344 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1345 $form->setType('suivi_notification_commune', 'jsontotab');
1346 }
1347
1348 // MODE AJOUTER
1349 if ($this->getParameter('maj') == 0) {
1350 $form->setType('commentaire', 'textareahidden');
1351 // Si l'option est active passage du champ date en lecture seule
1352 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1353 $form->setType("date_evenement", "hiddenstaticdate");
1354 } else {
1355 $form->setType("date_evenement", "date");
1356 }
1357 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1358 $form->setType("evenement", "selecthiddenstatic");
1359 } else {
1360 $form->setType("evenement", "select");
1361 }
1362 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1363 $form->setType("signataire_arrete", "selecthiddenstatic");
1364 } else {
1365 $form->setType("signataire_arrete", "select");
1366 }
1367 if ($this->is_option_redaction_libre_enabled() === true) {
1368 $form->setType("flag_edition_integrale", "select");
1369 }
1370 }
1371
1372 // MODE MODIFIER
1373 if ($this->getParameter('maj') == 1) {
1374 // Si l'option est active passage du champ date en lecture seule
1375 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1376 $form->setType("date_evenement", "hiddenstaticdate");
1377 } else {
1378 $form->setType("date_evenement", "date");
1379 }
1380 $form->setType("evenement", "selecthiddenstatic");
1381 if ($this->has_an_edition() === true) {
1382 $form->setType('document_type_instruction', 'selecthiddenstatic');
1383 $form->setType('lettretype', 'hiddenstatic');
1384 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1385 $form->setType("signataire_arrete", "selecthiddenstatic");
1386 } else {
1387 $form->setType("signataire_arrete", "select");
1388 }
1389 if ($this->getVal("flag_edition_integrale") == "t") {
1390 $form->setType("titre_om_htmletat", "htmlEtat");
1391 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1392 } else {
1393 $form->setType("complement_om_html", "html");
1394 $form->setType("complement2_om_html", "html");
1395 $form->setType("complement3_om_html", "html");
1396 $form->setType("complement4_om_html", "html");
1397 $form->setType('bible_auto', 'httpclick');
1398 $form->setType('bible', 'httpclick');
1399 $form->setType('bible2', 'httpclick');
1400 $form->setType('bible3', 'httpclick');
1401 $form->setType('bible4', 'httpclick');
1402 }
1403 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1404 //
1405 $form->setType('btn_refresh', 'httpclickbutton');
1406 $form->setType('btn_preview', 'httpclickbutton');
1407 $form->setType('btn_redaction', 'httpclickbutton');
1408 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1409 // pour identifiant le champ de prévisualisation et régler sa taille à
1410 // l'affichage du champ. En cas de modification, le selecteur doit également
1411 // être mis à jour
1412 $form->setType('live_preview', 'previsualiser_pdf');
1413 }
1414
1415 // necessaire pour calcul de date en modification
1416 //$form->setType('delai', 'hiddenstatic');
1417 // les administrateurs technique et fonctionnel peuvent
1418 // modifier tous les champs de date
1419 // si l'instruction a déjà été finalisée au moins une fois
1420 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1421 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1422 && $this->getVal("date_finalisation_courrier") != '') {
1423 //
1424 $form->setType('date_envoi_signature', 'date');
1425 $form->setType('date_retour_signature', 'date');
1426 if ($this->is_sent_for_signature() === true
1427 && $this->is_signed() === true) {
1428 //
1429 $form->setType("date_envoi_signature", "datereadonly");
1430 $form->setType("date_retour_signature", "datereadonly");
1431 }
1432 $form->setType('date_envoi_rar', 'date');
1433 $form->setType('date_retour_rar', 'date');
1434 $form->setType('date_envoi_controle_legalite', 'date');
1435 if ($this->is_sent_to_cl() === true) {
1436 $form->setType("date_envoi_controle_legalite", "datedisabled");
1437 }
1438 $form->setType('date_retour_controle_legalite', 'date');
1439 $form->setType('date_finalisation_courrier', 'date');
1440 }
1441 }
1442 }
1443
1444 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1445 if ($this->getParameter('maj') == 3
1446 || $this->getParameter('maj') == 2
1447 || $this->getParameter('maj') == 125
1448 || $this->getParameter('maj') == 410) {
1449 //
1450 $form->setType("date_evenement", "datestatic");
1451 $form->setType("evenement", "selecthiddenstatic");
1452 if ($this->has_an_edition() === true) {
1453 $form->setType("document_type_instruction", "selecthiddenstatic");
1454 $form->setType('lettretype', 'hiddenstatic');
1455 $form->setType("signataire_arrete", "selecthiddenstatic");
1456 if ($this->getVal("om_final_instruction") == 't') {
1457 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1458 } else {
1459 $form->setType('om_final_instruction_utilisateur', 'hidden');
1460 }
1461 }
1462 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1463 $form->setType('commentaire', 'textareastatic');
1464 }
1465 }
1466
1467 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1468 if ($this->getParameter('maj') == 3
1469 || $this->getParameter('maj') == 2
1470 || $this->getParameter('maj') == 410) {
1471 // Si il n'y a pas de lettre type (edition) associé à l'événement
1472 // les dates de suivi ne sont pas affichée
1473 if ($this->has_an_edition() === true) {
1474 $form->setType('date_envoi_signature', 'datestatic');
1475 $form->setType('date_retour_signature', 'datestatic');
1476 $form->setType('date_envoi_rar', 'datestatic');
1477 $form->setType('date_retour_rar', 'datestatic');
1478 $form->setType('date_envoi_controle_legalite', 'datestatic');
1479 $form->setType('date_retour_controle_legalite', 'datestatic');
1480 $form->setType('date_finalisation_courrier', 'datestatic');
1481 if ($this->getVal("flag_edition_integrale") == "t") {
1482 $form->setType("titre_om_htmletat", "htmlstatic");
1483 $form->setType("corps_om_htmletatex", "htmlstatic");
1484 } else {
1485 $form->setType("complement_om_html", "htmlstatic");
1486 $form->setType("complement2_om_html", "htmlstatic");
1487 $form->setType("complement3_om_html", "htmlstatic");
1488 $form->setType("complement4_om_html", "htmlstatic");
1489 }
1490 }
1491 }
1492
1493 // MODE SUIVI DES DATES 125
1494 if ($this->getParameter('maj') == 125) {
1495 $form->setType("date_evenement", "hiddenstaticdate");
1496 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1497 $form->setType('date_envoi_signature', 'date');
1498 $form->setType('date_retour_signature', 'date');
1499 if ($this->is_sent_for_signature() === true
1500 || $this->is_signed() === true) {
1501 //
1502 $form->setType("date_envoi_signature", "datereadonly");
1503 $form->setType("date_retour_signature", "datereadonly");
1504 }
1505 $form->setType('date_envoi_rar', 'date');
1506 $form->setType('date_retour_rar', 'date');
1507 $form->setType('date_envoi_controle_legalite', 'date');
1508 if ($this->is_sent_to_cl() === true) {
1509 $form->setType("date_envoi_controle_legalite", "datedisabled");
1510 }
1511 $form->setType('date_retour_controle_legalite', 'date');
1512 $form->setType('date_finalisation_courrier', 'date');
1513 }
1514
1515 if ($maj == 401) {
1516 foreach ($this->champs as $champ) {
1517 $form->setType($champ, 'hidden');
1518 }
1519 $form->setType('preview_edition', 'previsualiser');
1520 }
1521
1522 // Si l'instruction a été envoyé au contrôle de légalité et que la
1523 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1524 // l'utilisateur que l'envoi au cl est en cours de traitement.
1525 if ($this->is_sent_to_cl() === true
1526 && $maj == 3) {
1527 $form->setType("date_envoi_controle_legalite", "datestatic");
1528 if (empty($this->getVal('date_envoi_controle_legalite'))) {
1529 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1530 }
1531 }
1532 $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1533 $this->f->module_manager->run_hooks('setType_post', $this, $data);
1534 }
1535
1536 function setOnchange(&$form,$maj){
1537 $this->f->log(__METHOD__, 'BEGIN');
1538 $data = array('form' => &$form, 'maj' => &$maj);
1539 $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1540
1541 parent::setOnchange($form,$maj);
1542
1543 // MODE AJOUTER
1544 if ($this->getParameter('maj') == 0) {
1545 $form->setOnchange(
1546 "evenement",
1547 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1548 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1549 );
1550 }
1551
1552 $data = array('form' => &$form, 'maj' => &$maj);
1553 $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1554 $this->f->log(__METHOD__, 'END');
1555 }
1556
1557 function evenement_has_an_edition($evenement_id) {
1558 $evenement = $this->get_inst_evenement($evenement_id);
1559 $lettretype = $evenement->getVal('lettretype');
1560 if ($lettretype !== '' && $lettretype !== null) {
1561 return true;
1562 }
1563 return false;
1564 }
1565
1566 function view_evenement_has_an_edition_json() {
1567 $json_return = array(
1568 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1569 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1570 );
1571 echo json_encode($json_return);
1572 }
1573
1574 function evenement_has_a_commentaire($evenement_id) {
1575 $evenement = $this->get_inst_evenement($evenement_id);
1576 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1577 }
1578
1579 function view_evenement_has_a_commentaire_json() {
1580 $json_return = array(
1581 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1582 );
1583 echo json_encode($json_return);
1584 }
1585
1586
1587 /**
1588 * CONDITION - can_be_sent_to_cl
1589 *
1590 * Vérifie que le contrôle de légalité est disponible
1591 *
1592 * @return boolean
1593 */
1594 function can_be_sent_to_cl() {
1595 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1596
1597 // Si événement est paramétré pour envoyer le contrôle de légalité
1598 // par Plat'AU
1599 if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1600 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1601
1602 // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1603 // Que le type de dossier d'autorisation est transmissible à Plat'AU
1604 // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1605 if ($this->getVal('envoye_cl_platau') === 'f'
1606 && $this->f->is_type_dossier_platau($this->getVal('dossier')) === true
1607 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1608
1609 // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL
1610 if ($this->has_an_edition() === false) {
1611 return true;
1612 }
1613
1614 // Si l'instruction a une édition et que la date de retour signature est renseignée
1615 // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1616 // envoyer l'instruction au CL
1617 if ($this->has_an_edition() === true
1618 && empty($this->getVal('date_retour_signature')) === false
1619 && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1620
1621 return true;
1622 }
1623 }
1624 }
1625 //
1626 return false;
1627 }
1628
1629 /**
1630 *
1631 * @return string
1632 */
1633 function get_var_sql_forminc__sql_signataire_arrete() {
1634 return sprintf(
1635 "SELECT
1636 signataire_arrete.signataire_arrete,
1637 CONCAT_WS(
1638 ' - ',
1639 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1640 signataire_habilitation.libelle,
1641 signataire_arrete.description
1642 )
1643 FROM
1644 %1\$ssignataire_arrete
1645 LEFT JOIN %1\$ssignataire_habilitation
1646 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1647 WHERE
1648 ((signataire_arrete.om_validite_debut IS NULL
1649 AND (signataire_arrete.om_validite_fin IS NULL
1650 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1651 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1652 AND (signataire_arrete.om_validite_fin IS NULL
1653 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1654 ORDER BY
1655 signataire_arrete.prenom,
1656 signataire_arrete.nom",
1657 DB_PREFIXE
1658 );
1659 }
1660
1661 /**
1662 *
1663 * @return string
1664 */
1665 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1666 return sprintf(
1667 "SELECT
1668 signataire_arrete.signataire_arrete,
1669 CONCAT_WS(
1670 ' - ',
1671 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1672 signataire_habilitation.libelle,
1673 signataire_arrete.description
1674 )
1675 FROM
1676 %1\$ssignataire_arrete
1677 LEFT JOIN %1\$ssignataire_habilitation
1678 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1679 WHERE
1680 signataire_arrete.signataire_arrete = <idx>",
1681 DB_PREFIXE
1682 );
1683 }
1684
1685 /**
1686 *
1687 * @return string
1688 */
1689 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1690 return sprintf(
1691 "SELECT
1692 signataire_arrete.signataire_arrete,
1693 CONCAT_WS(
1694 ' - ',
1695 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1696 signataire_habilitation.libelle,
1697 signataire_arrete.description
1698 )
1699 FROM
1700 %1\$ssignataire_arrete
1701 LEFT JOIN %1\$som_collectivite
1702 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1703 LEFT JOIN %1\$ssignataire_habilitation
1704 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1705 WHERE
1706 ((signataire_arrete.om_validite_debut IS NULL
1707 AND (signataire_arrete.om_validite_fin IS NULL
1708 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1709 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1710 AND (signataire_arrete.om_validite_fin IS NULL
1711 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1712 AND (om_collectivite.niveau = '2'
1713 OR signataire_arrete.om_collectivite = <collectivite_di>)
1714 ORDER BY
1715 signataire_arrete.prenom, signataire_arrete.nom",
1716 DB_PREFIXE
1717 );
1718 }
1719
1720 /**
1721 *
1722 * @return string
1723 */
1724 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1725 return sprintf(
1726 "SELECT
1727 signataire_arrete.signataire_arrete,
1728 CONCAT_WS(
1729 ' - ',
1730 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1731 signataire_habilitation.libelle,
1732 signataire_arrete.description
1733 )
1734 FROM
1735 %1\$ssignataire_arrete
1736 LEFT JOIN %1\$ssignataire_habilitation
1737 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1738 WHERE
1739 ((signataire_arrete.om_validite_debut IS NULL
1740 AND (signataire_arrete.om_validite_fin IS NULL
1741 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1742 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1743 AND (signataire_arrete.om_validite_fin IS NULL
1744 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1745 AND signataire_arrete.defaut IS TRUE
1746 ORDER BY
1747 signataire_arrete.prenom, signataire_arrete.nom",
1748 DB_PREFIXE
1749 );
1750 }
1751
1752 /**
1753 *
1754 * @return string
1755 */
1756 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1757 return sprintf(
1758 "SELECT
1759 signataire_arrete.signataire_arrete,
1760 CONCAT_WS(
1761 ' - ',
1762 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1763 signataire_habilitation.libelle,
1764 signataire_arrete.description
1765 )
1766 FROM
1767 %1\$ssignataire_arrete
1768 LEFT JOIN %1\$ssignataire_habilitation
1769 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1770 LEFT JOIN %1\$som_collectivite
1771 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1772 WHERE
1773 ((signataire_arrete.om_validite_debut IS NULL
1774 AND (signataire_arrete.om_validite_fin IS NULL
1775 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1776 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1777 AND (signataire_arrete.om_validite_fin IS NULL
1778 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1779 AND signataire_arrete.defaut IS TRUE
1780 AND (om_collectivite.niveau = '2'
1781 OR signataire_arrete.om_collectivite = <collectivite_di>)
1782 ORDER BY
1783 signataire_arrete.prenom,
1784 signataire_arrete.nom",
1785 DB_PREFIXE
1786 );
1787 }
1788
1789 /**
1790 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1791 * dont l'identifiant a été passé en paramètre dans l'url.
1792 *
1793 * @return array
1794 */
1795 function get_var_sql_forminc__sql_evenement() {
1796 // Récupération du numéro de dossier
1797 $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1798 $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1799 // Si changement de décision par instructeur commune
1800 $filter = '';
1801 if ($this->f->isUserInstructeur() === true
1802 // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1803 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1804 && $this->isInstrCanChangeDecision($dossier) === true) {
1805 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1806 }
1807 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1808 // de déterminer si il s'agit d'évènements suggérés.
1809 $qres = $this->f->get_all_results_from_db_query(
1810 sprintf(
1811 'SELECT
1812 DISTINCT(evenement.evenement),
1813 evenement.libelle,
1814 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1815 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1816 THEN FALSE
1817 ELSE TRUE
1818 END AS is_suggested
1819 FROM
1820 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1821 -- selon le type de dossier et l état du dossier.
1822 %1$sevenement
1823 JOIN %1$slien_dossier_instruction_type_evenement
1824 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1825 JOIN %1$stransition
1826 ON evenement.evenement = transition.evenement
1827 JOIN %1$sdossier
1828 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1829 AND transition.etat = dossier.etat
1830 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1831 LEFT JOIN (
1832 SELECT
1833 lien_sig_contrainte_evenement.evenement,
1834 dossier.dossier
1835 FROM
1836 %1$slien_sig_contrainte_evenement
1837 JOIN %1$ssig_contrainte
1838 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1839 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1840 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1841 JOIN %1$slien_sig_contrainte_om_collectivite
1842 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1843 JOIN %1$scontrainte
1844 ON sig_contrainte.libelle = contrainte.libelle
1845 JOIN %1$sdossier_contrainte
1846 ON contrainte.contrainte = dossier_contrainte.contrainte
1847 JOIN %1$sdossier
1848 ON dossier_contrainte.dossier = dossier.dossier
1849 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1850 JOIN %1$som_collectivite
1851 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1852 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1853 OR om_collectivite.niveau = \'2\')
1854 ) AS evenement_suggere_dossier
1855 ON evenement.evenement = evenement_suggere_dossier.evenement
1856 AND dossier.dossier = evenement_suggere_dossier.dossier
1857 WHERE
1858 dossier.dossier = \'%2$s\'
1859 %3$s
1860 ORDER BY
1861 is_suggested DESC,
1862 evenement.libelle',
1863 DB_PREFIXE,
1864 $this->f->db->escapeSimple($dossier),
1865 $filter
1866 ),
1867 array(
1868 "origin" => __METHOD__
1869 )
1870 );
1871 return $qres['result'];
1872 }
1873
1874 /**
1875 * Récupère un tableau contenant des évènements de la forme :
1876 * $events = array(
1877 * 1 => array(
1878 * 'libelle' => 'evenement_libelle',
1879 * 'evenement' => 'identifiant_evenement',
1880 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1881 * ))
1882 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1883 *
1884 * Le format de sorti est le suivant :
1885 * $select = array(
1886 * 0 => array( -> liste des id des événements
1887 * '0' => '',
1888 * '1' => array(
1889 * '0' => array(), -> liste des id des événements suggérés
1890 * '1' => array(), -> liste des libelles des événements suggérés
1891 * ),
1892 * ...,
1893 * n => 'id_evenement_n'
1894 * ),
1895 * 1 => array(
1896 * '0' => '__('choisir')." ".__('evenement')',
1897 * '1' => '💡 Suggestions',
1898 * ...,
1899 * 'n' => 'libelle_evenement_n',
1900 * )
1901 * )
1902 *
1903 * @param array tableau des événements
1904 * @return array
1905 */
1906 protected function convert_events_array_to_select_format($events) {
1907 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1908 $contenu = array(
1909 0 => array("",),
1910 1 => array(__('choisir')." ".__('evenement'),)
1911 );
1912
1913 if (! empty($events)) {
1914 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1915 $suggested_event_group = array_filter($events, function($a) {
1916 return $a['is_suggested'] === 't';
1917 });
1918 if (! empty($suggested_event_group)) {
1919 // Prépare les données qui permettront d'afficher le groupe des événements
1920 // suggérés.
1921 $values = array();
1922 $labels = array();
1923 foreach ($suggested_event_group as $index => $suggested_event) {
1924 $values[] = $suggested_event['evenement'];
1925 $labels[] = $suggested_event['libelle'];
1926 // Supprime les évènements suggérés de la liste des évènements
1927 unset($events[$index]);
1928 }
1929 // Remplissage du select pour le groupe
1930 $contenu[0][] = array($values, $labels);
1931 $contenu[1][] = __('💡 Suggestions');
1932 }
1933
1934 // Remplissage du select
1935 foreach ($events as $event) {
1936 $contenu[0][] = $event['evenement'];
1937 $contenu[1][] = $event['libelle'];
1938 }
1939 }
1940 return $contenu;
1941 }
1942
1943 /**
1944 * SETTER_FORM - setSelect.
1945 *
1946 * @return void
1947 */
1948 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1949 //parent::setSelect($form, $maj);
1950 /**
1951 * On ne surcharge pas la méthode parent car une requête sur la table
1952 * dossier est mauvaise pour les performances, car la requête qui
1953 * concerne evenement est plus complexe que celle générée et car les
1954 * champs action, avis_decision et etat ne sont pas utilisés comme des
1955 * select
1956 */
1957 //// action
1958 //$this->init_select($form, $this->f->db, $maj, null, "action",
1959 // $sql_action, $sql_action_by_id, false);
1960
1961 //// avis_decision
1962 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1963 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1964
1965 //// dossier
1966 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1967 // $sql_dossier, $sql_dossier_by_id, false);
1968
1969 //// etat
1970 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1971 // $sql_etat, $sql_etat_by_id, false);
1972
1973 //// evenement
1974 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1975 // $sql_evenement, $sql_evenement_by_id, false);
1976
1977 // signataire_arrete
1978 // si contexte DI
1979 if ($this->getParameter("retourformulaire") == "dossier"
1980 || $this->f->contexte_dossier_instruction()) {
1981 // on recupère les signataires de la multicollectivité et de celle du DI
1982 $di = $this->f->get_inst__om_dbform(array(
1983 "obj" => "dossier_instruction",
1984 "idx" => $this->getParameter('idxformulaire'),
1985 ));
1986 $sql_signataire_arrete_by_di = str_replace(
1987 '<collectivite_di>',
1988 $di->getVal("om_collectivite"),
1989 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1990 );
1991 $this->init_select(
1992 $form,
1993 $this->f->db,
1994 $maj,
1995 null,
1996 "signataire_arrete",
1997 $sql_signataire_arrete_by_di,
1998 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1999 true
2000 );
2001 } else {
2002 $this->init_select(
2003 $form,
2004 $this->f->db,
2005 $maj,
2006 null,
2007 "signataire_arrete",
2008 $this->get_var_sql_forminc__sql("signataire_arrete"),
2009 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2010 true
2011 );
2012 }
2013
2014 /**
2015 * Gestion du filtre sur les événements de workflow disponibles
2016 * On récupère ici en fonction de l'état du dossier d'instruction en
2017 * cours et du type du dossier d'instruction en cours la liste
2018 * événements disponibles.
2019 */
2020 if ($maj == 0) {
2021 $evenements = $this->get_var_sql_forminc__sql_evenement();
2022 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
2023 } else {
2024 // Instanciation de l'événement pour récupérer son libellé
2025 $evenement = $this->f->get_inst__om_dbform(array(
2026 "obj" => "evenement",
2027 "idx" => $this->getVal("evenement"),
2028 ));
2029
2030 $contenu = array(
2031 0 => array($this->getVal("evenement"),),
2032 1 => array($evenement->getVal('libelle'),)
2033 );
2034 $form->setSelect("evenement", $contenu);
2035 }
2036
2037 /**
2038 * Gesion des liens vers la bible
2039 */
2040 // lien bible_auto
2041 $contenu = array(__("automatique"));
2042 $form->setSelect("bible_auto",$contenu);
2043 // lien bible1
2044 $contenu = array(__("bible"));
2045 $form->setSelect("bible",$contenu);
2046 // lien bible2
2047 $contenu = array(__("bible"));
2048 $form->setSelect("bible2",$contenu);
2049 // lien bible3
2050 $contenu = array(__("bible"));
2051 $form->setSelect("bible3",$contenu);
2052 // lien bible4
2053 $contenu = array(__("bible"));
2054 $form->setSelect("bible4",$contenu);
2055
2056 if ($maj == 1) {
2057 $base64 = $this->init_pdf_temp();
2058 $form->setSelect('live_preview', array('base64'=>$base64));
2059 $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2060 $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2061 $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2062 }
2063
2064 // Selection du type de rédaction à l'ajout
2065 $content = array(
2066 0 => array('f', 't', ),
2067 1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2068 );
2069 $form->setSelect('flag_edition_integrale', $content);
2070
2071 $contenu = array();
2072 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2073 $contenu[0][] = $value;
2074 $contenu[1][] = $this->get_trad_for_statut($value);
2075 }
2076 $form->setSelect('statut_signature', $contenu);
2077
2078
2079 if ($maj == 401) {
2080 $idx = $this->getParameter("idx");
2081 $dossier = $this->getParameter("idxformulaire");
2082 if ( strpos($idx, 'STORAGE_') !== FALSE) {
2083 $idx = substr($idx, 8);
2084 $model = 'storage';
2085 $champ = 'uid';
2086 $object = $this->f->get_inst__om_dbform(array(
2087 "obj" => $model,
2088 "idx" => $idx,
2089 ));
2090
2091 $file = $this->f->storage->get($object->getVal($champ));
2092 $label = $file['metadata']['filename'];
2093 $href =sprintf(
2094 '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2095 $idx
2096 );
2097 $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2098 $this->val['preview_edition'] = '';
2099 }else{
2100 $label = $this->getVal("fichier_instruction_name");
2101 $href =sprintf(
2102 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2103 $this->getVal($this->clePrimaire)
2104 );
2105 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2106 }
2107
2108 $form->setSelect('preview_edition', array(
2109 'base64' => base64_encode($file['file_content']),
2110 'mimetype' => $file['metadata']['mimetype'],
2111 'label' => $label,
2112 'href' => $href
2113 ));
2114 }
2115
2116 // document_type_instruction
2117 $this->init_select(
2118 $form,
2119 $this->f->db,
2120 $maj,
2121 null,
2122 "document_type_instruction",
2123 $this->get_var_sql_forminc__sql("document_type_instruction"),
2124 $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2125 true,
2126 false,
2127 '',
2128 $maj == 999 ? true : false
2129 );
2130 }
2131
2132 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2133 //
2134 // Vérifie uniquementla cle secondaire : demande
2135 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2136
2137 $id = $this->getVal($this->clePrimaire);
2138
2139 //Requête de vérification que cet événement d'instruction n'est pas lié
2140 //à la création d'un dossier d'instruction
2141 $qres = $this->f->get_one_result_from_db_query(
2142 sprintf(
2143 'SELECT
2144 demande_type.dossier_instruction_type
2145 FROM
2146 %1$sdemande_type
2147 LEFT JOIN %1$sdemande
2148 ON demande.demande_type = demande_type.demande_type
2149 WHERE
2150 demande.instruction_recepisse = \'%2$d\'',
2151 DB_PREFIXE,
2152 intval($id)
2153 ),
2154 array(
2155 "origin" => __METHOD__,
2156 )
2157 );
2158
2159 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2160 //création de dossier d'instruction, l'événement d'instruction peut être
2161 //supprimé
2162 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2163 // Requête de vérification que cet événement d'instruction est lié
2164 // à une demande
2165 $qres = $this->f->get_one_result_from_db_query(
2166 sprintf(
2167 'SELECT
2168 demande
2169 FROM
2170 %1$sdemande
2171 WHERE
2172 instruction_recepisse = \'%2$d\'',
2173 DB_PREFIXE,
2174 intval($id)
2175 ),
2176 array(
2177 "origin" => __METHOD__,
2178 )
2179 );
2180
2181 //Si c'est un événement d'instruction lié à une demande
2182 if ($qres['result'] != null || $qres['result'] != ""){
2183 $demande = $this->f->get_inst__om_dbform(array(
2184 "obj" => "demande",
2185 "idx" => $qres['result'],
2186 ));
2187
2188 //On met à jour la demande en supprimant la liaison vers
2189 //l'événement d'instruction
2190 $demande->setParameter("maj", 1);
2191 $valF = array();
2192 foreach($demande->champs as $identifiant => $champ) {
2193 $valF[$champ] = $demande->val[$identifiant];
2194 }
2195 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2196 $valF['instruction_recepisse']=NULL;
2197 $ret = $demande->modifier($valF);
2198 }
2199
2200 /**
2201 * Vérification que l'élément supprimé est le dernier pour pouvoir
2202 * remodifier les données de manière itérative.
2203 */
2204 $qres = $this->f->get_one_result_from_db_query(
2205 sprintf(
2206 'SELECT
2207 max(instruction)
2208 FROM
2209 %1$sinstruction
2210 WHERE
2211 dossier = \'%2$s\'',
2212 DB_PREFIXE,
2213 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2214 ),
2215 array(
2216 "origin" => __METHOD__,
2217 )
2218 );
2219
2220 // Si on se trouve effectivement sur le dernier evenement d'instruction
2221 // alors on valide la suppression sinon on l'annule
2222 $this->correct = false;
2223 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2224 if ($qres['result'] == $id) {
2225 // Alors on valide la suppression
2226 $this->correct = true;
2227 $message = __('Destruction_chronologique');
2228 }
2229 $this->addToMessage($message);
2230 }
2231 }
2232
2233 /**
2234 * Vérification de la possibilité ou non de modifier des dates de suivi
2235 * @param string $champ champ date à vérifier
2236 */
2237 function updateDate($champ) {
2238
2239 //Si le retourformulaire est "dossier_instruction"
2240 if ($this->getParameter("retourformulaire") == "dossier"
2241 || $this->f->contexte_dossier_instruction()) {
2242
2243 // Vérification de la possibilité de modifier les dates si déjà éditées
2244 if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2245 // si l'utilisateur n'est pas un admin
2246 if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2247
2248 // si le champ concerné est 'date_envoi_signature'
2249 // et que le statut du parapheur est 'expired'
2250 // alors on autorise le changement de la date
2251 // pour tous les autres cas, on ne peut modifier la date
2252 if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2253 $this->correct = false;
2254 $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2255 }
2256 }
2257 }
2258 }
2259
2260 //
2261 return true;
2262 }
2263
2264 /**
2265 * SETTER_FORM - setValsousformulaire (setVal).
2266 *
2267 * @return void
2268 */
2269 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2270 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2271 $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2272
2273 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2274 //
2275 $this->retourformulaire = $retourformulaire;
2276 //
2277 if ($maj == 0) {
2278 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2279 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2280 }
2281
2282 // Si l'instruction a été envoyé au contrôle de légalité et que la
2283 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2284 // l'utilisateur que l'envoi au cl est en cours de traitement.
2285 if ($this->is_sent_to_cl() === true
2286 && empty($this->getVal('date_envoi_controle_legalite'))
2287 && $maj == 3) {
2288 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2289 }
2290 //
2291 $this->set_form_default_values($form, $maj, $validation);
2292
2293 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2294 $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2295 }
2296
2297 /**
2298 * SETTER_FORM - set_form_default_values (setVal).
2299 *
2300 * @return void
2301 */
2302 function set_form_default_values(&$form, $maj, $validation) {
2303 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2304 $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2305
2306 if ($maj == 0) {
2307 // si contexte DI
2308 if ($this->getParameter("retourformulaire") == "dossier"
2309 || $this->f->contexte_dossier_instruction()) {
2310 // on recupère les signataires de la multicollectivité et de celle du DI
2311 $di = $this->f->get_inst__om_dbform(array(
2312 "obj" => "dossier_instruction",
2313 "idx" => $this->getParameter("idxformulaire"),
2314 ));
2315 $sql = str_replace(
2316 "<collectivite_di>",
2317 $di->getVal("om_collectivite"),
2318 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2319 );
2320 } else {
2321 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2322 }
2323
2324 $qres = $this->f->get_all_results_from_db_query($sql, array(
2325 "origin" => __METHOD__));
2326 $row = array_shift($qres['result']);
2327 if (isset($row["signataire_arrete"])
2328 && is_numeric($row["signataire_arrete"])) {
2329 //
2330 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2331 }
2332 // Date du jour
2333 $form->setVal("date_evenement", date("Y-m-d"));
2334 }
2335 //
2336 if ($maj == 0 || $maj == 1 || $maj == 125) {
2337 $form->setVal("bible_auto", "bible_auto()");
2338 $form->setVal("bible", "bible(1)");
2339 $form->setVal("bible2", "bible(2)");
2340 $form->setVal("bible3", "bible(3)");
2341 $form->setVal("bible4", "bible(4)");
2342 }
2343 // TODO à faire autrement car ça génère une requête à chaque fois, plus l'instanciation du dossier d'instruction et donc de ses modules !
2344 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2345 if ($maj == 1
2346 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2347 && $this->has_an_edition() === true) {
2348 //
2349 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2350 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2351 $form->setVal("btn_preview", "show_instr_preview()");
2352 $form->setVal("btn_redaction", "show_instr_redaction()");
2353 }
2354
2355 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2356 // des communes
2357 if ($maj == 3) {
2358 if ($this->can_display_notification_demandeur()) {
2359 $typeNotification = array(
2360 'notification_recepisse',
2361 'notification_instruction',
2362 'notification_decision',
2363 );
2364 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2365 }
2366 if ($this->can_display_notification_service()) {
2367 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2368 }
2369 if ($this->can_display_notification_tiers()) {
2370 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2371 }
2372 if ($this->can_display_notification_commune()) {
2373 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2374 }
2375 if ($this->getVal('flag_edition_integrale') == 't') {
2376 $message = __("Aucun contenu à afficher.");
2377 if (empty($this->getVal('titre_om_htmletat'))) {
2378 $form->setVal("titre_om_htmletat", $message);
2379 }
2380 if (empty($this->getVal('corps_om_htmletatex'))) {
2381 $form->setVal("corps_om_htmletatex", $message);
2382 }
2383 }
2384 }
2385 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2386 $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2387 }
2388
2389 function setLayout(&$form, $maj){
2390 $data = array('form' => &$form, 'maj' => &$maj);
2391 $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
2392
2393 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2394
2395 $form->setFieldset('evenement','D',_('Evenement'));
2396 $form->setFieldset('om_final_instruction_utilisateur','F','');
2397
2398 $form->setBloc('om_final_instruction_utilisateur','F');
2399 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2400 // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2401 $form->setBloc('om_final_instruction_utilisateur','F');
2402 $form->setBloc('parapheur_lien_page_signature','D');
2403
2404 $form->setBloc('date_finalisation_courrier','D',"","");
2405
2406 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2407 $form->setBloc('date_finalisation_courrier','D');
2408 $form->setBloc('date_envoi_rar','F');
2409
2410 $form->setBloc('date_retour_rar','D');
2411 $form->setBloc('date_retour_controle_legalite','F');
2412 $form->setFieldset('date_retour_controle_legalite','F','');
2413
2414 $form->setBloc('date_retour_controle_legalite','F');
2415
2416 $form->setBloc('statut_signature','D');
2417 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2418 $form->setBloc('commentaire_signature','F');
2419 $form->setBloc('historique_signature','D');
2420 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2421 $form->setBloc('historique_signature','F');
2422 $form->setFieldset('historique_signature','F');
2423
2424 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2425 $form->setFieldset('suivi_notification','F');
2426 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2427 $form->setFieldset('suivi_notification_service','F');
2428 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2429 $form->setFieldset('suivi_notification_tiers','F');
2430 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2431 $form->setFieldset('suivi_notification_commune','F');
2432
2433 if ($maj == 1) {
2434 // Récupère la collectivité du dossier d'instruction
2435 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2436
2437 //
2438 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2439 && $this->has_an_edition() === true) {
2440 //
2441 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2442 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2443 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2444 $form->setFieldset('complement_om_html','D',_('Complement'));
2445 $form->setFieldset('bible','F','');
2446 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2447 $form->setFieldset('bible2','F','');
2448 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2449 $form->setFieldset('bible3','F','');
2450 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2451 $form->setFieldset('bible4','F','');
2452 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2453 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2454 $form->setBloc('corps_om_htmletatex','F');
2455 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2456 $form->setBloc('btn_preview','F');
2457 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2458 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2459 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2460 $form->setFieldset('live_preview','F');
2461 $form->setBloc('live_preview','F');
2462 $form->setBloc('live_preview','F');
2463 } else {
2464 $form->setBloc('complement_om_html','D',"","hidelabel");
2465 $form->setFieldset('complement_om_html','D',_('Complement'));
2466 $form->setFieldset('bible','F','');
2467 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2468 $form->setFieldset('bible2','F','');
2469 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2470 $form->setFieldset('bible3','F','');
2471 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2472 $form->setFieldset('bible4','F','');
2473 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2474 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2475 $form->setBloc('corps_om_htmletatex','F');
2476 }
2477 } else {
2478 $form->setBloc('complement_om_html','D',"","hidelabel");
2479 $form->setFieldset('complement_om_html','D',_('Complement'));
2480 $form->setFieldset('bible','F','');
2481 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2482 $form->setFieldset('bible2','F','');
2483 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2484 $form->setFieldset('bible3','F','');
2485 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2486 $form->setFieldset('bible4','F','');
2487 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2488 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2489 $form->setBloc('corps_om_htmletatex','F');
2490 }
2491 $data = array('form' => &$form, 'maj' => &$maj);
2492 $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2493 }
2494
2495 function setLib(&$form, $maj) {
2496 $data = array('form' => &$form, 'maj' => &$maj);
2497 $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2498 //
2499 parent::setLib($form, $maj);
2500 //
2501 $form->setLib('bible_auto', "");
2502 $form->setLib('bible', "");
2503 $form->setLib('bible2', "");
2504 $form->setLib('bible3', "");
2505 $form->setLib('bible4', "");
2506 $form->setLib('btn_refresh', "");
2507 $form->setLib('btn_preview', "");
2508 $form->setLib('btn_redaction', "");
2509 $form->setLib('live_preview', "");
2510 $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2511 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2512 $form->setLib('date_retour_rar', __("date_notification"));
2513 $form->setLib('statut_signature', __("statut"));
2514 $form->setLib('commentaire_signature', __("commentaire"));
2515 $form->setLib('historique_signature', '');
2516 $form->setLib('suivi_notification', '');
2517 $form->setLib('suivi_notification_service', '');
2518 $form->setLib('suivi_notification_tiers', '');
2519 $form->setLib('suivi_notification_commune', '');
2520 $form->setLib('preview_edition', "");
2521 $form->setLib('document_type_instruction', __("Type de document"));
2522
2523 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2524 // ajout et que l'option de rédaction libre est activée sur la
2525 // collectivité du dossier
2526 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2527 //
2528 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2529 $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.");
2530 $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2531 }
2532 else {
2533 $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2534 }
2535
2536 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2537 // modification et que l'option de prévisualisation de l'édition est
2538 // activée sur la collectivité du dossier
2539 if ($maj === '1'
2540 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2541 //
2542 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2543 $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.");
2544 $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2545 $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2546 }
2547 $data = array('form' => &$form, 'maj' => &$maj);
2548 $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2549 }
2550
2551 /**
2552 * Surcharge om_dbform::set_form_specificity()
2553 *
2554 * Traitements spécifiques lié à l'affichage des formulaires.
2555 * Les traitements gérés ici sont les suivants :
2556 * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2557 * pu être récupérée.
2558 * - Affichage d'un message d'information à l'attention de l'utilisateur si
2559 * la notification est activée mais qu'elle n'est pas possible à cause du
2560 * paramètrage.
2561 *
2562 * @param formulaire $form Instance formulaire.
2563 * @param string $maj
2564 *
2565 * @return void
2566 */
2567 function set_form_specificity(&$form, $maj) {
2568 parent::set_form_specificity($form, $maj);
2569
2570 // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2571 // Si ce n'est pas le cas affiche un message d'erreur.
2572 if ((! empty($maj) && $maj == 3)) {
2573 if (! empty($this->getVal('lettretype'))) {
2574
2575 $om_edition = $this->f->get_inst__om_edition();
2576 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2577 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2578 $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2579
2580 if (empty($edition)) {
2581 $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2582 }
2583 }
2584 }
2585
2586 $this->display_notification_info($maj);
2587 }
2588
2589 /**
2590 * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2591 * citoyen, si la notification des demandeurs est activée sur l'évenement
2592 * d'instruction et que le paramétrage du demandeur principal n'est pas
2593 * correct alors un message a destination de l'instructeur est affiché.
2594 *
2595 * @param string $maj
2596 *
2597 * @return void
2598 */
2599 public function display_notification_info($maj) {
2600 if ((! empty($maj) && $maj == 3)) {
2601 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2602 // la requête permettant de savoir le type de demande à échouée) et si
2603 // la notification se fait par mail vérifie si il y a des erreurs de
2604 // paramétrage et si c'est le cas on affiche un message d'information
2605 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2606 $erreurParam = $this->get_info_notification_fail();
2607 // Récupération de l'évenement d'instruction
2608 $instEV = $this->get_inst_evenement();
2609 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2610 $class = 'text-info ui-state-highlight ui-state-info';
2611 $message = __("La notification n'est pas possible.");
2612 $this->f->display_panel_information(
2613 $class,
2614 $message,
2615 $erreurParam,
2616 __('Les données suivantes doivent être modifiées'),
2617 'erreur_param_notif'
2618 );
2619 }
2620 }
2621 }
2622 }
2623
2624 /**
2625 * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2626 */
2627 public function display_error_message($msg) {
2628 $this->correct = false;
2629 $this->msg = $msg;
2630 }
2631
2632 /**
2633 * TRIGGER - triggerajouter.
2634 * Réalise différents traitements avant d'ajouter l'instruction en base.
2635 *
2636 * Les traitements réalisés sont les suivant :
2637 * - TODO : documenter les traietements existant
2638 * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2639 * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2640 *
2641 * @return boolean
2642 */
2643 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2644 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2645 $parent_res = parent::triggerajouter($id, $dnu1, $val);
2646 if ($parent_res === false) return $parent_res;
2647
2648 $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2649 if (! $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data)) {
2650 return false;
2651 }
2652
2653 /**
2654 * Le code suivant permet de récupérer des valeurs des tables evenement
2655 * et dossier pour les stocker dans l'instruction :
2656 * DEPUIS L'EVENEMENT
2657 * - action
2658 * - delai
2659 * - accord_tacite
2660 * - etat
2661 * - avis_decision
2662 * - delai_notification
2663 * - lettretype
2664 * - autorite_competente
2665 * - pec_metier
2666 * - complement_om_html
2667 * - complement2_om_html
2668 * - complement3_om_html
2669 * - complement4_om_html
2670 * - complement5_om_html
2671 * DEPUIS LE DOSSIER D'INSTRUCTION
2672 * - archive_delai
2673 * - archive_accord_tacite
2674 * - archive_etat
2675 * - archive_avis
2676 * - date_complet
2677 * - date_rejet
2678 * - date_limite
2679 * - date_notification_delai
2680 * - date_decision
2681 * - date_validite
2682 * - date_achevement
2683 * - date_chantier
2684 * - date_conformite
2685 * - avis_decision
2686 */
2687 // Récupération de tous les paramètres de l'événement sélectionné
2688 $evenement = $this->f->get_inst__om_dbform(array(
2689 "obj" => "evenement",
2690 "idx" => intval($this->valF['evenement']),
2691 ));
2692 if ($evenement->exists() === true) {
2693 // Récupération de l'identifiant de l'action
2694 // si une action est paramétrée dans l'événement
2695 $this->valF['action'] = NULL;
2696 if (!empty($evenement->getVal('action'))) {
2697 $this->valF['action']=$evenement->getVal('action');
2698 }
2699 // Récupération de la valeur du délai
2700 $this->valF['delai'] = $evenement->getVal('delai');
2701 // Récupération de l'identifiant de l'état
2702 // si un état est paramétré dans l'événement
2703 $this->valF['etat']=NULL;
2704 if (!empty($evenement->getVal('etat'))) {
2705 $this->valF['etat']=$evenement->getVal('etat');
2706 }
2707 // Récupération de la valeur d'accord tacite
2708 $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2709 // Récupération de la valeur du délai de notification
2710 $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2711 // Récupération de l'identifiant de l'avis
2712 // si un avis est paramétré dans l'événement
2713 $this->valF['avis_decision'] = NULL;
2714 if(!empty($evenement->getVal('avis_decision'))) {
2715 $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2716 }
2717 // Récupération de la valeur de l'autorité compétente
2718 // si l'autorité compétente est paramétré dans l'événement
2719 $this->valF['autorite_competente'] = NULL;
2720 if(!empty($evenement->getVal('autorite_competente'))) {
2721 $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2722 }
2723 // Récupération de la valeur de la lettre type
2724 $this->valF['lettretype']=$evenement->getVal('lettretype');
2725
2726 // Récupération de la valeur du document_type
2727 if(!empty($evenement->getVal('document_type'))){
2728 $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2729 }
2730 // Récupération de la valeur de la prise en compte métier
2731 // si la prise en compte métier est paramétrée dans l'événement
2732 $this->valF['pec_metier'] = NULL;
2733 if(!empty($evenement->getVal('pec_metier'))) {
2734 $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2735 }
2736 }
2737 // Récupération de toutes les valeurs du dossier d'instruction en cours
2738 // TODO : remplacer cette requête par l'instanciation de l'objet
2739 $qres = $this->f->get_all_results_from_db_query(
2740 sprintf(
2741 'SELECT
2742 *
2743 FROM
2744 %1$sdossier
2745 WHERE
2746 dossier = \'%2$s\'',
2747 DB_PREFIXE,
2748 $this->f->db->escapeSimple($this->valF['dossier'])
2749 ),
2750 array(
2751 "origin" => __METHOD__,
2752 )
2753 );
2754 $row = array_shift($qres['result']);
2755 $this->updateArchiveData($row);
2756
2757 // Récupération de la duree de validite du dossier d'autorisation
2758 $qres = $this->f->get_one_result_from_db_query(
2759 sprintf(
2760 'SELECT
2761 duree_validite_parametrage
2762 FROM
2763 %1$sdossier_autorisation_type_detaille
2764 LEFT JOIN %1$sdossier_autorisation
2765 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2766 LEFT JOIN %1$sdossier
2767 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2768 WHERE
2769 dossier.dossier = \'%2$s\'',
2770 DB_PREFIXE,
2771 $this->f->db->escapeSimple($this->valF['dossier'])
2772 ),
2773 array(
2774 "origin" => __METHOD__,
2775 )
2776 );
2777
2778 if ($qres['result'] != '') {
2779 $this->valF['duree_validite_parametrage'] = $qres['result'];
2780 }
2781
2782 // Identifiant du type de courrier
2783 $idTypeCourrier = '11';
2784 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2785 // Code barres
2786 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2787
2788 // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2789 // à l'ajout de l'instruction.
2790 // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2791 if (! empty($this->valF['lettretype'])) {
2792 $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2793 }
2794
2795 $res = true;
2796 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2797 if (! $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data)) {
2798 return false;
2799 }
2800 return $res;
2801 }
2802
2803 /**
2804 * Récupère pour chaque champ complementX_om_html le complément correspondant
2805 * et set l'entrée correspondante de valF avec.
2806 *
2807 * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2808 * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2809 * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2810 * aura donc un impact sur cette méthode.
2811 *
2812 * @param string dossier : identifiant du dossier de l'instruction
2813 * @param int evenement : identifiant de l'évènement d'instruction
2814 *
2815 * @return void
2816 */
2817 public function set_precharge_complement($evenement, $dossier) {
2818 // Récupération des bibles et chargement dans les compléments
2819 for ($i = 1; $i <= 15; $i++) {
2820 // Constitution de l'id du champs.
2821 // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2822 $field = "complement".($i === 1 ? '' : $i)."_om_html";
2823 // Récupération des compléments correspondant en fonction de l'évènement
2824 // et du dossier puis insertion dans la champs voulu
2825 $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2826 }
2827 }
2828
2829
2830
2831 /**
2832 * Test si une restriction est valide.
2833 *
2834 * @return boolean
2835 */
2836 function restrictionIsValid($restriction){
2837 if($this->restriction_valid != null) {
2838 return $this->restriction_valid;
2839 }
2840 if(empty($restriction)) {
2841 $this->restriction_valid = true;
2842 return $this->restriction_valid;
2843 }
2844 // Liste des opérateurs possibles sans espace
2845 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2846 // Liste identique mais avec le marqueur §
2847 $mark = "§";
2848 $operateurs_marked = array();
2849 foreach ($operateurs as $operateur) {
2850 $operateurs_marked[] = $mark.$operateur.$mark;
2851 }
2852
2853 // Supprime tous les espaces de la chaîne de caractère
2854 $restriction = preg_replace('/\s+/', '', $restriction);
2855
2856 // Met un marqueur avant et après les opérateurs
2857 // puis transforme la chaine en un tableau
2858 $restriction = str_replace($operateurs, $operateurs_marked,
2859 $restriction);
2860
2861 // Pour chaque opérateur logique
2862 foreach (array('&&', '||') as $operator) {
2863
2864 // S'il est absent on ne fait aucun traitement
2865 if (strpos($restriction, $mark.$operator.$mark) === false) {
2866 continue;
2867 }
2868 // Sinon on vérifie les deux conditions avec le OU/ET logique
2869 $restrictions = explode($mark.$operator.$mark, $restriction);
2870 $restrictions[0] = explode($mark, $restrictions[0]);
2871 $restrictions[1] = explode($mark, $restrictions[1]);
2872 $res_bool = false;
2873 if ($operator == '&&') {
2874 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2875 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2876 $res_bool = true;
2877 }
2878 }
2879 if ($operator == '||') {
2880 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2881 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2882 $res_bool = true;
2883 }
2884 }
2885 return $res_bool;
2886 }
2887 $tabRestriction = explode($mark, $restriction);
2888 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2889
2890 }
2891
2892 function is_restriction_satisfied($restriction, $operateurs) {
2893 // Tableau comprenant les résultat
2894 $res = array();
2895 // Compteur pour les résultat
2896 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2897 $j = 1;
2898 // Comparateur du calcul
2899 $comparateur = '';
2900 // Booléen retourné
2901 $res_bool = true;
2902
2903 // S'il y a un comparateur
2904 if (in_array(">=", $restriction)
2905 || in_array("<=", $restriction)
2906 || in_array("==", $restriction)
2907 || in_array("!=", $restriction)) {
2908
2909 // Si le tableau n'est pas vide
2910 if (count($restriction) > 0) {
2911
2912 // Boucle dans le tableau pour récupérer seulement les valeurs
2913 foreach ($restriction as $key => $value) {
2914 //
2915 if (!in_array($value, $operateurs)) {
2916 if ($this->getRestrictionValue($value) != false) {
2917 $res[] = $this->getRestrictionValue($value);
2918 } else {
2919 // Message d'erreur
2920 $error_message = sprintf(__("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2921 $this->addToMessage($error_message);
2922 // Arrête le traitement
2923 return false;
2924 }
2925 }
2926 }
2927
2928 // Boucle dans le tableau
2929 // commence à 1 car le 0 doit rester inchangé tout au long du
2930 // traitement
2931 for ($i = 1; $i<count($restriction); $i++) {
2932
2933 // Récupère le comparateur
2934 if ($restriction[$i] === ">="
2935 || $restriction[$i] === "<="
2936 || $restriction[$i] === "=="
2937 || $restriction[$i] === "!=") {
2938 $comparateur = $restriction[$i];
2939 }
2940
2941 // Si l'opérateur qui suit est un "+"
2942 if ($restriction[$i] === "+") {
2943 $dateDep = $res[$j];
2944 unset($res[$j]);$j++;
2945 $duree = $res[$j];
2946 unset($res[$j]);
2947 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2948 }
2949
2950 // Si l'opérateur qui suit est un "-"
2951 if ($restriction[$i] === "-") {
2952 $dateDep = $res[$j];
2953 unset($res[$j]);$j++;
2954 $duree = $res[$j];
2955 unset($res[$j]);
2956 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2957 }
2958 }
2959
2960 }
2961
2962 // Si les tableau des résultats n'est pas vide
2963 if (count($res) > 0) {
2964 //
2965 $res_bool = false;
2966 // Effectue le test
2967 if ($comparateur === ">=") {
2968 //
2969 if (strtotime($res[0]) >= strtotime($res[$j])) {
2970 $res_bool = true;
2971 }
2972 }
2973 if ($comparateur === "<=") {
2974 //
2975 if (strtotime($res[0]) <= strtotime($res[$j])) {
2976 $res_bool = true;
2977 }
2978 }
2979 if ($comparateur === "==") {
2980 //
2981 if (strtotime($res[0]) == strtotime($res[$j])) {
2982 $res_bool = true;
2983 }
2984 }
2985 if ($comparateur === "!=") {
2986 //
2987 if (strtotime($res[0]) != strtotime($res[$j])) {
2988 $res_bool = true;
2989 }
2990 }
2991 }
2992 // Sinon une erreur s'affiche
2993 } else {
2994
2995 // Message d'erreur
2996 $error_message = __("Mauvais parametrage de la restriction.")." ".
2997 __("Contactez votre administrateur");
2998 $this->addToMessage($error_message);
2999 // Arrête le traitement
3000 return false;
3001 }
3002
3003 return $res_bool;
3004
3005 }
3006
3007 /**
3008 * Permet de définir si l'événement passé en paramètre est un événement retour.
3009 * @param integer $evenement événement à tester
3010 *
3011 * @return boolean retourne true si événement retour sinon false
3012 */
3013 function is_evenement_retour($evenement) {
3014 if(empty($evenement) || !is_numeric($evenement)) {
3015 return "";
3016 }
3017
3018 $evenement = $this->f->get_inst__om_dbform(array(
3019 "obj" => "evenement",
3020 "idx" => $evenement,
3021 ));
3022
3023 return $evenement->getVal('retour') == 't';
3024 }
3025
3026 /**
3027 * Retourne le champ restriction de l'événement passé en paramètre.
3028 *
3029 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
3030 *
3031 * @return string contenu du champ restriction
3032 */
3033 function get_restriction($evenement) {
3034 if(empty($evenement) || !is_numeric($evenement)) {
3035 return "";
3036 }
3037 //Récupère la restriction
3038 $evenement = $this->f->get_inst__om_dbform(array(
3039 "obj" => "evenement",
3040 "idx" => $evenement,
3041 ));
3042
3043 return $evenement->getVal('restriction');
3044 }
3045
3046 /**
3047 * Récupère la valeur du champ dans la restriction
3048 * @param string $restrictionValue Nom du champ
3049 * @return mixed Valeur du champ
3050 */
3051 function getRestrictionValue($restrictionValue){
3052
3053 // Initialisation de la valeur de retour
3054 $return = false;
3055
3056 // Récupére les valeurs du dossier
3057 $value_dossier = $this->get_dossier_actual();
3058
3059 //
3060 if (is_numeric($restrictionValue)) {
3061 $return = $restrictionValue;
3062 }elseif (isset($value_dossier[$restrictionValue])) {
3063 $return = $value_dossier[$restrictionValue];
3064 }elseif (isset($this->valF[$restrictionValue])) {
3065 $return = $this->valF[$restrictionValue];
3066 }
3067
3068 // Retourne la valeur du champ
3069 return $return;
3070 }
3071
3072
3073 /**
3074 * Calcul une regle à partir des données de l'url et affiche son
3075 * résultat au format json
3076 */
3077 public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3078 // Récupération de la date limite
3079 $dossier = $this->f->get_inst__om_dbform(array(
3080 'obj' => 'dossier',
3081 'idx' => $this->getVal('dossier')
3082 ));
3083 $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3084 $dossier->getVal('date_limite') :
3085 $dossier->getVal('date_limite_incompletude');
3086 // Ajout d'un jour à la date limite (reglementaire lors de la notification
3087 // par demat)
3088 $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3089 // Compare la date limite à j+1 et la date du jour
3090 // La date du jour est récupérée via la fonction date pour pouvoir comparer
3091 // des timestamps de début de journée
3092 if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3093 echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3094 }
3095
3096 /**
3097 * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3098 *
3099 * @param object $ev Instance de l'événement associé à l'instruction
3100 * @param array $params Types d'événements autorisés
3101 * @return boolean
3102 */
3103 public function is_type_evenement_autorise($ev, $params = array()) {
3104 $type_evenement = $ev->getVal('type');
3105 if (isset($params["types_evenements_autorises"])
3106 && ! empty($params["types_evenements_autorises"])
3107 && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3108 return true;
3109 }
3110 return false;
3111 }
3112
3113 /**
3114 * Vérifie si la date limite de notification au demandeur est dépassée.
3115 *
3116 * @param boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3117 * @return boolean
3118 */
3119 public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3120 $dln = $this->getVal('archive_date_notification_delai');
3121 if ($dln === ''
3122 || $dln === null) {
3123 //
3124 $dossier = $this->f->get_inst__om_dbform(array(
3125 'obj' => 'dossier',
3126 'idx' => $this->getVal('dossier')
3127 ));
3128 $dln = $dossier->getVal('date_notification_delai');
3129 }
3130 if ($dln === ''
3131 || $dln === null) {
3132 //
3133 return false;
3134 }
3135 // Ajout d'un jour à la date limite de notification
3136 if ($add_one_day === true) {
3137 $dln = $this->f->mois_date($dln, "1", "+", "jour");
3138 }
3139 // Compare la date limite de notification et la date du jour
3140 return strtotime($dln) <= strtotime(date("Y-m-d"));
3141 }
3142
3143 /**
3144 * Calcul des règle d'action selon leur type.
3145 *
3146 * Types de règle :
3147 * - date
3148 * - numeric
3149 * - text
3150 * - bool
3151 * - specific
3152 * - technical_data
3153 *
3154 * @param string $rule Règle d'action.
3155 * @param string $rule_name Nom de la règle.
3156 * @param string $type Type de la règle.
3157 *
3158 * @return mixed Résultat de la règle
3159 */
3160 public function regle($rule, $rule_name, $type = null) {
3161
3162 // Supprime tous les espaces de la chaîne de caractère
3163 $rule = str_replace(' ', '', $rule);
3164 // On force les minuscules
3165 $rule = strtolower($rule);
3166 // Coupe la chaîne au niveau de l'opérateur
3167 $operands = explode ("+", $rule);
3168 // Nombre d'opérande
3169 $nb_operands = count($operands);
3170
3171 // Règle à null
3172 if ($rule == "null") {
3173 return null;
3174 }
3175
3176 // Tableau des champs de type date
3177 $rule_type_date = array(
3178 "regle_date_limite",
3179 "regle_date_notification_delai",
3180 "regle_date_complet",
3181 "regle_date_validite",
3182 "regle_date_decision",
3183 "regle_date_chantier",
3184 "regle_date_achevement",
3185 "regle_date_conformite",
3186 "regle_date_rejet",
3187 "regle_date_dernier_depot",
3188 "regle_date_limite_incompletude",
3189 "regle_date_cloture_instruction",
3190 "regle_date_premiere_visite",
3191 "regle_date_derniere_visite",
3192 "regle_date_contradictoire",
3193 "regle_date_retour_contradictoire",
3194 "regle_date_ait",
3195 "regle_date_transmission_parquet",
3196 "regle_date_affichage",
3197 "duree_validite",
3198 "duree_validite_parametrage",
3199 );
3200 // Tableau des champs de type numérique
3201 $rule_type_numeric = array(
3202 );
3203 // Tableau des champs de type text
3204 $rule_type_time_delai = array(
3205 "regle_delai",
3206 "regle_delai_incompletude",
3207 );
3208 // Tableau des champs de type text
3209 $rule_type_text = array(
3210 );
3211 // Tableau des champs de type booléen
3212 $rule_type_bool = array(
3213 "regle_a_qualifier",
3214 "regle_incompletude",
3215 "regle_incomplet_notifie",
3216 "regle_evenement_suivant_tacite_incompletude",
3217 );
3218 // Tableau des champs spécifiques
3219 $rule_type_specific = array(
3220 "regle_autorite_competente",
3221 "regle_etat",
3222 "regle_accord_tacite",
3223 "regle_avis",
3224 "regle_pec_metier",
3225 "regle_etat_pendant_incompletude",
3226 );
3227 // Tableau des champs de données techniques
3228 $rule_type_technical_data = array(
3229 'regle_donnees_techniques1',
3230 'regle_donnees_techniques2',
3231 'regle_donnees_techniques3',
3232 'regle_donnees_techniques4',
3233 'regle_donnees_techniques5',
3234 );
3235 // Tableau des champs simple
3236 $rule_type_simple = array(
3237 "regle_dossier_instruction_type",
3238 );
3239
3240 // Définit le type du champ
3241 if (in_array($rule_name, $rule_type_date) == true) {
3242 $type = "date";
3243 }
3244 if (in_array($rule_name, $rule_type_numeric) == true) {
3245 $type = "numeric";
3246 }
3247 if (in_array($rule_name, $rule_type_text) === true) {
3248 $type = "text";
3249 }
3250 if (in_array($rule_name, $rule_type_bool) === true) {
3251 $type = "bool";
3252 }
3253 if (in_array($rule_name, $rule_type_specific) === true) {
3254 $type = "specific";
3255 }
3256 if (in_array($rule_name, $rule_type_technical_data) === true) {
3257 $type = 'technical_text';
3258 }
3259 if (in_array($rule_name, $rule_type_simple) === true) {
3260 $type = 'simple';
3261 }
3262 if (in_array($rule_name, $rule_type_time_delai) === true) {
3263 $type = "time_delai";
3264 }
3265
3266 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3267 // Récupère directement la valeur de l'opérande
3268 if ($type === 'specific') {
3269 //
3270 return $this->get_value_for_rule($rule);
3271 }
3272
3273 // Initialisation des variables
3274 $total_numeric = 0;
3275 $res_text = '';
3276 $final_date = null;
3277
3278 // Pour chaque opérande
3279 foreach ($operands as $key => $operand) {
3280 // Si c'est une règle de type date
3281 if ($type == 'date') {
3282 if (is_numeric($operand) === false){
3283 $rule_value = $this->get_value_for_rule($operand);
3284 if (
3285 $rule_value !== null
3286 && (
3287 strpos($operand, 'mois') !== false
3288 || strpos($operand, 'jour') !== false
3289 )
3290 ){
3291 $rule_value = $operand;
3292 }
3293 if ($rule_value !== null){
3294 // Vérifie si l'opérande est une date
3295 if ($this->f->check_date($rule_value) == true) {
3296 // Affecte la date
3297 $final_date = $rule_value;
3298 }else{
3299 // Gère les opérandes
3300 preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3301
3302 // Ajoute l'opérande au total
3303 foreach ($matches[1] as $matche_key => $matche_value) {
3304 $timelength = $matches[1][$matche_key][0];
3305 $timetype = 'mois';
3306 if ( $matches[2][$matche_key][0] != ''){
3307 $timetype = $matches[2][$matche_key][0];
3308 }
3309 // Ajout au calcul de la date
3310 $final_date = $this->f->mois_date(
3311 $final_date,
3312 $timelength,
3313 "+",
3314 $timetype
3315 );
3316 }
3317 }
3318 }
3319 }
3320 // Les autres opérandes doivent être que des numériques
3321 if (is_numeric($operand) == true) {
3322 // Ajoute l'opérande au total
3323 // Ajout au calcul de la date
3324 $final_date = $this->f->mois_date(
3325 $final_date,
3326 $operand,
3327 "+"
3328 );
3329 }
3330 }
3331
3332 // Si c'est une règle de type numérique
3333 if ($type == 'numeric') {
3334 // Les opérandes doivent être que des numériques
3335 if (is_numeric($operand) == true) {
3336 // Ajoute l'opérande au total
3337 $total_numeric += $operand;
3338 }
3339 if (is_numeric($operand) === false
3340 && $this->get_value_for_rule($operand) !== null
3341 && is_numeric($this->get_value_for_rule($operand)) == true) {
3342 // Ajoute l'opérande au total
3343 $total_numeric += $this->get_value_for_rule($operand);
3344 }
3345 }
3346
3347 // Si c'est une règle de type text
3348 if ($type === 'text' || $type === 'technical_text') {
3349 // Concatène toutes les chaînes de caractère
3350 $res_text .= $this->get_value_for_rule($operand);
3351 }
3352
3353 // Si c'est une règle de type time_delai
3354 if ($type === 'time_delai') {
3355 $rule_value = $this->get_value_for_rule($operand);
3356 if ( strlen($res_text) != 0) {
3357 $res_text .= "+";
3358 }
3359 if ($rule_value != null && $rule_value != '' && $rule_value != 'null'){
3360 // Supprime tous les espaces de la chaîne de caractère
3361 // Concatène toutes les chaînes de caractère
3362 $res_text .= $rule_value;
3363 } else if (! in_array($operand, action::EVENEMENT_FIELDS)) {
3364 $res_text .= $operand;
3365 }
3366 }
3367
3368 }
3369
3370 // Résultat pour une règle de type date
3371 if ($type == 'date') {
3372 // Retourne la date
3373 return $final_date;
3374 }
3375
3376 // Résultat pour une règle de type numérique
3377 if ($type == 'numeric') {
3378 // Retourne le calcul
3379 return $total_numeric;
3380 }
3381
3382 // Résultat pour une règle de type text
3383 if (in_array($type, array('text', 'technical_text')) === true) {
3384 // Retourne la chaîne de caractère
3385 return $res_text;
3386 }
3387
3388 // Résultat pour une règle de type text
3389 if (in_array($type, array('time_delai')) === true) {
3390 // Traitement de la valeur à afficher
3391 $res_text = str_replace(' ', '', $res_text);
3392 $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3393 $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3394 $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3395 return $res_text;
3396 }
3397
3398 if ($type === 'simple' || $type === 'bool') {
3399 // Retourne la valeur du champs rule
3400 return $rule;
3401 }
3402 }
3403
3404
3405 /**
3406 * Récupère la valeur du champs dans l'instruction ou dans les données
3407 * techniques.
3408 * Spécifique au calcul des règles.
3409 *
3410 * @param string $field Champ
3411 *
3412 * @return mixed Valeur du champ
3413 */
3414 private function get_value_for_rule($field) {
3415 // Si le champ n'existe pas dans la table instruction
3416 if (array_key_exists($field, $this->valF) === false) {
3417 // Récupère l'instance de la classe donnees_techniques
3418 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3419 // Retourne la valeur de la donnée technique
3420 return $inst_donnees_techniques->getVal($field);
3421 }
3422
3423 //
3424 return $this->valF[$field];
3425 }
3426
3427
3428 /**
3429 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3430 * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3431 *
3432 * Pour générer le nom du fichier, si le type de document en lien avec l'évènement existe, on récupère son libellé
3433 * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3434 *
3435 * @return string : le nom du fichier générer
3436 */
3437 function determinate_name_doc_pdf(){
3438 $id_DI = $this->getVal("dossier");
3439 $date = date('Ymd');
3440 $data = "";
3441
3442 // Récupération de l'id de la lettre type associée à l'instruction
3443 $data = $this->getVal("lettretype");
3444
3445 // Récupération de l'id de l'instruction
3446 $id_instr = $this->getVal("instruction");
3447
3448 // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3449 if(!empty($this->get_type_document_linked_with_instruction())){
3450 $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3451 }
3452
3453 // On retourne le nom du fichier généré
3454 return $this->f->normalize_string(
3455 sprintf(
3456 "%s_%s_%s_%s",
3457 $id_DI,
3458 $id_instr,
3459 $date,
3460 $data
3461 )
3462 );
3463 }
3464
3465
3466 /**
3467 * [get_inst_donnees_techniques description]
3468 *
3469 * @param [type] $donnees_techniques [description]
3470 *
3471 * @return [type] [description]
3472 */
3473 function get_inst_donnees_techniques($donnees_techniques = null) {
3474 //
3475 if (isset($this->inst_donnees_techniques) === false ||
3476 $this->inst_donnees_techniques === null) {
3477 //
3478 if (is_null($donnees_techniques)) {
3479 $donnees_techniques = $this->getDonneesTechniques();
3480 }
3481 //
3482 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3483 "obj" => "donnees_techniques",
3484 "idx" => $donnees_techniques,
3485 ));
3486 }
3487 //
3488 return $this->inst_donnees_techniques;
3489 }
3490
3491
3492 /**
3493 * Retourne l'identifiant des données techniques liées du dossier
3494 * @return string L'identifiant des données techniques liées du dossier
3495 */
3496 function getDonneesTechniques() {
3497
3498 $qres = $this->f->get_one_result_from_db_query(
3499 sprintf(
3500 'SELECT
3501 donnees_techniques
3502 FROM
3503 %1$sdonnees_techniques
3504 WHERE
3505 dossier_instruction = \'%2$s\'',
3506 DB_PREFIXE,
3507 $this->f->db->escapeSimple($this->valF["dossier"])
3508 ),
3509 array(
3510 "origin" => __METHOD__,
3511 )
3512 );
3513
3514 return $qres['result'];
3515 }
3516
3517 /**
3518 * TRIGGER - triggerajouterapres.
3519 *
3520 * - Mise à jour des informations liées au workflow sur le dossier
3521 * - Interface avec le référentiel ERP [105][111]
3522 * - Mise à jour du DA
3523 * - Historisation de la vie du DI
3524 *
3525 * @return boolean
3526 */
3527 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3528 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3529
3530 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3531 if ($parent_res === false) return $parent_res;
3532
3533 $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3534 if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data)) {
3535 return false;
3536 }
3537
3538 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3539 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3540 // Instance de la classe evenement
3541 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3542 // Instance de l'état courant du dossier d'instruction
3543 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3544 "obj" => "etat",
3545 "idx" => $inst_di->get_id_etat(),
3546 ));
3547
3548 /**
3549 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3550 * par l'action
3551 */
3552 // état de complétude actuel du dossier
3553 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3554 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3555 $ev_suiv_tacite_incompletude = false;
3556 // Initialisation
3557 $valF = array();
3558 $valF_dt = array();
3559 //
3560 // Récupération des paramètres de l'action
3561 // TODO : remplacer cette requête par l'instanciation de l'action
3562 $qres = $this->f->get_all_results_from_db_query(
3563 sprintf(
3564 'SELECT
3565 *
3566 FROM
3567 %1$saction
3568 WHERE
3569 action = \'%2$s\'',
3570 DB_PREFIXE,
3571 $this->f->db->escapeSimple($this->valF['action'])
3572 ),
3573 array(
3574 "origin" => __METHOD__
3575 )
3576 );
3577 foreach ($qres['result'] as $row) {
3578
3579 // pour chacune des regles, on applique la regle
3580 if ($row['regle_delai'] != '') {
3581 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3582 }
3583 if ($row['regle_accord_tacite'] != '') {
3584 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3585 }
3586 if ($row['regle_avis'] != '') {
3587 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3588 }
3589 if ($row['regle_date_limite'] != '') {
3590 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3591 }
3592 if ($row['regle_date_complet'] != '') {
3593 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3594 }
3595 if ($row['regle_date_dernier_depot'] != '') {
3596 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3597 }
3598 if ($row['regle_date_notification_delai'] != '') {
3599 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3600 }
3601 if ($row['regle_date_decision'] != '') {
3602 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3603 }
3604 if ($row['regle_date_rejet'] != '') {
3605 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3606 }
3607 if ($row['regle_date_validite'] != '') {
3608 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3609 }
3610 if ($row['regle_date_chantier'] != '') {
3611 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3612 }
3613 if ($row['regle_date_achevement'] != '') {
3614 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3615 }
3616 if ($row['regle_date_conformite'] != '') {
3617 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3618 }
3619 if ($row['regle_date_limite_incompletude'] != '') {
3620 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3621 }
3622 if ($row['regle_delai_incompletude'] != '') {
3623 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3624 }
3625 if ($row['regle_autorite_competente'] != '') {
3626 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3627 }
3628 if ($row['regle_etat'] != '') {
3629 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3630 }
3631 if ($row['regle_date_cloture_instruction'] !== '') {
3632 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3633 }
3634 if ($row['regle_date_premiere_visite'] !== '') {
3635 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3636 }
3637 if ($row['regle_date_derniere_visite'] !== '') {
3638 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3639 }
3640 if ($row['regle_date_contradictoire'] !== '') {
3641 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3642 }
3643 if ($row['regle_date_retour_contradictoire'] !== '') {
3644 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3645 }
3646 if ($row['regle_date_ait'] !== '') {
3647 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3648 }
3649 if ($row['regle_donnees_techniques1'] !== '') {
3650 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3651 }
3652 if ($row['regle_donnees_techniques2'] !== '') {
3653 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3654 }
3655 if ($row['regle_donnees_techniques3'] !== '') {
3656 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3657 }
3658 if ($row['regle_donnees_techniques4'] !== '') {
3659 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3660 }
3661 if ($row['regle_donnees_techniques5'] !== '') {
3662 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3663 }
3664 if ($row['regle_date_transmission_parquet'] !== '') {
3665 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3666 }
3667 if ($row['regle_dossier_instruction_type'] !== '') {
3668 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3669 }
3670 // La date d'affichage est modifiée seulement si le champ n'est pas
3671 // renseigné
3672 if ($row['regle_date_affichage'] !== ''
3673 && ($inst_di->getVal('date_affichage') === ''
3674 || $inst_di->getVal('date_affichage') === null)) {
3675 //
3676 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3677 }
3678 //
3679 if ($row['regle_pec_metier'] != '') {
3680 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3681 }
3682 if ($row['regle_a_qualifier'] != '') {
3683 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3684 }
3685 //
3686 if ($row['regle_incompletude'] != '') {
3687 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3688 }
3689 if ($row['regle_incomplet_notifie'] != '') {
3690 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3691 }
3692 if ($row['regle_etat_pendant_incompletude'] != '') {
3693 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3694 }
3695 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3696 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3697 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3698 $ev_suiv_tacite_incompletude = true;
3699 }
3700 }
3701 }
3702
3703 // Si l'événement a un événement suivant tacite
3704 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3705 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3706 // pas associé de le même façon au dossier d'instruction
3707 if ($ev_suiv_tacite_incompletude === false) {
3708 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3709 }
3710 if ($ev_suiv_tacite_incompletude === true) {
3711 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3712 }
3713 }
3714 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3715 if (count($valF_dt) > 0) {
3716 $dt_id = $this->getDonneesTechniques();
3717 // On met à jour le dossier
3718 $cle = " donnees_techniques='".$dt_id."'";
3719 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3720 $this->addToLog(
3721 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3722 VERBOSE_MODE
3723 );
3724 $this->f->isDatabaseError($res1);
3725 // Affichage d'informations à l'utilisateur
3726 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3727 }
3728 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3729 if (count($valF) > 0) {
3730 //
3731 $inst_dossier = $this->f->get_inst__om_dbform(array(
3732 "obj" => "dossier",
3733 "idx" => $this->valF['dossier'],
3734 ));
3735 $valF['instruction'] = $id;
3736 $valF['crud'] = 'create';
3737 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3738 if ($update_by_instruction === false) {
3739 $this->cleanMessage();
3740 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3741 return false;
3742 }
3743 // Affichage d'informations à l'utilisateur
3744 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3745 }
3746
3747 /**
3748 * Interface avec le référentiel ERP.
3749 *
3750 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3751 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3752 * Déclencheur :
3753 * - L'option ERP est activée
3754 * - Le dossier est marqué comme "connecté au référentiel ERP"
3755 * - Le dossier est de type PC
3756 * - Le formulaire d'ajout d'un événement d'instruction est validé
3757 * avec un événement pour lequel les services ERP doivent être
3758 * informé
3759 */
3760 //
3761 if ($this->f->is_option_referentiel_erp_enabled() === true
3762 && $inst_di->is_connected_to_referentiel_erp() === true
3763 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3764 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3765 //
3766 $infos = array(
3767 "dossier_instruction" => $this->valF['dossier'],
3768 "decision" => $inst_evenement->getVal("libelle"),
3769 );
3770 //
3771 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3772 if ($ret !== true) {
3773 $this->cleanMessage();
3774 $this->addToMessage(__("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3775 return false;
3776 }
3777 $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3778 }
3779
3780 // Si le mode en rédaction intégrale est activé
3781 if (isset($this->valF['flag_edition_integrale']) === true
3782 && $this->valF['flag_edition_integrale'] === true) {
3783 $redactionIntegraleValF = array();
3784
3785 // Récupère la collectivite du dossier d'instruction
3786 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3787 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3788 // Récupère le corps de la lettre type
3789 $params = array(
3790 "specific" => array(
3791 "corps" => array(
3792 "mode" => "get",
3793 )
3794 ),
3795 );
3796 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3797 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3798 // Récupère le titre de la lettre type
3799 $params = array(
3800 "specific" => array(
3801 "titre" => array(
3802 "mode" => "get",
3803 )
3804 ),
3805 );
3806 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3807 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3808
3809 // mise à jour en base de données
3810 $res = $this->f->db->autoExecute(
3811 DB_PREFIXE.$this->table,
3812 $redactionIntegraleValF,
3813 DB_AUTOQUERY_UPDATE,
3814 $this->clePrimaire."=".$id
3815 );
3816 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3817 if ($this->f->isDatabaseError($res, true) === true) {
3818 return false;
3819 }
3820 }
3821
3822 /**
3823 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3824 */
3825 // Si la finalisation automatique de l'événement est activée
3826 // ET si l'instruction n'a pas déjà été finalisée
3827 // ET s'il existe une lettre type associée
3828 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3829 && $inst_evenement->getVal('om_final_instruction') !== 't'
3830 && $inst_evenement->getVal('lettretype') !== ''
3831 && $inst_evenement->getVal('lettretype') !== null) {
3832
3833 // On instancie l'instruction
3834 $inst_instruction = $this->f->get_inst__om_dbform(array(
3835 "obj" => "instruction",
3836 "idx" => $this->valF[$this->clePrimaire],
3837 ));
3838
3839 // On finalise l'instruction dans le contexte de finalisation : action 100
3840 $inst_instruction->setParameter('maj', 100);
3841 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3842
3843 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3844 // et dans le message d'erreur
3845 if ($finalize === false) {
3846 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3847 $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3848 return false;
3849 }
3850 }
3851
3852 /**
3853 * Finalisation automatique des instructions tacites ou retours.
3854 */
3855 // Si l'option de finalisation automatique des instructions tacites ou
3856 // retours est activée et l'événement d'instruction a une lettre type
3857 // associée
3858 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3859 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3860 && $inst_evenement->getVal('lettretype') !== ''
3861 && $inst_evenement->getVal('lettretype') !== null) {
3862
3863 // Rècupère l'identifiant de l'événement
3864 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3865
3866 // Si l'événement d'instruction est identifié comme un événement
3867 // retour
3868 // OU l'événement d'instruction est l'événement suivant tacite du
3869 // dossier d'instruction (incomplétude prise en compte)
3870 // ET l'événement d'instruction n'a pas déjà été finalisé
3871 if (($inst_evenement->getVal("retour") === 't'
3872 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3873 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3874 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3875
3876 // Finalise l'instruction
3877 $inst_instruction = $this->f->get_inst__om_dbform(array(
3878 "obj" => "instruction",
3879 "idx" => $this->valF[$this->clePrimaire],
3880 ));
3881 $inst_instruction->setParameter('maj', 100);
3882 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3883 if ($finalize === false) {
3884 //
3885 return false;
3886 }
3887 }
3888 }
3889
3890 /**
3891 * Mise à jour de la version de clôture *version_clos* du dossier si et
3892 * seulement si l'instruction met à jour l'état du dossier.
3893 */
3894 if (isset($valF['etat']) === true
3895 && $valF['etat'] !== null
3896 && $valF['etat'] !== '') {
3897 // Instanciation de l'état appliqué sur le dossier par l'instruction
3898 $inst_etat = $this->f->get_inst__om_dbform(array(
3899 "obj" => "etat",
3900 "idx" => $valF['etat'],
3901 ));
3902 //
3903 $update_version_clos = null;
3904 // En cas d'instruction qui clôture le dossier
3905 if ($inst_etat->getVal('statut') === 'cloture') {
3906 $update_version_clos = $inst_di->update_version_clos('up');
3907 }
3908 // En cas d'instruction qui rouvre le dossier
3909 if ($inst_current_etat->getVal('statut') === 'cloture'
3910 && $inst_etat->getVal('statut') !== 'cloture') {
3911 //
3912 $update_version_clos = $inst_di->update_version_clos('down');
3913 //
3914 $params = array(
3915 'di_reopened' => true,
3916 );
3917 }
3918 //
3919 if ($update_version_clos === false) {
3920 $this->f->addToLog(sprintf(
3921 "%s() : ERREUR - %s %s",
3922 __METHOD__,
3923 sprintf(
3924 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3925 $inst_di->getVal($inst_di->clePrimaire)
3926 ),
3927 sprintf(
3928 __("L'instruction tente d'appliquer l'état %s."),
3929 $inst_etat->getVal($inst_etat->clePrimaire)
3930 )
3931 ));
3932 $this->addToMessage(sprintf(
3933 "%s %s",
3934 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3935 __("Veuillez contacter votre administrateur.")
3936 ));
3937 return false;
3938 }
3939 }
3940
3941 /**
3942 * Notification automatique
3943 */
3944 // Notification automatique à l'ajout de l'instruction si la notification
3945 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3946 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3947 ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
3948
3949 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3950 $msgLog = sprintf(
3951 '%s %s : %d',
3952 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3953 __('Instruction notifiée'),
3954 $id
3955 );
3956
3957 // Récupération de la liste des demandeurs à notifier et de la catégorie
3958 $categorie = $this->f->get_param_option_notification($collectivite_di);
3959 $isPortal = $categorie === PORTAL;
3960 $demandeursANotifie = $this->get_demandeurs_notifiable(
3961 $this->valF['dossier'],
3962 $isPortal
3963 );
3964
3965 //
3966 $msg_notif = '';
3967
3968 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3969 $demandeurPrincipalNotifie = false;
3970 foreach ($demandeursANotifie as $demandeur) {
3971 // Identifie si le demandeur principal a été notifié ou pas
3972 // et récupère ses informations
3973 if ($demandeur['petitionnaire_principal'] == 't') {
3974 $demandeurPrincipalNotifie = true;
3975 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3976 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3977 // suivante. On le considère également comme non notifié pour gérer l'envoie
3978 // des messages d'erreurs
3979 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3980 // d'impact sur la notification
3981 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3982 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3983 $demandeurPrincipalNotifie = false;
3984 continue;
3985 }
3986 }
3987 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
3988 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
3989 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
3990 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
3991 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
3992 && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
3993 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
3994 // Ajout de la notif et récupération de son id
3995 $idNotif = $this->ajouter_notification(
3996 $this->valF[$this->clePrimaire],
3997 $this->f->get_connected_user_login_name(),
3998 $demandeur,
3999 $collectivite_di,
4000 array(),
4001 true,
4002 'Echec',
4003 __('La date limite de notification au demandeur est dépassée')
4004 );
4005 if ($idNotif === false) {
4006 // Termine le traitement
4007 $this->addToLog(
4008 sprintf('%s() : %s', __METHOD__, $msgLog),
4009 DEBUG_MODE
4010 );
4011 return $this->end_treatment(__METHOD__, false);
4012 }
4013 $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4014 }
4015 else {
4016 // Ajout de la notif et récupération de son id
4017 $idNotif = $this->ajouter_notification(
4018 $this->valF[$this->clePrimaire],
4019 $this->f->get_connected_user_login_name(),
4020 $demandeur,
4021 $collectivite_di,
4022 array(),
4023 true
4024 );
4025 if ($idNotif === false) {
4026 $this->addToLog(
4027 sprintf('%s() : %s', __METHOD__, $msgLog),
4028 DEBUG_MODE
4029 );
4030 return false;
4031 }
4032 // Création de la tache en lui donnant l'id de la notification
4033 $notification_by_task = $this->notification_by_task(
4034 $idNotif,
4035 $this->valF['dossier'],
4036 $categorie
4037 );
4038 if ($notification_by_task === false) {
4039 $this->addToLog(
4040 sprintf('%s() : %s', __METHOD__, $msgLog),
4041 DEBUG_MODE
4042 );
4043 $this->addToMessage(
4044 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4045 );
4046 return false;
4047 }
4048 $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4049 }
4050 }
4051 // Pour la notification par mail ou la notification via portal si le dossier a
4052 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4053 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4054 // laquelle le demandeur principal n'a pas pu être notifié
4055 $depotPortal = $this->dossier_depose_sur_portail();
4056 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4057 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4058 // ' ' permet de mettre un espace entre les 2 msg de log.
4059 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4060 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4061 $erreursParam = $this->get_info_notification_fail($val['dossier']);
4062 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4063 // Ajout de la notif et récupération de son id
4064 $idNotif = $this->ajouter_notification(
4065 $this->valF[$this->clePrimaire],
4066 $this->f->get_connected_user_login_name(),
4067 $demandeurPrincipal,
4068 $collectivite_di,
4069 array(),
4070 true,
4071 'Echec',
4072 implode(' ', $erreursParam)
4073 );
4074 if ($idNotif === false) {
4075 $this->addToLog(
4076 sprintf('%s() : %s', __METHOD__, $msgLog),
4077 DEBUG_MODE
4078 );
4079 $this->addToMessage(
4080 __('Erreur : la création de la notification a échouée.').
4081 __("Veuillez contacter votre administrateur.")
4082 );
4083 return false;
4084 }
4085 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4086 // de l'échec de la notification
4087 $dossier_message = $this->get_inst_dossier_message(0);
4088 $dossier_message_val = array(
4089 'dossier' => $val['dossier'],
4090 'type' => __('erreur expedition'),
4091 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4092 'login' => $_SESSION['login'],
4093 'date_emission' => date('Y-m-d H:i:s'),
4094 'contenu' => __('Échec lors de la notification de l\'instruction ').
4095 $inst_evenement->getVal('libelle').
4096 '.<br>'.
4097 implode("\n", $erreursParam).
4098 '<br>'.
4099 __('Veuillez corriger ces informations avant de renvoyer la notification.')
4100 );
4101 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4102 // Si une erreur se produit pendant l'ajout
4103 if ($add !== true) {
4104 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4105 return false;
4106 }
4107 }
4108 $this->addToMessage($msg_notif);
4109 }
4110
4111 // Notification automatique en cas de dépôt de dossier dématérialisé
4112 // Vérifie si l'option de notification est active et si il s'agit bien d'une
4113 // instruction de récépissé
4114 if (
4115 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4116 && $this->is_instruction_recepisse()
4117 ) {
4118 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4119 $msgLog = sprintf(
4120 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4121 $val['dossier']
4122 );
4123 // Récupère l'instance de la demande
4124 $demande = $inst_di->get_inst_demande();
4125 // Vérifie que le dossier a été déposé via platau ou portal
4126 if (
4127 ($demande->getVal('source_depot') == PLATAU ||
4128 $demande->getVal('source_depot') == PORTAL)
4129 ) {
4130 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4131 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4132 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4133 if (empty($listeEmails)) {
4134 $this->addToLog(
4135 sprintf(
4136 '%s(): %s %s',
4137 __METHOD__,
4138 $msgLog,
4139 __('Aucun courriel paramétré.')
4140 ),
4141 DEBUG_MODE
4142 );
4143 } else {
4144 foreach ($listeEmails as $email) {
4145 // Ajout de la notif et récupération de son id
4146 $destinataire = array(
4147 'destinataire' => $email,
4148 'courriel' => $email
4149 );
4150 $idNotif = $this->ajouter_notification(
4151 $this->valF[$this->clePrimaire],
4152 $this->f->get_connected_user_login_name(),
4153 $destinataire,
4154 $collectivite_di,
4155 array(),
4156 true
4157 );
4158 if ($idNotif === false) {
4159 $this->addToLog(
4160 sprintf('%s(): %s', __METHOD__, $msgLog),
4161 DEBUG_MODE
4162 );
4163 return false;
4164 }
4165 // Création de la tache en lui donnant l'id de la notification
4166 $notification_by_task = $this->notification_by_task(
4167 $idNotif,
4168 $this->valF['dossier'],
4169 'mail',
4170 'notification_depot_demat'
4171 );
4172 if ($notification_by_task === false) {
4173 $this->addToMessage(
4174 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4175 );
4176 $this->addToLog(
4177 sprintf('%s(): %s', __METHOD__, $msgLog),
4178 DEBUG_MODE
4179 );
4180 return false;
4181 }
4182 }
4183 }
4184 }
4185 }
4186
4187 /**
4188 * Mise à jour de la date de dernière modification du dossier
4189 */
4190 $inst_di->update_last_modification_date();
4191
4192 /**
4193 * Mise à jour des données du DA.
4194 */
4195 $inst_da = $inst_di->get_inst_dossier_autorisation();
4196 $params['di_id'] = $this->valF['dossier'];
4197 if ($inst_da->majDossierAutorisation($params) === false) {
4198 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4199 $this->correct = false;
4200 return false;
4201 }
4202
4203 /**
4204 * Historisation de la vie du DI.
4205 */
4206
4207 $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4208
4209 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4210 if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data)) {
4211 return false;
4212 }
4213 return $res;
4214 }
4215
4216 /**
4217 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4218 * sont remplies.
4219 * Les conditions vérifiées sont les suivantes :
4220 * - L'option de notification *option_notification* doit être définie
4221 * - Le petitionnaire principal doit accepter les notifications
4222 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4223 * - Le pétitionnaire principal doit avoir une adresse mail correcte
4224 * Pour chaque vérification effectué un message d'erreur est ajouté si la
4225 * condition n'est pas remplie.
4226 * Renvoie le message d'erreur en sortie.
4227 *
4228 * @param string identifiant du dossier sur lequel les notifications ont échouée
4229 * @return string
4230 */
4231 public function get_info_notification_fail($dossier = null) {
4232 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4233 // utilise celui associé à l'instruction
4234 if ($dossier == null) {
4235 $dossier = $this->getVal('dossier');
4236 }
4237 // Tableau contenant la liste des messages d'erreur
4238 $errorMessage = array();
4239 // Récupère l'option de notification
4240 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4241 $option_notification = $this->f->get_param_option_notification($collectivite_di);
4242 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4243 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4244 }
4245 // Récupère les informations du demandeurs principal
4246 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4247 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4248 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4249 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4250 }
4251 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4252 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4253 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4254 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4255 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4256 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4257 $infoPetitionnaire['courriel'].
4258 '.';
4259 }
4260 } else {
4261 // Si le courriel du pétitionnaire principal
4262 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4263 }
4264
4265 return $errorMessage;
4266 }
4267
4268 /**
4269 * Méthode servant à vérifier si un dossier a été déposé sur
4270 * le portail citoyen ou pas.
4271 * La verification se fait via une requête sql dans laquelle
4272 * on va chercher un dossier ayant pour id l'identifiant de
4273 * dossier associé à l'instruction et pour lequel la demande
4274 * associée la plus ancienne est une demande de création de
4275 * dossier via portail
4276 *
4277 * @param string identifiant du dossier. Si non renseigné c'est le dossier
4278 * associé à l'instruction qui est utilisé
4279 * @return boolean|void true : dossier déposé via portail, false : dossier
4280 * non déposé via portail et null : erreur de base de données.
4281 */
4282 protected function dossier_depose_sur_portail($dossier = null) {
4283 if (empty($dossier)) {
4284 $dossier = $this->getVal('dossier');
4285 }
4286 $qres = $this->f->get_one_result_from_db_query(
4287 sprintf(
4288 'SELECT
4289 dossier
4290 FROM
4291 %1$sdossier
4292 -- Récuperation de la première demande associée au dossier
4293 LEFT JOIN (
4294 SELECT
4295 demande,
4296 dossier_instruction,
4297 source_depot
4298 FROM
4299 %1$sdemande
4300 WHERE
4301 dossier_instruction = \'%2$s\'
4302 ORDER BY
4303 demande ASC
4304 LIMIT 1
4305 ) AS demande
4306 ON dossier.dossier = demande.dossier_instruction
4307 WHERE
4308 dossier.dossier = \'%2$s\'
4309 AND demande.source_depot = \'portal\'',
4310 DB_PREFIXE,
4311 $this->f->db->escapeSimple($dossier)
4312 ),
4313 array(
4314 "origin" => __METHOD__,
4315 "force_return" => true,
4316 )
4317 );
4318 if ($qres["code"] !== "OK") {
4319 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4320 return;
4321 }
4322 // Si on a un résultat c'est que le dossier a été déposé via le portail
4323 return ! empty($qres["result"]);
4324 }
4325
4326 public function is_service_notifiable() {
4327 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4328
4329 // Si l'instruction a une édition non finalisé quel que soit
4330 // le type de notification, il n'est pas notifiable
4331 if ($this->has_an_edition() === true) {
4332 if ($this->is_unfinalizable_without_bypass() === false) {
4333 return false;
4334 }
4335 }
4336 // Vérifie si la notification des tiers est active pour l'évènement
4337 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4338 }
4339
4340 public function is_tiers_notifiable() {
4341 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4342
4343 // Si l'instruction a une édition non finalisé quel que soit
4344 // le type de notification, il n'est pas notifiable
4345 if ($this->has_an_edition() === true) {
4346 if ($this->is_unfinalizable_without_bypass() === false) {
4347 return false;
4348 }
4349 }
4350 // Vérifie si la notification des tiers est active pour l'évènement
4351 return ! empty($evenement->getVal('notification_tiers'));
4352 }
4353
4354 /**
4355 * Méthode permettant de savoir si une instruction peut
4356 * être notifiée manuellement selon les différents types
4357 * de notification.
4358 *
4359 * Si l'instruction a une édition non finalisée alors elle n'est pas
4360 * manuellement notifiable.
4361 * Si l'instruction est associé à un événement de notification pour
4362 * lequel un retour signature est recquis, elle n'est notifiable que
4363 * si la date de retour de signature est remplie.
4364 * Par défaut si le type de notification n'est pas connu alors l'instruction
4365 * n'est pas notifiable.
4366 * Pour tous les autres cas l'instruction est manuellement notifiable.
4367 *
4368 * @return boolean true : notifiable | false : non notifiable
4369 */
4370 public function is_notifiable_by_task_manual() {
4371 $ev = $this->get_inst_evenement($this->getVal('evenement'));
4372
4373 // Si l'instruction a une édition non finalisé quel que soit
4374 // le type de notification, il n'est pas notifiable
4375 if ($this->has_an_edition() === true) {
4376 if ($this->is_unfinalizable_without_bypass() === false) {
4377 return false;
4378 }
4379 }
4380
4381 // Gestion des différents cas selon la valeur du champs notification
4382 if ($ev->getVal('notification') == 'notification_manuelle' ||
4383 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4384 $ev->getVal('notification') == 'notification_automatique'
4385 ) {
4386 return true;
4387 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4388 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4389 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4390 $this->getVal('date_retour_signature') != null &&
4391 $this->getVal('date_retour_signature') != ''
4392 ) {
4393 return true ;
4394 }
4395 return false;
4396 }
4397
4398 /**
4399 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4400 * pour le demandeur principal.
4401 *
4402 * @return boolean true si le traitement à réussi
4403 */
4404 protected function notifier_demandeur_principal_via_portal() {
4405 $this->begin_treatment(__METHOD__);
4406 $message = '';
4407 // Récupération des informations concernant le demandeur
4408 $dossier = $this->getVal('dossier');
4409 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4410 $demandeur = $this->get_demandeurs_notifiable(
4411 $dossier,
4412 true
4413 );
4414 if ($demandeur !== array()) {
4415 $destinataire = array_values($demandeur);
4416 // Ajout de la notif et récupération de son id
4417 $idNotification = $this->ajouter_notification(
4418 $this->getVal($this->clePrimaire),
4419 $this->f->get_connected_user_login_name(),
4420 $destinataire[0],
4421 $collectivite_di,
4422 array(),
4423 true
4424 );
4425 if ($idNotification === false) {
4426 return $this->end_treatment(__METHOD__, false);
4427 }
4428 // Création de la tâche en lui donnant l'id de la notification
4429 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4430 if ($notification_by_task === false) {
4431 $this->addToMessage(
4432 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4433 );
4434 return $this->end_treatment(__METHOD__, false);
4435 }
4436 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
4437 return $this->end_treatment(__METHOD__, true);
4438 }
4439 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4440 return $this->end_treatment(__METHOD__, false);
4441 }
4442
4443 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4444 // Si le type n'est pas correctement spécifié, alors il est calculé
4445 if ($type !== 'notification_recepisse'
4446 && $type !== 'notification_instruction'
4447 && $type !== 'notification_decision'
4448 && $type !== 'notification_service_consulte'
4449 && $type !== 'notification_tiers_consulte'
4450 && $type !== 'notification_depot_demat'
4451 && $type !== 'notification_commune'
4452 && $type !== 'notification_signataire') {
4453 //
4454 $type = 'notification_instruction';
4455 // Vérifie si l'instruction est un récépissé
4456 if ($this->is_instruction_recepisse()) {
4457 $type = 'notification_recepisse';
4458
4459 }
4460 // Vérifie si l'instruction est une décision
4461 if ($type !== 'notification_recepisse') {
4462 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4463 if ($avis_decision !== null && $avis_decision !== '') {
4464 $type = 'notification_decision';
4465 }
4466 }
4467 }
4468 // Préparation des valeurs de la tâche
4469 $task_val = array(
4470 'type' => $type,
4471 'object_id' => $object_id,
4472 'dossier' => $dossier,
4473 'category' => $category,
4474 );
4475 // Préparation de la tache de notification
4476 $inst_task = $this->f->get_inst__om_dbform(array(
4477 "obj" => "task",
4478 "idx" => 0,
4479 ));
4480
4481 $add_task = $inst_task->add_task(array('val' => $task_val));
4482 if ($add_task === false) {
4483 $this->addToLog(
4484 sprintf(
4485 '%s(): %s %s : %s',
4486 __METHOD__,
4487 __('Echec de l\'ajout de la tâche de notification.'),
4488 __('Paramétrage de la tâche'),
4489 var_export($task_val, true)
4490 ),
4491 DEBUG_MODE
4492 );
4493 return false;
4494 }
4495
4496 return true;
4497 }
4498
4499 /**
4500 * Cette méthode permet de savoir si l'instruction est une instruction
4501 * de recepisse (instruction lié à l'ajout du dossier).
4502 *
4503 * Pour cela, on récupère la liste des actions qui ont menées à la création
4504 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4505 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4506 * l'instruction et donc qu'il s'agit d'un recepisse.
4507 *
4508 * @return boolean
4509 */
4510 protected function is_instruction_recepisse() {
4511 // Récupère la liste des actions qui ont mené à la création de
4512 // l'instruction
4513 $trace = debug_backtrace();
4514 // Parcours la liste des actions et si une de ces actions est lié
4515 // à la classe demande on cosidère que l'instruction est un recepisse
4516 foreach ($trace as $key => $value) {
4517 if (isset($trace[$key]['class']) === true
4518 && empty($trace[$key]['class']) === false) {
4519 if (strtolower($trace[$key]['class']) === 'demande') {
4520 return true;
4521 }
4522 }
4523 }
4524 return false;
4525 }
4526
4527 /**
4528 * A partir des informations passée en argument ajoute un nouvel élément
4529 * dans la table instruction_notification.
4530 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4531 * paramètre si le paramétrage attendus est ok.
4532 * Ajoute également un nouvel élement dans instruction_notification_document
4533 * si l'instruction possède une lettretype.
4534 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4535 * élement dans la table instruction_notification_document qui correspondra
4536 * à l'annexe de la notification.
4537 *
4538 * @param integer identifiant de l'instruction notifiée
4539 * @param string information concernant l'emetteur
4540 * @param array tableau contenant 2 entrées
4541 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4542 * - courriel : adresse mail de la personne à notifier
4543 * @param integer identifiant de la collectivité permettant de récupèrer les
4544 * paramètres à valider
4545 * @param boolean indique si la notification est automatique ou manuelle
4546 * @param integer identifiant d'une instruction dont l'édition sera annexé
4547 * à la notification
4548 *
4549 * @return integer|boolean identifiant de la notification créée si le traitement
4550 * a réussie, false sinon.
4551 */
4552 protected function ajouter_notification(
4553 $idInstruction,
4554 $emetteur,
4555 $destinataire,
4556 $collectiviteId,
4557 $annexes = array(),
4558 $demandeAuto = false,
4559 $statut = 'en cours d\'envoi',
4560 $commentaire = 'Notification en cours de traitement'
4561 ) {
4562 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4563 // de créer la notification
4564 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4565 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4566 $this->addToMessage($msgErreur);
4567 $this->addToLog(
4568 sprintf('%s() : %s', __METHOD__, $msgErreur),
4569 DEBUG_MODE
4570 );
4571 return false;
4572 }
4573 // Préparation de la notification
4574 $inst_notif = $this->f->get_inst__om_dbform(array(
4575 "obj" => "instruction_notification",
4576 "idx" => "]",
4577 ));
4578 $notif_val = array(
4579 'instruction_notification' => null,
4580 'instruction' => $idInstruction,
4581 'automatique' => $demandeAuto,
4582 'emetteur' => $emetteur,
4583 'date_envoi' => null,
4584 'destinataire' => $destinataire['destinataire'],
4585 'courriel' => $destinataire['courriel'],
4586 'date_premier_acces' => null,
4587 'statut' => $statut,
4588 'commentaire' => $commentaire
4589 );
4590
4591 // Création de la notification
4592 $add_notif = $inst_notif->ajouter($notif_val);
4593 if ($add_notif === false) {
4594 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4595 $this->addToLog(
4596 sprintf(
4597 '%s() : %s %s : %s',
4598 __METHOD__,
4599 __("Echec de l'ajout de la notification en base de données."),
4600 __('Paramétrage de la notification'),
4601 var_export($notif_val, true)
4602 ),
4603 DEBUG_MODE
4604 );
4605 return false;
4606 }
4607
4608 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4609 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4610 $add_notif_doc = $this->ajouter_notification_document(
4611 $inst_notif->getVal($inst_notif->clePrimaire),
4612 $this->getVal($this->clePrimaire),
4613 'instruction'
4614 );
4615 if ($add_notif_doc === false) {
4616 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4617 return false;
4618 }
4619 }
4620 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4621 if (! empty($annexes) && is_array($annexes)) {
4622 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4623 $inst_notif->getVal($inst_notif->clePrimaire),
4624 $annexes
4625 );
4626 if ($add_notif_annexe === false) {
4627 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4628 return false;
4629 }
4630 }
4631
4632 // Renvoie l'id de la nouvelle instance de instruction_notification
4633 return $inst_notif->getVal($inst_notif->clePrimaire);
4634 }
4635
4636 /**
4637 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4638 * instance dans la table instruction_notification_document lié a la
4639 * notification dont l'id est passé en paramètre.
4640 *
4641 * @param array tableau contenant les informations nécessaires pour créer les annexes
4642 *
4643 * @return integer|boolean identifiant de la notification créée si le traitement
4644 * a réussie, false sinon.
4645 */
4646 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4647 foreach ($listeDocument as $paramDoc) {
4648 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4649 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4650 return false;
4651 }
4652 }
4653 return true;
4654 }
4655
4656 /**
4657 * Ajoute un élément dans la table instruction_notification_document en utilisant
4658 * les éléments fourni en paramètre
4659 *
4660 * @param integer $idNotification : id de la notification à laquelle on associe le document
4661 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4662 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4663 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4664 *
4665 * @return boolean indique si le traitement a réussi
4666 */
4667 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4668 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4669 "obj" => "instruction_notification_document",
4670 "idx" => "]",
4671 ));
4672 // l'attribut instruction doit obligatoirement être renseigné
4673 // pour éviter toutes confusion avec d'autres instruction l'id
4674 // 0 est donné au document n'appartenant pas aux instructions
4675 $notif_doc_val = array(
4676 'instruction_notification_document' => null,
4677 'instruction_notification' => $idNotification,
4678 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4679 'document_type' => $tableDocument,
4680 'document_id' => $idDocument,
4681 'cle' => $this->getCleAccesDocument(),
4682 'annexe' => $isAnnexe
4683 );
4684
4685 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4686 if ($add_notif_doc === false) {
4687 $this->addToLog(
4688 sprintf(
4689 '%s() : %s %s : %s',
4690 __METHOD__,
4691 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4692 __('Paramétrage du document'),
4693 var_export($notif_doc_val, true)
4694 ),
4695 DEBUG_MODE
4696 );
4697 return false;
4698 }
4699 return true;
4700 }
4701
4702 /**
4703 * Récupère via une requête la liste des identifiants des éléments de la table
4704 * parametrage_annexe liés à une instruction.
4705 * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4706 * et lui appliquer le traitement de suppression.
4707 *
4708 * @param integer identifiant d'une instruction
4709 * @return boolean état du traitement. True : OK, False : Echec
4710 */
4711 function supprimer_parametrage_annexe($id_instruction) {
4712 // Récupère la liste des parametrage_annexe associés à l'instruction
4713 $qres = $this->f->get_all_results_from_db_query(sprintf(
4714 'SELECT parametrage_annexe
4715 FROM %sparametrage_annexe
4716 WHERE parametrage_annexe.instruction = %d',
4717 DB_PREFIXE,
4718 intval($id_instruction)),
4719 array('origin' => __METHOD__));
4720 // Instancie puis supprime chacun des éléments de la liste
4721 foreach ($qres['result'] as $res) {
4722 $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4723 'obj' => 'parametrage_annexe',
4724 'idx' => $res['parametrage_annexe']
4725 ));
4726 foreach ($parametrage_annexe->champs as $champ) {
4727 $val[$champ] = $parametrage_annexe->getVal($champ);
4728 }
4729 $suppression = $parametrage_annexe->supprimer($val);
4730 // En cas d'échec arrête le traitement et renvoie false
4731 if ($suppression === false) {
4732 return false;
4733 }
4734 }
4735 return true;
4736 }
4737
4738 /**
4739 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4740 *
4741 * @param integer identifiant de la collectivité
4742 * @return boolean
4743 */
4744 protected function is_parametrage_notification_correct($collectiviteId) {
4745 $categorie = $this->f->get_param_option_notification($collectiviteId);
4746 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4747 if ($categorie === 'mail' && $urlAccesNotif === null) {
4748 return false;
4749 }
4750 return true;
4751 }
4752
4753 /**
4754 * Calcule les nouvelles métadonnées pour un fichier d'instruction.
4755 * Ajoute des métadonnées spécifiques si l'événement est de type "arrêté".
4756 *
4757 * @return array|false Les métadonnées ou false en cas d'erreur.
4758 */
4759 protected function calculate_metadata() {
4760 // Calculs des nouvelles métadonnées
4761 $metadata = $this->getMetadata("om_fichier_instruction");
4762
4763 // On vérifie si l'instruction à finaliser a un événement de type arrete
4764 // TODO : A voir pour remplacer par une instanciation de l'événement.
4765 // Voir également si l'événement ne dois pas être instancié en début de
4766 // méthode pour pouvoir être réutilisé.
4767 $qres = $this->f->get_one_result_from_db_query(
4768 sprintf(
4769 'SELECT
4770 type
4771 FROM
4772 %1$sevenement
4773 WHERE
4774 evenement = \'%2$d\'',
4775 DB_PREFIXE,
4776 intval($this->getVal("evenement"))
4777 ),
4778 array(
4779 "origin" => __METHOD__,
4780 "force_return" => true,
4781 )
4782 );
4783 if ($qres["code"] !== "OK") {
4784 return false;
4785 }
4786 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4787 if ($qres['result'] == 'arrete'){
4788 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4789 }
4790
4791 //
4792 return $metadata;
4793 }
4794
4795 /**
4796 * TRIGGER - triggermodifierapres.
4797 *
4798 * @return boolean
4799 */
4800 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4801 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4802
4803 $data = array('val' => &$val, 'id' => $id);
4804 if (! $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data)) {
4805 return false;
4806 }
4807
4808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4809 $message = '';
4810 $res = true;
4811 // Définit si le dossier d'instruction doit être mis à jour
4812 $update_dossier = true;
4813 // Les actions de mise à jour des dates ne doivent pas appliquer
4814 // l'action de l'événement et donc ne pas mettre à jour le dossier
4815 if ($this->getParameter("maj") == 125
4816 || $this->getParameter("maj") == 170
4817 || $this->getParameter("maj") == 175) {
4818 $update_dossier = false;
4819 }
4820
4821 // Traitement en cas de mise à jour du dossier
4822 if ($update_dossier === true) {
4823 /**
4824 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4825 * si la date de l'evenement est modifiee
4826 */
4827 // Initialisation
4828 $valF = array();
4829 $valF_dt = array();
4830 // Initialisation du type d'événement
4831 $type_evmt = "";
4832 // Récupération de l'action correspondante à l'événement
4833 $evenement = $this->f->get_inst__om_dbform(array(
4834 "obj" => "evenement",
4835 "idx" => $this->valF['evenement']
4836 ));
4837
4838 // Récupération des paramètres de l'action
4839 // TODO : remplacer cette requête par l'instanciation de l'action
4840 $qres = $this->f->get_all_results_from_db_query(
4841 sprintf(
4842 'SELECT
4843 *
4844 FROM
4845 %1$saction
4846 WHERE
4847 action = \'%2$s\'',
4848 DB_PREFIXE,
4849 $this->f->db->escapeSimple($evenement->getVal('action'))
4850 ),
4851 array(
4852 "origin" => __METHOD__
4853 )
4854 );
4855 foreach ($qres['result'] as $row) {
4856 // application des regles sur le courrier + delai
4857 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4858 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4859 }
4860 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4861 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4862 }
4863 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4864 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4865 }
4866 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4867 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4868 }
4869 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4870 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4871 }
4872 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4873 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4874 }
4875 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4876 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4877 }
4878 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4879 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4880 }
4881 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4882 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4883 }
4884 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4885 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4886 }
4887 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4888 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4889 }
4890 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4891 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4892 }
4893 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4894 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4895 }
4896 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4897 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4898 }
4899 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4900 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4901 }
4902 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4903 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4904 }
4905 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4906 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4907 }
4908 if ($row['regle_donnees_techniques1'] !== '') {
4909 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4910 }
4911 if ($row['regle_donnees_techniques2'] !== '') {
4912 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4913 }
4914 if ($row['regle_donnees_techniques3'] !== '') {
4915 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4916 }
4917 if ($row['regle_donnees_techniques4'] !== '') {
4918 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4919 }
4920 if ($row['regle_donnees_techniques5'] !== '') {
4921 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4922 }
4923 if ($row['regle_dossier_instruction_type'] !== '') {
4924 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4925 }
4926 }
4927 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4928 if (count($valF_dt) > 0) {
4929 $dt_id = $this->getDonneesTechniques();
4930 // On met à jour le dossier
4931 $cle = " donnees_techniques='".$dt_id."'";
4932 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4933 $this->addToLog(
4934 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4935 VERBOSE_MODE
4936 );
4937 $this->f->isDatabaseError($res1);
4938 // Affichage d'informations à l'utilisateur
4939 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4940 }
4941 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4942 if (count($valF) > 0) {
4943 $inst_dossier = $this->f->get_inst__om_dbform(array(
4944 "obj" => "dossier",
4945 "idx" => $this->valF['dossier'],
4946 ));
4947 $valF['instruction'] = $id;
4948 $valF['crud'] = 'update';
4949 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4950 if ($update_by_instruction === false) {
4951 $this->cleanMessage();
4952 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4953 return false;
4954 }
4955 // Affichage d'informations à l'utilisateur
4956 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4957 }
4958 }
4959
4960 // Par défaut les instructions à ajouter suite à la saisie d'une date
4961 // de retour signature ou de notification, utilisent l'action 0
4962 // Si la création d'événement d'instruction suivant est déclenchée par
4963 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4964 // de la nouvelle instruction se fait avec l'action 176
4965 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4966 // nouvelle instruction, depuis la méthode verifier()
4967 $code_action_add = 0;
4968 if ($this->getParameter("maj") == 175) {
4969 $code_action_add = 176;
4970 }
4971 $restriction = $this->get_restriction($val['evenement']);
4972 $this->restriction_valid = $this->restrictionIsValid($restriction);
4973
4974 if($restriction == "" || $this->restriction_valid ){
4975 // Récupération de tous les paramètres de l'événement sélectionné
4976 // TODO : remplacer cette requête par l'instanciation de l'evenement
4977 $qres = $this->f->get_all_results_from_db_query(
4978 sprintf(
4979 'SELECT
4980 *
4981 FROM
4982 %1$sevenement
4983 WHERE
4984 evenement = %2$d',
4985 DB_PREFIXE,
4986 intval($this->valF['evenement'])
4987 ),
4988 array(
4989 "origin" => __METHOD__
4990 )
4991 );
4992 $current_id = $this->getVal($this->clePrimaire);
4993 foreach ($qres['result'] as $row) {
4994 // Si la date de retour signature est éditée
4995 if (
4996 $this->getVal('date_retour_signature') == "" &&
4997 $this->valF['date_retour_signature'] != ""
4998 ){
4999 // On Lance le hook
5000 $data = array('val' => $this->valF);
5001 $data['dossier'] = $this->valF['dossier'];
5002 $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
5003
5004 // On vérifie si il existe un événement automatique
5005 if (
5006 $row['evenement_retour_signature'] != ""
5007 ) {
5008 $new_instruction = $this->f->get_inst__om_dbform(array(
5009 "obj" => "instruction",
5010 "idx" => "]",
5011 ));
5012 // Création d'un tableau avec la liste des champs de l'instruction
5013 foreach($new_instruction->champs as $champ) {
5014 $valNewInstr[$champ] = "";
5015 }
5016 // Définition des valeurs de la nouvelle instruction
5017 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
5018 $valNewInstr["destinataire"] = $this->valF['destinataire'];
5019 $valNewInstr["dossier"] = $this->valF['dossier'];
5020 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
5021 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5022 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5023 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5024 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5025 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5026 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5027 $new_instruction->setParameter("maj", $code_action_add);
5028 $new_instruction->class_actions[$code_action_add]["identifier"] =
5029 sprintf(
5030 __("Ajout suite au retour signature de l'instruction %s"),
5031 $current_id
5032 );
5033 $retour = $new_instruction->ajouter($valNewInstr);
5034
5035 //Si une erreur s'est produite et qu'il s'agit d'un problème
5036 //de restriction
5037 if ($retour == false && !$new_instruction->restriction_valid){
5038 $error_message = $this->get_restriction_error_message($restriction);
5039 $this->f->displayMessage("error", $error_message);
5040 $this->addToLog(__METHOD__."(): evenement retour ".
5041 "instruction ".$this->valF[$this->clePrimaire]." : ".
5042 $new_instruction->msg);
5043 }
5044 //Si une erreur s'est produite après le test de la restriction
5045 elseif ($retour == false && $new_instruction->restriction_valid){
5046 $this->correct = false ;
5047 $this->msg .= $new_instruction->msg;
5048 return false;
5049 }
5050 }
5051
5052 $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
5053 }
5054
5055 // Si la date de retour AR est éditée
5056 if (
5057 $this->getVal('date_retour_rar') == "" &&
5058 $this->valF['date_retour_rar'] != ""
5059 ){
5060 // On Lance le hook Notification/Date retour Accusée Reception
5061 $data = array('val' => $this->valF);
5062 $data['dossier'] = $this->valF['dossier'];
5063 $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
5064
5065 // On vérifie si il existe un événement automatique
5066 if ( $row['evenement_retour_ar'] != "" ) {
5067 $new_instruction = $this->f->get_inst__om_dbform(array(
5068 "obj" => "instruction",
5069 "idx" => "]",
5070 ));
5071 // Création d'un tableau avec la liste des champs de l'instruction
5072 foreach($new_instruction->champs as $champ) {
5073 $valNewInstr[$champ] = "";
5074 }
5075 // Définition des valeurs de la nouvelle instruction
5076 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
5077 $valNewInstr["destinataire"] = $this->valF['destinataire'];
5078 $valNewInstr["dossier"] = $this->valF['dossier'];
5079 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
5080 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5081 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5082 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5083 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5084 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5085 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5086 $new_instruction->setParameter("maj", $code_action_add);
5087 $new_instruction->class_actions[$code_action_add]["identifier"] =
5088 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5089 $retour = $new_instruction->ajouter($valNewInstr);
5090
5091 //Si une erreur s'est produite et qu'il s'agit d'un problème
5092 //de restriction
5093 if ($retour == false && !$new_instruction->restriction_valid) {
5094 $error_message = $this->get_restriction_error_message($restriction);
5095 $this->f->displayMessage("error", $error_message);
5096 $this->addToLog(
5097 __METHOD__."(): evenement retour instruction ".
5098 $this->valF[$this->clePrimaire]." : ".
5099 $new_instruction->msg
5100 );
5101 }
5102 //Si une erreur s'est produite après le test de la restriction
5103 elseif ($retour == false && $new_instruction->restriction_valid){
5104 $this->correct = false ;
5105 $this->msg .= $new_instruction->msg;
5106 return false;
5107 }
5108 }
5109 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5110 }
5111
5112 // Si la date_envoi_signature est éditée
5113 if (
5114 $this->getVal('date_envoi_signature') == "" &&
5115 $this->valF['date_envoi_signature'] != ""
5116 ){
5117 // On Lance le hook
5118 $data = array('val' => $this->valF);
5119 $data['dossier'] = $this->valF['dossier'];
5120 $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5121 }
5122 // Si la date de envoi AR est éditée
5123 if (
5124 $this->getVal('date_envoi_rar') == "" &&
5125 $this->valF['date_envoi_rar'] != ""
5126 ){
5127 // On Lance le hook
5128 $data = array('val' => $this->valF);
5129 $data['dossier'] = $this->valF['dossier'];
5130 $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5131 }
5132 // Si la date de envoi controle legalite est éditée
5133 if (
5134 $this->getVal('date_envoi_controle_legalite') == "" &&
5135 $this->valF['date_envoi_controle_legalite'] != ""
5136 ){
5137 // On Lance le hook
5138 $data = array('val' => $this->valF);
5139 $data['dossier'] = $this->valF['dossier'];
5140 $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5141 }
5142 // Si la date de retour controle legalite est éditée
5143 if (
5144 $this->getVal('date_retour_controle_legalite') == "" &&
5145 $this->valF['date_retour_controle_legalite'] != ""
5146 ){
5147 // On Lance le hook
5148 $data = array('val' => $this->valF);
5149 $data['dossier'] = $this->valF['dossier'];
5150 $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5151 }
5152 }
5153 }
5154
5155 // Traitement en cas de mise à jour du dossier
5156 if ($update_dossier === true) {
5157 /**
5158 * Mise à jour de la date de dernière modification du dossier
5159 * d'instruction
5160 */
5161 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5162 $inst_di->update_last_modification_date();
5163
5164 // Mise à jour des données du dossier d'autorisation
5165 $da = $this->f->get_inst__om_dbform(array(
5166 "obj" => "dossier_autorisation",
5167 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5168 ));
5169 $params = array(
5170 'di_id' => $this->getVal('dossier'),
5171 );
5172 if($da->majDossierAutorisation($params) === false) {
5173 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5174 $this->correct = false;
5175 return false;
5176 }
5177 }
5178
5179 // mise à jour des métadonnées issues des dates de suivi
5180 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5181 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5182 if ($dateRetourSignatureModified || $dateRetourRARModified) {
5183
5184 $docUid = $this->getVal("om_fichier_instruction");
5185
5186 // Calculs des nouvelles métadonnées
5187 $metadata = $this->calculate_metadata();
5188 if ($metadata === false) {
5189 $this->correct = false;
5190 $this->addToMessage(__("Erreur de traitement de fichier."));
5191 $log_msg_error = "Modification non enregistrée - id instruction = %s - uid fichier = %s";
5192 $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $this->getVal($this->clePrimaire), $docUid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
5193 return false;
5194 }
5195
5196 // Filtre pour conserver uniquement les métadonnées liées aux dates
5197 $metadataToKeep = array(
5198 "statutAutorisation",
5199 "dateEvenementDocument",
5200 'date_cloture_metier',
5201 "NotificationArrete",
5202 "dateNotificationArrete",
5203 "controleLegalite",
5204 "dateSignature",
5205 "nomSignataire",
5206 "qualiteSignataire",
5207 "dateControleLegalite",
5208 );
5209 $metadata = array_filter(
5210 $metadata,
5211 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5212 ARRAY_FILTER_USE_KEY
5213 );
5214
5215 // Mise à jour des métadonnées du document en GED
5216 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5217 if ($operationOrUID == 'OP_FAILURE') {
5218 $this->correct = false;
5219 $this->addToMessage(__("Erreur de traitement de fichier."));
5220 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5221 return false;
5222 }
5223
5224 // mise à jour de l'UID du document en BDD
5225 else {
5226 $valF = array('om_fichier_instruction' => $operationOrUID);
5227 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5228 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5229 if ($this->f->isDatabaseError($res, true) === true) {
5230 $this->correct = false;
5231 $this->addToMessage(__("Erreur de traitement de fichier."));
5232 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5233 return false;
5234 }
5235 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5236 }
5237 }
5238
5239 // Déclenchement des notifications automatique après finalisation et
5240 // retour de signature
5241 if ($dateRetourSignatureModified === true
5242 && $this->valF['date_retour_signature'] !== ''
5243 && $this->valF['date_retour_signature'] !== null) {
5244
5245 // Message à afficher dans les logs pour indiquer quelle notification a échouée
5246 $msgLog = sprintf(
5247 '%s %s : %d',
5248 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5249 __('Instruction notifiée'),
5250 $id
5251 );
5252
5253 // Récupération de l'instance de l'événement pour accéder au paramètrage
5254 // des notifications
5255 $ev = $this->get_inst_evenement($this->valF['evenement']);
5256 // Si la notification automatique des tiers consulté est active
5257 // déclenche le traitement de notification.
5258 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5259 $typeNotifTiers = $ev->getVal('notification_tiers');
5260 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5261 if ($typeNotifTiers === 'notification_automatique') {
5262 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5263 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5264 $this->correct = false;
5265 }
5266 }
5267
5268 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5269 // Récupération de la liste des demandeurs à notifier et de la catégorie
5270 $categorie = $this->f->get_param_option_notification($collectivite_di);
5271 $isPortal = $categorie === PORTAL;
5272 $demandeursANotifie = $this->get_demandeurs_notifiable(
5273 $this->valF['dossier'],
5274 $isPortal
5275 );
5276
5277 //
5278 $msg_notif = '';
5279
5280 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5281 $demandeurPrincipalNotifie = false;
5282 foreach ($demandeursANotifie as $demandeur) {
5283 // Identifie si le demandeur principal a été notifié ou pas
5284 // et récupère ses informations
5285 if ($demandeur['petitionnaire_principal'] == 't') {
5286 $demandeurPrincipalNotifie = true;
5287 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5288 // son paramétrage, on effectue pas le traitement et on passe à l'itération
5289 // suivante. On le considère également comme non notifié pour gérer l'envoie
5290 // des messages d'erreurs
5291 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5292 // d'impact sur la notification
5293 $erreursParam = $this->get_info_notification_fail();
5294 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5295 $demandeurPrincipalNotifie = false;
5296 continue;
5297 }
5298 }
5299 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5300 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
5301 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5302 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5303 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5304 && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5305 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5306 // Ajout de la notif et récupération de son id
5307 $idNotif = $this->ajouter_notification(
5308 $this->valF[$this->clePrimaire],
5309 $this->f->get_connected_user_login_name(),
5310 $demandeur,
5311 $collectivite_di,
5312 array(),
5313 true,
5314 'Echec',
5315 __('La date limite de notification au demandeur est dépassée')
5316 );
5317 if ($idNotif === false) {
5318 // Termine le traitement
5319 $this->addToLog(
5320 sprintf('%s() : %s', __METHOD__, $msgLog),
5321 DEBUG_MODE
5322 );
5323 return $this->end_treatment(__METHOD__, false);
5324 }
5325 $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5326 }
5327 else {
5328 // Ajout de la notif et récupération de son id
5329 $idNotif = $this->ajouter_notification(
5330 $this->valF[$this->clePrimaire],
5331 $this->f->get_connected_user_login_name(),
5332 $demandeur,
5333 $collectivite_di,
5334 array(),
5335 true
5336 );
5337 if ($idNotif === false) {
5338 $this->addToLog(
5339 sprintf('%s() : %s',__METHOD__, $msgLog),
5340 DEBUG_MODE
5341 );
5342 return false;
5343 }
5344 // Création de la tache en lui donnant l'id de la notification
5345 $notification_by_task = $this->notification_by_task(
5346 $idNotif,
5347 $this->valF['dossier'],
5348 $categorie
5349 );
5350 if ($notification_by_task === false) {
5351 $this->addToLog(
5352 sprintf('%s() : %s',__METHOD__, $msgLog),
5353 DEBUG_MODE
5354 );
5355 $this->addToMessage(
5356 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5357 );
5358 return false;
5359 }
5360 $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5361 }
5362 }
5363
5364 // Pour la notification par mail ou la notification via portal si le dossier a
5365 // été déposés via portal, si le demandeur principal n'est pas notifiable,
5366 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5367 // laquelle le demandeur principal n'a pas pu être notifié
5368 $depotPortal = $this->dossier_depose_sur_portail();
5369 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5370 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5371 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5372 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5373 $erreursParam = $this->get_info_notification_fail();
5374 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5375 // Ajout de la notif et récupération de son id
5376 $idNotif = $this->ajouter_notification(
5377 $this->valF[$this->clePrimaire],
5378 $this->f->get_connected_user_login_name(),
5379 $demandeurPrincipal,
5380 $collectivite_di,
5381 array(),
5382 true,
5383 'Echec',
5384 implode(' ', $erreursParam)
5385 );
5386 if ($idNotif === false) {
5387 $this->addToLog(
5388 sprintf('%s() : %s', __METHOD__, $msgLog),
5389 DEBUG_MODE
5390 );
5391 $this->addToMessage(
5392 __('Erreur : la création de la notification a échouée.').
5393 __("Veuillez contacter votre administrateur.")
5394 );
5395 return false;
5396 }
5397 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5398 // de l'échec de la notification
5399 $dossier_message = $this->get_inst_dossier_message(0);
5400 $dossier_message_val = array(
5401 'dossier' => $this->getVal('dossier'),
5402 'type' => __('erreur expedition'),
5403 'emetteur' => $this->f->get_connected_user_login_name(),
5404 'login' => $_SESSION['login'],
5405 'date_emission' => date('Y-m-d H:i:s'),
5406 'contenu' => __('Échec lors de la notification de l\'instruction ').
5407 $ev->getVal('libelle').
5408 '.<br>'.
5409 implode("\n", $erreursParam).
5410 '<br>'.
5411 __('Veuillez corriger ces informations avant de renvoyer la notification.')
5412 );
5413 $add = $dossier_message->add_notification_message($dossier_message_val, true);
5414 // Si une erreur se produit pendant l'ajout
5415 if ($add !== true) {
5416 $this->addToLog(
5417 sprintf(
5418 '%s() : %s',
5419 __METHOD__,
5420 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5421 ),
5422 DEBUG_MODE
5423 );
5424 return false;
5425 }
5426 }
5427 $this->addToMessage($msg_notif);
5428 }
5429 }
5430 // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5431 if ($res !== false) {
5432 foreach($this->champs as $index => $champ) {
5433 // if (get_class($this) == 'instruction') {
5434 $this->f->log(__METHOD__, "[".var_export(get_class($this), true)."] this->valF[$champ]): ".var_export($this->valF[$champ] ?? null, true).", this->val[$index]: ".var_export($this->val[$index] ?? null, true), 'DEBUG', 'seb');
5435 // }
5436 $this->val[$index] = $this->valF[$champ] ?? null;
5437 }
5438 }
5439
5440 $res = $this->add_log_to_dossier($id, $val);
5441 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5442 if (! $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data)) {
5443 return false;
5444 }
5445 return $res;
5446 }
5447
5448 /**
5449 * TRIGGER - triggersupprimer.
5450 *
5451 * @return boolean
5452 */
5453 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5454 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5455 $data = array('val' => &$val, 'id' => $id);
5456 if (! $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data)) {
5457 return false;
5458 }
5459
5460 /**
5461 * L'objectif ici est de repositionner les valeurs récupérées en
5462 * archive dans le dossier d'instruction avant de supprimer l'événement
5463 * d'instruction si les valeurs du dossier sont différentes
5464 */
5465 $valF = array();
5466 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5467 foreach ($inst_di->champs as $key => $champ) {
5468 // Si le champ du DI à une archive dans l'instruction
5469 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5470 // Si la valeur entre le champ du DI et son archive dans instruction
5471 // est différente
5472 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5473 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5474 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5475 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5476 if ($champ === "accord_tacite" && $valF[$champ] === null) {
5477 $valF[$champ] = ' ';
5478 }
5479 }
5480 }
5481 }
5482 // Spécificité du champ avis_decision dont le champ archive est nommé
5483 // différemment
5484 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5485 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5486 }
5487 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5488 // par l'archive
5489 unset($valF['date_affichage']);
5490
5491 /**
5492 * Mise à jour de la version de clôture *version_clos* du dossier si et
5493 * seulement si l'instruction met à jour l'état du dossier.
5494 */
5495 if (isset($valF['etat']) === true
5496 && $valF['etat'] !== null
5497 && $valF['etat'] !== '') {
5498 // Récupère l'état actuel du dossier d'instruction
5499 $inst_current_etat = $this->f->get_inst__om_dbform(array(
5500 "obj" => "etat",
5501 "idx" => $inst_di->get_id_etat(),
5502 ));
5503 // Instanciation de l'état archivé appliqué sur le dossier
5504 $inst_etat = $this->f->get_inst__om_dbform(array(
5505 "obj" => "etat",
5506 "idx" => $valF['etat'],
5507 ));
5508 //
5509 $update_version_clos = null;
5510 // En cas de clôture du dossier par l'état archivé
5511 if ($inst_etat->getVal('statut') === 'cloture') {
5512 $update_version_clos = $inst_di->update_version_clos('up');
5513 }
5514 // En cas de réouverture du dossier par l'état archivé
5515 if ($inst_current_etat->getVal('statut') === 'cloture'
5516 && $inst_etat->getVal('statut') !== 'cloture') {
5517 //
5518 $update_version_clos = $inst_di->update_version_clos('down');
5519 //
5520 $this->set_att_di_reopened(true);
5521 }
5522 //
5523 if ($update_version_clos === false) {
5524 $this->f->addToLog(sprintf(
5525 "%s() : ERREUR - %s %s",
5526 __METHOD__,
5527 sprintf(
5528 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5529 $inst_di->getVal($inst_di->clePrimaire)
5530 ),
5531 sprintf(
5532 __("L'instruction tente d'appliquer l'état %s."),
5533 $inst_etat->getVal($inst_etat->clePrimaire)
5534 )
5535 ));
5536 $this->addToMessage(sprintf(
5537 "%s %s",
5538 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5539 __("Veuillez contacter votre administrateur.")
5540 ));
5541 return false;
5542 }
5543 }
5544 // On supprime toutes les notications liées à l'instruction
5545 $notifASupprimer = $this->get_instruction_notification(
5546 $this->getVal($this->clePrimaire),
5547 array(
5548 'notification_recepisse',
5549 'notification_instruction',
5550 'notification_decision',
5551 'notification_service_consulte',
5552 'notification_tiers_consulte',
5553 'notification_depot_demat',
5554 'notification_commune',
5555 'notification_signataire'
5556 ),
5557 true
5558 );
5559
5560 foreach ($notifASupprimer as $idNotif) {
5561 $inst_notif = $this->f->get_inst__om_dbform(array(
5562 "obj" => "instruction_notification",
5563 "idx" => $idNotif,
5564 ));
5565 $val_notif = array();
5566 foreach ($inst_notif->champs as $champ) {
5567 $val_notif[$champ] = $inst_notif->getVal($champ);
5568 }
5569 // La suppression des notifications entrainera la suppression des tâches qui y sont
5570 // liées
5571 $supprNotif = $inst_notif->supprimer($val_notif);
5572 if ($supprNotif == false) {
5573 $this->addToMessage(sprintf(
5574 "%s %s",
5575 __("Erreur lors de la suppression des notifications de l'instruction."),
5576 __("Veuillez contacter votre administrateur.")
5577 ));
5578 return false;
5579 }
5580 }
5581
5582 // Suppression du paramétrage de l'annexe lié à l'évènement
5583 if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5584 $this->addToLog(sprintf(
5585 "%s %s",
5586 __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5587 __("Veuillez contacter votre administrateur.")
5588 ), DEBUG_MODE);
5589 return false;
5590 }
5591
5592 // On met à jour le dossier
5593 $valF['instruction'] = $id;
5594 $valF['crud'] = 'delete';
5595 $update_by_instruction = $inst_di->update_by_instruction($valF);
5596 if ($update_by_instruction === false) {
5597 $this->cleanMessage();
5598 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5599 return false;
5600 }
5601
5602 // Affichage d'informations à l'utilisateur
5603 $this->addToMessage(__("Suppression de l'instruction")." [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5604
5605 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5606
5607 $res = true;
5608 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5609 if (! $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data)) {
5610 return false;
5611 }
5612 return $res;
5613 }
5614
5615 /**
5616 * TRIGGER - triggersupprimerapres.
5617 *
5618 * @return boolean
5619 */
5620 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5621 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5622 $data = array('val' => &$val, 'id' => $id);
5623 if (! $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data)) {
5624 return false;
5625 }
5626
5627 /**
5628 * Mise à jour de la date de dernière modification du dossier
5629 * d'instruction
5630 */
5631 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5632 $inst_di->update_last_modification_date();
5633
5634 /**
5635 * Mise à jour des données du dossier d'autorisation
5636 */
5637 $da = $this->f->get_inst__om_dbform(array(
5638 "obj" => "dossier_autorisation",
5639 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5640 ));
5641 $params = array(
5642 'di_id' => $this->getVal('dossier'),
5643 'di_reopened' => $this->get_att_di_reopened(),
5644 );
5645 if($da->majDossierAutorisation($params) === false) {
5646 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5647 $this->correct = false;
5648 return false;
5649 }
5650
5651 /**
5652 * Gestion des tâches pour la dématérialisation
5653 */
5654 $inst_task_empty = $this->f->get_inst__om_dbform(array(
5655 "obj" => "task",
5656 "idx" => 0,
5657 ));
5658 foreach ($inst_di->task_types as $task_type) {
5659 $task_exists = $inst_task_empty->task_exists($task_type, $id);
5660 if ($task_exists !== false) {
5661 $inst_task = $this->f->get_inst__om_dbform(array(
5662 "obj" => "task",
5663 "idx" => $task_exists,
5664 ));
5665 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5666 $task_val = array(
5667 'state' => task::STATUS_CANCELED,
5668 );
5669 $update_task = $inst_task->update_task(array('val' => $task_val));
5670 if ($update_task === false) {
5671 $this->addToMessage(sprintf('%s %s',
5672 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5673 __("Veuillez contacter votre administrateur.")
5674 ));
5675 $this->correct = false;
5676 return false;
5677 }
5678 }
5679 }
5680 }
5681
5682 //
5683 $val['evenement'] = $this->getVal('evenement');
5684
5685 $res = $this->add_log_to_dossier($id, $val);
5686 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5687 if (! $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data)) {
5688 return false;
5689 }
5690 return $res;
5691 }
5692
5693 /**
5694 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5695 * "di_reopened".
5696 *
5697 * @param boolean $val
5698 */
5699 function set_att_di_reopened($val) {
5700 $this->di_reopened = $val;
5701 }
5702
5703 /**
5704 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5705 *
5706 * @return boolean
5707 */
5708 function get_att_di_reopened() {
5709 return $this->di_reopened;
5710 }
5711
5712 /**
5713 * Permet de composer un message d'erreur sur restriction non valide en
5714 * fonction du contexte.
5715 *
5716 * @param string $restriction formule de la restriction
5717 *
5718 * @return string message d'erreur
5719 */
5720 function get_restriction_error_message($restriction) {
5721 // Affichage du message si la restriction s'applique
5722 // Contexte du suivi des dates (message simple)
5723 $message_restrict = __("Probleme de dates :");
5724 // Split restriction
5725 $champs_restrict = preg_split(
5726 '/(\W+)/',
5727 $restriction,
5728 null,
5729 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5730 );
5731 $formated_restrict = "";
5732 // Ajout des chaînes à traduire
5733 foreach ($champs_restrict as $value) {
5734 $formated_restrict .= __($value)." ";
5735 }
5736 $formated_restrict = substr($formated_restrict, 0, -1);
5737 // Message d'erreur dans le contexte du suivi des dates
5738 if($this->getParameter("maj") == 170) {
5739 $message_restrict .= " ".__("contactez l'instructeur du dossier");
5740 $message_restrict .= "<br/>(".$formated_restrict.")";
5741 } else {
5742 // Affichage du message si la restriction s'applique
5743 // Contexte instruction
5744 $message_restrict .= "<br/>".$formated_restrict;
5745 }
5746
5747 return $message_restrict;
5748 }
5749
5750 /**
5751 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5752 * les vérifications suivantes :
5753 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5754 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5755 * le message d'erreur associé à la restriction
5756 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5757 * et / ou la modification et affiche un message d'erreur
5758 * -
5759 * -
5760 * -
5761 * -
5762 * -
5763 * -
5764 *
5765 * @param array val : tableau contenant les valeurs issues du formulaire.
5766 * @param - dnu1 : Paramètre déprécié et non utilisé.
5767 * @param - dnu2 : Paramètre déprécié et non utilisé.
5768 *
5769 * @return void
5770 */
5771 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5772 parent::verifier($val);
5773 //
5774 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5775 $restriction = $this->get_restriction($val['evenement']);
5776
5777 //Test qu'une restriction est présente
5778 if ($restriction != "" ){
5779
5780 // Vérifie le contexte de la modification et test si la restriction est valide.
5781 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5782 // Il n'est donc pas nécessaire de vérifier les restrictions.
5783 $this->restriction_valid = $this->restrictionIsValid($restriction);
5784 if ($this->getParameter("maj") != 176
5785 && !$this->restriction_valid) {
5786
5787 // Affichage du message si la restriction s'applique
5788 $this->addToMessage(
5789 $this->get_restriction_error_message($restriction)
5790 );
5791 $this->correct=false;
5792 return false;
5793 }
5794
5795 // Liste des opérateurs possible
5796 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5797 // Supprime tous les espaces de la chaîne de caractère
5798 $restriction = str_replace(' ', '', $restriction);
5799
5800 // Met des espace avant et après les opérateurs puis transforme la
5801 // chaine en un tableau
5802 $tabRestriction = str_replace($operateurs, " ", $restriction);
5803 // Tableau des champ
5804 $tabRestriction = explode(" ", $tabRestriction);
5805 // Supprime les numériques du tableau
5806 foreach ($tabRestriction as $key => $value) {
5807 if (is_numeric($value)) {
5808 unset($tabRestriction[$key]);
5809 }
5810 }
5811
5812 // Vérifie les champs utilisés pour la restriction
5813 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5814 if ($check_field_exist !== true) {
5815
5816 // Liste des champs en erreur
5817 $string_error_fields = implode(", ", $check_field_exist);
5818
5819 // Message d'erreur
5820 $error_message = __("Le champ %s n'est pas utilisable pour le champ %s");
5821 if (count($check_field_exist) > 1) {
5822 $error_message = __("Les champs %s ne sont pas utilisable pour le champ %s");
5823 }
5824
5825 // Affiche l'erreur
5826 $this->correct=false;
5827 $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
5828 $this->addToMessage(__("Veuillez contacter votre administrateur."));
5829 }
5830 }
5831
5832 }
5833 if(!$this->updateDate("date_envoi_signature")) {
5834 return false;
5835 }
5836 if(!$this->updateDate("date_retour_signature")) {
5837 return false;
5838 }
5839 if(!$this->updateDate("date_envoi_rar")) {
5840 return false;
5841 }
5842 if(!$this->updateDate("date_retour_rar")) {
5843 return false;
5844 }
5845 if(!$this->updateDate("date_envoi_controle_legalite")) {
5846 return false;
5847 }
5848 if(!$this->updateDate("date_retour_controle_legalite")) {
5849 return false;
5850 }
5851
5852 }
5853
5854 /**
5855 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5856 * principal du dossier auquel appartiens l'instruction.
5857 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5858 *
5859 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5860 * et affiche un message dans les logs.
5861 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5862 *
5863 * @param string identifiant du dossier
5864 * @return array|boolean
5865 */
5866 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5867 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5868 // l'objet courant
5869 if (empty($dossier)) {
5870 $dossier = $this->getVal('dossier');
5871 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5872 // false et on affiche un message d'erreur dans les logs
5873 if (empty($dossier)) {
5874 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5875 return false;
5876 }
5877 }
5878
5879 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5880 // principal
5881 $qres = $this->f->get_all_results_from_db_query(
5882 sprintf(
5883 'SELECT
5884 -- Récupère toutes les informations du demandeur principal
5885 demandeur.*,
5886 CASE
5887 WHEN demandeur.qualite=\'particulier\'
5888 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5889 ELSE
5890 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5891 END AS destinataire
5892 FROM
5893 %1$sdossier
5894 LEFT JOIN %1$slien_dossier_demandeur
5895 ON lien_dossier_demandeur.dossier = dossier.dossier
5896 LEFT JOIN %1$sdemandeur
5897 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5898 WHERE
5899 dossier.dossier = \'%2$s\'
5900 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5901 DB_PREFIXE,
5902 $this->f->db->escapeSimple($dossier)
5903 ),
5904 array(
5905 "origin" => __METHOD__,
5906 )
5907 );
5908 if (is_array($qres["result"]) === true
5909 && array_key_exists(0, $qres["result"]) === true) {
5910 //
5911 return $qres["result"][0];
5912 }
5913 return null;
5914 }
5915
5916
5917
5918 /**
5919 * Finalisation des documents.
5920 * @param string $champ champ du fichier à finaliser
5921 * @param booleen $status permet de définir si on finalise ou définalise
5922 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5923 */
5924 function manage_finalizing($mode = null, $val = array()) {
5925 //
5926 $this->begin_treatment(__METHOD__);
5927
5928 //
5929 $id_inst = $this->getVal($this->clePrimaire);
5930
5931 //
5932 $admin_msg_error = __("Veuillez contacter votre administrateur.");
5933 $file_msg_error = __("Erreur de traitement de fichier.")
5934 ." ".$admin_msg_error;
5935 $bdd_msg_error = __("Erreur de base de données.")
5936 ." ".$admin_msg_error;
5937 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5938
5939 // Si on finalise le document
5940 if ($mode == "finalize"){
5941 //
5942 $etat = __('finalisation');
5943
5944 // Récupère la collectivite du dossier d'instruction
5945 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5946
5947 //
5948 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5949
5950 //
5951 $params = array(
5952 "specific" => array(),
5953 );
5954 // Si la rédaction libre est activée sur l'instruction
5955 if ($this->getVal("flag_edition_integrale") == 't') {
5956 $params["specific"]["corps"] = array(
5957 "mode" => "set",
5958 "value" => $this->getVal("corps_om_htmletatex"),
5959 );
5960 $params["specific"]["titre"] = array(
5961 "mode" => "set",
5962 "value" => $this->getVal("titre_om_htmletat"),
5963 );
5964 }
5965 // Génération du PDF
5966 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5967 $pdf_output = $result['pdf_output'];
5968
5969 //Métadonnées du document
5970 $metadata = array(
5971 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5972 'mimetype' => 'application/pdf',
5973 'size' => strlen($pdf_output)
5974 );
5975
5976 // Récupération des métadonnées calculées après validation
5977 $spe_metadata = $this->calculate_metadata();
5978 if ($spe_metadata === false) {
5979 $this->correct = false;
5980 $this->addToMessage($bdd_msg_error);
5981 $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $id_inst, $uid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
5982 return $this->end_treatment(__METHOD__, false);
5983 }
5984
5985 $metadata = array_merge($metadata, $spe_metadata);
5986
5987 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5988 $res = $this->f->db->autoExecute(
5989 DB_PREFIXE.$this->table,
5990 ['fichier_instruction_name' => $metadata['filename']],
5991 DB_AUTOQUERY_UPDATE,
5992 "instruction='".$this->getVal("instruction")."'"
5993 );
5994
5995 // Si le document a déjà été finalisé on le met à jour
5996 // en conservant son UID
5997 if ($this->getVal("om_fichier_instruction") != ''){
5998 $uid = $this->f->storage->update(
5999 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
6000 );
6001 }
6002 // Sinon on crée un nouveau document et dont on récupère l'UID
6003 else {
6004 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
6005 }
6006 }
6007
6008 // Si on définalise le document
6009 if ($mode == "unfinalize") {
6010 //
6011 $etat = __('définalisation');
6012 // Récupération de l'uid du document finalisé
6013 $uid = $this->getVal("om_fichier_instruction");
6014 }
6015
6016 // Si on définalise l'UID doit être défini
6017 // Si on finalise la création/modification du fichier doit avoir réussi
6018 if ($uid == '' || $uid == 'OP_FAILURE' ) {
6019 $this->correct = false;
6020 $this->addToMessage($file_msg_error);
6021 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6022 return $this->end_treatment(__METHOD__, false);
6023 }
6024
6025 //
6026 foreach ($this->champs as $key => $champ) {
6027 //
6028 $val[$champ] = $this->val[$key];
6029 }
6030
6031 //
6032 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
6033 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
6034 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
6035 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
6036 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
6037 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
6038 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
6039 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
6040 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
6041 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
6042 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
6043 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
6044 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
6045 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
6046 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
6047 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
6048 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
6049 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
6050 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
6051 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
6052 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
6053 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
6054 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
6055 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6056 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6057 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6058 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6059 $this->setvalF($val);
6060
6061 // Verification de la validite des donnees
6062 $this->verifier($this->val);
6063 // Si les verifications precedentes sont correctes, on procede a
6064 // la modification, sinon on ne fait rien et on retourne une erreur
6065 if ($this->correct === true) {
6066 //
6067 $valF = array(
6068 "om_fichier_instruction" => $uid,
6069 "date_finalisation_courrier" => date('Y-m-d')
6070 );
6071 //
6072 if($mode=="finalize") {
6073 // état finalisé vrai
6074 $valF["om_final_instruction"] = true;
6075 // ajout log utilisateur
6076 $login = $_SESSION['login'];
6077 $nom = "";
6078 $this->f->getUserInfos();
6079 if (isset($this->f->om_utilisateur["nom"])
6080 && !empty($this->f->om_utilisateur["nom"])) {
6081 $nom = $this->f->om_utilisateur["nom"];
6082 }
6083 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
6084 if ($nom != "") {
6085 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
6086 }
6087 } else {
6088 // état finalisé faux
6089 $valF["om_final_instruction"] = false;
6090 // suppression log utilisateur
6091 $valF["om_final_instruction_utilisateur"] = '';
6092 }
6093
6094 // Execution de la requête de modification des donnees de l'attribut
6095 // valF de l'objet dans l'attribut table de l'objet
6096 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6097 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6098 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6099 //
6100 if ($this->f->isDatabaseError($res, true) === true) {
6101 $this->correct = false;
6102 $this->addToMessage($bdd_msg_error);
6103 return $this->end_treatment(__METHOD__, false);
6104 }
6105
6106 //
6107 $this->addToMessage(sprintf(__("La %s du document s'est effectuee avec succes."), $etat));
6108 //
6109 if ($this->add_log_to_dossier($id_inst, $val) === false) {
6110 return $this->end_treatment(__METHOD__, false);
6111 }
6112 //
6113 return $this->end_treatment(__METHOD__, true);
6114 }
6115 // L'appel de verifier() a déjà positionné correct à false
6116 // et défini un message d'erreur.
6117 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6118 return $this->end_treatment(__METHOD__, false);
6119 }
6120
6121 /**
6122 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
6123 * @return string numéro de dossier d'instruction
6124 */
6125 protected function getDossier($champ = null) {
6126 if(empty($this->specificMetadata)) {
6127 $this->getSpecificMetadata();
6128 }
6129 return $this->specificMetadata->dossier;
6130 }
6131 /**
6132 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
6133 * @return int Version
6134 */
6135 protected function getDossierVersion() {
6136 if(empty($this->specificMetadata)) {
6137 $this->getSpecificMetadata();
6138 }
6139 return $this->specificMetadata->version;
6140 }
6141 /**
6142 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
6143 * @return string numéro de dossier d'autorisation
6144 */
6145 protected function getNumDemandeAutor() {
6146 if(empty($this->specificMetadata)) {
6147 $this->getSpecificMetadata();
6148 }
6149 return $this->specificMetadata->dossier_autorisation;
6150 }
6151 /**
6152 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6153 * @return date de la demande initiale
6154 */
6155 protected function getAnneemoisDemandeAutor() {
6156 if(empty($this->specificMetadata)) {
6157 $this->getSpecificMetadata();
6158 }
6159 return $this->specificMetadata->date_demande_initiale;
6160 }
6161 /**
6162 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6163 * @return string type du dossier d'instruction
6164 */
6165 protected function getTypeInstruction() {
6166 if(empty($this->specificMetadata)) {
6167 $this->getSpecificMetadata();
6168 }
6169 return $this->specificMetadata->dossier_instruction_type;
6170 }
6171 /**
6172 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6173 * @return string avis
6174 */
6175 protected function getStatutAutorisation() {
6176 if(empty($this->specificMetadata)) {
6177 $this->getSpecificMetadata();
6178 }
6179 return $this->specificMetadata->statut;
6180 }
6181 /**
6182 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6183 * @return string type du dossier d'autorisation
6184 */
6185 protected function getTypeAutorisation() {
6186 if(empty($this->specificMetadata)) {
6187 $this->getSpecificMetadata();
6188 }
6189 return $this->specificMetadata->dossier_autorisation_type;
6190 }
6191 /**
6192 * Récupération de la date d'ajout de document à ajouter aux métadonnées
6193 * @return date de l'évènement
6194 */
6195 protected function getDateEvenementDocument() {
6196 return date("Y-m-d");
6197 }
6198 /**
6199 * Récupération du groupe d'instruction à ajouter aux métadonnées
6200 * @return string Groupe d'instruction
6201 */
6202 protected function getGroupeInstruction() {
6203 if(empty($this->specificMetadata)) {
6204 $this->getSpecificMetadata();
6205 }
6206 return $this->specificMetadata->groupe_instruction;
6207 }
6208 /**
6209 * Récupération du libellé du type du document à ajouter aux métadonnées
6210 * @return string Groupe d'instruction
6211 */
6212 protected function getTitle() {
6213
6214 // Récupère le champ événement
6215 if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6216 $evenement = $this->valF["evenement"];
6217 } else {
6218 $evenement = $this->getVal("evenement");
6219 }
6220
6221 // Requête sql
6222 $evenement = $this->f->get_inst__om_dbform(array(
6223 "obj" => "evenement",
6224 "idx" => $evenement
6225 ));
6226
6227 // Retourne le libelle de l'événement
6228 return $evenement->getVal('libelle');
6229 }
6230
6231
6232 /**
6233 * Récupération du champ ERP du dossier d'instruction.
6234 *
6235 * @return boolean
6236 */
6237 public function get_concerne_erp() {
6238 //
6239 if(empty($this->specificMetadata)) {
6240 $this->getSpecificMetadata();
6241 }
6242 //
6243 return $this->specificMetadata->erp;
6244 }
6245
6246
6247 /**
6248 * Cette méthode permet de stocker en attribut toutes les métadonnées
6249 * nécessaire à l'ajout d'un document.
6250 */
6251 public function getSpecificMetadata() {
6252 if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6253 $dossier = $this->valF["dossier"];
6254 } else {
6255 $dossier = $this->getVal("dossier");
6256 }
6257 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6258 $qres = $this->f->get_all_results_from_db_query(
6259 sprintf(
6260 'SELECT
6261 dossier.dossier AS dossier,
6262 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6263 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6264 dossier_instruction_type.code AS dossier_instruction_type,
6265 etat_dossier_autorisation.libelle AS statut,
6266 dossier_autorisation_type.code AS dossier_autorisation_type,
6267 groupe.code AS groupe_instruction,
6268 CASE WHEN dossier.erp IS TRUE
6269 THEN \'true\'
6270 ELSE \'false\'
6271 END AS erp
6272 FROM
6273 %1$sdossier
6274 LEFT JOIN %1$sdossier_instruction_type
6275 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6276 LEFT JOIN %1$sdossier_autorisation
6277 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6278 LEFT JOIN %1$setat_dossier_autorisation
6279 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6280 LEFT JOIN %1$sdossier_autorisation_type_detaille
6281 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6282 LEFT JOIN %1$sdossier_autorisation_type
6283 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6284 LEFT JOIN %1$sgroupe
6285 ON dossier_autorisation_type.groupe = groupe.groupe
6286 WHERE
6287 dossier.dossier = \'%2$s\'',
6288 DB_PREFIXE,
6289 $this->f->db->escapeSimple($dossier)
6290 ),
6291 array(
6292 "origin" => __METHOD__,
6293 )
6294 );
6295 $row = array_shift($qres['result']);
6296
6297 //Si il y a un résultat
6298 if (! empty($row)) {
6299
6300 // Instrance de la classe dossier
6301 $inst_dossier = $this->get_inst_dossier($dossier);
6302 // TODO : améliorer ce code
6303 //
6304 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6305 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6306 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6307 // valeurs issues de la requête en objet.
6308 $metadata = (object)$row;
6309 // Insère l'attribut version à l'objet
6310 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6311
6312 //Alors on créé l'objet dossier_instruction
6313 $this->specificMetadata = $metadata;
6314
6315 }
6316 }
6317
6318 /**
6319 * Retourne le statut du dossier d'instruction
6320 * @param string $idx Identifiant du dossier d'instruction
6321 * @return string Le statut du dossier d'instruction
6322 */
6323 function getStatutAutorisationDossier($idx){
6324
6325 $statut = '';
6326
6327 //Si l'identifiant du dossier d'instruction fourni est correct
6328 if ( $idx != '' ){
6329
6330 //On récupère le statut de l'état du dossier à partir de l'identifiant du
6331 //dossier
6332 $qres = $this->f->get_one_result_from_db_query(
6333 sprintf(
6334 'SELECT
6335 etat.statut
6336 FROM
6337 %1$sdossier
6338 LEFT JOIN
6339 %1$setat
6340 ON
6341 dossier.etat = etat.etat
6342 WHERE
6343 dossier = \'%2$s\'',
6344 DB_PREFIXE,
6345 $this->f->db->escapeSimple($idx)
6346 ),
6347 array(
6348 "origin" => __METHOD__,
6349 )
6350 );
6351 }
6352
6353 return $qres['result'];
6354 }
6355
6356 /**
6357 * Récupère les données du dossier
6358 * @return array
6359 */
6360 function get_dossier_actual() {
6361
6362 // Initialisation de la valeur de retour
6363 $return = array();
6364
6365 // Récupération de toutes les valeurs du dossier d'instruction en cours
6366 // TODO : remplacer cette requête par une instanciation de l'objet
6367 $qres = $this->f->get_all_results_from_db_query(
6368 sprintf(
6369 'SELECT
6370 *
6371 FROM
6372 %1$sdossier
6373 WHERE
6374 dossier = \'%2$s\'',
6375 DB_PREFIXE,
6376 $this->f->db->escapeSimple($this->valF['dossier'])
6377 ),
6378 array(
6379 'origin' => __METHOD__
6380 )
6381 );
6382
6383 foreach ($qres['result'] as $row) {
6384
6385 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6386 // de l'état et de l'avis du dossier d'instruction
6387 $return['archive_delai'] = $row['delai'];
6388 $return['archive_accord_tacite'] = $row['accord_tacite'];
6389 $return['archive_etat'] = $row['etat'];
6390 $return['archive_avis'] = $row['avis_decision'];
6391 // Récupération de la valeur actuelle des dates du dossier
6392 // d'instruction
6393 $return['archive_date_complet'] = $row['date_complet'];
6394 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6395 $return['archive_date_rejet'] = $row['date_rejet'];
6396 $return['archive_date_limite'] = $row['date_limite'];
6397 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6398 $return['archive_date_decision'] = $row['date_decision'];
6399 $return['archive_date_validite'] = $row['date_validite'];
6400 $return['archive_date_achevement'] = $row['date_achevement'];
6401 $return['archive_date_chantier'] = $row['date_chantier'];
6402 $return['archive_date_conformite'] = $row['date_conformite'];
6403 $return['archive_incompletude'] = $row['incompletude'];
6404 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6405 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6406 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6407 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6408 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6409 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6410 $return['archive_autorite_competente'] = $row['autorite_competente'];
6411 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6412 $return['duree_validite'] = $row['duree_validite'];
6413 $return['date_depot'] = $row['date_depot'];
6414 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6415 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6416 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6417 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6418 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6419 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6420 $return['archive_date_ait'] = $row['date_ait'];
6421 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6422 $return['archive_date_affichage'] = $row['date_affichage'];
6423 $return['archive_pec_metier'] = $row['pec_metier'];
6424 $return['archive_a_qualifier'] = $row['a_qualifier'];
6425 }
6426
6427 // Retour de la fonction
6428 return $return;
6429
6430 }
6431
6432 /**
6433 * Permet de vérifier qu'un événement est verrouillable
6434 * @param integer $idx Identifiant de l'instruction
6435 * @return boolean
6436 */
6437 function checkEvenementNonVerrouillable($idx) {
6438 // Si la condition n'est pas vide
6439 if ($idx != "") {
6440
6441 // Requête SQL
6442 $qres = $this->f->get_one_result_from_db_query(
6443 sprintf(
6444 'SELECT
6445 evenement.non_verrouillable
6446 FROM
6447 %1$sevenement
6448 LEFT JOIN %1$sinstruction
6449 ON instruction.evenement = evenement.evenement
6450 WHERE
6451 instruction.instruction = \'%2$s\'',
6452 DB_PREFIXE,
6453 intval($idx)
6454 ),
6455 array(
6456 "origin" => __METHOD__,
6457 )
6458 );
6459 }
6460
6461 // Si on a un résultat et que ce résultat indique que l'événement n'est
6462 // pas vérrouillable renvoie true, sinon renvoie false
6463 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6464 }
6465
6466 /**
6467 * Mise à jour des champs archive_*
6468 * @param mixed $row La ligne de données
6469 */
6470 public function updateArchiveData($row){
6471
6472 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6473 // de l'état et de l'avis du dossier d'instruction
6474 $this->valF['archive_delai']=$row['delai'];
6475 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6476 $this->valF['archive_etat']=$row['etat'];
6477 $this->valF['archive_avis']=$row['avis_decision'];
6478 // Récupération de la valeur actuelle des 9 dates du dossier
6479 // d'instruction
6480 if ($row['date_complet'] != '') {
6481 $this->valF['archive_date_complet']=$row['date_complet'];
6482 }
6483 if ($row['date_dernier_depot'] != '') {
6484 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6485 }
6486 if ($row['date_rejet'] != '') {
6487 $this->valF['archive_date_rejet']= $row['date_rejet'];
6488 }
6489 if ($row['date_limite'] != '') {
6490 $this->valF['archive_date_limite']= $row['date_limite'];
6491 }
6492 if ($row['date_notification_delai'] != '') {
6493 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6494 }
6495 if ($row['date_decision'] != '') {
6496 $this->valF['archive_date_decision']= $row['date_decision'];
6497 }
6498 if ($row['date_validite'] != '') {
6499 $this->valF['archive_date_validite']= $row['date_validite'];
6500 }
6501 if ($row['date_achevement'] != '') {
6502 $this->valF['archive_date_achevement']= $row['date_achevement'];
6503 }
6504 if ($row['date_chantier'] != '') {
6505 $this->valF['archive_date_chantier']= $row['date_chantier'];
6506 }
6507 if ($row['date_conformite'] != '') {
6508 $this->valF['archive_date_conformite']= $row['date_conformite'];
6509 }
6510 if ($row['incompletude'] != '') {
6511 $this->valF['archive_incompletude']= $row['incompletude'];
6512 }
6513 if ($row['incomplet_notifie'] != '') {
6514 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6515 }
6516 if ($row['evenement_suivant_tacite'] != '') {
6517 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6518 }
6519 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6520 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6521 }
6522 if ($row['etat_pendant_incompletude'] != '') {
6523 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6524 }
6525 if ($row['date_limite_incompletude'] != '') {
6526 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6527 }
6528 if ($row['delai_incompletude'] != '') {
6529 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6530 }
6531 if ($row['autorite_competente'] != '') {
6532 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6533 }
6534 if ($row['duree_validite'] != '') {
6535 $this->valF['duree_validite']= $row['duree_validite'];
6536 }
6537 if ($row['date_depot'] != '') {
6538 $this->valF['date_depot']= $row['date_depot'];
6539 }
6540 if ($row['date_depot_mairie'] != '') {
6541 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6542 }
6543 // Dates concernant les dossiers contentieux
6544 if ($row['date_cloture_instruction'] != '') {
6545 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6546 }
6547 if ($row['date_premiere_visite'] != '') {
6548 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6549 }
6550 if ($row['date_derniere_visite'] != '') {
6551 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6552 }
6553 if ($row['date_contradictoire'] != '') {
6554 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6555 }
6556 if ($row['date_retour_contradictoire'] != '') {
6557 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6558 }
6559 if ($row['date_ait'] != '') {
6560 $this->valF['archive_date_ait']= $row['date_ait'];
6561 }
6562 if ($row['date_transmission_parquet'] != '') {
6563 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6564 }
6565 //
6566 if ($row['dossier_instruction_type'] != '') {
6567 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6568 }
6569 if ($row['date_affichage'] != '') {
6570 $this->valF['archive_date_affichage']= $row['date_affichage'];
6571 }
6572 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6573 $this->valF['archive_pec_metier']= $row['pec_metier'];
6574 }
6575 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6576 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6577 }
6578 }
6579
6580 // {{{
6581 // Méthodes de récupération des métadonnées arrêté
6582 /**
6583 * @return string Retourne le numéro d'arrêté
6584 */
6585 function getNumArrete() {
6586 return $this->getVal("numero_arrete");
6587 }
6588 /**
6589 * @return chaîne vide
6590 */
6591 function getReglementaireArrete() {
6592 return 'true';
6593 }
6594 /**
6595 * @return boolean de notification au pétitionnaire
6596 */
6597 function getNotificationArrete() {
6598 return 'true';
6599 }
6600 /**
6601 * @return date de notification au pétitionnaire
6602 */
6603 function getDateNotificationArrete() {
6604 if (empty($this->metadonneesArrete)) {
6605 $this->getArreteMetadata();
6606 }
6607 return $this->metadonneesArrete["datenotification"];
6608 }
6609 /**
6610 * @return boolean check si le document est passé au contrôle de légalité
6611 */
6612 function getControleLegalite() {
6613 return 'true';
6614 }
6615 /**
6616 * @return date de signature de l'arrêté
6617 */
6618 function getDateSignature() {
6619 if (empty($this->metadonneesArrete)) {
6620 $this->getArreteMetadata();
6621 }
6622 return $this->metadonneesArrete["datesignaturearrete"];
6623 }
6624 /**
6625 * @return string nom du signataire
6626 */
6627 function getNomSignataire() {
6628 if (empty($this->metadonneesArrete)) {
6629 $this->getArreteMetadata();
6630 }
6631 return $this->metadonneesArrete["nomsignataire"];
6632 }
6633 /**
6634 * @return string qualité du signataire
6635 */
6636 function getQualiteSignataire() {
6637 if (empty($this->metadonneesArrete)) {
6638 $this->getArreteMetadata();
6639 }
6640 return $this->metadonneesArrete["qualitesignataire"];
6641 }
6642 /**
6643 * @return string numéro du terrain
6644 */
6645 function getAp_numRue() {
6646 if (empty($this->metadonneesArrete)) {
6647 $this->getArreteMetadata();
6648 }
6649 return $this->metadonneesArrete["ap_numrue"];
6650 }
6651 /**
6652 * @return string nom de la rue du terrain
6653 */
6654 function getAp_nomDeLaVoie() {
6655 if (empty($this->metadonneesArrete)) {
6656 $this->getArreteMetadata();
6657 }
6658 return $this->metadonneesArrete["ap_nomdelavoie"];
6659 }
6660 /**
6661 * @return string code postal du terrain
6662 */
6663 function getAp_codePostal() {
6664 if (empty($this->metadonneesArrete)) {
6665 $this->getArreteMetadata();
6666 }
6667 return $this->metadonneesArrete["ap_codepostal"];
6668 }
6669 /**
6670 * @return string ville du terrain
6671 */
6672 function getAp_ville() {
6673 if (empty($this->metadonneesArrete)) {
6674 $this->getArreteMetadata();
6675 }
6676 return $this->metadonneesArrete["ap_ville"];
6677 }
6678 /**
6679 * @return string activité
6680 */
6681 function getActivite() {
6682 return "Droit du sol";
6683 }
6684 /**
6685 * @return string date du retour de controle légalité
6686 */
6687 function getDateControleLegalite() {
6688 if (empty($this->metadonneesArrete)) {
6689 $this->getArreteMetadata();
6690 }
6691 return $this->metadonneesArrete["datecontrolelegalite"];
6692 }
6693
6694 // Fin des méthodes de récupération des métadonnées
6695 // }}}
6696
6697 /**
6698 * Méthode de récupération des métadonnées arrêtés dans la base de données,
6699 * les données sont stockés dans l'attribut $this->metadonneesArrete
6700 */
6701 function getArreteMetadata() {
6702
6703 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6704 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6705 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6706 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6707 "ap_codepostal"=>"", "ap_ville"=>"");
6708
6709 $qres = $this->f->get_all_results_from_db_query(
6710 sprintf(
6711 'SELECT
6712 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6713 signataire_arrete.qualite as qualitesignataire,
6714 instruction.etat as decisionarrete,
6715 instruction.date_retour_rar as datenotification,
6716 instruction.date_retour_signature as datesignaturearrete,
6717 instruction.date_retour_controle_legalite as datecontrolelegalite,
6718 dossier.terrain_adresse_voie_numero as ap_numrue,
6719 dossier.terrain_adresse_voie as ap_nomdelavoie,
6720 dossier.terrain_adresse_code_postal as ap_codepostal,
6721 dossier.terrain_adresse_localite as ap_ville
6722 FROM
6723 %1$sinstruction
6724 LEFT JOIN %1$ssignataire_arrete
6725 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6726 LEFT JOIN %1$sdossier
6727 ON instruction.dossier = dossier.dossier
6728 LEFT JOIN %1$sdonnees_techniques
6729 ON donnees_techniques.dossier_instruction = dossier.dossier
6730 WHERE
6731 instruction.instruction = %2$d',
6732 DB_PREFIXE,
6733 intval($this->getVal('instruction'))
6734 ),
6735 array(
6736 'origin' => __METHOD__
6737 )
6738 );
6739 $this->metadonneesArrete = array_shift($qres['result']);
6740 }
6741
6742 /**
6743 * CONDITION - has_an_edition.
6744 *
6745 * Condition pour afficher le bouton de visualisation de l'édition.
6746 *
6747 * @return boolean
6748 */
6749 function has_an_edition() {
6750 // Récupère la valeur du champ lettretype
6751 $lettretype = $this->getVal("lettretype");
6752 // Si le champ est vide
6753 if ($lettretype !== '' && $lettretype !== null) {
6754 //
6755 return true;
6756 }
6757
6758 //
6759 return false;
6760 }
6761
6762 /**
6763 * CONDITION - is_modifiable.
6764 *
6765 * Controle si l'évenement est modifiable.
6766 *
6767 * @return boolean
6768 */
6769 function is_evenement_modifiable() {
6770 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6771 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6772 }
6773
6774 /**
6775 * CONDITION - is_editable.
6776 *
6777 * Condition pour la modification.
6778 *
6779 * @return boolean
6780 */
6781 function is_editable() {
6782
6783 // XXX
6784 // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6785 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6786
6787 // Contrôle si l'utilisateur possède un bypass
6788 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6789 //
6790 if ($bypass == true) {
6791 //
6792 return true;
6793 }
6794
6795 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6796 // que l'événement n'est pas identifié comme non verrouillable
6797 if ($this->f->isUserInstructeur()
6798 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6799 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6800 //
6801 return false;
6802 }
6803
6804 // Si l'utilisateur est un intructeur qui correspond à la division du
6805 // dossier
6806 if ($this->is_instructeur_from_division_dossier() === true) {
6807 //
6808 return true;
6809 }
6810
6811 // Si l'utilisateur est instructeur de la commune du dossier et que
6812 // l'instruction est créée par un instructeur de la commune
6813 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6814 $this->getVal('created_by_commune') === 't') {
6815 return true;
6816 }
6817
6818 //
6819 return false;
6820 }
6821
6822 /**
6823 * Vérifie si l'événement est supprimable ou pas.
6824 *
6825 * @return boolean
6826 */
6827 function is_evenement_supprimable() {
6828 // Controle si l'évenement est supprimable
6829 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6830 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6831 }
6832
6833 /**
6834 * CONDITION - is_deletable.
6835 *
6836 * Condition pour la suppression.
6837 *
6838 * @return boolean
6839 */
6840 function is_deletable() {
6841
6842 // XXX
6843 // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6844 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6845
6846 // Contrôle si l'utilisateur possède un bypass intégral
6847 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6848 //
6849 if ($bypass == true) {
6850
6851 //
6852 return true;
6853 }
6854
6855 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6856 // division du dossier et si l'utilisateur n'a pas la permission bypass
6857 // de la division
6858 if ($this->is_instructeur_from_division_dossier() === false
6859 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6860
6861 //
6862 return false;
6863 }
6864
6865 // l'événement est-il le dernier ?
6866 $dernier_evenement = false;
6867 // instanciation dossier
6868 $dossier = $this->f->get_inst__om_dbform(array(
6869 "obj" => "dossier",
6870 "idx" => $this->getVal('dossier'),
6871 ));
6872 // récupération dernier événement
6873 $id_dernier_evenement = $dossier->get_dernier_evenement();
6874 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6875 $dernier_evenement = true;
6876 }
6877
6878 // Si dossier cloturé ou si pas dernier événement
6879 // ou de type retour ou si une date est renseignée
6880 // ET utilisateur non administrateur
6881 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6882 || $dernier_evenement == false
6883 || $this->is_evenement_retour($this->getVal("evenement")) == true
6884 || $this->getVal('date_envoi_signature') != ''
6885 || $this->getVal('date_retour_signature') != ''
6886 || $this->getVal('date_envoi_rar') != ''
6887 || $this->getVal('date_retour_rar') != ''
6888 || $this->getVal('date_envoi_controle_legalite') != ''
6889 || $this->getVal('date_retour_controle_legalite') != '') {
6890 // pas le droit de supprimer
6891 return false;;
6892 }
6893
6894 //
6895 return true;
6896 }
6897
6898
6899 /**
6900 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6901 * dossier.
6902 *
6903 * @return, boolean true/false
6904 */
6905 function is_instructeur_from_collectivite_dossier() {
6906 if ($this->f->isUserInstructeur() === true &&
6907 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6908 return true;
6909 }
6910 return false;
6911 }
6912
6913 /**
6914 * CONDITION - is_addable.
6915 *
6916 * Condition pour afficher les boutons modifier et supprimer.
6917 *
6918 * @return boolean
6919 */
6920 function is_addable() {
6921 // Contrôle si l'utilisateur possède un bypass
6922 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6923 //
6924 if ($bypass == true) {
6925
6926 //
6927 return true;
6928 }
6929 // Si l'utilisateur est un intructeur qui correspond à la
6930 // division du dossier ou qu'il peut changer la décision
6931 if ($this->is_instructeur_from_division_dossier() === true ||
6932 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6933 //
6934 return true;
6935 }
6936
6937 //
6938 return false;
6939 }
6940
6941 /**
6942 * CONDITION - is_finalizable.
6943 *
6944 * Condition pour afficher le bouton.
6945 *
6946 * @return boolean
6947 */
6948 function is_finalizable() {
6949 // Contrôle si l'utilisateur possède un bypass
6950 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6951 //
6952 if ($bypass == true) {
6953 //
6954 return true;
6955 }
6956
6957 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6958 // que l'événement n'est pas identifié comme non verrouillable
6959 if ($this->f->isUserInstructeur()
6960 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6961 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6962 //
6963 return false;
6964 }
6965
6966 // Si l'utilisateur est un intructeur qui correspond à la division du
6967 // dossier
6968 if ($this->is_instructeur_from_division_dossier() === true) {
6969 //
6970 return true;
6971 }
6972
6973 // Si l'utilisateur est instructeur de la commune du dossier et que
6974 // l'instruction est créée par un instructeur de la commune
6975 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6976 $this->getVal('created_by_commune') === 't') {
6977 return true;
6978 }
6979
6980 //
6981 return false;
6982 }
6983
6984 /**
6985 * CONDITION - is_finalize_without_bypass.
6986 *
6987 * Condition pour afficher le bouton sans le bypass.
6988 *
6989 * @return boolean [description]
6990 */
6991 function is_finalizable_without_bypass() {
6992 // Récupère la valeur du champ finalisé
6993 $om_final_instruction = $this->getVal('om_final_instruction');
6994
6995 // Si le rapport n'est pas finalisé
6996 if (empty($om_final_instruction)
6997 || $om_final_instruction == 'f') {
6998 //
6999 return true;
7000 }
7001
7002 //
7003 return false;
7004 }
7005
7006 /**
7007 * CONDITION - is_unfinalizable.
7008 *
7009 * Condition pour afficher le bouton.
7010 *
7011 * @return boolean
7012 */
7013 function is_unfinalizable(){
7014 // Contrôle si l'utilisateur possède un bypass
7015 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
7016 //
7017 if ($bypass == true) {
7018 //
7019 return true;
7020 }
7021
7022 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
7023 // que l'événement n'est pas identifié comme non verrouillable
7024 if ($this->f->isUserInstructeur()
7025 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
7026 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
7027 //
7028 return false;
7029 }
7030
7031 // Si l'utilisateur est un intructeur qui correspond à la division du
7032 // dossier
7033 if ($this->is_instructeur_from_division_dossier() === true) {
7034 //
7035 return true;
7036 }
7037
7038 // Si l'utilisateur est instructeur de la commune du dossier et que
7039 // l'instruction est créée par un instructeur de la commune
7040 if ($this->is_instructeur_from_collectivite_dossier() === true &&
7041 $this->getVal('created_by_commune') === 't') {
7042 return true;
7043 }
7044
7045 //
7046 return false;
7047 }
7048
7049 /**
7050 * CONDITION - is_unfinalizable_without_bypass.
7051 *
7052 * Condition pour afficher le bouton sans le bypass.
7053 *
7054 * @return boolean
7055 */
7056 function is_unfinalizable_without_bypass() {
7057 // Récupère la valeur du champ finalisé
7058 $om_final_instruction = $this->getVal('om_final_instruction');
7059
7060 // Si l'instruction est finalisée
7061 if ($om_final_instruction == 't') {
7062 //
7063 return true;
7064 }
7065
7066 //
7067 return false;
7068 }
7069
7070
7071 /**
7072 * Permet de définir si un instructeur commune peut editer une instruction
7073 *
7074 * @return boolean true si il peut
7075 */
7076 function isInstrCanChangeDecision($idx) {
7077
7078 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7079 $this->f->isUserInstructeur() !== true) {
7080 return false;
7081 }
7082
7083
7084
7085 // Sinon on vérifie l'éligibilité du dossier au changement de décision
7086 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7087 // de décision :
7088 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7089 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7090 $sql = sprintf(
7091 'SELECT
7092 dossier.dossier
7093 FROM
7094 %1$sdossier
7095 JOIN %1$setat
7096 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7097 JOIN %1$slien_dossier_demandeur
7098 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7099 JOIN %1$sdossier_instruction_type
7100 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7101 JOIN %1$sinstruction
7102 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7103 ON instruction.instruction = (
7104 SELECT instruction
7105 FROM %1$sinstruction
7106 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7107 AND evenement.retour IS FALSE
7108 WHERE instruction.dossier = dossier.dossier
7109 ORDER BY date_evenement DESC, instruction DESC
7110 LIMIT 1
7111 )
7112 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7113 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7114 -- non signée, non notifié, etc.
7115 AND (instruction.om_final_instruction IS TRUE
7116 OR instruction.created_by_commune IS TRUE)
7117 AND instruction.date_retour_signature IS NULL
7118 AND instruction.date_envoi_rar IS NULL
7119 AND instruction.date_retour_rar IS NULL
7120 AND instruction.date_envoi_controle_legalite IS NULL
7121 AND instruction.date_retour_controle_legalite IS NULL
7122 -- On vérifie que l instruction soit un arrêté ou un changement de décision
7123 JOIN %1$sevenement
7124 ON instruction.evenement=evenement.evenement
7125 AND (evenement.type = \'arrete\'
7126 OR evenement.type = \'changement_decision\')
7127 -- Recherche les informations du pétitionnaire principal pour l affichage
7128 JOIN %1$sdemandeur
7129 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7130 -- Recherche la collectivité rattachée à l instructeur
7131 JOIN %1$sinstructeur
7132 ON dossier.instructeur=instructeur.instructeur
7133 JOIN %1$sdivision
7134 ON instructeur.division=division.division
7135 JOIN %1$sdirection
7136 ON division.direction=direction.direction
7137 JOIN %1$som_collectivite
7138 ON direction.om_collectivite=om_collectivite.om_collectivite
7139 WHERE
7140 -- Vérification que la décision a été prise par l agglo
7141 om_collectivite.niveau = \'2\'
7142 AND dossier.dossier = \'%2$s\'
7143 ',
7144 DB_PREFIXE,
7145 $this->f->db->escapeSimple($idx)
7146 );
7147
7148
7149 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7150 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7151 $sql .= sprintf(
7152 ' AND dossier.om_collectivite = %1$d',
7153 intval($_SESSION['collectivite'])
7154 );
7155 }
7156 $qres = $this->f->get_one_result_from_db_query(
7157 $sql,
7158 array(
7159 "origin" => __METHOD__,
7160 )
7161 );
7162
7163 return $qres['result'] !== null;
7164 }
7165
7166
7167 /**
7168 * CONDITION - can_monitoring_dates.
7169 *
7170 * Condition pour afficher le bouton de suivi des dates.
7171 *
7172 * @return boolean
7173 */
7174 public function can_monitoring_dates() {
7175 // Récupère la valeur du champ finalisé
7176 $om_final_instruction = $this->getVal('om_final_instruction');
7177
7178 // Si l'instruction n'est pas finalisée
7179 if ($om_final_instruction !== 't') {
7180 //
7181 return false;
7182 }
7183
7184 // Contrôle si l'utilisateur possède un bypass
7185 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7186 if ($bypass === true) {
7187 return true;
7188 }
7189
7190 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7191 // un utilisateur lié à un instructeur
7192 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7193
7194 // On vérifie en premier lieu que le DI n'est pas clôturé et que
7195 // l'utilisateur ne possède pas la permission de modifier le suivi des
7196 // dates sur un dossier clôturé
7197 $inst_dossier = $this->get_inst_dossier();
7198 if ($inst_dossier->getStatut() === 'cloture'
7199 && $perm_moni_dates_d_closed === false) {
7200 //
7201 return false;
7202 }
7203 // On récupère ses infos
7204 $coll_di = $inst_dossier->getVal('om_collectivite');
7205 $div_di = $this->getDivisionFromDossier();
7206 // et celles de son éventuel instructeur
7207 $instr_di = $inst_dossier->getVal('instructeur');
7208
7209 // Il faut disposer d'une entrée instructeur
7210 if ($this->f->isUserInstructeur() === false) {
7211 return false;
7212 }
7213
7214 // Par défaut on prétend que l'instructeur n'est pas multi
7215 $instr_di_coll_multi = false;
7216 // Si un instructeur est affecté au dossier
7217 if ($instr_di !== '' && $instr_di !== null) {
7218 // Vérifie si l'instructeur est de la collectivité de niveau 2
7219 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7220 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7221 //
7222 $instr_di_coll_multi = true;
7223 }
7224 }
7225
7226 // Il faut qu'il instruise le dossier ou soit de la même division
7227 if ($this->f->om_utilisateur['instructeur'] === $instr_di
7228 || $this->f->om_utilisateur['division'] === $div_di) {
7229 //
7230 return true;
7231 }
7232
7233 // On donne également le droit s'il est de la même collectivité que
7234 // le dossier ET si l'instruction est déléguée à la communauté
7235 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7236 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7237 && $instr_di_coll_multi === true) {
7238 //
7239 return true;
7240 }
7241
7242 // Si l'instructeur ne rentre pas dans les deux cas précédents
7243 return false;
7244 }
7245
7246
7247 /**
7248 * CONDITION - is_finalized.
7249 *
7250 * Condition pour vérifier si une instruction est finalisée.
7251 *
7252 * @return boolean
7253 */
7254 public function is_finalized() {
7255
7256 return $this->getVal('om_final_instruction') === "t";
7257 }
7258
7259 /**
7260 * CONDITION - is_not_date_retour_signature_set.
7261 *
7262 * Condition pour vérifier si une date de retour signature n'est pas définie.
7263 *
7264 * @return boolean
7265 */
7266 public function is_not_date_retour_signature_set() {
7267
7268 return $this->getVal('date_retour_signature') == null;
7269
7270 }
7271
7272
7273 /**
7274 * TREATMENT - finalize.
7275 *
7276 * Permet de finaliser un enregistrement.
7277 *
7278 * @param array $val valeurs soumises par le formulaire
7279 *
7280 * @return boolean
7281 */
7282 function finalize($val = array()) {
7283 // Cette méthode permet d'exécuter une routine en début des méthodes
7284 // dites de TREATMENT.
7285 $this->begin_treatment(__METHOD__);
7286 $message = '';
7287 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7288
7289 $this->f->log(__METHOD__, 'BEGIN');
7290 $collectivite_di = null;
7291 $data = array('val' => &$val);
7292 $data['ev'] = $ev;
7293 $data['collectivite_di'] = $collectivite_di;
7294 $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7295
7296 // Controle du signataire
7297 if (! $this->controle_signataire($ev)) {
7298 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7299 // Termine le traitement
7300 return $this->end_treatment(__METHOD__, false);
7301 }
7302
7303 // Traitement de la finalisation
7304 $ret = $this->manage_finalizing("finalize", $val);
7305
7306 // Si le traitement retourne une erreur
7307 if ($ret !== true) {
7308
7309 // Termine le traitement
7310 return $this->end_treatment(__METHOD__, false);
7311 }
7312
7313 // Envoi des notifications aux demandeurs si la notification est automatique
7314 // et que la signature n'est pas requise
7315 if ($ev->getVal('notification') === 'notification_automatique') {
7316 // Préparation du message de log en cas d'erreur de notification
7317 $msgLog = sprintf(
7318 '%s %s : %d',
7319 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7320 __('Instruction notifiée'),
7321 $this->getVal($this->clePrimaire)
7322 );
7323 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7324 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7325 // Récupération de la liste des demandeurs à notifier et de la catégorie
7326 $categorie = $this->f->get_param_option_notification($collectivite_di);
7327 $isPortal = $categorie === PORTAL;
7328 $demandeursANotifie = $this->get_demandeurs_notifiable(
7329 $this->getVal('dossier'),
7330 $isPortal
7331 );
7332
7333 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7334 $demandeurPrincipalNotifie = false;
7335 if (count($demandeursANotifie) > 0) {
7336 foreach ($demandeursANotifie as $demandeur) {
7337 // Identifie si le demandeur principal a été notifié ou pas
7338 // et récupère ses informations
7339 if ($demandeur['petitionnaire_principal'] == 't') {
7340 $demandeurPrincipalNotifie = true;
7341 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7342 // son paramétrage, on effectue pas le traitement et on passe à l'itération
7343 // suivante. On le considère également comme non notifié pour gérer l'envoie
7344 // des messages d'erreurs
7345 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7346 // d'impact sur la notification
7347 $erreursParam = $this->get_info_notification_fail();
7348 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7349 $demandeurPrincipalNotifie = false;
7350 continue;
7351 }
7352 }
7353 //
7354 $msg_notif = '';
7355
7356 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
7357 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7358 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7359 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7360 && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7361 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7362 // Ajout de la notif et récupération de son id
7363 $idNotif = $this->ajouter_notification(
7364 $this->getVal($this->clePrimaire),
7365 $this->f->get_connected_user_login_name(),
7366 $demandeur,
7367 $collectivite_di,
7368 array(),
7369 true,
7370 'Echec',
7371 __('La date limite de notification au demandeur est dépassée')
7372 );
7373 if ($idNotif === false) {
7374 // Termine le traitement
7375 $this->addToLog(
7376 sprintf('%s() : %s', __METHOD__, $msgLog),
7377 DEBUG_MODE
7378 );
7379 return $this->end_treatment(__METHOD__, false);
7380 }
7381 $msg_notif = sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7382 }
7383 else {
7384 // Ajout de la notif et récupération de son id
7385 $idNotif = $this->ajouter_notification(
7386 $this->getVal($this->clePrimaire),
7387 $this->f->get_connected_user_login_name(),
7388 $demandeur,
7389 $collectivite_di,
7390 array(),
7391 true
7392 );
7393 if ($idNotif === false) {
7394 // Termine le traitement
7395 $this->addToLog(
7396 sprintf('%s() : %s', __METHOD__, $msgLog),
7397 DEBUG_MODE
7398 );
7399 return $this->end_treatment(__METHOD__, false);
7400 }
7401 $notification_by_task = $this->notification_by_task(
7402 $idNotif,
7403 $this->getVal('dossier'),
7404 $categorie
7405 );
7406 if ($notification_by_task === false) {
7407 $this->addToLog(
7408 sprintf('%s() : %s', __METHOD__, $msgLog),
7409 DEBUG_MODE
7410 );
7411 $this->addToMessage(
7412 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7413 );
7414 // Termine le traitement
7415 return $this->end_treatment(__METHOD__, false);
7416 }
7417 $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7418 }
7419 }
7420 $this->addToMessage($message .= $msg_notif);
7421 }
7422 // Pour la notification par mail ou la notification via portal si le dossier a
7423 // été déposés via portal, si le demandeur principal n'est pas notifiable,
7424 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7425 // laquelle le demandeur principal n'a pas pu être notifié
7426 $depotPortal = $this->dossier_depose_sur_portail();
7427 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7428 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7429 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7430 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7431 $erreursParam = $this->get_info_notification_fail();
7432 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7433 // Ajout de la notif et récupération de son id
7434 $idNotif = $this->ajouter_notification(
7435 $this->valF[$this->clePrimaire],
7436 $this->f->get_connected_user_login_name(),
7437 $demandeurPrincipal,
7438 $collectivite_di,
7439 array(),
7440 true,
7441 'Echec',
7442 implode(' ', $erreursParam)
7443 );
7444 if ($idNotif === false) {
7445 $this->addToMessage(
7446 __('Erreur : la création de la notification a échouée.').
7447 __("Veuillez contacter votre administrateur.")
7448 );
7449 $this->addToLog(
7450 sprintf('%s() : %s', __METHOD__, $msgLog),
7451 DEBUG_MODE
7452 );
7453 return false;
7454 }
7455 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7456 // de l'échec de la notification
7457 $dossier_message = $this->get_inst_dossier_message(0);
7458 $dossier_message_val = array(
7459 'dossier' => $this->getVal('dossier'),
7460 'type' => __('erreur expedition'),
7461 'emetteur' => $this->f->get_connected_user_login_name(),
7462 'login' => $_SESSION['login'],
7463 'date_emission' => date('Y-m-d H:i:s'),
7464 'contenu' => __('Échec lors de la notification de l\'instruction ').
7465 $ev->getVal('libelle').
7466 '.<br>'.
7467 implode("\n", $erreursParam).
7468 '<br>'.
7469 __('Veuillez corriger ces informations avant de renvoyer la notification.')
7470 );
7471 $add = $dossier_message->add_notification_message($dossier_message_val, true);
7472 // Si une erreur se produit pendant l'ajout
7473 if ($add !== true) {
7474 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7475 return false;
7476 }
7477 }
7478 }
7479
7480 // Termine le traitement
7481 // Événement
7482 $data['ev'] = $ev;
7483 $data['collectivite_di'] = $collectivite_di;
7484 $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7485 $this->f->log(__METHOD__, 'END');
7486
7487 return $this->end_treatment(__METHOD__, true);
7488 }
7489
7490 /**
7491 * Récupère l'instance de dossier message.
7492 *
7493 * @param string $dossier_message Identifiant du message.
7494 *
7495 * @return object
7496 */
7497 private function get_inst_dossier_message($dossier_message = null) {
7498 //
7499 return $this->get_inst_common("dossier_message", $dossier_message);
7500 }
7501
7502 /**
7503 * Vérifie si le signataire est obligatoire pour finaliser
7504 * le document apartir du paramétrage de l'événement.
7505 * Si c'est le cas, vérifie si il y a bien un signataire
7506 * renseigné.
7507 * Si c'est le cas renvoie true, sinon renvoie false.
7508 *
7509 * @param evenement évenement de l'instruction permettant de
7510 * récupérer le paramétrage
7511 * @return boolean
7512 */
7513 protected function controle_signataire($evenement) {
7514 // Vérifie si le signataire est obligatoire et si c'est le cas
7515 // vérifie si il y a bien un signataire pour le document
7516 if ($evenement->is_signataire_obligatoire() &&
7517 ($this->getVal('signataire_arrete') === null ||
7518 $this->getVal('signataire_arrete') === '')) {
7519 return false;
7520 }
7521 return true;
7522 }
7523
7524 /**
7525 * TREATMENT - unfinalize.
7526 *
7527 * Permet de définaliser un enregistrement.
7528 *
7529 * @param array $val valeurs soumises par le formulaire
7530 *
7531 * @return boolean
7532 */
7533 function unfinalize($val = array()) {
7534
7535 // Cette méthode permet d'exécuter une routine en début des méthodes
7536 // dites de TREATMENT.
7537 $this->begin_treatment(__METHOD__);
7538
7539 // Traitement de la finalisation
7540 $ret = $this->manage_finalizing("unfinalize", $val);
7541
7542 // Si le traitement retourne une erreur
7543 if ($ret !== true) {
7544
7545 // Termine le traitement
7546 return $this->end_treatment(__METHOD__, false);
7547 }
7548
7549 // Termine le traitement
7550 return $this->end_treatment(__METHOD__, true);
7551 }
7552
7553 /**
7554 * VIEW - view_edition
7555 *
7556 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7557 *
7558 * @return null Si l'action est incorrecte
7559 */
7560 function view_edition() {
7561
7562 // Si l'instruction est finalisée
7563 if($this->getVal("om_final_instruction") == 't'
7564 && $this->getVal("om_final_instruction") != null) {
7565
7566 // Ouvre le document
7567 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7568 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7569 //
7570 header("Location: ".$lien);
7571 } else {
7572
7573 // Récupère la collectivite du dossier d'instruction
7574 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7575
7576 //
7577 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7578
7579 // Paramètre du PDF
7580 $params = array(
7581 "watermark" => true,
7582 "specific" => array(
7583 "mode" => "previsualisation",
7584 ),
7585 );
7586 // Si la rédaction libre est activée sur l'instruction
7587 if ($this->getVal("flag_edition_integrale") == 't') {
7588 $params["specific"]["corps"] = array(
7589 "mode" => "set",
7590 "value" => $this->getVal("corps_om_htmletatex"),
7591 );
7592 $params["specific"]["titre"] = array(
7593 "mode" => "set",
7594 "value" => $this->getVal("titre_om_htmletat"),
7595 );
7596 }
7597
7598 // Génération du PDF
7599 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7600 $result['filename'] = $this->determinate_name_doc_pdf();
7601 // Affichage du PDF
7602 $this->expose_pdf_output(
7603 $result['pdf_output'],
7604 $result['filename']
7605 );
7606 }
7607 }
7608
7609 /**
7610 * Récupère la collectivité du dossier d'instruction.
7611 *
7612 * @param string $dossier_instruction_id Identifiant du DI.
7613 *
7614 * @return integer
7615 */
7616 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7617
7618 // Si l'identifiant n'est pas renseigné
7619 if ($dossier_instruction_id === null) {
7620 // Récupère la valeur
7621 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7622 $dossier_instruction_id = $this->getVal('dossier');
7623 } elseif ($this->getParameter('idxformulaire') !== null
7624 && $this->getParameter('idxformulaire') !== '') {
7625 //
7626 $dossier_instruction_id = $this->getParameter('idxformulaire');
7627 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7628 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7629 //
7630 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7631 }
7632 }
7633
7634 //
7635 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7636 "obj" => "dossier_instruction",
7637 "idx" => $dossier_instruction_id,
7638 ));
7639
7640 //
7641 return $dossier_instruction->getVal('om_collectivite');
7642 }
7643
7644 /**
7645 * VIEW - view_bible
7646 *
7647 * Affiche la bible manuelle.
7648 *
7649 * @return void
7650 */
7651 function view_bible() {
7652 // Vérification de l'accessibilité sur l'élément
7653 $this->checkAccessibility();
7654
7655 /**
7656 * Affichage de la structure HTML
7657 */
7658 //
7659 if ($this->f->isAjaxRequest()) {
7660 //
7661 header("Content-type: text/html; charset=".HTTPCHARSET."");
7662 } else {
7663 //
7664 $this->f->setFlag("htmlonly");
7665 $this->f->display();
7666 }
7667 //
7668 $this->f->displayStartContent();
7669 //
7670 $this->f->setTitle(__("Liste des éléments de la bible en lien avec un evenement"));
7671 $this->f->displayTitle();
7672
7673 /**
7674 *
7675 */
7676 //
7677 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7678 $evenement = intval($evenement);
7679 //
7680 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7681 // Récupération du code du type de DA
7682 $code_da_type = '';
7683 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7684 $code_da_type = $matches[0];
7685 }
7686 //
7687 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7688
7689 // Récupération de la collectivité du dossier
7690 $dossier = $this->f->get_inst__om_dbform(array(
7691 "obj" => "dossier",
7692 "idx" => $idx,
7693 ));
7694
7695 $qres = $this->f->get_all_results_from_db_query(
7696 sprintf(
7697 'SELECT
7698 *,
7699 bible.libelle as bible_lib
7700 FROM
7701 %1$sbible
7702 LEFT OUTER JOIN %1$sdossier_autorisation_type
7703 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7704 LEFT JOIN %1$som_collectivite
7705 ON bible.om_collectivite = om_collectivite.om_collectivite
7706 WHERE
7707 (evenement = %2$d
7708 OR evenement IS NULL)
7709 AND (complement = %3$d
7710 OR complement IS NULL)
7711 AND (bible.dossier_autorisation_type IS NULL
7712 OR dossier_autorisation_type.code = \'%4$s\')
7713 AND (om_collectivite.niveau = \'2\'
7714 OR bible.om_collectivite = %5$d)
7715 ORDER BY
7716 bible_lib ASC',
7717 DB_PREFIXE,
7718 intval($evenement),
7719 intval($complement),
7720 $this->f->db->escapeSimple($code_da_type),
7721 intval($dossier->getVal("om_collectivite"))
7722 ),
7723 array(
7724 'origin' => __METHOD__
7725 )
7726 );
7727 //
7728 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7729 //
7730 if ($qres['row_count'] > 0) {
7731 //
7732 echo "\t<table id='tab-bible' width='100%'>\n";
7733 //
7734 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7735 echo "<th>".__("Choisir")."</th>";
7736 echo "<th>".__("Libelle")."</th>";
7737 echo "</tr>\n";
7738 //
7739 $i = 0;
7740 //
7741 foreach ($qres['result'] as $row) {
7742 //
7743 echo "\t\t<tr";
7744 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7745 echo ">";
7746 //
7747 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7748 // XXX utilisation de l'attribut titre pour afficher une infobulle
7749 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7750 //
7751 echo "</tr>\n";
7752 //
7753 $i++;
7754 }
7755 echo "\t</table>\n";
7756 //
7757 echo "<div class=\"formControls\">\n";
7758 $this->f->layout->display_form_button(array(
7759 "value" => __("Valider"),
7760 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7761 ));
7762 $this->f->displayLinkJsCloseWindow();
7763 echo "</div>\n";
7764
7765 } else {
7766 //
7767 $message_class = "error";
7768 $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7769 $this->f->displayMessage($message_class, $message);
7770 //
7771 echo "<div class=\"formControls\">\n";
7772 $this->f->displayLinkJsCloseWindow();
7773 echo "</div>\n";
7774 }
7775 //
7776 echo "</form>\n";
7777
7778 /**
7779 * Affichage de la structure HTML
7780 */
7781 //
7782 $this->f->displayEndContent();
7783 }
7784
7785 /**
7786 * VIEW - view_bible_auto
7787 *
7788 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7789 *
7790 * @return void
7791 */
7792 function view_bible_auto() {
7793 // Vérification de l'accessibilité sur l'élément
7794 $this->checkAccessibility();
7795 //
7796 $this->f->disableLog();
7797
7798 $formatDate="AAAA-MM-JJ";
7799
7800 // Récupération des paramètres
7801 $idx = $this->f->get_submitted_get_value('idx');
7802 $evenement = $this->f->get_submitted_get_value('ev');
7803
7804 // Initialisation de la variable de retour
7805 $retour['complement_om_html'] = '';
7806 $retour['complement2_om_html'] = '';
7807 $retour['complement3_om_html'] = '';
7808 $retour['complement4_om_html'] = '';
7809
7810 // Vérification d'une consultation liée à l'événement
7811 $instEvenement = $this->f->get_inst__om_dbform(array(
7812 "obj" => "evenement",
7813 "idx" => $evenement,
7814 ));
7815
7816 // Si consultation liée, récupération du retour d'avis
7817 if($instEvenement->getVal('consultation') == 'Oui'){
7818
7819 $qres = $this->f->get_all_results_from_db_query(
7820 sprintf(
7821 'SELECT
7822 date_retour,
7823 avis_consultation.libelle as avis_consultation,
7824 COALESCE(service.libelle, tiers_consulte.libelle) as service
7825 FROM
7826 %1$sconsultation
7827 LEFT JOIN %1$stiers_consulte
7828 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7829 LEFT JOIN %1$sservice
7830 ON consultation.service = service.service
7831 LEFT JOIN %1$savis_consultation
7832 ON consultation.avis_consultation = avis_consultation.avis_consultation
7833 WHERE
7834 dossier = \'%2$s\'
7835 AND consultation.visible',
7836 DB_PREFIXE,
7837 $this->f->db->escapeSimple($idx)
7838 ),
7839 array(
7840 'origin' => __METHOD__
7841 )
7842 );
7843 // Récupération des consultations
7844 foreach ($qres['result'] as $row) {
7845 $correct=false;
7846 // date retour
7847 if ($row['date_retour']<>""){
7848 if ($formatDate=="AAAA-MM-JJ"){
7849 $date = explode("-", $row['date_retour']);
7850 // controle de date
7851 if (count($date) == 3 &&
7852 checkdate($date[1], $date[2], $date[0])) {
7853 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7854 $correct=true;
7855 }else{
7856 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7857 $correct=false;
7858 }
7859 }
7860 }
7861 //
7862 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7863 if($correct == true){
7864 $temp=$temp." du ".$date_retour_f;
7865 }
7866 // Concaténation des retours d'avis de consultation
7867 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7868 } // while
7869
7870 } // consultation
7871 // Récupération des bibles automatiques pour le champ complement_om_html
7872 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7873 // Récupération des bibles automatiques pour le champ complement2_om_html
7874 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7875 // Récupération des bibles automatiques pour le champ complement3_om_html
7876 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7877 // Récupération des bibles automatiques pour le champ complement4_om_html
7878 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7879
7880
7881
7882 echo json_encode($retour);
7883 }
7884
7885 /**
7886 * VIEW - view_pdf_temp
7887 *
7888 * @return void
7889 */
7890 function view_pdf_temp() {
7891 $this->checkAccessibility();
7892 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7893 $this->f->set_submitted_value();
7894 $merge_fields = array();
7895 //
7896 if (array_key_exists('c1', $_POST) === true) {
7897 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7898 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7899 }
7900 if (array_key_exists('c2', $_POST) === true) {
7901 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7902 }
7903 if (array_key_exists('c3', $_POST) === true) {
7904 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7905 }
7906 if (array_key_exists('c4', $_POST) === true) {
7907 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7908 }
7909 $params = array(
7910 "watermark" => true,
7911 "specific" => array(
7912 "merge_fields" => $merge_fields,
7913 ),
7914 );
7915 //
7916 if (array_key_exists('corps', $_POST) === true) {
7917 $params["specific"]["corps"] = array(
7918 "mode" => "set",
7919 "value" => $_POST['corps'],
7920 );
7921 }
7922 if (array_key_exists('titre', $_POST) === true) {
7923 $params["specific"]["titre"] = array(
7924 "mode" => "set",
7925 "value" => $_POST['titre'],
7926 );
7927 }
7928 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7929 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7930 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7931 $retour = array(
7932 'base' => base64_encode($result['pdf_output']),
7933 );
7934 echo json_encode($retour);
7935 }
7936
7937 /**
7938 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7939 * PDF sans prise en compte de la valeur des compléments et le retourne en
7940 * base 64.
7941 *
7942 * @return string Rendu PDF converti en base 64.
7943 */
7944 function init_pdf_temp() {
7945 $params = array(
7946 "watermark" => true,
7947 );
7948 // Si la rédaction libre est activée sur l'instruction
7949 if ($this->getVal("flag_edition_integrale") == 't') {
7950 $params["specific"]["corps"] = array(
7951 "mode" => "set",
7952 "value" => $this->getVal("corps_om_htmletatex"),
7953 );
7954 $params["specific"]["titre"] = array(
7955 "mode" => "set",
7956 "value" => $this->getVal("titre_om_htmletat"),
7957 );
7958 }
7959 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7960 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7961 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7962
7963 return base64_encode($result['pdf_output']);
7964 }
7965
7966 /**
7967 * Récupération des éléments de bible.
7968 *
7969 * @param integer $event id de l'événement
7970 * @param string $idx id du dossier
7971 * @param integer $compnb numéro du champ complement
7972 * @param string $type types possibles : automatique ou precharge
7973 *
7974 * @return string Chaîne de texte à insérer dans le champ complement
7975 */
7976 function getBible($event, $idx, $compnb, $type = 'automatique') {
7977 // Récupération de la collectivité du dossier
7978 $dossier = $this->f->get_inst__om_dbform(array(
7979 "obj" => "dossier",
7980 "idx" => $idx,
7981 ));
7982 // Récupération du code du type de DA
7983 $code_da_type = '';
7984 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7985 $code_da_type = $matches[0];
7986 }
7987
7988 // Prépare le filtre de la requête selon le type de remplissage voulu
7989 $sql_filter_type = '';
7990 if ($type === 'automatique') {
7991 $sql_filter_type = "AND automatique = 'Oui'";
7992 } elseif ($type === 'precharge') {
7993 $sql_filter_type = "AND precharge IS TRUE";
7994 }
7995
7996 $qres = $this->f->get_all_results_from_db_query(
7997 sprintf(
7998 'SELECT
7999 *
8000 FROM
8001 %1$sbible
8002 LEFT OUTER JOIN %1$sdossier_autorisation_type
8003 ON bible.dossier_autorisation_type =
8004 dossier_autorisation_type.dossier_autorisation_type
8005 LEFT JOIN %1$som_collectivite
8006 ON bible.om_collectivite = om_collectivite.om_collectivite
8007 WHERE
8008 (evenement = %2$d
8009 OR evenement IS NULL)
8010 AND (complement = %3$d
8011 OR complement IS NULL)
8012 AND (dossier_autorisation_type.code = \'%4$s\'
8013 OR bible.dossier_autorisation_type IS NULL)
8014 AND (om_collectivite.niveau = \'2\'
8015 OR bible.om_collectivite = %5$d)
8016 %6$s',
8017 DB_PREFIXE,
8018 intval($event),
8019 intval($compnb),
8020 $this->f->db->escapeSimple($code_da_type),
8021 intval($dossier->getVal("om_collectivite")),
8022 $sql_filter_type
8023 ),
8024 array(
8025 "origin" => __METHOD__
8026 )
8027 );
8028 $temp = "";
8029 foreach ($qres['result'] as $row) {
8030 // Remplacement des retours à la ligne par des br
8031 $temp .= preg_replace(
8032 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
8033 );
8034 // Ajout d'un saut de ligne entre chaque bible.
8035 $temp .= '<br/>';
8036 } // fin while
8037 return $temp;
8038 }
8039
8040 /**
8041 * VIEW - view_suivi_bordereaux.
8042 *
8043 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
8044 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
8045 * collectivité des dossiers affichés.
8046 *
8047 * @return void
8048 */
8049 function view_suivi_bordereaux() {
8050 // Vérification de l'accessibilité sur l'élément
8051 $this->checkAccessibility();
8052
8053 /**
8054 * Validation du formulaire
8055 */
8056 // Si le formulaire a été validé
8057 if ($this->f->get_submitted_post_value("validation") !== null) {
8058 // Si un bordereau à été sélectionné
8059 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
8060 // Si aucun bordereau n'a été sélectionné
8061 $message_class = "error";
8062 $message = __("Veuillez selectionner un bordereau.");
8063 }
8064 // Sinon si les dates ne sont pas valide
8065 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8066 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8067 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8068 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8069 // Si aucune date n'a été saisie
8070 $message_class = "error";
8071 $message = __("Veuillez saisir une date valide.");
8072 }
8073 // Sinon si les dates ne sont pas valides
8074 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8075 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
8076 // Si aucune date n'a été saisie
8077 $message_class = "error";
8078 $message = __("Erreur de parametrage. Contactez votre administrateur.");
8079 }
8080 // Affiche le message de validation
8081 else {
8082 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
8083 $etat = $this->f->get_inst__om_dbform(array(
8084 "obj" => "om_etat",
8085 "idx" => $this->f->get_submitted_post_value("bordereau")
8086 ));
8087 $qres = $this->f->get_one_result_from_db_query(
8088 sprintf(
8089 'SELECT
8090 om_etat.libelle
8091 FROM
8092 %som_etat
8093 WHERE
8094 om_etat.id = \'%s\'',
8095 DB_PREFIXE,
8096 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8097 ),
8098 array(
8099 "origin" => __METHOD__,
8100 )
8101 );
8102
8103 //
8104 $message_class = "valid";
8105 $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8106 $message .= " : <br/><br/>";
8107 $message .= "<a class='om-prev-icon pdf-16'";
8108 $message .= " title=\"".__("Bordereau")."\"";
8109 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8110 $message .= "&action=220";
8111 $message .= "&idx=0";
8112 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8113 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
8114 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
8115 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8116 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8117 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8118 }
8119 $message .= "'"." target='_blank'>";
8120 $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8121 ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8122 $message .= "</a>";
8123 }
8124 }
8125
8126 /**
8127 * Affichage des messages et du formulaire
8128 */
8129 // Affichage du message de validation ou d'erreur
8130 if (isset($message) && isset($message_class) && $message != "") {
8131 $this->f->displayMessage($message_class, $message);
8132 }
8133 // Ouverture du formulaire
8134 printf("\t<form");
8135 printf(" method=\"post\"");
8136 printf(" id=\"suivi_bordereaux_form\"");
8137 printf(" action=\"\"");
8138 printf(">\n");
8139 // Paramétrage des champs du formulaire
8140 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8141 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
8142 // collectivité dans le formulaire
8143 if ($_SESSION["niveau"] == 2) {
8144 array_push($champs, "om_collectivite");
8145 }
8146 // Création d'un nouvel objet de type formulaire
8147 $form = $this->f->get_inst__om_formulaire(array(
8148 "validation" => 0,
8149 "maj" => 0,
8150 "champs" => $champs,
8151 ));
8152 // Paramétrage du champ date_bordereau_debut
8153 $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8154 $form->setType("date_bordereau_debut", "date");
8155 $form->setTaille("date_bordereau_debut", 12);
8156 $form->setMax("date_bordereau_debut", 12);
8157 $form->setRequired("date_bordereau_debut");
8158 $form->setOnchange("date_bordereau_debut", "fdate(this)");
8159 $form->setVal("date_bordereau_debut", date("d/m/Y"));
8160 // Paramétrage du champ date_bordereau_fin
8161 $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8162 $form->setType("date_bordereau_fin", "date");
8163 $form->setTaille("date_bordereau_fin", 12);
8164 $form->setMax("date_bordereau_fin", 12);
8165 $form->setRequired("date_bordereau_fin");
8166 $form->setOnchange("date_bordereau_fin", "fdate(this)");
8167 $form->setVal("date_bordereau_fin", date("d/m/Y"));
8168 // Paramétrage du champ bordereau
8169 $form->setLib("bordereau", __("bordereau"));
8170 $form->setType("bordereau", "select");
8171 $form->setRequired("bordereau");
8172 // Valeurs des champs
8173 if ($this->f->get_submitted_post_value("validation") !== null) {
8174 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8175 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8176 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8177 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8178 }
8179 // Données du select - On récupère ici la liste de tous les états disponibles
8180 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8181 // 'bordereau_'
8182 $qres = $this->f->get_all_results_from_db_query(
8183 sprintf(
8184 'SELECT
8185 om_etat.id,
8186 om_etat.libelle
8187 FROM
8188 %1$som_etat
8189 WHERE
8190 om_etat.id LIKE \'bordereau_%%\'
8191 ORDER BY
8192 om_etat.id',
8193 DB_PREFIXE
8194 ),
8195 array(
8196 "origin" => __METHOD__
8197 )
8198 );
8199 // Données du select
8200 $contenu = array(
8201 0 => array("", ),
8202 1 => array(__("choisir bordereau")),
8203 );
8204 foreach ($qres['result'] as $row) {
8205 $contenu[0][] = $row['id'];
8206 $contenu[1][] = $row['libelle'];
8207 }
8208 $form->setSelect("bordereau", $contenu);
8209 //
8210 if ($_SESSION["niveau"] == 2) {
8211 $form->setLib("om_collectivite", __("collectivite"));
8212 $form->setType("om_collectivite", "select");
8213
8214 // Données du select - On récupère ici la liste de tous toutes les collectivités
8215 // de niveau 1
8216 $qres = $this->f->get_all_results_from_db_query(
8217 sprintf(
8218 'SELECT
8219 om_collectivite,
8220 libelle
8221 FROM
8222 %1$som_collectivite
8223 WHERE
8224 niveau = \'1\'
8225 ORDER BY
8226 libelle',
8227 DB_PREFIXE
8228 ),
8229 array(
8230 "origin" => __METHOD__
8231 )
8232 );
8233 // La valeur par défaut du select est Toutes
8234 $list_collectivites = array(
8235 0 => array("", ),
8236 1 => array(__("toutes"))
8237 );
8238
8239 $id_colls = "";
8240 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8241 // par des virgules, pour un traitement plus facile dans la requête de sous-état
8242 foreach ($qres['result'] as $row) {
8243 if ($id_colls != "") {
8244 $id_colls .= ",";
8245 }
8246 $id_colls .= $row['om_collectivite'];
8247 $list_collectivites[0][] = $row['om_collectivite'];
8248 $list_collectivites[1][] = $row['libelle'];
8249 }
8250 // On affecte la liste d'identifiants à l'option Toutes
8251 $list_collectivites[0][0] = $id_colls ;
8252 $form->setSelect("om_collectivite", $list_collectivites);
8253 }
8254 // Affichage du formulaire
8255 $form->entete();
8256 $form->afficher($champs, 0, false, false);
8257 $form->enpied();
8258 // Affichage du bouton
8259 printf("\t<div class=\"formControls\">\n");
8260 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8261 printf("\t</div>\n");
8262 // Fermeture du formulaire
8263 printf("\t</form>\n");
8264 }
8265
8266
8267 /**
8268 * VIEW - view_generate_suivi_bordereaux.
8269 *
8270 * Génère et affiche les bordereaux de suivi.
8271 *
8272 * @return [void]
8273 */
8274 function view_generate_suivi_bordereaux() {
8275 // Vérification de l'accessibilité sur l'élément
8276 $this->checkAccessibility();
8277 // Récupération du type de bordereau
8278 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8279 // Génération du PDF
8280 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8281 // Affichage du PDF
8282 $this->expose_pdf_output(
8283 $result['pdf_output'],
8284 $result['filename']
8285 );
8286 }
8287
8288
8289 /**
8290 * VIEW - view_suivi_envoi_lettre_rar.
8291 *
8292 * Vue pour imprimer les AR.
8293 *
8294 * @return void
8295 */
8296 function view_suivi_envoi_lettre_rar() {
8297 // Vérification de l'accessibilité sur l'élément
8298 $this->checkAccessibility();
8299
8300 //
8301 if ($this->f->get_submitted_post_value("date") !== null) {
8302 $date = $this->f->get_submitted_post_value("date");
8303 } else {
8304 $date = "";
8305 }
8306 //
8307 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8308 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8309 } else {
8310 $liste_code_barres_instruction = "";
8311 }
8312
8313 // Compteur du nombre de page générées
8314 $nbLettres = 0;
8315 // Liste d'id des instructions
8316 $id4Gen = array();
8317 //
8318 $error = "";
8319
8320 // Initialisation du tableau qui va contenir les DI pour lister les liens
8321 $dossierTab = array();
8322 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8323 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8324 $hasHidden = true;
8325 // S'il ne peut pas les consulter il aura des dossiers caché
8326 if ($isAccredited === true) {
8327 $hasHidden = false;
8328 }
8329
8330 /**
8331 * Validation du formulaire
8332 */
8333 // Si le formulaire a été validé
8334 if ($this->f->get_submitted_post_value('validation') !== null) {
8335 //
8336 if (empty($date) || empty($liste_code_barres_instruction)) {
8337 //
8338 $message_class = "error";
8339 $message = __("Tous les champs doivent etre remplis.");
8340 } else {
8341 // Création d'un tableau d'instruction
8342 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8343 //
8344 foreach ($liste as $code_barres) {
8345 // On enlève les éventuels espaces saisis
8346 $code_barres = trim($code_barres);
8347 // Vérification de l'existence de l'instruction
8348 if ($code_barres != "") {
8349 // Si la valeur transmise est numérique
8350 if (is_numeric($code_barres)) {
8351 //
8352 $sql = "SELECT count(*)
8353 FROM ".DB_PREFIXE."instruction
8354 INNER JOIN ".DB_PREFIXE."dossier
8355 ON dossier.dossier=instruction.dossier
8356 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8357 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8358 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8359 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8360 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8361 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8362 INNER JOIN ".DB_PREFIXE."groupe
8363 ON dossier_autorisation_type.groupe = groupe.groupe
8364 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8365
8366 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8367 $group_clause = array();
8368 foreach ($_SESSION["groupe"] as $key => $value) {
8369 $group_clause[$key] = "(groupe.code = '".$key."'";
8370 if($value["confidentiel"] !== true) {
8371 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8372 }
8373 $group_clause[$key] .= ")";
8374 }
8375 $conditions = implode(" OR ", $group_clause);
8376 $sql .= " AND (" . $conditions . ")";
8377
8378 $qres = $this->f->get_one_result_from_db_query(
8379 $sql,
8380 array(
8381 "origin" => __METHOD__,
8382 )
8383 );
8384
8385 if ($qres['result'] == "1") {
8386 // Récupération de la date d'envoi de l'instruction bippé
8387 $qres = $this->f->get_all_results_from_db_query(
8388 sprintf(
8389 'SELECT
8390 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8391 instruction
8392 FROM
8393 %1$sinstruction
8394 WHERE
8395 code_barres = \'%2$s\'',
8396 DB_PREFIXE,
8397 $this->f->db->escapeSimple($code_barres)
8398 ),
8399 array(
8400 'origin' => __METHOD__
8401 )
8402 );
8403 $row = array_shift($qres['result']);
8404 // Si pas de date ou correspond à la date du formulaire on
8405 // effectue le traitement
8406 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8407 $instr = $this->f->get_inst__om_dbform(array(
8408 "obj" => "instruction",
8409 "idx" => $row['instruction'],
8410 ));
8411 $valF = array();
8412 foreach($instr->champs as $id => $champ) {
8413 $valF[$champ] = $instr->val[$id];
8414 }
8415
8416 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8417 if ($isAccredited === true
8418 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8419 $dossier = $this->f->get_inst__om_dbform(array(
8420 "obj" => "dossier",
8421 "idx" => $instr->getVal("dossier"),
8422 ));
8423 if ($dossier->is_user_from_allowed_collectivite()){
8424 $dossierTab[$instr->getVal("dossier")] = $dossier;
8425 } else {
8426 $hasHidden = true;
8427 }
8428 }
8429
8430 $valF['date_evenement']=
8431 $instr->dateDBToForm($valF['date_evenement']);
8432 $valF['archive_date_complet']=
8433 $instr->dateDBToForm($valF['archive_date_complet']);
8434 $valF['archive_date_rejet']=
8435 $instr->dateDBToForm($valF['archive_date_rejet']);
8436 $valF['archive_date_limite']=
8437 $instr->dateDBToForm($valF['archive_date_limite']);
8438 $valF['archive_date_notification_delai']=
8439 $instr->dateDBToForm($valF['archive_date_notification_delai']);
8440 $valF['archive_date_decision']=
8441 $instr->dateDBToForm($valF['archive_date_decision']);
8442 $valF['archive_date_validite']=
8443 $instr->dateDBToForm($valF['archive_date_validite']);
8444 $valF['archive_date_achevement']=
8445 $instr->dateDBToForm($valF['archive_date_achevement']);
8446 $valF['archive_date_chantier']=
8447 $instr->dateDBToForm($valF['archive_date_chantier']);
8448 $valF['archive_date_conformite']=
8449 $instr->dateDBToForm($valF['archive_date_conformite']);
8450 $valF['archive_date_dernier_depot']=
8451 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8452 $valF['archive_date_limite_incompletude']=
8453 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8454 $valF['date_finalisation_courrier']=
8455 $instr->dateDBToForm($valF['date_finalisation_courrier']);
8456 $valF['date_envoi_signature']=
8457 $instr->dateDBToForm($valF['date_envoi_signature']);
8458 $valF['date_retour_signature']=
8459 $instr->dateDBToForm($valF['date_retour_signature']);
8460 $valF['date_envoi_rar']=
8461 $instr->dateDBToForm($valF['date_envoi_rar']);
8462 $valF['date_retour_rar']=
8463 $instr->dateDBToForm($valF['date_retour_rar']);
8464 $valF['date_envoi_controle_legalite']=
8465 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8466 $valF['date_retour_controle_legalite']=
8467 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8468 $valF['date_envoi_rar'] = $date;
8469
8470 // Vérification de la finalisation du document
8471 // correspondant au code barres
8472 if($instr->getVal("om_final_instruction") === 't') {
8473 $instr->setParameter('maj', 1);
8474 $instr->class_actions[1]["identifier"] =
8475 "envoi lettre RAR (depuis le menu suivi des pièces)";
8476 if ($instr->modifier($valF) == true) {
8477 $id4Gen[] = $code_barres;
8478 $nbLettres ++;
8479 } else {
8480 //
8481 if ($error != "") {
8482 $error .= "<br/>";
8483 }
8484 $error .= sprintf(__("Une erreur s'est produite lors de la modification de l'instruction %s."),
8485 $code_barres);
8486 $error .= " ";
8487 $error .= __("Veuillez contacter votre administrateur.");
8488 }
8489 } else {
8490 //
8491 if ($error != "") {
8492 $error .= "<br/>";
8493 }
8494 $error .= sprintf(__("Le document correspondant au
8495 code barres %s n'est pas finalise,
8496 le bordereau ne sera pas genere."),
8497 $code_barres);
8498 }
8499
8500 } else {
8501 //
8502 if ($error != "") {
8503 $error .= "<br/>";
8504 }
8505 $error .= __("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." ".__("a deja ete envoyee, le bordereau ne sera pas genere.");
8506 }
8507 } else {
8508 //
8509 if ($error != "") {
8510 $error .= "<br/>";
8511 }
8512 $error .= __("Le numero")." ".$code_barres." ".__("ne correspond a aucun code barres d'instruction.");
8513 }
8514 } else {
8515 //
8516 if ($error != "") {
8517 $error .= "<br/>";
8518 }
8519 $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8520 }
8521 }
8522 }
8523 }
8524 }
8525
8526 /**
8527 * Affichage des messages et du formulaire
8528 */
8529 // Affichage du message de validation ou d'erreur
8530 if (isset($message) && isset($message_class) && $message != "") {
8531 $this->f->displayMessage($message_class, $message);
8532 }
8533 // Affichage du message d'erreur
8534 if(!empty($error)) {
8535 $this->f->displayMessage("error", $error);
8536 }
8537 // Affichage du message de validation de la saisie
8538 if ($nbLettres > 0) {
8539 //
8540 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8541 echo "\n<p>";
8542 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8543 echo "\n<span class=\"text\">";
8544 echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8545 echo " : \n<br/><br/>";
8546 echo "\n<a class='om-prev-icon pdf-16'";
8547 echo "\n title=\"".__("imprimer les AR")."\"";
8548 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8549 echo "\n target='_blank'>";
8550 echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8551 echo "\n</a>";
8552 echo "\n</span>";
8553 echo "\n</p>";
8554 echo "\n<br/>\n";
8555 if ($isAccredited === true) {
8556 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8557 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8558 echo __('Dossiers concernés par ce traitement');
8559 echo "\n</legend>";
8560 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8561
8562 if ($hasHidden === true) {
8563 echo "\n<br/>";
8564 echo "\n<p>";
8565 echo "\n<span class='text'>";
8566 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.");
8567 echo "</span>";
8568 echo "\n</p>";
8569 echo "\n<br/>";
8570 }
8571 foreach ($dossierTab as $dossier) {
8572
8573 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8574 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8575 $code_datd = $inst_datd->getVal('code');
8576
8577 $obj = "dossier_instruction";
8578 if ($code_datd === 'REC' || $code_datd === 'REG') {
8579 $obj = "dossier_contentieux_tous_recours";
8580 }
8581 if ($code_datd === 'IN') {
8582 $obj = "dossier_contentieux_toutes_infractions";
8583 }
8584
8585 echo "\n<div class=\"bloc group\">";
8586 echo "\n<div class=\"field field-type-text\">";
8587
8588 echo "\n<p>";
8589 echo "\n<span class='text'>";
8590 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . __('Consulter') . "\"";
8591 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8592 echo $dossier->getVal("dossier");
8593 echo "\">";
8594 echo "\n</a>";
8595
8596 echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8597 echo " href=\"".OM_ROUTE_FORM."&obj=";
8598 echo $obj;
8599 echo "&action=3&idx=";
8600 echo $dossier->getVal("dossier");
8601 echo "\">";
8602 echo $dossier->getVal("dossier_libelle");
8603 echo "\n</a>";
8604 echo "\n</span>";
8605 echo "\n</p>";
8606
8607 echo "\n</div>";
8608 echo "\n</div>";
8609 }
8610 echo "\n</div>";
8611 echo "\n</fieldset>";
8612 }
8613 echo "\n</div>";
8614 echo "\n</div>";
8615 }
8616 // Ouverture du formulaire
8617 echo "\t<form";
8618 echo " method=\"post\"";
8619 echo " id=\"suivi_envoi_lettre_rar_form\"";
8620 echo " action=\"\"";
8621 echo ">\n";
8622 // Paramétrage des champs du formulaire
8623 $champs = array("date", "liste_code_barres_instruction");
8624 // Création d'un nouvel objet de type formulaire
8625 $form = $this->f->get_inst__om_formulaire(array(
8626 "validation" => 0,
8627 "maj" => 0,
8628 "champs" => $champs,
8629 ));
8630 // Paramétrage du champ date du formulaire
8631 $form->setLib("date", __("Date")."* :");
8632 $form->setType("date", "date");
8633 $form->setOnchange("date", "fdate(this)");
8634 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8635 $form->setTaille("date", 10);
8636 $form->setMax("date", 10);
8637 // Paramétrage du champ liste_code_barres_instruction du formulaire
8638 $form->setLib("liste_code_barres_instruction", __("Liste des codes barres d'instructions scannes")."* :");
8639 $form->setType("liste_code_barres_instruction", "textarea");
8640 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8641 $form->setTaille("liste_code_barres_instruction", 20);
8642 $form->setMax("liste_code_barres_instruction", 20);
8643 // Affichage du formulaire
8644 $form->entete();
8645 $form->afficher($champs, 0, false, false);
8646 $form->enpied();
8647 // Affichage du bouton
8648 echo "\t<div class=\"formControls\">\n";
8649 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8650 echo "\t</div>\n";
8651 // Fermeture du formulaire
8652 echo "\t</form>\n";
8653 }
8654
8655 /**
8656 * VIEW - view_suivi_mise_a_jour_des_dates.
8657 *
8658 * Vu pour mettre à jour les dates de suivi de l'instruction.
8659 *
8660 * @return void
8661 */
8662 function view_suivi_mise_a_jour_des_dates() {
8663 // Vérification de l'accessibilité sur l'élément
8664 $this->checkAccessibility();
8665
8666 // Récupération des valeur passées en POST ou GET
8667 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8668 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8669 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8670 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8671 } else {
8672 $type_mise_a_jour = "";
8673 }
8674 if($this->f->get_submitted_post_value('date') !== null) {
8675 $date = $this->f->get_submitted_post_value('date');
8676 } elseif($this->f->get_submitted_get_value('date') !== null) {
8677 $date = $this->f->get_submitted_get_value('date');
8678 } else {
8679 $date = "";
8680 }
8681 if($this->f->get_submitted_post_value('code_barres') !== null) {
8682 $code_barres = $this->f->get_submitted_post_value('code_barres');
8683 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8684 $code_barres = $this->f->get_submitted_get_value('code_barres');
8685 } else {
8686 $code_barres = "";
8687 }
8688 // Booléen permettant de définir si un enregistrement à eu lieu
8689 $correct = false;
8690 // Booléen permettant de définir si les dates peuvent êtres enregistrées
8691 $date_error = false;
8692 // Champs date à mettre à jour
8693 $liste_champs=array();
8694
8695 // Si le formulaire a été validé
8696 if ($this->f->get_submitted_post_value('validation') !== null) {
8697 if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
8698
8699 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8700 $group_clause = array();
8701 foreach ($_SESSION["groupe"] as $key => $value) {
8702 $group_clause[$key] = "(groupe.code = '".$key."'";
8703 if($value["confidentiel"] !== true) {
8704 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8705 }
8706 $group_clause[$key] .= ")";
8707 }
8708 $conditions = implode(" OR ", $group_clause);
8709 $groupFilter = " AND (" . $conditions . ")";
8710
8711 $qres = $this->f->get_all_results_from_db_query(
8712 sprintf(
8713 'SELECT
8714 instruction
8715 FROM
8716 %1$sinstruction
8717 INNER JOIN %1$sdossier
8718 ON dossier.dossier = instruction.dossier
8719 INNER JOIN %1$sdossier_instruction_type
8720 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8721 INNER JOIN %1$sdossier_autorisation_type_detaille
8722 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8723 INNER JOIN %1$sdossier_autorisation_type
8724 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8725 INNER JOIN %1$sgroupe
8726 ON dossier_autorisation_type.groupe = groupe.groupe
8727 WHERE
8728 code_barres = \'%2$s\'
8729 %3$s',
8730 DB_PREFIXE,
8731 $this->f->db->escapeSimple($code_barres),
8732 $groupFilter
8733 ),
8734 array(
8735 'origin' => __METHOD__
8736 )
8737 );
8738 if($qres['row_count'] === 1) {
8739 $liste_champs = explode(";", $type_mise_a_jour);
8740 $row = array_shift($qres['result']);
8741 $instr = $this->f->get_inst__om_dbform(array(
8742 "obj" => "instruction",
8743 "idx" => $row['instruction'],
8744 ));
8745 // Mise à jour des dates après l'écran de verification
8746 if($this->f->get_submitted_post_value('is_valid') !== null && $this->f->get_submitted_post_value('is_valid') == "true") {
8747 $valF = array();
8748 foreach($instr->champs as $id => $champ) {
8749 $valF[$champ] = $instr->val[$id];
8750 }
8751 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8752 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8753 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8754 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8755 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8756 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8757 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8758 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8759 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8760 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8761 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8762 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8763 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8764 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8765 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8766 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8767 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8768 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8769 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8770 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8771 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8772 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8773 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8774 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8775 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8776 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8777
8778 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8779 $valF[$maj_date]=$date;
8780 }
8781
8782 // Vérification de la finalisation du document
8783 // correspondant au code barres
8784 if($valF["om_final_instruction"] === 't' ||
8785 $valF["lettretype"] == '') {
8786 $code_barres = "";
8787
8788 //Désactivation de l'autocommit
8789 $this->f->db->autoCommit(false);
8790
8791 //On modifie les valeurs de l'instruction
8792 $instr->setParameter('maj', 170);
8793 $instr->class_actions[170]["identifier"] =
8794 "mise à jour des dates (depuis le menu suivi des pièces)";
8795 $retour = $instr->modifier($valF);
8796
8797 //Si une erreur s'est produite, on défait les modifications
8798 //qui ont été faites
8799 if (!$retour){
8800 $instr->undoValidation();
8801 }
8802 //Sinon, on valide en base de données les modifications
8803 else {
8804 $this->f->db->commit();
8805 }
8806
8807 // Variable correct retourné depuis la classe instruction
8808 $correct = $instr->correct;
8809
8810 // Si la modification sur l'instruction a échoué
8811 if ($correct === false) {
8812
8813 // Message d'erreur de la classe instruction
8814 $error = $instr->msg;
8815 }
8816
8817 } else {
8818 // Indique que le traitement est en erreur
8819 $correct = false;
8820 // Message d'erreur
8821 $error = sprintf(__("Le document n'est pas finalise."),
8822 "<span class='bold'>".$code_barres."</span>");
8823 }
8824 } else {
8825 // Récupération des infos du dossier
8826 $qres = $this->f->get_all_results_from_db_query(
8827 sprintf(
8828 'SELECT
8829 dossier.dossier_libelle,
8830 evenement.libelle as evenement,
8831 autorite_competente.code as autorite_competente_code,
8832 autorite_competente.libelle as autorite_competente,
8833 evenement.type as evenement_type,
8834 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8835 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8836 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8837 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8838 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8839 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8840 FROM
8841 %1$sinstruction
8842 INNER JOIN %1$sdossier
8843 ON dossier.dossier=instruction.dossier
8844 LEFT JOIN %1$sautorite_competente
8845 ON dossier.autorite_competente=autorite_competente.autorite_competente
8846 INNER JOIN %1$sevenement
8847 ON instruction.evenement=evenement.evenement
8848 WHERE
8849 code_barres = \'%2$s\'',
8850 DB_PREFIXE,
8851 $this->f->db->escapeSimple($code_barres)
8852 ),
8853 array(
8854 "origin" => __METHOD__
8855 )
8856 );
8857 $infos = array_shift($qres['result']);
8858
8859 // Vérification de la non modification des dates de suivi
8860 foreach(explode(";", $type_mise_a_jour) as $champ) {
8861 if ($champ === 'date_envoi_controle_legalite') {
8862 if ($instr->is_sent_to_cl() === true) {
8863 $error = __("Les dates de suivis ne peuvent etre modifiees");
8864 $date_error = true;
8865 break;
8866 }
8867 }
8868 if($infos[$champ] != "" && $infos[$champ] != $date) {
8869 $error = __("Les dates de suivis ne peuvent etre modifiees");
8870 $date_error = true;
8871 break;
8872 }
8873 }
8874 }
8875 } else {
8876 $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
8877 }
8878
8879 } else {
8880 $error = __("Tous les champs doivent etre remplis.");
8881 }
8882 }
8883
8884 /**
8885 * Affichage des messages et du formulaire
8886 */
8887 // Affichage du message de validation ou d'erreur
8888 if (isset($message) && isset($message_class) && $message != "") {
8889 $this->f->displayMessage($message_class, $message);
8890 }
8891 // Affichage du message d'erreur
8892 if(!empty($error)) {
8893 $this->f->displayMessage("error", $error);
8894 }
8895
8896 // Affichage du message de validation de la saisie
8897 if($correct === true) {
8898 $this->f->displayMessage("ok", __("Saisie enregistree"));
8899 }
8900 // Ouverture du formulaire
8901 echo "\t<form";
8902 echo " method=\"post\"";
8903 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8904 echo " action=\"\"";
8905 echo ">\n";
8906 // Paramétrage des champs du formulaire
8907 if(isset($infos)) {
8908 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8909 , "autorite_competente", "date_envoi_signature",
8910 "date_retour_signature", "date_envoi_controle_legalite",
8911 "date_retour_controle_legalite", "date_envoi_rar",
8912 "date_retour_rar", "is_valid");
8913 } else {
8914 $champs = array("type_mise_a_jour", "date", "code_barres");
8915 }
8916 // Création d'un nouvel objet de type formulaire
8917 $form = $this->f->get_inst__om_formulaire(array(
8918 "validation" => 0,
8919 "maj" => 0,
8920 "champs" => $champs,
8921 ));
8922 // Paramétrage des champs du formulaire
8923 // Parametrage du champ type_mise_a_jour
8924 $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
8925 if(isset($infos)) {
8926 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8927
8928 } else {
8929 $form->setType("type_mise_a_jour", "select");
8930
8931 }
8932 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8933 $contenu = array();
8934
8935 $contenu[0][0] = "date_envoi_signature";
8936 $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
8937
8938 $contenu[0][1] = "date_retour_signature";
8939 $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
8940
8941 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8942 $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
8943
8944 $contenu[0][3] = "date_envoi_controle_legalite";
8945 $contenu[1][3] = __("date d'envoi au controle de legalite");
8946
8947 $contenu[0][4] = "date_retour_controle_legalite";
8948 $contenu[1][4] = __("date de retour de controle de legalite");
8949
8950 $contenu[0][5] = "date_retour_rar";
8951 $contenu[1][5] = __("date de notification du correspondant");
8952
8953 $form->setSelect("type_mise_a_jour", $contenu);
8954
8955 // Parametrage du champ date
8956 $form->setLib("date", __("Date")."* :");
8957 if(isset($infos)) {
8958 $form->setType("date", "hiddenstaticdate");
8959
8960 } else {
8961 $form->setType("date", "date");
8962 }
8963 $form->setVal("date", $date);
8964 $form->setTaille("date", 10);
8965 $form->setMax("date", 10);
8966
8967 // Parametrage du champ code_barres
8968 $form->setLib("code_barres", __("Code barres d'instruction")."* :");
8969 if(isset($infos)) {
8970 $form->setType("code_barres", "hiddenstatic");
8971 } else {
8972 $form->setType("code_barres", "text");
8973 }
8974 $form->setVal("code_barres", $code_barres);
8975 $form->setTaille("code_barres", 20);
8976 $form->setMax("code_barres", 20);
8977
8978 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8979 if(isset($infos)) {
8980
8981 // Tous les champs sont défini par defaut à static
8982 foreach ($infos as $key => $value) {
8983 $form->setType($key, "static");
8984 if(in_array($key, $liste_champs)) {
8985 $form->setVal($key, $date);
8986 } else {
8987 $form->setVal($key, $value);
8988 }
8989 }
8990
8991 // Les champs dont on viens de définir la valeur sont en gras
8992 foreach ($liste_champs as $value) {
8993 $form->setBloc($value,'DF',"",'bold');
8994 }
8995
8996 // Parametrage du champ dossier
8997 $form->setLib("dossier_libelle", __("dossier_libelle")." :");
8998 $form->setType("dossier_libelle", "static");
8999 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
9000
9001 // Parametrage du champ evenement
9002 $form->setLib("evenement", __("evenement")." :");
9003 $form->setType("evenement", "static");
9004 $form->setVal("evenement", $infos['evenement']);
9005
9006 // Parametrage du champ autorite_competente
9007 $form->setLib("autorite_competente", __("Autorite competente")." :");
9008 $form->setType("autorite_competente", "static");
9009 $form->setVal("autorite_competente", $infos['autorite_competente']);
9010
9011 // Parametrage des libellés d'envoi avec AR
9012 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
9013 $form->setLib("date_retour_rar", __("date_notification")." :");
9014
9015 $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
9016 $form->setLib("date_retour_signature", __("date_retour_signature")." :");
9017 $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
9018 $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
9019 // Configuration des libellé en fonction de l'autorité compétente
9020 if($infos['autorite_competente_code'] == 'ETAT') {
9021 $form->setType("date_envoi_controle_legalite", "hiddendate");
9022 $form->setType("date_retour_controle_legalite", "hiddendate");
9023 }
9024
9025 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
9026 $form->setLib("is_valid", __("Valide")." :");
9027 $form->setType("is_valid", "hidden");
9028 $form->setVal("is_valid", 'true');
9029
9030 $form->setFieldset('dossier_libelle','D',_('Synthese'));
9031 $form->setFieldset('is_valid','F');
9032
9033 }
9034
9035
9036 // Création du fieldset regroupant les champs permettant la mise à jour des date
9037 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
9038 $form->setFieldset('code_barres','F');
9039 // Affichage du formulaire
9040 $form->entete();
9041 $form->afficher($champs, 0, false, false);
9042 $form->enpied();
9043 // Affichage du bouton
9044 echo "\t<div class=\"formControls\">\n";
9045 //
9046 if(!$date_error) {
9047 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9048 }
9049 // Si pas sur l'écran de validation
9050 if(isset($infos)) {
9051 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
9052 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
9053 echo "\">Retour</a>";
9054 }
9055 echo "\t</div>\n";
9056 // Fermeture du formulaire
9057 echo "\t</form>\n";
9058 }
9059
9060 /**
9061 * [view_pdf_lettre_rar description]
9062 *
9063 * @return [type] [description]
9064 */
9065 function view_pdf_lettre_rar() {
9066 // Vérification de l'accessibilité sur l'élément
9067 $this->checkAccessibility();
9068 //
9069 $this->f->disableLog();
9070
9071 if($this->f->get_submitted_get_value('liste') != null) {
9072 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
9073
9074 // Classe permettant la mise en page de l'édition pdf
9075 require_once "../obj/pdf_lettre_rar.class.php";
9076 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9077 // Initialisation de la mise en page
9078 $pdf_lettre_rar->init($this->f);
9079
9080 foreach ($listeCodeBarres as $code_barres) {
9081
9082 // On récupère le dossier
9083 $qres = $this->f->get_one_result_from_db_query(
9084 sprintf(
9085 'SELECT
9086 dossier
9087 FROM
9088 %1$sinstruction
9089 WHERE
9090 code_barres = \'%2$s\'',
9091 DB_PREFIXE,
9092 $this->f->db->escapeSimple($code_barres)
9093 ),
9094 array(
9095 "origin" => __METHOD__,
9096 )
9097 );
9098
9099 $inst_dossier = $this->f->get_inst__om_dbform(array(
9100 "obj" => "dossier",
9101 "idx" => $qres['result'],
9102 ));
9103
9104 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9105 $groupe = $inst_dossier->get_type_affichage_formulaire();
9106 switch ($groupe) {
9107 case 'CTX IN':
9108 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
9109 break;
9110 case 'CTX RE':
9111 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
9112 break;
9113 case 'ADS':
9114 case 'DPC':
9115 case 'CONSULTATION ENTRANTE':
9116 default:
9117 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9118 break;
9119 }
9120
9121 // Test si l'evenement est de type arrete et si un délégataire a été nommé
9122 $qres = $this->f->get_all_results_from_db_query(
9123 sprintf(
9124 'SELECT
9125 dossier.dossier_libelle,
9126 evenement.type,
9127 count(lien_dossier_demandeur) as nbdemandeur,
9128 CASE
9129 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9130 THEN CONCAT(phase.code, \' - \', division.libelle)
9131 ELSE
9132 phase.code
9133 END AS code_phase
9134 FROM
9135 %1$sinstruction
9136 LEFT JOIN %1$sdossier
9137 ON instruction.dossier = dossier.dossier
9138 LEFT JOIN %1$sdivision
9139 ON dossier.division = division.division
9140 INNER JOIN %1$sevenement
9141 ON instruction.evenement=evenement.evenement
9142 LEFT JOIN %1$sphase
9143 ON evenement.phase = phase.phase
9144 inner JOIN %1$slien_dossier_demandeur
9145 ON instruction.dossier=lien_dossier_demandeur.dossier
9146 inner join %1$sdemandeur
9147 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9148 WHERE
9149 code_barres = \'%2$s\'
9150 AND %3$s
9151 GROUP BY
9152 dossier.dossier_libelle,
9153 evenement.type,
9154 phase.code,
9155 division.libelle',
9156 DB_PREFIXE,
9157 $this->f->db->escapeSimple($code_barres),
9158 $sql_demandeur
9159 ),
9160 array(
9161 "origin" => __METHOD__
9162 )
9163 );
9164 $testDemandeur = array_shift($qres['result']);
9165
9166
9167 // Recuperation de l'adresse de destination
9168 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9169 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9170 if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9171 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9172 }
9173
9174 $qres = $this->f->get_all_results_from_db_query(
9175 sprintf(
9176 'SELECT
9177 CASE WHEN demandeur.qualite = \'particulier\'
9178 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9179 ELSE TRIM(demandeur.personne_morale_denomination)
9180 END as ligne1,
9181 CASE WHEN demandeur.qualite = \'personne_morale\'
9182 THEN TRIM(demandeur.personne_morale_raison_sociale)
9183 ELSE \'\'
9184 END as ligne1_1,
9185 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9186 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9187 ELSE \'\'
9188 END as ligne1_2,
9189 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9190 CASE demandeur.complement
9191 WHEN null THEN \'\'
9192 ELSE trim(demandeur.complement)
9193 END as ligne3,
9194 CASE demandeur.lieu_dit
9195 WHEN null THEN \'\'
9196 ELSE trim(demandeur.lieu_dit)
9197 END as ligne4,
9198 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9199 (CASE WHEN demandeur.bp IS NOT NULL
9200 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9201 ELSE \'\'
9202 END),
9203 (CASE WHEN demandeur.cedex IS NOT NULL
9204 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9205 ELSE \'\'
9206 END))
9207 as ligne5,
9208 code_barres as code_barres
9209 FROM
9210 %1$sinstruction
9211 INNER JOIN %1$sdossier
9212 ON dossier.dossier = instruction.dossier
9213 INNER JOIN %1$slien_dossier_demandeur
9214 ON dossier.dossier = lien_dossier_demandeur.dossier
9215 INNER JOIN %1$sdemandeur
9216 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9217 LEFT OUTER JOIN %1$scivilite AS pc
9218 ON demandeur.particulier_civilite = pc.civilite
9219 OR demandeur.personne_morale_civilite = pc.civilite
9220 WHERE
9221 instruction.code_barres = \'%2$s\'
9222 %3$s',
9223 DB_PREFIXE,
9224 $this->f->db->escapeSimple($code_barres),
9225 $sqlAdresse
9226 ),
9227 array(
9228 "origin" => __METHOD__
9229 )
9230 );
9231 $adresse_dest = array_shift($qres['result']);
9232
9233 // Création adresse destinataire sans ligne vide
9234 $adresse_destinataire = array();
9235 if (!empty($adresse_dest['ligne1'])) {
9236 $adresse_destinataire[] = $adresse_dest['ligne1'];
9237 }
9238 if (!empty($adresse_dest['ligne1_1'])) {
9239 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9240 }
9241 if (!empty($adresse_dest['ligne1_2'])) {
9242 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9243 }
9244 $adresse_destinataire[] = $adresse_dest['ligne2'];
9245 if (!empty($adresse_dest['ligne3'])) {
9246 $adresse_destinataire[] = $adresse_dest['ligne3'];
9247 }
9248 if (!empty($adresse_dest['ligne4'])) {
9249 $adresse_destinataire[] = $adresse_dest['ligne4'];
9250 }
9251 $adresse_destinataire[] = $adresse_dest['ligne5'];
9252
9253 // Création du champ specifique
9254 $specifique_content = array();
9255 $specifique_content[] = $adresse_dest['ligne1'];
9256 $specifique_content[] = $adresse_dest['ligne1_1'];
9257 $specifique_content[] = $adresse_dest['ligne1_2'];
9258 $specifique_content[] = $testDemandeur['dossier_libelle'];
9259 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9260 unset($adresse_dest['code_barres']);
9261 // Ajout d'une page aux pdf
9262 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9263
9264 }
9265 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9266 $om_edition = $this->f->get_inst__om_edition();
9267 $om_edition->set_object_linked($this);
9268 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9269 }
9270 }
9271
9272 /**
9273 * VIEW - view_bordereau_envoi_maire.
9274 *
9275 * Formulaire demandant :
9276 * - le code-barres de l'événement d'instruction
9277 * - la date d'envoi du courrier pour signature par le maire
9278 *
9279 * Lors de la validation :
9280 * => met à jour cette date dans l'événement d'instruction
9281 * => crée un lien permettant de générer en PDF le bordereau
9282 *
9283 * @return void
9284 */
9285 function view_bordereau_envoi_maire() {
9286 // Vérification de l'accessibilité sur l'élément
9287 $this->checkAccessibility();
9288
9289 // Récupération des valeur passées en POST ou GET
9290 $code_barres = "";
9291 if($this->f->get_submitted_post_value('code_barres') !== null) {
9292 $code_barres = $this->f->get_submitted_post_value('code_barres');
9293 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9294 $code_barres = $this->f->get_submitted_get_value('code_barres');
9295 }
9296 $date = "";
9297 if($this->f->get_submitted_post_value('date') !== null) {
9298 $date = $this->f->get_submitted_post_value('date');
9299 } elseif($this->f->get_submitted_get_value('date') !== null) {
9300 $date = $this->f->get_submitted_get_value('date');
9301 }
9302 $validation = 0;
9303 if($this->f->get_submitted_post_value('validation') !== null) {
9304 $validation = $this->f->get_submitted_post_value('validation');
9305 } elseif($this->f->get_submitted_get_value('validation') !== null) {
9306 $validation = $this->f->get_submitted_get_value('validation');
9307 }
9308
9309 // Si le formulaire a été validé
9310 if ($this->f->get_submitted_post_value('validation') !== null) {
9311 // Tous les champs doivent obligatoirement être remplis
9312 if (!empty($date) && !empty($code_barres)) {
9313 $date_en = $this->dateDB($date);
9314 // Si date valide
9315 if ($date_en != "") {
9316 $id_instruction = $this->get_instruction_by_barcode($code_barres);
9317 // Si un événement d'instruction a été trouvé pour ce code-barres
9318 if ($id_instruction !== null) {
9319 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9320 // Si mise à jour réussie de la date d'envoi du courrier
9321 // pour signature par l'autorité compétente
9322 if($ret === true) {
9323 // Message de validation avec lien PDF
9324 $message_class = "valid";
9325 $message = '&bullet; '.__("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9326 $message .= " : <br/><br/>";
9327 $message .= "<a class='om-prev-icon pdf-16'";
9328 $message .= " id=\"generer_bordereau_envoi_maire\"";
9329 $message .= " title=\"".__("Bordereau")."\"";
9330 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9331 $message .= "&action=200";
9332 $message .= "&idx=".$id_instruction."'";
9333 $message .= " target='_blank'>";
9334 $message .= __("Bordereau d'envoi au maire");
9335 $message .= "</a><br/><br/>";
9336 $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9337 $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9338 $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9339
9340 } else {
9341 // Message d'erreur
9342 $message_class = "error";
9343 $message = sprintf(__("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9344 $code_barres);
9345 }
9346 }
9347 else {
9348 $message_class = "error";
9349 $message = __("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9350 }
9351 }
9352 else {
9353 $message_class = "error";
9354 $message = __("La date est invalide.");
9355 }
9356 } else {
9357 $message_class = "error";
9358 $message = __("Tous les champs doivent etre remplis.");
9359 }
9360 }
9361
9362 /**
9363 * Affichage des messages et du formulaire
9364 */
9365
9366 // Affichage du message de validation ou d'erreur
9367 if (isset($message) && isset($message_class) && $message != "") {
9368 $this->f->displayMessage($message_class, $message);
9369 }
9370
9371 // Ouverture du formulaire
9372 $datasubmit = $this->getDataSubmit();
9373 echo "\n<!-- ########## START DBFORM ########## -->\n";
9374 echo "<form";
9375 echo " id=\"bordereau_envoi_maire\"";
9376 echo " method=\"post\"";
9377 echo " name=\"f1\"";
9378 echo " action=\"";
9379 echo $datasubmit;
9380 echo "\"";
9381 echo ">\n";
9382
9383 // Paramétrage des champs du formulaire
9384 $champs = array("code_barres","date");
9385
9386 // Création d'un nouvel objet de type formulaire
9387 $form = $this->f->get_inst__om_formulaire(array(
9388 "validation" => 0,
9389 "maj" => 0,
9390 "champs" => $champs,
9391 ));
9392
9393 $template_required_label = '%s *';
9394 // Parametrage du champ code_barres
9395 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9396 $form->setType("code_barres", "text");
9397 $form->setVal("code_barres", $code_barres);
9398 $form->setTaille("code_barres", 20);
9399 $form->setMax("code_barres", 20);
9400 // Parametrage du champ date
9401 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9402 $form->setType("date", "date") ;
9403 if (empty($date)) {
9404 $date = date('d/m/Y');
9405 }
9406 $form->setVal("date", $date);
9407 $form->setTaille("date", 10);
9408 $form->setMax("date", 10);
9409
9410 // Création du bloc regroupant les champs
9411 $form->setBloc('code_barres','D');
9412 $form->setBloc('date','F');
9413 // Affichage du formulaire
9414 $form->entete();
9415 $form->afficher($champs, 0, false, false);
9416 $form->enpied();
9417 // Affichage du bouton
9418 printf("\t<div class=\"formControls\">\n");
9419 //
9420 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9421 printf("\t</div>\n");
9422 // Fermeture du formulaire
9423 printf("\t</form>\n");
9424 }
9425
9426 /**
9427 * VIEW - view_bordereau_envoi_maire.
9428 *
9429 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9430 *
9431 * @return [void]
9432 */
9433 function view_generate_bordereau_envoi_maire() {
9434 // Vérification de l'accessibilité sur l'élément
9435 $this->checkAccessibility();
9436 // Récupération de la collectivité du dossier d'instruction
9437 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9438 // Récupération de ses paramètres
9439 $collectivite = $this->f->getCollectivite($collectivite_di);
9440 // Génération du PDF
9441 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9442 // Affichage du PDF
9443 $this->expose_pdf_output(
9444 $result['pdf_output'],
9445 $result['filename']
9446 );
9447 }
9448
9449 /**
9450 * VIEW - view_rapport_instruction.
9451 *
9452 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9453 * Cette action est bindée pour utiliser la fonction popUpIt.
9454 *
9455 * @return void
9456 */
9457 function view_overlay_notification_manuelle() {
9458
9459 // Vérification de l'accessibilité sur l'élément
9460 $this->checkAccessibility();
9461
9462 printf(
9463 '<script type="text/javascript" >
9464 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9465 </script>',
9466 'instruction_notification_manuelle',
9467 OM_ROUTE_SOUSFORM,
9468 $this->getVal($this->clePrimaire),
9469 $this->getVal('dossier')
9470 );
9471 }
9472
9473 /**
9474 * VIEW - view_overlay_notification_service_consulte.
9475 *
9476 * Ouvre le sous-formulaire de notification des services consulte
9477 * en ajaxIt dans un overlay.
9478 * Cette action est bindée pour utiliser la fonction popUpIt.
9479 *
9480 * @return void
9481 */
9482 function view_overlay_notification_service_consulte() {
9483
9484 // Vérification de l'accessibilité sur l'élément
9485 $this->checkAccessibility();
9486
9487 printf(
9488 '<script type="text/javascript" >
9489 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9490 </script>',
9491 'instruction_notification_manuelle',
9492 OM_ROUTE_SOUSFORM,
9493 $this->getVal($this->clePrimaire),
9494 $this->getVal('dossier')
9495 );
9496 }
9497
9498 /**
9499 * VIEW - overlay_notification_tiers_consulte.
9500 *
9501 * Ouvre le sous-formulaire de notification des tiers consulte
9502 * en ajaxIt dans un overlay.
9503 * Cette action est bindée pour utiliser la fonction popUpIt.
9504 *
9505 * @return void
9506 */
9507 function view_overlay_notification_tiers_consulte() {
9508
9509 // Vérification de l'accessibilité sur l'élément
9510 $this->checkAccessibility();
9511
9512 printf(
9513 '<script type="text/javascript" >
9514 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9515 </script>',
9516 'instruction_notification_manuelle',
9517 OM_ROUTE_SOUSFORM,
9518 $this->getVal($this->clePrimaire),
9519 $this->getVal('dossier')
9520 );
9521 }
9522
9523 /**
9524 * VIEW - view_modale_selection_document_signe
9525 *
9526 * Ouvre le sous-formulaire de notification des services consulte
9527 * en ajaxIt dans un overlay.
9528 * Cette action est bindée pour utiliser la fonction popUpIt.
9529 *
9530 * @return void
9531 */
9532 function view_modale_selection_document_signe() {
9533
9534 // Vérification de l'accessibilité sur l'élément
9535 $this->checkAccessibility();
9536
9537 printf(
9538 '<script type="text/javascript" >
9539 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9540 </script>',
9541 'instruction_modale',
9542 OM_ROUTE_SOUSFORM,
9543 $this->getVal($this->clePrimaire),
9544 $this->getVal('dossier')
9545 );
9546 }
9547
9548 /**
9549 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9550 * pour exclure les dossiers du groupe contentieux.
9551 *
9552 * @param [string] $barcode numéro du code-barres
9553 * @return [mixed] ID de son instruction ou null si aucun code
9554 */
9555 function get_instruction_by_barcode($barcode) {
9556 // Begin
9557 $this->begin_treatment(__METHOD__);
9558
9559 // Vérification de l'existence de l'événement d'instruction
9560 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9561 $qres = $this->f->get_one_result_from_db_query(
9562 sprintf(
9563 'SELECT
9564 instruction
9565 FROM
9566 %1$sinstruction
9567 INNER JOIN %1$sdossier
9568 ON dossier.dossier=instruction.dossier
9569 INNER JOIN %1$sdossier_instruction_type
9570 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9571 INNER JOIN %1$sdossier_autorisation_type_detaille
9572 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9573 INNER JOIN %1$sdossier_autorisation_type
9574 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9575 INNER JOIN %1$sgroupe
9576 ON dossier_autorisation_type.groupe = groupe.groupe
9577 AND groupe.code != \'CTX\'
9578 WHERE
9579 code_barres = \'%2$s\'',
9580 DB_PREFIXE,
9581 $this->f->db->escapeSimple($barcode)
9582 ),
9583 array(
9584 "origin" => __METHOD__,
9585 )
9586 );
9587
9588 // Retourne résultat
9589 return $this->end_treatment(__METHOD__, $qres['result']);
9590 }
9591
9592 /**
9593 * Met à jour le champ date d'envoi signature
9594 * avec la date fournie et pour l'instruction donnée
9595 *
9596 * @param [string] $id ID de l'événement d'instruction
9597 * @param [string] $date date au format EN
9598 * @return [boolean] true si mise à jour avec succès
9599 */
9600 function update_date_envoi_signature($id, $date) {
9601 // Préparation du tableau
9602 $valF = array();
9603 $valF['date_envoi_signature'] = $date;
9604 // Begin
9605 $this->begin_treatment(__METHOD__);
9606 // Requête
9607 $res = $this->f->db->autoexecute(
9608 DB_PREFIXE.$this->table,
9609 $valF,
9610 DB_AUTOQUERY_UPDATE,
9611 $this->getCle($id)
9612 );
9613 $this->addToLog(
9614 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9615 VERBOSE_MODE
9616 );
9617 if ($this->f->isDatabaseError($res, true) !== false) {
9618 $this->end_treatment(__METHOD__, false);
9619 }
9620 //
9621 return $this->end_treatment(__METHOD__, true);
9622 }
9623
9624 /**
9625 * Méthode permettant de définir des valeurs à envoyer en base après
9626 * validation du formulaire d'ajout.
9627 * @param array $val tableau des valeurs retournées par le formulaire
9628 */
9629 function setValFAjout($val = array()) {
9630 // Mise à jour du flag created_by_commune lors d'un changement de décision
9631 // par un utilisateur de commune sur un dossier instruit par la comcom
9632 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9633 $this->valF['created_by_commune'] = true;
9634 }
9635
9636 //
9637 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9638 if (isset($this->valF['flag_edition_integrale']) === true) {
9639 unset($this->valF['flag_edition_integrale']);
9640 }
9641 if (isset($this->valF['signataire_arrete']) === true) {
9642 unset($this->valF['signataire_arrete']);
9643 }
9644 }
9645 }
9646
9647
9648 /**
9649 * Récupère l'instance d'un événement de workflow.
9650 *
9651 * @param mixed $evenement Identifiant de l'événement.
9652 *
9653 * @return object
9654 */
9655 function get_inst_evenement($evenement = null) {
9656 //
9657 return $this->get_inst_common("evenement", $evenement);
9658 }
9659
9660 /**
9661 * Logue l'action de l'instruction dans son DI.
9662 *
9663 * @param string $id Clé primaire de l'instruction.
9664 * @param array $val Valeurs de l'instruction.
9665 *
9666 * @return bool Vrai si traitement effectué avec succès
9667 */
9668 private function add_log_to_dossier($id, array $val) {
9669 $maj = $this->getParameter("maj");
9670 // Action = Trace par défaut
9671 $action = $this->get_backtrace();
9672 // Action = Identifant de l'action si contexte connu
9673 if (empty($maj) === false
9674 || (empty($maj) === true && $maj === 0)) {
9675 $action = $this->get_action_param($maj, 'identifier');
9676 if ($action === 'modifier_suivi') {
9677 $action = "modifier (via l'action suivi des dates)";
9678 }
9679 if ($action === 'notifier_commune'
9680 && isset($val['mails_destinataires']) === true) {
9681 $action = "notification de la commune (courriels : ";
9682 $action .= $val['mails_destinataires'].")";
9683 }
9684 }
9685 // Création du log
9686 $log = array(
9687 'date' => date('Y-m-d H:i:s'),
9688 'user' => $_SESSION['login'],
9689 'action' => $action,
9690 'values' => array(
9691 'date_evenement' => $this->dateDB($val['date_evenement']),
9692 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9693 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9694 'evenement' => $val['evenement'],
9695 'action' => $val['action'],
9696 'instruction' => $id,
9697 'etat' => $val['etat'],
9698 ),
9699 );
9700 // Ajout du log
9701 $di = $this->get_inst_dossier($val['dossier']);
9702 $ret = $di->add_log_instructions($log);
9703 if ($ret === false) {
9704 $this->correct = false;
9705 $this->msg = '';
9706 $this->addToMessage($di->msg);
9707 }
9708 return $ret;
9709 }
9710
9711
9712 /**
9713 * Retourne le contexte de déboguage formaté en HTML.
9714 *
9715 * @return string Une ligne par trace
9716 */
9717 private function get_backtrace() {
9718 $trace = debug_backtrace();
9719 $backtrace = '';
9720 $i = 1;
9721 foreach ($trace as $key => $value) {
9722 $func = $trace[$key]['function'];
9723 // On ne s'autolog pas
9724 if ($func === 'get_backtrace'
9725 || $func === 'add_log_to_dossier') {
9726 continue;
9727 }
9728 $backtrace .= $i.') ';
9729 // Si dans une classe
9730 if (isset($trace[$key]['class']) === true
9731 && empty($trace[$key]['class']) === false) {
9732 $backtrace .= $trace[$key]['class'].'->'.$func;
9733 }
9734 // Si procédural
9735 else {
9736 $file = $trace[$key]['file'];
9737 $line = $trace[$key]['line'];
9738 $truncated_file = $this->f->get_relative_path($file);
9739 if ($truncated_file !== false) {
9740 $file = $truncated_file;
9741 }
9742 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9743 }
9744 $backtrace .= '<br/>';
9745 $i++;
9746 }
9747 return $backtrace;
9748 }
9749
9750 /**
9751 * CONDITION - is_notifiable.
9752 *
9753 * Condition pour afficher l'action notifier_commune.
9754 *
9755 * @return boolean
9756 */
9757 public function is_notifiable() {
9758 // L'instruction doit être finalisée, ce qui revient à dire
9759 // définalisable sans bypass
9760 if ($this->is_unfinalizable_without_bypass() === false) {
9761 return false;
9762 }
9763 // La collectivité de l'utilisateur doit être de niveau multi
9764 if ($this->f->has_collectivite_multi() === false) {
9765 return false;
9766 }
9767 // Le paramètre multi de l'objet du courriel doit exister
9768 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9769 return false;
9770 }
9771 // Le paramètre multi du modèle du courriel doit exister
9772 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9773 return false;
9774 }
9775 // A ce stade toutes les conditions sont satisfaites
9776 return true;
9777 }
9778
9779 /**
9780 * TREATMENT - notifier_commune.
9781 *
9782 * Notifie aux communes et par courriel la finalisation d'une instruction.
9783 *
9784 * @return boolean
9785 */
9786 public function notifier_commune() {
9787 // Cette méthode permet d'exécuter une routine en début des méthodes
9788 // dites de TREATMENT.
9789 $this->begin_treatment(__METHOD__);
9790 $message = __('Erreur de paramétrage :');
9791 $erreurParametrage = false;
9792 // Récupération du paramétrage de la collectivité du dossier
9793 $id_di = $this->getVal('dossier');
9794 $di = $this->get_inst_dossier($id_di);
9795 $collectivite_di = $di->getVal('om_collectivite');
9796 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9797 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9798 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9799 $erreurParametrage = true;
9800 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9801 }
9802
9803 // Récupération de la liste des mails
9804 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9805 if (empty($adresses)) {
9806 $erreurParametrage = true;
9807 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9808 }
9809
9810 // Vérification du paramétrage des mails
9811 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9812 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9813 $erreurParametrage = true;
9814 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9815 }
9816 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9817 $erreurParametrage = true;
9818 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9819 }
9820
9821 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9822 // un message a destination de l'utilisateur est affiché
9823 if ($erreurParametrage) {
9824 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9825 $this->addToMessage($message);
9826 return $this->end_treatment(__METHOD__, false);
9827 }
9828
9829 // Création d'un notification et de sa tâche associé pour chaque mail
9830 foreach ($adresses as $adresse) {
9831 // Ajout de la notif et récupération de son id
9832 $destinataire = array(
9833 'destinataire' => $adresse,
9834 'courriel' => $adresse
9835 );
9836 $idNotif = $this->ajouter_notification(
9837 $this->getVal($this->clePrimaire),
9838 $this->f->get_connected_user_login_name(),
9839 $destinataire,
9840 $collectivite_di
9841 );
9842 if ($idNotif === false) {
9843 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9844 return $this->end_treatment(__METHOD__, false);
9845 }
9846 // Création de la tache en lui donnant l'id de la notification
9847 $notification_by_task = $this->notification_by_task(
9848 $idNotif,
9849 $this->getVal('dossier'),
9850 'mail',
9851 'notification_commune'
9852 );
9853 if ($notification_by_task === false) {
9854 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9855 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9856 return $this->end_treatment(__METHOD__, false);
9857 }
9858 }
9859 $this->addToMessage(__('La commune a été notifiée.'));
9860 return $this->end_treatment(__METHOD__, true);
9861 }
9862
9863 /**
9864 * Récupère l'instance de l'instructeur
9865 *
9866 * @param integer $instructeur Identifiant de l'instructeur.
9867 *
9868 * @return object
9869 */
9870 protected function get_inst_instructeur($instructeur) {
9871 //
9872 return $this->get_inst_common("instructeur", $instructeur);
9873 }
9874
9875
9876 /**
9877 * Récupère l'instance de l'utilisateur
9878 *
9879 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9880 *
9881 * @return object
9882 */
9883 protected function get_inst_om_utilisateur($om_utilisateur) {
9884 //
9885 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9886 }
9887
9888
9889 /**
9890 * Récupère l'instance de la division.
9891 *
9892 * @param integer $division Identifiant de la division.
9893 *
9894 * @return object
9895 */
9896 protected function get_inst_division($division) {
9897 //
9898 return $this->get_inst_common("division", $division);
9899 }
9900
9901
9902 /**
9903 * Récupère l'instance de la direction.
9904 *
9905 * @param integer $direction Identifiant de la direction.
9906 *
9907 * @return object
9908 */
9909 protected function get_inst_direction($direction) {
9910 //
9911 return $this->get_inst_common("direction", $direction);
9912 }
9913
9914
9915 /**
9916 * Récupère la collectivité d'un instructeur en passant par sa division puis
9917 * par sa direction.
9918 *
9919 * @param integer $instructeur Identifiant de l'instructeur.
9920 *
9921 * @return integer
9922 */
9923 protected function get_instructeur_om_collectivite($instructeur) {
9924 // Chemin vers la collectivité d'un instructeur
9925 $inst_instr = $this->get_inst_instructeur($instructeur);
9926 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9927 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9928
9929 // Collectivité
9930 $om_collectivite = $inst_direction->getVal('om_collectivite');
9931
9932 //
9933 return $om_collectivite;
9934 }
9935
9936 /*
9937 * CONDITION - can_user_access_dossier_contexte_ajout
9938 *
9939 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9940 * formulaire d'ajout.
9941 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9942 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9943 *
9944 */
9945 function can_user_access_dossier_contexte_ajout() {
9946
9947 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9948 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9949 //
9950 if ($id_dossier !== "") {
9951 $dossier = $this->f->get_inst__om_dbform(array(
9952 "obj" => "dossier_instruction",
9953 "idx" => $id_dossier,
9954 ));
9955 //
9956 return $dossier->can_user_access_dossier();
9957 }
9958 return false;
9959 }
9960
9961 /*
9962 * CONDITION - can_user_access_dossier
9963 *
9964 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9965 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9966 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9967 *
9968 */
9969 function can_user_access_dossier_contexte_modification() {
9970
9971 $id_dossier = $this->getVal('dossier');
9972 //
9973 if ($id_dossier !== "" && $id_dossier !== null) {
9974 $dossier = $this->f->get_inst__om_dbform(array(
9975 "obj" => "dossier_instruction",
9976 "idx" => $id_dossier,
9977 ));
9978 //
9979 return $dossier->can_user_access_dossier();
9980 }
9981 return false;
9982 }
9983
9984 /**
9985 * TREATMENT - envoyer_a_signature_sans_relecture
9986 *
9987 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9988 *
9989 * @return boolean true si l'envoi a été effectué avec succès false sinon
9990 */
9991 function envoyer_a_signature_sans_relecture() {
9992 return $this->envoyer_a_signature();
9993 }
9994
9995 /**
9996 * TREATMENT - envoyer_a_signature_avec_relecture
9997 *
9998 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9999 *
10000 * @return boolean true si l'envoi a été effectué avec succès false sinon
10001 */
10002 function envoyer_a_signature_avec_relecture() {
10003 $is_forced_view_files = true;
10004 return $this->envoyer_a_signature($is_forced_view_files);
10005 }
10006
10007 /**
10008 * TREATMENT - envoyer_a_signature
10009 *
10010 * Permet d'envoyer le document de l'instruction au parapheur pour signature
10011 *
10012 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
10013 *
10014 * @return boolean true si l'envoi a été effectué avec succès false sinon
10015 */
10016 function envoyer_a_signature($is_forced_view_files = false) {
10017 $this->begin_treatment(__METHOD__);
10018 $this->correct = true;
10019
10020 // Instanciation de l'objet signataire_arrete
10021 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
10022 'obj' => 'signataire_arrete',
10023 'idx' => $this->getVal('signataire_arrete'),
10024 ));
10025
10026 // Instanciation de l'objet dossier
10027 $inst_dossier = $this->f->get_inst__om_dbform(array(
10028 'obj' => 'dossier',
10029 'idx' => $this->getVal('dossier'),
10030 ));
10031
10032 //Instanciation de la classe electronicsignature
10033 $inst_es = $this->get_electronicsignature_instance();
10034 if ($inst_es === false) {
10035 $this->correct = false;
10036 return $this->end_treatment(__METHOD__, false);
10037 }
10038
10039 // Vérifie si la notification se fait via l'application ou via le parapheur
10040 try {
10041 $notification_required = $inst_es->signer_notification_is_delegated();
10042 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10043 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10044 $notification_required = false;
10045 }
10046
10047 // Si la notification est faite par l'application vérifie que l'adresse mail du
10048 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10049 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10050 // notification
10051 if ($notification_required === true) {
10052 $signer_mail = $inst_signataire_arrete->getVal('email');
10053 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10054
10055 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10056
10057 if (empty($signer_mail)) {
10058 $this->correct = false;
10059 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10060 $this->addToMessage($err_msg.$err_detail);
10061 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10062 return $this->end_treatment(__METHOD__, false);
10063 }
10064 if (! $this->f->checkValidEmailAddress($signer_mail)) {
10065 $this->correct = false;
10066 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10067 $this->addToMessage($err_msg.$err_detail);
10068 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10069 return $this->end_treatment(__METHOD__, false);
10070 }
10071 }
10072
10073 // Récupération du document à signer
10074 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10075 if ($file === OP_FAILURE) {
10076 $this->correct = false;
10077 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10078 // Termine le traitement
10079 return $this->end_treatment(__METHOD__, false);
10080 }
10081
10082 // Initialisation des paramètre à passer pour l'envoi en signature
10083 $this->f->getUserInfos();
10084 $data = array(
10085 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10086 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10087 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10088 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10089 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10090 // Permet d'envoyer en signature l'instruction le jour de la date limite
10091 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10092 "dossier" => $this->getVal('dossier'),
10093 "is_forced_view_files" => $is_forced_view_files,
10094 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10095 'instruction' => $this->getVal($this->clePrimaire),
10096 'last_statut_signature' => $this->getVal('statut_signature'),
10097 'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10098 );
10099
10100 // Initialisation des métadonnées
10101 $metadonnee_dossier = $file['metadata'];
10102 // Récupération du libellé du document transmis au parapheur
10103 $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10104 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10105
10106 $metadonnee_dossier['url_di'] = sprintf(
10107 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
10108 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10109 $this->getVal('dossier')
10110 );
10111
10112 $optional_data = null;
10113 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10114 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10115 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10116 if (json_last_error() !== JSON_ERROR_NONE) {
10117 $this->correct = false;
10118 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10119 $this->addToLog(__METHOD__."(): ".
10120 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10121 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10122 );
10123 // Termine le traitement
10124 return $this->end_treatment(__METHOD__, false);
10125 }
10126 }
10127
10128 // Appel de la méthode de l'abstracteur send_for_signature()
10129 // Cette méthode doit retourner un tableau de valeur
10130 try {
10131 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10132 } catch (electronicsignature_exception $e) {
10133 $this->handle_electronicsignature_exception($e);
10134 return $this->end_treatment(__METHOD__, false);
10135 }
10136
10137 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10138 $valF = array();
10139
10140 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10141 foreach($this->champs as $identifiant => $champ) {
10142 $valF[$champ] = $this->val[$identifiant];
10143 }
10144 // On fait ensuite nos modifications spécifiques
10145 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10146 $valF['statut_signature'] = $result['statut'];
10147 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10148 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10149 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10150 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10151 $this->setParameter("maj", 1);
10152 $ret = $this->modifier($valF);
10153
10154 if ($ret === false) {
10155 $this->correct = false;
10156 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10157 // Termine le traitement
10158 return $this->end_treatment(__METHOD__, false);
10159 }
10160
10161 // Notification du signataire
10162 if ($notification_required === true) {
10163 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10164 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10165 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10166 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10167 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10168 // precedemment
10169 $this->init_record_data($this->getVal($this->clePrimaire));
10170 $this->annuler_envoi_en_signature();
10171 $this->correct = false;
10172 return $this->end_treatment(__METHOD__, true);
10173 }
10174 }
10175
10176 // Message
10177 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10178 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10179 && array_key_exists('signature_page_url', $result) === true) {
10180 $this->addToMessage(sprintf(
10181 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10182 $result['signature_page_url'],
10183 __("Signez directement le document")
10184 ));
10185 }
10186 if ($notification_required !== true) {
10187 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10188 }
10189
10190 // Tout s'est bien passé, on termine le traitement
10191 return $this->end_treatment(__METHOD__, true);
10192 }
10193
10194 /**
10195 * Notifie le signataire d'un document à signer.
10196 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10197 * En cas d'erreur ajoute une ligne dans les logs de l'application.
10198 *
10199 * @param string $signer_name Nom du signataire
10200 * @param string $signer_mail Mail du signataire
10201 * @param string $user_name Nom de l'utilisateur openADS courant
10202 *
10203 * @return boolean true si succés, false si erreur
10204 */
10205 protected function notify_signer($signer_name, $signer_mail, $user_name) {
10206 // message d'erreur
10207 $err_msg_log = sprintf(
10208 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10209 $signer_name,
10210 $signer_mail,
10211 $this->getVal($this->clePrimaire)
10212 );
10213 $err_msg = sprintf(
10214 '%s %s (%s)"',
10215 __("Échec de la notification du signataire"),
10216 $signer_name,
10217 $signer_mail
10218 );
10219
10220 // vérification des informations requises
10221 if (empty($signer_name)) {
10222 $err_detail = __("le nom du signataire est vide");
10223 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10224 $this->addToMessage($err_msg.', '.$err_detail);
10225 return false;
10226 }
10227 if (empty($signer_mail)) {
10228 $err_detail = __("le courriel du signataire est vide");
10229 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10230 $this->addToMessage($err_msg.', '.$err_detail);
10231 return false;
10232 }
10233 if (empty($this->getVal('dossier'))) {
10234 $err_detail = __("l'identifiant du dossier est vide");
10235 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10236 $this->addToMessage($err_msg.', '.$err_detail);
10237 return false;
10238 }
10239
10240 // ajout de la notification à la liste des notifications de l'instruction
10241 $instruction_id = $this->getVal($this->clePrimaire);
10242 $inst_notif = $this->f->get_inst__om_dbform(array(
10243 "obj" => "instruction_notification",
10244 "idx" => "]",
10245 ));
10246 $notif_val = array(
10247 'instruction_notification' => null,
10248 'instruction' => $instruction_id,
10249 'automatique' => true,
10250 'emetteur' => $user_name,
10251 'date_envoi' => null,
10252 'destinataire' => "$signer_name <$signer_mail>",
10253 'courriel' => $signer_mail,
10254 'date_premier_acces' => null,
10255 'statut' => '',
10256 'commentaire' => ''
10257 );
10258 $add_notif = $inst_notif->ajouter($notif_val);
10259 if ($add_notif === false) {
10260 $err_detail = __("Échec de l'ajout de la notification.");
10261 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10262 $this->addToMessage($err_msg);
10263 return false;
10264 }
10265 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10266
10267 // ajout d'une tâche de notification (envoi du mail)
10268 $notification_task = $this->notification_by_task(
10269 $notification_id,
10270 $this->getVal('dossier'),
10271 'mail',
10272 'notification_signataire'
10273 );
10274 if ($notification_task === false) {
10275 $err_detail = sprintf(
10276 __("Échec de l'ajout de la tâche de notification (notification %s)."),
10277 $notification_id);
10278 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10279 $this->addToMessage($err_msg);
10280 return false;
10281 }
10282
10283 // Vérification de la réussite de l'envoi du mail
10284 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10285 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10286 // qui viens d'être créée.
10287 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10288 $qres = $this->f->get_one_result_from_db_query(
10289 sprintf(
10290 'SELECT
10291 state
10292 FROM
10293 %1$stask
10294 WHERE
10295 type = \'notification_signataire\'
10296 AND category = \'mail\'
10297 AND dossier = \'%2$s\'
10298 ORDER BY
10299 task DESC
10300 LIMIT 1',
10301 DB_PREFIXE,
10302 $this->f->db->escapeSimple($this->getVal('dossier'))
10303 ),
10304 array(
10305 'origin' => __METHOD__
10306 )
10307 );
10308 if ($qres['result'] === 'error') {
10309 $err_detail = sprintf(
10310 __("Échec de l'envoi du mail de notification (notification %s)."),
10311 $notification_id);
10312 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10313 $this->addToMessage($err_msg);
10314 return false;
10315 }
10316 // TODO gérer les autres cas (gestion d'erreur)
10317
10318 // succès de la planification de la notification
10319 $this->addToMessage(sprintf(
10320 __('Le signataire "%s (%s)" sera notifié prochainement'),
10321 $signer_name,
10322 $signer_mail));
10323 return true;
10324 }
10325
10326 /**
10327 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10328 * est en incomplet notifié ou non.
10329 * On peut ajouter des jours à cette date grâce au paramètre "delay".
10330 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10331 * l'instruction en signature le jour de la date limite.
10332 *
10333 * @param int $delay Le nombre de jour à ajouter à la date limite.
10334 *
10335 * @return string $date_limite la date limite calculé ou false
10336 */
10337 private function compute_date_limite($delay) {
10338 // Instanciation de l'objet dossier
10339 $inst_dossier = $this->f->get_inst__om_dbform(array(
10340 'obj' => 'dossier',
10341 'idx' => $this->getVal('dossier'),
10342 ));
10343
10344 $date_to_compute = null;
10345 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10346 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10347 } else {
10348 $date_to_compute = $inst_dossier->getVal('date_limite');
10349 }
10350 if ($date_to_compute != null) {
10351 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10352 }
10353
10354 return null;
10355 }
10356
10357 /**
10358 * Permet de récupérer la traduction de la valeur de statut_signature
10359 *
10360 * @return string la valeur de statut_signature traduite | false
10361 */
10362 function get_trad_for_statut($value_to_trad){
10363 $statut_signature_tab = array(
10364 'waiting' => __('en préparation'),
10365 'in_progress' => __('en cours de signature'),
10366 'canceled' => __('signature annulée'),
10367 'expired' => __('délai de signature expiré'),
10368 'finished' => __('signé')
10369 );
10370 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10371 return $statut_signature_tab[$value_to_trad];
10372 }
10373
10374 return false;
10375 }
10376
10377 /**
10378 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10379 *
10380 * @return string (json) la valeur de historique_signature mis à jour | false
10381 */
10382 function get_updated_historique_signature($historique_signature_values) {
10383
10384 $historique_signature_value_tab = $this->get_historique_signature_decoded();
10385
10386 if ($historique_signature_value_tab === false) {
10387 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10388 return false;
10389 }
10390
10391 $last_val_historique_signature = array();
10392
10393 // Si la tableau récupéré n'est pas vide alors
10394 // on récupère la dernière ligne du tableau
10395 if (empty($historique_signature_value_tab) === false) {
10396 $last_val_historique_signature = end($historique_signature_value_tab);
10397 }
10398
10399 $format_date = '';
10400 $format_date_hour = '';
10401 $date_converted=array();
10402
10403 $date_to_convert = array(
10404 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10405 'date_limite_instruction' => $this->compute_date_limite(0),
10406 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10407 );
10408
10409 // Conversion des dates en fonction de leur format
10410 foreach ($date_to_convert as $key => $value) {
10411 $date_converted[$key] = null;
10412 if ($value != null) {
10413 $format_date = 'd/m/Y';
10414 $format_date_hour = 'd/m/Y H:i:s';
10415 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10416 }
10417 }
10418
10419 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10420 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10421 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10422 $tab_for_columns_trad = array(
10423 __('entry_date'),
10424 __('id_parapheur_signature'),
10425 __('emetteur'),
10426 __('signataire'),
10427 __('date_envoi'),
10428 __('date_limite'),
10429 __('date_retour'),
10430 __('statut_signature'),
10431 __('commentaire_signature')
10432 );
10433
10434 array_push($historique_signature_value_tab, array(
10435 'entry_date' => date('d/m/Y H:i:s'),
10436 'id_parapheur_signature' => $historique_signature_values['id_parapheur_signature'] == null ? (isset($last_val_historique_signature['id_parapheur_signature']) === true ? $last_val_historique_signature['id_parapheur_signature'] : null) : $historique_signature_values['id_parapheur_signature'],
10437 'emetteur' => $historique_signature_values['om_utilisateur_email'] == null ? (isset($last_val_historique_signature['emetteur']) === true ? $last_val_historique_signature['emetteur'] : null) : $historique_signature_values['om_utilisateur_email'],
10438 'signataire' => $historique_signature_values['signataire_arrete_email'] == null ? (isset($last_val_historique_signature['signataire']) === true ? $last_val_historique_signature['signataire'] : null) : $historique_signature_values['signataire_arrete_email'],
10439 'date_envoi' => $historique_signature_values['date_envoi_signature'] == null ? (isset($last_val_historique_signature['date_envoi']) === true ? $last_val_historique_signature['date_envoi'] : null) : $date_converted['date_envoi_signature'],
10440 'date_limite' => $historique_signature_values['date_limite_instruction'] == null ? (isset($last_val_historique_signature['date_limite']) === true ? $last_val_historique_signature['date_limite'] : null) : $date_converted['date_limite_instruction'],
10441 'date_retour' => $historique_signature_values['date_retour_signature'] == null ? (isset($last_val_historique_signature['date_retour']) === true ? $last_val_historique_signature['date_retour'] : null) : $date_converted['date_retour_signature'],
10442 'statut_signature' => $historique_signature_values['statut'] == null ? (isset($last_val_historique_signature['statut_signature']) === true ? $last_val_historique_signature['statut_signature'] : null) : $this->get_trad_for_statut($historique_signature_values['statut']),
10443 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10444 ));
10445
10446 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10447 }
10448
10449 /**
10450 * TREATMENT - annuler_envoi_en_signature
10451 *
10452 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10453 *
10454 * @return boolean true si l'annulation a été effectué avec succès false sinon
10455 */
10456 function annuler_envoi_en_signature() {
10457 $this->begin_treatment(__METHOD__);
10458 $this->correct = true;
10459
10460 //Instanciation de la classe electronicsignature
10461 $inst_es = $this->get_electronicsignature_instance();
10462 if ($inst_es === false) {
10463 $this->correct = false;
10464 return $this->end_treatment(__METHOD__, false);
10465 }
10466
10467 $data = array();
10468 if (! empty($this->getVal('id_parapheur_signature'))) {
10469 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10470 } else {
10471 $this->correct = false;
10472 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10473 return $this->end_treatment(__METHOD__, false);
10474 }
10475
10476 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10477 // Cette méthode doit retourner un tableau de valeur
10478 try {
10479 $result = $inst_es->cancel_send_for_signature($data);
10480 } catch (electronicsignature_exception $e) {
10481 $this->handle_electronicsignature_exception($e);
10482 return $this->end_treatment(__METHOD__, false);
10483 }
10484
10485 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10486 $valF = array();
10487
10488 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10489 foreach($this->champs as $identifiant => $champ) {
10490 $valF[$champ] = $this->val[$identifiant];
10491 }
10492 // On fait ensuite nos modifications spécifiques
10493 $valF['id_parapheur_signature'] = null;
10494 $valF['statut_signature'] = $result['statut'];
10495 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10496 $valF['date_envoi_signature'] = null;
10497 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10498
10499 $this->setParameter("maj", 1);
10500 $ret = $this->modifier($valF);
10501
10502 if ($ret === false) {
10503 $this->correct = false;
10504 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10505 // Termine le traitement
10506 return $this->end_treatment(__METHOD__, false);
10507 }
10508
10509 // Message
10510 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10511
10512 // Tout s'est bien passé, on termine le traitement
10513 return $this->end_treatment(__METHOD__, true);
10514 }
10515
10516
10517 /**
10518 * Récupère le contenu du champ historique_signature et le converti en tableau
10519 *
10520 * @return array sinon false en cas d'erreur
10521 */
10522 protected function get_historique_signature_decoded() {
10523 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10524 if ($val === '' || $val == 'false') {
10525 $val = json_encode(array());
10526 }
10527 if($this->isJson($val) === false) {
10528 return false;
10529 }
10530 return json_decode($val, true);
10531 }
10532
10533 /**
10534 * Récupère les informations à afficher dans le tableau de suivi à l'aide
10535 * d'une requête sql. Stocke ces informations dans un tableau.
10536 * Converti le tableau au format json et renvoi le json obtenu.
10537 *
10538 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10539 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10540 * La clause where de la requête est construite à partir du tableau contenant les types
10541 * de tâches fourni en paramètre.
10542 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10543 *
10544 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10545 * la date de premier accès ne sera pas affichée.
10546 *
10547 * @param array liste des tâches permettant d'identifier quelles notification afficher
10548 * @param boolean permet d'afficher les notifications non liées à des tâches
10549 * @return json
10550 */
10551 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10552 $whereTypeTache = '';
10553 $sqlTaskNull = 'INNER';
10554
10555 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10556 $listeChampsTrad = array(
10557 __('emetteur'),
10558 __('date_envoi'),
10559 __('destinataire'),
10560 __('date_premier_acces'),
10561 __('instruction'),
10562 __('annexes'),
10563 __('statut'),
10564 __('commentaire')
10565 );
10566 $listeChamps = array(
10567 'emetteur',
10568 'date_envoi',
10569 'destinataire',
10570 'date_premier_acces',
10571 'instruction',
10572 'annexes',
10573 'statut',
10574 'commentaire'
10575 );
10576
10577 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10578 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10579 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10580 // paramétrage
10581 if(is_bool($nonLieTache) && $nonLieTache === true) {
10582 $sqlTaskNull = 'LEFT';
10583 }
10584 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10585 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10586 // tiers consulté
10587 if (is_array($typeTache) && $typeTache != array()) {
10588 if (is_array($typeTache)) {
10589 $whereTypeTache = sprintf(
10590 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10591 "'".implode("', '", $typeTache)."'"
10592 );
10593 }
10594 // La date de premier accès n'a pas besoin d'être renseigné pour
10595 // les notifications des demandeurs via le portail citoyen.
10596 // Les notifications des demandeurs sont liés à 3 types de tâches
10597 // notification_recepisse, notification_instruction, notification_decision
10598 // Si le suivi de la notification concerne un de ces types de tâches on
10599 // considère que c'est une notification de demandeurs.
10600 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10601 // via le portail. Par défaut si rien n'est paramétré on considère que la
10602 // notification est faite via le portail
10603 if ((in_array('notification_recepisse', $typeTache) ||
10604 in_array('notification_instruction', $typeTache) ||
10605 in_array('notification_decision', $typeTache))) {
10606 $dossier = $this->getVal('dossier');
10607 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10608 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10609 if ($modeNotification === PORTAL) {
10610 $listeChamps = array(
10611 'emetteur',
10612 'date_envoi',
10613 'destinataire',
10614 'instruction',
10615 'annexes',
10616 'statut',
10617 'commentaire'
10618 );
10619 }
10620 }
10621 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10622 // de les afficher dans le suivi
10623 if (in_array('notification_depot_demat', $typeTache)) {
10624 $listeChamps = array(
10625 'emetteur',
10626 'date_envoi',
10627 'destinataire',
10628 'instruction',
10629 'statut',
10630 'commentaire'
10631 );
10632 }
10633 }
10634
10635 $valSuivi = array();
10636 // Récupération des infos nécessaires à l'affichage du tableau
10637 $sql = sprintf(
10638 'SELECT DISTINCT
10639 instruction_notification.instruction_notification,
10640 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10641 CASE WHEN instruction_notification.automatique = TRUE
10642 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10643 ELSE instruction_notification.emetteur
10644 END as emetteur,
10645 date_envoi,
10646 instruction_notification.destinataire,
10647 instruction_notification.date_premier_acces,
10648 evenement.libelle as instruction,
10649 instruction_notification.statut,
10650 instruction_notification.commentaire,
10651 annexes.instruction_annexe as annexes
10652 FROM
10653 %1$sinstruction_notification
10654 LEFT JOIN %1$sinstruction
10655 ON instruction.instruction = instruction_notification.instruction
10656 LEFT JOIN %1$sevenement
10657 ON instruction.evenement = evenement.evenement
10658 LEFT JOIN %1$sinstruction_notification_document
10659 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10660 AND instruction_notification_document.annexe = true
10661 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10662 %4$s JOIN %1$stask
10663 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10664 AND task.type LIKE \'notification%%\'
10665 -- Récupération de la liste des annexes sous la forme d une liste
10666 LEFT JOIN (
10667 SELECT
10668 instruction_notification,
10669 -- Récupère la liste des annexes de la notification
10670 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10671 -- à l affichage du lien vers les annexes
10672 CONCAT(
10673 \'[\',
10674 STRING_AGG(
10675 -- Affiche le nom du fichier selon le type de document/pièce
10676 CASE
10677 WHEN instruction_notification_document.document_type = \'instruction\'
10678 THEN CONCAT(
10679 \'{
10680 "obj" : "instruction",
10681 "champs" : "om_fichier_instruction",
10682 "label" : "\', evenement.libelle, \'",
10683 "id" : "\', instruction.instruction,\'"
10684 }\'
10685 )
10686 WHEN instruction_notification_document.document_type = \'consultation\'
10687 THEN CONCAT(
10688 \'{
10689 "obj" : "consultation",
10690 "champs" : "fichier",
10691 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10692 "id" : "\', consultation.consultation, \'"
10693 }\'
10694 )
10695 ELSE
10696 CONCAT(
10697 \'{
10698 "obj" : "document_numerise",
10699 "champs" : "uid",
10700 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10701 "id" : "\', document_numerise.document_numerise,\'"
10702 }\'
10703 )
10704 END,
10705 \', \'),
10706 \']\'
10707 ) AS instruction_annexe
10708 FROM
10709 %1$sinstruction_notification_document
10710 LEFT JOIN %1$sinstruction
10711 ON instruction_notification_document.instruction = instruction.instruction
10712 LEFT JOIN %1$sevenement
10713 ON instruction.evenement = evenement.evenement
10714 LEFT JOIN %1$sconsultation
10715 ON instruction_notification_document.document_id = consultation.consultation
10716 LEFT JOIN %1$sservice
10717 ON consultation.service = service.service
10718 LEFT JOIN %1$sdocument_numerise
10719 ON instruction_notification_document.document_id = document_numerise.document_numerise
10720 LEFT JOIN %1$sdocument_numerise_type
10721 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10722 WHERE
10723 instruction_notification_document.annexe = \'t\'
10724 GROUP BY
10725 instruction_notification
10726 ) AS annexes
10727 ON
10728 annexes.instruction_notification = instruction_notification.instruction_notification
10729 WHERE
10730 instruction.instruction = %2$s
10731 %3$s
10732 ORDER BY
10733 date_envoi ASC, instruction_notification.destinataire ASC',
10734 DB_PREFIXE,
10735 intval($this->getVal('instruction')),
10736 $whereTypeTache,
10737 $sqlTaskNull
10738 );
10739 $qres = $this->f->get_all_results_from_db_query($sql, array(
10740 "origin" => __METHOD__
10741 )
10742 );
10743 // Préparation du lien de téléchargement des annexes
10744 $htmlList =
10745 '<style>
10746 #content .gridjs-td a.lien_annexe {
10747 text-decoration : underline dotted 1px;
10748 }
10749 #content a.lien_annexe:hover {
10750 text-decoration : underline solid 1px;
10751 color : #46aede;
10752 }
10753 ol {padding-left : 10px;}
10754 </style>
10755 <ol>%1$s</ol>';
10756 $lienTelechargement =
10757 '<a class="lien_annexe" href="../app/index.php?module=form&amp;snippet=file&amp;obj=%1$s&amp;champ=%2$s&amp;id=%3$s" target="blank" title="%4$s">
10758 Annexe
10759 </a>';
10760 // Stockage des infos de chaque notification dans un tableau
10761 foreach ($qres['result'] as $row) {
10762 $valNotif = array();
10763 foreach($listeChamps as $champ) {
10764 $valNotif[$champ] = $row[$champ];
10765 if (($champ === 'date_envoi'
10766 || $champ === 'date_premier_acces')
10767 && $row[$champ] !== null
10768 && $row[$champ] !== '') {
10769 //
10770 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10771 } else if ($champ === 'annexes') {
10772 $listeAnnexe = '';
10773 $infoAnnexes = json_decode($row[$champ], true);
10774 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10775 // A partir des infos récupérées prépare le code html du lien vers chacune
10776 // des annexes et ajoute un élément de liste par annexe
10777 foreach($infoAnnexes as $annexe) {
10778 $listeAnnexe .= sprintf(
10779 '<li>%s</li>',
10780 sprintf($lienTelechargement,
10781 $annexe['obj'],
10782 $annexe['champs'],
10783 $annexe['id'],
10784 $annexe['label']
10785 )
10786 );
10787 }
10788 // Construction de la liste des annexes
10789 $valNotif[$champ] = sprintf(
10790 $htmlList,
10791 $listeAnnexe
10792 );
10793 }
10794 }
10795 }
10796 array_push($valSuivi, $valNotif);
10797 }
10798
10799 // Passage du tableau au format json
10800 return json_encode($valSuivi, JSON_HEX_APOS);
10801 }
10802
10803 /**
10804 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10805 *
10806 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10807 *
10808 * @return void
10809 */
10810 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10811 $this->correct = false;
10812 $this->addToMessage($exception->getMessage());
10813 }
10814
10815
10816 /**
10817 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10818 *
10819 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10820 * @return electronicsignature Instance de l'abstracteur.
10821 */
10822 public function get_electronicsignature_instance($with_handle_error = true) {
10823 if(isset($this->electronicsignature_instance)) {
10824 return $this->electronicsignature_instance;
10825 }
10826 // Instanciation du connecteur electronicsignature
10827 try {
10828 require_once "electronicsignature.class.php";
10829 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10830 $extra_params = array(
10831 "inst_framework" => $this->f,
10832 );
10833 $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
10834 } catch (electronicsignature_exception $e) {
10835 if ($with_handle_error === true) {
10836 $this->handle_electronicsignature_exception($e);
10837 }
10838 return false;
10839 }
10840 return $this->electronicsignature_instance;
10841 }
10842
10843 /**
10844 * TREATMENT - envoyer_au_controle_de_legalite
10845 *
10846 * Ajoute la tâche envoi_CL.
10847 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10848 *
10849 * @return [type] [description]
10850 */
10851 function envoyer_au_controle_de_legalite() {
10852 $this->begin_treatment(__METHOD__);
10853 $this->correct = true;
10854
10855 //
10856 if ($this->can_be_sent_to_cl() === true) {
10857 // Création de la task 'envoi_CL'
10858 $inst_task = $this->f->get_inst__om_dbform(array(
10859 "obj" => "task",
10860 "idx" => 0,
10861 ));
10862 $task_val = array(
10863 'type' => 'envoi_CL',
10864 'object_id' => $this->getVal('instruction'),
10865 'dossier' => $this->getVal('dossier'),
10866 );
10867 // Change l'état de la tâche de notification en fonction de l'état de
10868 // transmission du dossier d'instruction
10869 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10870 if ($this->f->is_option_mode_service_consulte_enabled() === false
10871 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10872 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10873 //
10874 $task_val['state'] = task::STATUS_DRAFT;
10875 }
10876 $add_task = $inst_task->add_task(array('val' => $task_val));
10877 if ($add_task === false) {
10878 $this->addToMessage(sprintf('%s %s',
10879 __("Une erreur s'est produite lors de la création tâche."),
10880 __("Veuillez contacter votre administrateur.")
10881 ));
10882 $this->correct = false;
10883 return $this->end_treatment(__METHOD__, false);
10884 }
10885 // Mise à jour du champs 'envoye_cl_platau'
10886 $instr_val = array(
10887 'envoye_cl_platau' => 't',
10888 );
10889 $res = $this->f->db->autoExecute(
10890 DB_PREFIXE.$this->table,
10891 $instr_val,
10892 DB_AUTOQUERY_UPDATE,
10893 $this->getCle($this->getVal($this->clePrimaire))
10894 );
10895 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10896 if ($this->f->isDatabaseError($res, true) === true) {
10897 $this->addToMessage(sprintf('%s %s',
10898 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10899 __("Veuillez contacter votre administrateur.")
10900 ));
10901 $this->correct = false;
10902 return $this->end_treatment(__METHOD__, false);
10903 }
10904 // Message de validation à l'utilisateur
10905 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10906 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10907 }
10908 //
10909 return $this->end_treatment(__METHOD__, true);
10910 }
10911
10912
10913 /**
10914 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10915 *
10916 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10917 * la vue 'sousformulaire'.
10918 *
10919 * @return string
10920 */
10921 function get_back_link($view = "formulaire") {
10922 //
10923 $href = parent::get_back_link($view);
10924 //
10925 $crud = $this->get_action_crud();
10926
10927 // Redirection vers le formulaire de modification à la validation du
10928 // formulaire d'ajout si l'événement associé possède une lettre type
10929 if (($crud === 'create'
10930 || ($crud === null
10931 && $this->getParameter('maj') == 0))
10932 && $this->correct == true
10933 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10934
10935 // On instancie l'instruction
10936 $inst_instruction = $this->f->get_inst__om_dbform(array(
10937 "obj" => "instruction",
10938 "idx" => $this->valF[$this->clePrimaire],
10939 ));
10940
10941 // Si l'instruction n'est pas finalisée automatiquement
10942 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10943 $href = str_replace("&action=3", "&action=1", $href);
10944 //
10945 if (strpos($href, "&retour=tab") !== false) {
10946 $href = str_replace("&retour=tab", "&retour= form", $href);
10947 } else {
10948 $href .= "&retour=form";
10949 }
10950 }
10951 }
10952
10953 //
10954 return $href;
10955 }
10956
10957 public function view_json_data() {
10958 $this->checkAccessibility();
10959 $this->f->disableLog();
10960 $view = $this->get_json_data();
10961 printf(json_encode($view));
10962 }
10963
10964 public function get_json_data() {
10965 $val = array_combine($this->champs, $this->val);
10966 foreach ($val as $key => $value) {
10967 $val[$key] = strip_tags($value);
10968 }
10969 $val['tacite'] = 'f';
10970 $inst_ad = $this->f->get_inst__om_dbform(array(
10971 "obj" => "avis_decision",
10972 "idx" => $val['avis_decision'],
10973 ));
10974 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10975 $val['tacite'] = 't';
10976 }
10977 return $val;
10978 }
10979
10980 /**
10981 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10982 * comme événement lié le suivant définit dans l'événement de l'instruction
10983 * instanciée.
10984 *
10985 * @param string $next_type Correspond aux trois déclenchement automatique
10986 * de création d'instruction paramétré sur un événement.
10987 * @param integer $instruction Identifiant de l'instruction à instancier.
10988 * @return mixed Identifiant de l'instruction recherchée ou false.
10989 */
10990 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10991 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10992 return false;
10993 }
10994 $result = array();
10995 $evenements = array();
10996 if ($instruction === null) {
10997 $instruction = $this->getVal($this->clePrimaire);
10998 $evenement = $this->getVal('evenement');
10999 $dossier = $this->getVal('dossier');
11000 } else {
11001 $inst = $this->f->get_inst__om_dbform(array(
11002 "obj" => "instruction",
11003 "idx" => $instruction,
11004 ));
11005 $evenement = $inst->getVal('evenement');
11006 $dossier = $inst->getVal('dossier');
11007 }
11008 // Récupération de l'identifiant de l'événement paramétré comme suivant
11009 // sur l'instruction instanciée
11010 $qres = $this->f->get_one_result_from_db_query(
11011 sprintf(
11012 'SELECT
11013 evenement_%3$s
11014 FROM
11015 %1$sevenement
11016 WHERE
11017 evenement = %2$s',
11018 DB_PREFIXE,
11019 intval($evenement),
11020 $next_type
11021 ),
11022 array(
11023 "origin" => __METHOD__,
11024 "force_return" => true,
11025 )
11026 );
11027 if ($qres["code"] !== "OK") {
11028 return false;
11029 }
11030 $ev_next = $qres["result"];
11031 // Récupération de l'instruction dans le dossier utilisant l'événement
11032 // suivant identifié dans la requête précédente
11033 $qres = $this->f->get_one_result_from_db_query(
11034 sprintf(
11035 'SELECT
11036 MAX(instruction.instruction) as instruction
11037 FROM
11038 %1$sinstruction
11039 WHERE
11040 dossier = \'%3$s\'
11041 AND evenement = %2$s',
11042 DB_PREFIXE,
11043 intval($ev_next),
11044 $this->f->db->escapeSimple($dossier)
11045 ),
11046 array(
11047 "origin" => __METHOD__,
11048 "force_return" => true,
11049 )
11050 );
11051 if ($qres["code"] !== "OK") {
11052 return false;
11053 }
11054 return $qres["result"];
11055 }
11056
11057 public function get_related_instructions($instruction = null) {
11058 $result = array();
11059 $evenements = array();
11060 if ($instruction === null) {
11061 $instruction = $this->getVal($this->clePrimaire);
11062 $evenement = $this->getVal('evenement');
11063 $dossier = $this->getVal('dossier');
11064 } else {
11065 $inst = $this->f->get_inst__om_dbform(array(
11066 "obj" => "instruction",
11067 "idx" => $instruction,
11068 ));
11069 $evenement = $inst->getVal('evenement');
11070 $dossier = $inst->getVal('dossier');
11071 }
11072 //
11073 $qres = $this->f->get_one_result_from_db_query(
11074 sprintf(
11075 'SELECT
11076 evenement
11077 FROM
11078 %1$sevenement
11079 WHERE
11080 evenement_retour_ar = %2$s
11081 OR evenement_retour_signature = %2$s',
11082 DB_PREFIXE,
11083 intval($evenement)
11084 ),
11085 array(
11086 "origin" => __METHOD__,
11087 "force_return" => true,
11088 )
11089 );
11090 if ($qres["code"] !== "OK") {
11091 return false;
11092 }
11093 $ev_parent = $qres["result"];
11094 //
11095 $qres = $this->f->get_one_result_from_db_query(
11096 sprintf(
11097 'SELECT
11098 MAX(instruction.instruction) as instruction
11099 FROM
11100 %1$sinstruction
11101 WHERE
11102 dossier = \'%3$s\'
11103 AND evenement = %2$s',
11104 DB_PREFIXE,
11105 intval($ev_parent),
11106 $this->f->db->escapeSimple($dossier)
11107 ),
11108 array(
11109 "origin" => __METHOD__,
11110 "force_return" => true,
11111 )
11112 );
11113 if ($qres["code"] !== "OK") {
11114 return false;
11115 }
11116 $result[] = $qres["result"];
11117 //
11118 $qres = $this->f->get_one_result_from_db_query(
11119 sprintf(
11120 'SELECT
11121 evenement_retour_ar
11122 FROM
11123 %1$sevenement
11124 WHERE
11125 evenement = %2$d
11126 AND evenement_retour_ar != %3$d',
11127 DB_PREFIXE,
11128 intval($ev_parent),
11129 intval($evenement)
11130 ),
11131 array(
11132 "origin" => __METHOD__,
11133 "force_return" => true,
11134 )
11135 );
11136 if ($qres["code"] !== "OK") {
11137 return false;
11138 }
11139 $evenements[] = $qres["result"];
11140 //
11141 $qres = $this->f->get_one_result_from_db_query(
11142 sprintf(
11143 'SELECT
11144 evenement_retour_signature
11145 FROM
11146 %1$sevenement
11147 WHERE
11148 evenement = %2$s
11149 AND evenement_retour_signature != %3$s
11150 ',
11151 DB_PREFIXE,
11152 intval($ev_parent),
11153 intval($evenement)
11154 ),
11155 array(
11156 "origin" => __METHOD__,
11157 "force_return" => true,
11158 )
11159 );
11160 if ($qres["code"] !== "OK") {
11161 return false;
11162 }
11163 $evenements[] = $qres["result"];
11164 foreach ($evenements as $value) {
11165 if ($value !== null) {
11166 $qres = $this->f->get_one_result_from_db_query(
11167 sprintf(
11168 'SELECT
11169 MAX(instruction.instruction) as instruction
11170 FROM
11171 %1$sinstruction
11172 WHERE
11173 dossier = \'%3$s\'
11174 AND evenement = %2$s',
11175 DB_PREFIXE,
11176 intval($value),
11177 $this->f->db->escapeSimple($dossier)
11178 ),
11179 array(
11180 "origin" => __METHOD__,
11181 "force_return" => true,
11182 )
11183 );
11184 if ($qres["code"] !== "OK") {
11185 return false;
11186 }
11187 $result[] = $qres["result"];
11188 }
11189 }
11190 return $result;
11191 }
11192
11193 protected function getDocumentType($champ = null) {
11194 $evenementId = $this->getVal('evenement');
11195 if (! empty($evenementId)) {
11196 $evenement = $this->f->findObjectById('evenement', $evenementId);
11197 if (! empty($evenement)) {
11198 return __("Instruction").':'.$evenement->getVal('libelle');
11199 }
11200 }
11201 return parent::getDocumentType();
11202 }
11203
11204 /**
11205 * Récupère à l'aide d'une requête sql la liste des demandeurs
11206 * pouvant être notifié. C'est à dire les demandeurs acceptant
11207 * les notifications et pour lesquels une adresse mail existe.
11208 *
11209 * Dans le cas, d'une notification pour le portail citoyen, seul
11210 * le pétitionnaire principal doit être notifier et uniquement si
11211 * il a une adress mail et qu'il accepte les notifications.
11212 *
11213 * @param string identifiant du dossier
11214 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11215 * pour une notification de categorie portail
11216 * @return array liste des demandeurs pouvant être notifié
11217 */
11218 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11219 if ($idDossier === null) {
11220 $idDossier = $this->getVal('dossier');
11221 }
11222 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11223 // pour une notification depuis le portail citoyen
11224 $sqlPetitionnairePrincipal = '';
11225 // Gestion des champs nécessaires pour la notification d'un demandeur
11226 $condition_demandeur = "AND demandeur.notification = 't'
11227 AND demandeur.courriel IS NOT NULL";
11228 if ($portail === true) {
11229 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11230 $condition_demandeur = "AND (
11231 (notification = 't' AND courriel IS NOT NULL)
11232 OR demande.source_depot = 'portal'
11233 )";
11234 }
11235
11236 $listeDemandeursNotifiable = array();
11237
11238 // Requête de récupération des demandeurs
11239 $qres = $this->f->get_all_results_from_db_query(
11240 sprintf(
11241 'SELECT
11242 demandeur.demandeur,
11243 CASE
11244 WHEN demandeur.qualite=\'particulier\'
11245 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11246 ELSE
11247 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11248 END AS destinataire,
11249 demandeur.courriel,
11250 petitionnaire_principal
11251 FROM
11252 %1$sdossier
11253 INNER JOIN %1$slien_dossier_demandeur
11254 ON dossier.dossier = lien_dossier_demandeur.dossier
11255 INNER JOIN %1$sdemandeur
11256 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11257 -- Récupération de la plus ancienne demande associée au dossier (la demande
11258 -- de création du dossier)
11259 INNER JOIN (
11260 SELECT
11261 demande,
11262 dossier_instruction,
11263 source_depot
11264 FROM
11265 %1$sdemande
11266 WHERE
11267 dossier_instruction = \'%2$s\'
11268 ORDER BY
11269 demande ASC
11270 LIMIT 1
11271 ) as demande
11272 ON dossier.dossier = demande.dossier_instruction
11273 WHERE
11274 dossier.dossier = \'%2$s\'
11275 %3$s
11276 %4$s',
11277 DB_PREFIXE,
11278 $this->f->db->escapeSimple($idDossier),
11279 $condition_demandeur,
11280 $sqlPetitionnairePrincipal
11281 ),
11282 array(
11283 "origin" => __METHOD__
11284 )
11285 );
11286 // Récupération des infos des demandeurs et stockage dans un tableau
11287 // ayant pour clé les id des demandeurs
11288 foreach ($qres['result'] as $row) {
11289 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11290 }
11291
11292 return $listeDemandeursNotifiable;
11293 }
11294
11295 /**
11296 * Renvoie la liste des notifications liées à l'instruction
11297 *
11298 * @param integer id de l'instruction dont on cherche les notifications
11299 * @return array liste des instruction_notification liés à l'instruction
11300 */
11301 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11302 // Compose la clause définissant dans la requête le type de tâche attendus
11303 $clause_type_tache = '';
11304 if ($typeNotification != null) {
11305 if (is_array($typeNotification)) {
11306 $clause_type_tache = sprintf(
11307 'AND task.type IN (\'%1$s\')',
11308 implode("', '", $typeNotification),
11309 );
11310 } else {
11311 $clause_type_tache = sprintf(
11312 'AND task.type = \'%1$s\'',
11313 $typeNotification
11314 );
11315 }
11316 }
11317
11318 // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11319 $qres = $this->f->get_all_results_from_db_query(
11320 sprintf('
11321 SELECT
11322 instruction_notification.instruction_notification
11323 FROM
11324 %1$sinstruction_notification
11325 INNER JOIN %1$stask
11326 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11327 %3$s
11328 WHERE
11329 instruction = %2$s',
11330 DB_PREFIXE,
11331 intval($id_instruction),
11332 $clause_type_tache
11333 ),
11334 array(
11335 "origin" => __METHOD__,
11336 'log_level' => DEBUG_MODE
11337 )
11338 );
11339 $listeInstrNotif = array();
11340 foreach ($qres['result'] as $row) {
11341 $listeInstrNotif[] = $row['instruction_notification'];
11342 }
11343
11344 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11345 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11346 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11347 // paramétrage
11348 if(is_bool($nonLieTache) && $nonLieTache === true) {
11349 $qres = $this->f->get_all_results_from_db_query(
11350 sprintf('
11351 SELECT
11352 instruction_notification.instruction_notification
11353 FROM
11354 %1$sinstruction_notification
11355 LEFT JOIN %1$stask
11356 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11357 AND task.type LIKE \'%%notification%%\'
11358 WHERE
11359 instruction = %2$s
11360 AND task.task IS NULL',
11361 DB_PREFIXE,
11362 intval($id_instruction)
11363 ),
11364 array(
11365 "origin" => __METHOD__
11366 )
11367 );
11368
11369 foreach ($qres['result'] as $row) {
11370 $listeInstrNotif[] = $row['instruction_notification'];
11371 }
11372 }
11373
11374 return $listeInstrNotif;
11375 }
11376
11377 /**
11378 * Crée une clé d'accès unique permettant à un utilisateur
11379 * anonyme de récupérer le document.
11380 *
11381 * @return string clé d'accès du document
11382 */
11383 function getCleAccesDocument() {
11384 // Initialisation d'un tableau
11385 $number_list = array();
11386
11387 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11388 for ($i = 0; $i < 4; $i++) {
11389 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11390 }
11391
11392 // Transformation en chaîne tout en séparant les nombres par un "-"
11393 $result = implode('-', $number_list);
11394
11395 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11396 if ($this->getUidDocumentInstructionWithKey($result) != null) {
11397 return $this->getCleAccesDocument();
11398 }
11399
11400 //
11401 return $result;
11402 }
11403
11404 /**
11405 * Récupère une clé et renvoie l'uid du document liée à cette
11406 * clé. Si la clé n'existe pas renvoie null.
11407 *
11408 * @param string $cleGen clé dont on cherche l'instruction
11409 * @return integer|null
11410 */
11411 protected function getUidDocumentInstructionWithKey($cleGen) {
11412 $qres = $this->f->get_one_result_from_db_query(
11413 sprintf(
11414 'SELECT
11415 instruction.om_fichier_instruction
11416 FROM
11417 %1$sinstruction_notification_document
11418 LEFT JOIN %1$sinstruction
11419 ON instruction_notification_document.instruction = instruction.instruction
11420 WHERE
11421 instruction_notification_document.cle = \'%2$s\'',
11422 DB_PREFIXE,
11423 $this->f->db->escapeSimple($cleGen)
11424 ),
11425 array(
11426 "origin" => __METHOD__,
11427 )
11428 );
11429
11430 return $qres['result'];
11431 }
11432
11433 /**
11434 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11435 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11436 *
11437 * @param string $cleGen
11438 * @return instruction_notification
11439 */
11440 protected function getInstanceNotificationWithKey($key) {
11441 $qres = $this->f->get_one_result_from_db_query(
11442 sprintf(
11443 'SELECT
11444 instruction_notification
11445 FROM
11446 %1$sinstruction_notification_document
11447 WHERE
11448 cle = \'%2$s\'',
11449 DB_PREFIXE,
11450 $this->f->db->escapeSimple($key)
11451 ),
11452 array(
11453 "origin" => __METHOD__,
11454 )
11455 );
11456
11457 // Récupération de l'instance de notification
11458 $instNotif = $this->f->get_inst__om_dbform(array(
11459 "obj" => "instruction_notification",
11460 "idx" => $qres['result'],
11461 ));
11462 return $instNotif;
11463 }
11464
11465
11466 /**
11467 * Affiche la page de téléchargement du document de la notification.
11468 *
11469 * @param boolean $content_only Affiche le contenu seulement.
11470 *
11471 * @return void
11472 */
11473 public function view_telecharger_document_anonym() {
11474 // Par défaut on considère qu'on va afficher le formulaire
11475 $idx = 0;
11476 // Flag d'erreur
11477 $error = false;
11478 // Message d'erreur
11479 $message = '';
11480
11481 // Paramètres GET : récupération de la clé d'accès
11482 $cle_acces_document = $this->f->get_submitted_get_value('key');
11483 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11484 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11485 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11486 if ($uidFichier != null) {
11487 // Récupération du document
11488 $file = $this->f->storage->get($uidFichier);
11489
11490 // Headers
11491 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11492 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11493 header("Content-Type: ".$file['metadata']['mimetype']);
11494 header("Accept-Ranges: bytes");
11495 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11496 // Affichage du document
11497 echo $file['file_content'];
11498
11499 // Récupération de la date de premier accès et maj du suivi uniquement
11500 // si la date de 1er accès n'a pas encore été remplis
11501 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11502 if ($inst_notif->getVal('date_premier_acces') == null ||
11503 $inst_notif->getVal('date_premier_acces') == '') {
11504 $notif_val = array();
11505 foreach ($inst_notif->champs as $champ) {
11506 $notif_val[$champ] = $inst_notif->getVal($champ);
11507 }
11508 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11509 $notif_val['statut'] = 'vu';
11510 $notif_val['commentaire'] = 'Le document a été vu';
11511 $suivi_notif = $inst_notif->modifier($notif_val);
11512 }
11513
11514 } else {
11515 // Page vide 404
11516 printf('Ressource inexistante');
11517 header('HTTP/1.0 404 Not Found');
11518 }
11519 }
11520
11521 /**
11522 * Récupère le titre du document envoyé au parapheur
11523 */
11524 protected function getDocumentTitre($champ = null) {
11525 $title = $this->getTitle();
11526 $dossier = $this->getDossier();
11527 return $dossier.' '.$title;
11528 }
11529
11530 /**
11531 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11532 * l'overlay de notification des demandeurs.
11533 */
11534 function getSubFormTitle($ent) {
11535 $actionSansPath = array('411', '420', '430');
11536 if (in_array($this->getParameter('maj'), $actionSansPath)) {
11537 return '';
11538 }
11539 return parent::getSubFormTitle($ent);
11540 }
11541
11542 /**
11543 * Traitement de la notification automatique des tiers consulté.
11544 *
11545 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11546 * récupérées ajoute une notification et une tâche de notification par mail.
11547 * La création de la tâche de notification par mail déclenchera l'envoi du mail
11548 * et la mise à jour du suivi.
11549 *
11550 * Les tiers notifiables sont ceux :
11551 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11552 * - ayant une habilitation dont le type est listé dans les paramètres de
11553 * notification de l’événement,
11554 * - intervenant sur la commune ou le département du dossier
11555 * - ayant au moins une adresse mail valide
11556 *
11557 * @param evenement instance de l'événement associée à l'instruction
11558 * @param dossier instance du dossier de l'instruction
11559 * @return boolean indique si le traitement à réussi
11560 */
11561 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11562 // Récupération de l'identifiant plat'au du service consultant
11563 $consultationEntrante = $dossier->get_inst_consultation_entrante();
11564 // Récupération de la liste des types d'habilitations autorisées pour
11565 // cette notification
11566 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11567 // Récupération du département et de la commune du dossier
11568 $commune = $dossier->getVal('commune');
11569 // Le département est récupéré à partir de la commune du dossier donc si la
11570 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11571 $idDepartement = null;
11572 if (! empty($commune)) {
11573 $departement = $dossier->get_inst_departement_dossier();
11574 $idDepartement = $departement->getVal($departement->clePrimaire);
11575 }
11576 // Récupération des courriels des tiers notifiables
11577 $tiersANotifier = $this->get_courriels_tiers_notifiable(
11578 $typesHabilitationsNotifiable,
11579 $consultationEntrante->getVal('service_consultant_id'),
11580 $commune,
11581 $idDepartement
11582 );
11583 // Traitement de chacune des listes de diffusion pour extraire les
11584 // courriels, vérifier la validité des courriels et envoyer la
11585 // notification
11586 $notificationSend = false;
11587 if (empty($tiersANotifier)) {
11588 $this->addToLog(
11589 sprintf(
11590 '%s() : %s %s : %s',
11591 __METHOD__,
11592 __("La récupération des tiers à échoué."),
11593 __('Paramétrage'),
11594 var_export(
11595 array(
11596 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11597 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11598 'id_commune' => $commune,
11599 'id_departement' => $idDepartement
11600 ),
11601 true
11602 )
11603 ),
11604 DEBUG_MODE
11605 );
11606 return false;
11607 }
11608 foreach($tiersANotifier as $tierANotifier) {
11609 // Découpe la liste de diffusion pour stocker les adresses mails
11610 // des tiers dans un tableau
11611 $courriels =
11612 array_filter(
11613 array_map(
11614 'trim',
11615 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11616
11617 foreach ($courriels as $courriel) {
11618 // Pour chaque adresse mail vérifie si l'adresse est valide
11619 if (! $this->f->checkValidEmailAddress($courriel)) {
11620 continue;
11621 }
11622 $destinataire = array(
11623 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11624 'courriel' => $courriel
11625 );
11626 // Si l'adresse est valide ajoute une nouvelle notification
11627 // et une tâche d'envoi de mails
11628 $idNotif = $this->ajouter_notification(
11629 $this->getVal($this->clePrimaire),
11630 $this->f->get_connected_user_login_name(),
11631 $destinataire,
11632 $this->get_dossier_instruction_om_collectivite(),
11633 array(),
11634 true
11635 );
11636 if ($idNotif === false) {
11637 $this->addToLog(
11638 __METHOD__.
11639 __("L'ajout de la notification a échoué."),
11640 DEBUG_MODE
11641 );
11642 return false;
11643 }
11644 // Création de la tache en lui donnant l'id de la notification
11645 $notification_by_task = $this->notification_by_task(
11646 $idNotif,
11647 $dossier->getVal('dossier'),
11648 'mail',
11649 'notification_tiers_consulte'
11650 );
11651 if ($notification_by_task === false) {
11652 $this->addToLog(
11653 __METHOD__.
11654 __("L'ajout de la tâche de notification a échoué."),
11655 DEBUG_MODE
11656 );
11657 $this->addToMessage(
11658 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11659 );
11660 return false;
11661 }
11662 $notificationSend = true;
11663 }
11664 }
11665 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11666 // valide, affiche un message dans les logs pour avoir un suivi.
11667 if (! $notificationSend) {
11668 $this->addToLog(
11669 sprintf(
11670 '%s %s : %s %s : %s',
11671 __METHOD__,
11672 __("Il n'y a pas de tiers notifiable pour l'instruction"),
11673 $evenement->getVal('libelle'),
11674 __("du dossier"),
11675 $this->getVal('dossier')
11676 ),
11677 DEBUG_MODE
11678 );
11679 }
11680 return true;
11681 }
11682
11683 /**
11684 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11685 * respectant les conditions suvantes :
11686 * - le tiers consulté dois accepté les notifications
11687 * - la liste de diffusion ne dois pas être vide
11688 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11689 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11690 * du tiers
11691 * - le type d'habilitation des tiers dois appartenir à la liste
11692 * fournie en paramètre
11693 * - le tiers dois être associé à la commune ou au département passé
11694 * en paramètre
11695 *
11696 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11697 * pouvant être notifiée
11698 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11699 * @param integer $commune identifiant de la commune du dossier
11700 * @param integer $departement identifiant du département du dossier
11701 *
11702 * @return array listes de diffusion des tiers notifiable
11703 */
11704 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11705 // Si paramètre non renseigné alors ne renvoie rien
11706 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11707 return false;
11708 }
11709 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11710 $filtreServiceConsulteDI = '';
11711 if (! empty($idPlatau)) {
11712 $filtreServiceConsulteDI = sprintf(
11713 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11714 -- en charge du dossier
11715 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11716 OR tiers_consulte.uid_platau_acteur IS NULL)",
11717 $this->f->db->escapeSimple($idPlatau)
11718 );
11719 }
11720 $rst = $this->f->get_all_results_from_db_query(
11721 sprintf(
11722 'SELECT
11723 -- Tiers notifiables lié à la commune du dossier
11724 tiers_consulte.liste_diffusion,
11725 tiers_consulte.libelle
11726 FROM
11727 %1$shabilitation_tiers_consulte
11728 LEFT JOIN %1$stiers_consulte
11729 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11730 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11731 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11732 -- Conservation uniquement des tiers acteur de dossiers
11733 JOIN %1$slien_dossier_tiers
11734 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11735 WHERE
11736 tiers_consulte.accepte_notification_email IS TRUE
11737 AND tiers_consulte.liste_diffusion IS NOT NULL
11738 %3$s
11739 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11740 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11741 -- Filtre sur les tiers acteur du dossier
11742 AND lien_dossier_tiers.dossier = \'%6$s\'
11743 UNION
11744 SELECT
11745 -- Tiers notifiables lié au département du dossier
11746 tiers_consulte.liste_diffusion,
11747 tiers_consulte.libelle
11748 FROM
11749 %1$shabilitation_tiers_consulte
11750 LEFT JOIN %1$stiers_consulte
11751 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11752 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11753 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11754 -- Conservation uniquement des tiers acteur de dossiers
11755 JOIN %1$slien_dossier_tiers
11756 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11757 WHERE
11758 tiers_consulte.accepte_notification_email IS TRUE
11759 AND tiers_consulte.liste_diffusion IS NOT NULL
11760 %3$s
11761 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11762 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11763 -- Filtre sur les tiers acteur du dossier
11764 AND lien_dossier_tiers.dossier = \'%6$s\'',
11765 DB_PREFIXE,
11766 implode(', ', $typesHabilitations),
11767 $filtreServiceConsulteDI,
11768 intval($commune),
11769 intval($departement),
11770 $this->f->db->escapeSimple($this->getVal('dossier'))
11771 ),
11772 array(
11773 "origin" => __METHOD__
11774 )
11775 );
11776 // Faire un order by sur un union ne fonctionne pas. A la place
11777 // c'est le tableau des résultats qui est ordonné.
11778 usort($rst['result'], function($a, $b) {
11779 return strcmp($a['libelle'], $b['libelle']);
11780 });
11781 return $rst['result'];
11782 }
11783
11784 /**
11785 * Gestion spécifique de l'affichage des documents dans le tableau des
11786 * documents d'instruction.
11787 * Prend en compte qu'une instruction peut également avoir un document lié
11788 * dans la table storage.
11789 *
11790 * @return void
11791 */
11792 public function view_telecharger_editions() {
11793 // Récupère l'identifiant du document dans l'URL appelant l'action
11794 $idx = $this->f->get_submitted_get_value('idx');
11795 $obj = $this->table;
11796 $champ = 'om_fichier_instruction';
11797 // Cas d'un document historisé (dans la table storage)
11798 if (strpos($idx, 'STORAGE_') !== false) {
11799 $idx = substr($idx, 8);
11800 $obj = 'storage';
11801 $champ = 'uid';
11802 }
11803 // Ouvre le document
11804 $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11805 header("Location: ".$lien);
11806 }
11807 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26