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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15037 - (show annotations)
Mon Jun 19 13:23:51 2023 UTC (19 months, 1 week ago) by softime
File size: 117760 byte(s)
chore(branch): fusion de la branche d'intégration 5.18.0-develop dans le trunk

1 <?php
2 //$Id$
3 //gen openMairie le 14/04/2020 14:11
4
5 require_once "../gen/obj/task.class.php";
6
7 class task extends task_gen {
8
9 const STATUS_DRAFT = 'draft';
10 const STATUS_NEW = 'new';
11 const STATUS_PENDING = 'pending';
12 const STATUS_DONE = 'done';
13 const STATUS_ERROR = 'error';
14 const STATUS_DEBUG = 'debug';
15 const STATUS_ARCHIVED = 'archived';
16 const STATUS_CANCELED = 'canceled';
17
18 /**
19 * Liste des types de tâche concernant les services instructeurs
20 */
21 const TASK_TYPE_SI = array(
22 'creation_DA',
23 'creation_DI',
24 'depot_DI',
25 'modification_DI',
26 'qualification_DI',
27 'decision_DI',
28 'incompletude_DI',
29 'completude_DI',
30 'ajout_piece',
31 'add_piece',
32 'creation_consultation',
33 'modification_DA',
34 'create_DI',
35 'envoi_CL',
36 'notification_recepisse',
37 'notification_instruction',
38 'notification_decision',
39 'notification_service_consulte',
40 'notification_tiers_consulte',
41 'notification_depot_demat',
42 'notification_commune',
43 'notification_signataire',
44 'lettre_incompletude',
45 'lettre_majoration'
46 );
47
48 /**
49 * Liste des types de tâche concernant les services consultés
50 */
51 const TASK_TYPE_SC = array(
52 'create_DI_for_consultation',
53 'avis_consultation',
54 'pec_metier_consultation',
55 'create_message',
56 'notification_recepisse',
57 'notification_instruction',
58 'notification_decision',
59 'notification_service_consulte',
60 'notification_tiers_consulte',
61 'notification_depot_demat',
62 'prescription',
63 );
64
65 /**
66 * Liste des types de tâche pouvant avoir des documents associés
67 */
68 const TASK_WITH_DOCUMENT = array(
69 'add_piece',
70 'avis_consultation',
71 'pec_metier_consultation'
72 );
73
74 /**
75 * Catégorie de la tâche
76 */
77 var $category = PLATAU;
78
79 /**
80 * Définition des actions disponibles sur la classe.
81 *
82 * @return void
83 */
84 public function init_class_actions() {
85 parent::init_class_actions();
86 //
87 $this->class_actions[998] = array(
88 "identifier" => "json_data",
89 "view" => "view_json_data",
90 "permission_suffix" => "consulter",
91 );
92 $this->class_actions[997] = array(
93 "identifier" => "json_data",
94 "view" => "post_update_task",
95 "permission_suffix" => "modifier",
96 );
97 $this->class_actions[996] = array(
98 "identifier" => "json_data",
99 "view" => "post_add_task",
100 "permission_suffix" => "ajouter",
101 );
102 }
103
104 public function setvalF($val = array()) {
105
106 // // les guillets doubles sont remplacés automatiquement par des simples
107 // // dans core/om_formulaire.clasS.php::recupererPostvar()
108 // // voir le ticket https://dev.atreal.fr/projets/openmairie/tracker/209
109 // // ceci est un hack sale temporaire en attendant résolution du ticket
110 // foreach(array('json_payload', 'timestamp_log') as $key) {
111 // if (isset($val[$key]) && ! empty($val[$key]) &&
112 // isset($_POST[$key]) && ! empty($_POST[$key])) {
113 // $submited_payload = $_POST[$key];
114 // if (! empty($submited_payload)) {
115 // $new_payload = str_replace("'", '"', $val[$key]);
116 // if ($new_payload == $submited_payload ||
117 // strpos($submited_payload, '"') === false) {
118 // $val[$key] = $new_payload;
119 // }
120 // else {
121 // $error_msg = sprintf(
122 // __("La convertion des guillemets de la payload JSON '%s' ".
123 // "n'est pas idempotente (courante: %s, postée: %s, convertie: %s)"),
124 // $key, var_export($val[$key], true), var_export($submited_payload, true),
125 // var_export($new_payload, true));
126 // $this->correct = false;
127 // $this->addToMessage($error_msg);
128 // $this->addToLog(__METHOD__."() erreur : $error_msg", DEBUG_MODE);
129 // return false;
130 // }
131 // }
132 // }
133 // }
134
135 parent::setvalF($val);
136
137 // XXX Ancien code : permet de ne pas avoir d'erreru lors de la modification d'une task
138 if (array_key_exists('timestamp_log', $val) === true) {
139 $this->valF['timestamp_log'] = str_replace("'", '"', $val['timestamp_log']);
140 }
141
142 // récupération de l'ID de l'objet existant
143 $id = property_exists($this, 'id') ? $this->id : null;
144 if(isset($val[$this->clePrimaire])) {
145 $id = $val[$this->clePrimaire];
146 } elseif(isset($this->valF[$this->clePrimaire])) {
147 $id = $this->valF[$this->clePrimaire];
148 }
149
150 // MODE MODIFIER
151 if (! empty($id)) {
152
153 // si aucune payload n'est fourni (devrait toujours être le cas)
154 if (! isset($val['json_payload']) || empty($val['json_payload'])) {
155
156 // récupère l'objet existant
157 $existing = $this->f->findObjectById('task', $id);
158 if (! empty($existing)) {
159
160 // récupère la payload de l'objet
161 $val['json_payload'] = $existing->getVal('json_payload');
162 $this->valF['json_payload'] = $existing->getVal('json_payload');
163 $this->f->addToLog(__METHOD__."() récupère la payload de la tâche existante ".
164 "'$id': ".$existing->getVal('json_payload'), EXTRA_VERBOSE_MODE);
165 }
166 }
167 }
168
169 if (array_key_exists('category', $val) === false
170 || $this->valF['category'] === ''
171 || $this->valF['category'] === null) {
172 //
173 $this->valF['category'] = $this->category;
174 }
175
176 // Si last_modification_time est vide, la valeur est remplacée par NULL
177 // pour eviter d'avoir une erreur de base de données car le champ est au format time.
178 if ($val['last_modification_time'] == "") {
179 $this->valF['last_modification_time'] = NULL;
180 } else {
181 $this->valF['last_modification_time'] = $val['last_modification_time'];
182 }
183
184 // Si creation_time est vide, la valeur est remplacée par NULL
185 // pour eviter d'avoir une erreur de base de données car le champ est au format time.
186 if ($val['creation_time'] == "") {
187 $this->valF['creation_time'] = NULL;
188 } else {
189 $this->valF['creation_time'] = $val['creation_time'];
190 }
191 }
192
193 /**
194 *
195 * @return array
196 */
197 function get_var_sql_forminc__champs() {
198 return array(
199 "task",
200 "type",
201 "state",
202 "object_id",
203 "dossier",
204 "stream",
205 "creation_date",
206 "creation_time",
207 "CONCAT_WS(' ', to_char(task.creation_date, 'DD/MM/YYYY'), task.creation_time) AS date_creation",
208 'last_modification_date',
209 'last_modification_time',
210 "CONCAT_WS(' ', to_char(task.last_modification_date, 'DD/MM/YYYY'), task.last_modification_time) AS date_modification",
211 "comment",
212 "json_payload",
213 "timestamp_log",
214 "timestamp_log AS timestamp_log_hidden",
215 "category",
216 );
217 }
218
219 function setType(&$form, $maj) {
220 parent::setType($form, $maj);
221
222 // Récupération du mode de l'action
223 $crud = $this->get_action_crud($maj);
224
225 // ALL
226 $form->setType("category", "hidden");
227 $form->setType("timestamp_log_hidden", "hidden");
228
229 // MODE CREER
230 if ($maj == 0 || $crud == 'create') {
231 $form->setType("type", "select");
232 $form->setType("state", "select");
233 $form->setType("stream", "select");
234 $form->setType("json_payload", "textarea");
235 }
236 // MODE MODIFIER
237 if ($maj == 1 || $crud == 'update') {
238 $form->setType("task", "hiddenstatic");
239 $form->setType("state", "select");
240 $form->setType("stream", "hiddenstatic");
241 $form->setType("json_payload", "jsonprettyprint");
242 $form->setType("timestamp_log", "jsontotab");
243 $form->setType("type", "hiddenstatic");
244 $form->setType("creation_date", "hidden");
245 $form->setType("creation_time", "hidden");
246 $form->setType("object_id", "hiddenstatic");
247 $form->setType("dossier", "hiddenstatic");
248 $form->setType("date_creation", "hiddenstatic");
249 $form->setType("last_modification_date", "hidden");
250 $form->setType("last_modification_time", "hidden");
251 $form->setType("date_modification", "static");
252 }
253 // MODE CONSULTER
254 if ($maj == 3 || $crud == 'read') {
255 $form->setType("state", "selecthiddenstatic");
256 $form->setType("stream", "selecthiddenstatic");
257 $form->setType('dossier', 'link');
258 $form->setType('json_payload', 'jsonprettyprint');
259 $form->setType("type", "selecthiddenstatic");
260 $form->setType("creation_date", "hidden");
261 $form->setType("creation_time", "hidden");
262 $form->setType("date_creation", "static");
263 $form->setType("last_modification_date", "hidden");
264 $form->setType("last_modification_time", "hidden");
265 $form->setType("date_modification", "static");
266 $form->setType("timestamp_log", "jsontotab");
267 }
268 }
269
270 function stateTranslation ($currentState) {
271 switch ($currentState){
272 case "draft":
273 return __('brouillon');
274 break;
275 case "new":
276 return __('à traiter');
277 break;
278 case "pending":
279 return __('en cours');
280 break;
281 case "done":
282 return __('terminé');
283 break;
284 case "archived":
285 return __('archivé');
286 break;
287 case "error":
288 return __('erreur');
289 break;
290 case "debug":
291 return __('debug');
292 break;
293 case "canceled":
294 return __('annulé');
295 break;
296 }
297 }
298 /**
299 *
300 */
301 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
302 if($maj <= 3) {
303 $contenu = array();
304 foreach(array('DRAFT', 'NEW', 'PENDING', 'DONE', 'ERROR', 'DEBUG', 'ARCHIVED', 'CANCELED') as $key) {
305 $const_name = 'STATUS_'.$key;
306 $const_value = constant("self::$const_name");
307 $contenu[0][] = $const_value;
308
309
310 $contenu[1][] = $this->stateTranslation($const_value);
311
312 }
313
314 $form->setSelect("state", $contenu);
315
316 $contenu_stream =array();
317 $contenu_stream[0][0]="input";
318 $contenu_stream[1][0]=__('input');
319 $contenu_stream[0][1]="output";
320 $contenu_stream[1][1]=__('output');
321 $form->setSelect("stream", $contenu_stream);
322
323 $tab_type = array_unique(array_merge(self::TASK_TYPE_SI, self::TASK_TYPE_SC));
324
325 foreach ($tab_type as $type) {
326
327 $contenu_type[0][] = $type;
328
329 switch ($type) {
330 case "creation_DA":
331 $value_type = __('Création DA');
332 break;
333 case "create_DI":
334 $value_type = __('Création demande');
335 break;
336 case "creation_DI":
337 $value_type = __('Création DI');
338 break;
339 case "modification_DA":
340 $value_type = __('Modification DA');
341 break;
342 case "modification_DI":
343 $value_type = __('Modification DI');
344 break;
345 case "ajout_piece":
346 $value_type = __('Ajout pièce (sortant)');
347 break;
348 case "add_piece":
349 $value_type = __('Ajout pièce (entrant)');
350 break;
351 case "depot_DI":
352 $value_type = __('Dépôt DI');
353 break;
354 case "qualification_DI":
355 $value_type = __('Qualification DI');
356 break;
357 case "creation_consultation":
358 $value_type = __('Création consultation');
359 break;
360 case "decision_DI":
361 $value_type = __('Décision DI');
362 break;
363 case "envoi_CL":
364 $value_type = __('Envoi contrôle de légalité');
365 break;
366 case "pec_metier_consultation":
367 $value_type = __('PeC consultation');
368 break;
369 case "avis_consultation":
370 $value_type = __('Avis');
371 break;
372 case "prescription":
373 $value_type = __('Prescription');
374 break;
375 case "create_DI_for_consultation":
376 $value_type = __('Création DI pour consultation');
377 break;
378 case "create_message":
379 $value_type = __('Message');
380 break;
381 case "notification_recepisse":
382 $value_type = __('Notification récépissé');
383 break;
384 case "notification_instruction":
385 $value_type = __('Notification instruction');
386 break;
387 case "notification_decision":
388 $value_type = __('Notification décision');
389 break;
390 case "notification_service_consulte":
391 $value_type = __('Notification service consulté');
392 break;
393 case "notification_tiers_consulte":
394 $value_type = __('Notification tiers consulté');
395 break;
396 case "notification_signataire":
397 $value_type = __('Notification signataire');
398 break;
399 case "completude_DI":
400 $value_type = __('complétude DI');
401 break;
402 case "incompletude_DI":
403 $value_type = __('incomplétude DI');
404 break;
405 case "lettre_incompletude":
406 $value_type = __('Lettre au pétitionnaire d\'incompletude');
407 break;
408 case "lettre_majoration":
409 $value_type = __('Lettre au pétitionnaire de majoration');
410 break;
411 }
412
413 $contenu_type[1][] = $value_type;
414 }
415
416 $form->setselect('type', $contenu_type);
417 }
418
419 if ($maj == 3) {
420 // Récupération du numéro du dossier si il n'est pas renseigné dans la tâche
421 if ($form->val['dossier'] == '' || $form->val['dossier'] == null) {
422 // Récupération de la payload de la taĉhe.
423 // Si la tâche est une tâche input la payload est associée à la tâche.
424 // Si la tâche est une tâche en output la payload est "calculé" à l'ouverture
425 // du formulaire.
426 if ($this->getVal('stream') == 'input') {
427 $json_payload = json_decode($this->getVal('json_payload'), true);
428 } else {
429 $json_payload = json_decode($form->val['json_payload'], true);
430 }
431 // A partir de la payload de la tâche ont récupère les externals uid
432 // Si un external uid de DI (dossier) existe ont le récupère et on stocke le numéro
433 // pour l'afficher sur le formulaire.
434 // Si l'external UID du DI n'existe pas on récupère celui du DA
435 $external_uid = '';
436 if (array_key_exists('external_uids', $json_payload)
437 && array_key_exists('dossier', $json_payload['external_uids'])
438 ) {
439 $external_uid = $json_payload['external_uids']['dossier'];
440 } elseif (array_key_exists('external_uids', $json_payload)
441 && array_key_exists('demande', $json_payload['external_uids'])) {
442 $external_uid = $json_payload['external_uids']['demande'];
443 }
444 // Recherche l'external uid dans la base de données pour récupèrer le numéro de
445 // DI / DA correspondant. On stocke le numéro de dossier dans la propriété val
446 // du formulaire pour pouvoir l'afficher
447 if ($external_uid != '') {
448 $qres = $this->f->get_one_result_from_db_query(
449 sprintf(
450 'SELECT
451 lien_id_interne_uid_externe.dossier
452 FROM
453 %1$slien_id_interne_uid_externe
454 WHERE
455 lien_id_interne_uid_externe.external_uid = \'%2$s\'',
456 DB_PREFIXE,
457 $this->f->db->escapeSimple($external_uid)
458 ),
459 array(
460 "origin" => __METHOD__,
461 )
462 );
463 if (! empty($qres["result"])) {
464 $form->val['dossier'] = $qres["result"];
465 }
466 }
467 }
468
469 // Vérifie si le numéro de dossier associé à la tâche existe dans la base.
470 // Si c'est le cas ce numéro sera lié au dossier (DI ou DA) correspondant
471 // TODO : vérifier la liste des tâches lié à des DA
472 $obj_link = '';
473 if ($form->val['type'] == "creation_DA" || $form->val['type'] == "modification_DA") {
474 // Vérification que le numéro de DA affiché dans le formulaire existe
475 $qres = $this->f->get_one_result_from_db_query(
476 sprintf(
477 'SELECT
478 dossier_autorisation.dossier_autorisation
479 FROM
480 %1$sdossier_autorisation
481 WHERE
482 dossier_autorisation.dossier_autorisation = \'%2$s\'',
483 DB_PREFIXE,
484 $this->f->db->escapeSimple($form->val['dossier'])
485 ),
486 array(
487 "origin" => __METHOD__,
488 )
489 );
490 // Si on a un résultat c'est que le dossier existe, il faut afficher le lien
491 if (! empty($qres["result"])) {
492 $obj_link = 'dossier_autorisation';
493 }
494 } else {
495 // Vérification que le numéro de DI affiché dans le formulaire existe
496 $qres = $this->f->get_one_result_from_db_query(
497 sprintf(
498 'SELECT
499 dossier.dossier
500 FROM
501 %1$sdossier
502 WHERE
503 dossier.dossier = \'%2$s\'',
504 DB_PREFIXE,
505 $this->f->db->escapeSimple($form->val['dossier'])
506 ),
507 array(
508 "origin" => __METHOD__,
509 )
510 );
511 // Si on a un résultat c'est que le dossier existe, il faut afficher le lien
512 if (! empty($qres["result"])) {
513 $obj_link = 'dossier_instruction';
514 }
515 }
516 // Pour afficher le lien vers un dossier ont utilise un champ de type "link".
517 // Pour paramétrer ce champs on a besoin de savoir :
518 // - quel objet est visé par le lien
519 // - le label (libellé) du lien
520 // - l'identifiant de l'objet qui sera utilisé dans le lien
521 // - le titre associé au lien
522 // Pour cela on remplit le champs comme un select et les valeurs du select
523 // contiennent les informations nécessaire à l'affichage du champs.
524 $params = array(
525 'obj' => $obj_link,
526 'libelle' => $form->val['dossier'],
527 'title' => "Consulter le dossier",
528 'idx' => $form->val['dossier']
529 );
530 $form->setSelect("dossier", $params);
531 }
532 }
533
534 /**
535 * SETTER_FORM - setVal (setVal).
536 *
537 * @return void
538 */
539 function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
540 // parent::setVal($form, $maj, $validation);
541 //
542 if ($this->getVal('stream') == "output"
543 && ($this->getVal('state') !== self::STATUS_DONE
544 || $this->getVal('json_payload') === "{}")) {
545 //
546 $form->setVal('json_payload', $this->view_form_json(true));
547 } else {
548 $form->setVal('json_payload', json_encode(json_decode($this->getVal('json_payload'), true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
549 }
550 // Gestion du contenu de l'historique
551 if ($this->getVal('timestamp_log') !== ''
552 && $this->getVal('timestamp_log') !== null) {
553 //
554 $form->setVal('timestamp_log', $this->getVal('timestamp_log'));
555 }
556 }
557
558 function setLib(&$form, $maj) {
559 parent::setLib($form, $maj);
560
561 // Récupération du mode de l'action
562 $crud = $this->get_action_crud($maj);
563
564 $form->setLib('date_creation', __("Date de création"));
565 $form->setLib('date_modification', __("Date de dernière modification"));
566 $form->setLib('comment', __("commentaire"));
567
568 // MODE different de CREER
569 if ($maj != 0 || $crud != 'create') {
570 $form->setLib('json_payload', '');
571 $form->setLib("task", __("identifiant"));
572 $form->setLib("Task_portal", __("task_portal"));
573 $form->setLib("type", __("type"));
574 $form->setLib("object_id", __("Réf. interne"));
575 $form->setLib("stream", __("flux"));
576 $form->setLib("timestamp_log", __("Historique"));
577 }
578 }
579
580 public function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
581 $ret = parent::verifier($val, $dnu1, $dnu2);
582
583 // une tâche entrante doit avoir un type et une payload non-vide
584 if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
585 if (isset($this->valF['type']) === false) {
586 $this->correct = false;
587 $this->addToMessage(sprintf(
588 __("Le champ %s est obligatoire pour une tâche entrante."),
589 sprintf('<span class="bold">%s</span>', $this->getLibFromField('type'))
590 ));
591 $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
592 }
593 if (isset($this->valF['json_payload']) === false) {
594 $this->correct = false;
595 $this->addToMessage(sprintf(
596 __("Le champ %s est obligatoire pour une tâche entrante."),
597 sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
598 ));
599 $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
600 }
601 }
602
603 // les JSONs doivent être décodables
604 foreach(array('json_payload', 'timestamp_log') as $key) {
605 if (isset($this->valF[$key]) && ! empty($this->valF[$key]) && (
606 is_array(json_decode($this->valF[$key], true)) === false
607 || json_last_error() !== JSON_ERROR_NONE)) {
608 $this->correct = false;
609 $champ_text = sprintf('<span class="bold">%s</span>', $this->getLibFromField($key));
610 $this->addToMessage(sprintf(
611 __("Le champ %s doit être dans un format JSON valide (erreur: %s).".
612 "<p>%s valF:</br><pre>%s</pre></p>".
613 "<p>%s val:</br><pre>%s</pre></p>".
614 "<p>%s POST:</br><pre>%s</pre></p>".
615 "<p>%s submitted POST value:</br><pre>%s</pre></p>"),
616 $champ_text,
617 json_last_error() !== JSON_ERROR_NONE ? json_last_error_msg() : __('invalide'),
618 $champ_text,
619 $this->valF[$key],
620 $champ_text,
621 $val[$key],
622 $champ_text,
623 isset($_POST[$key]) ? $_POST[$key] : '',
624 $champ_text,
625 $this->f->get_submitted_post_value($key)
626 ));
627 $this->addToLog(__METHOD__.'(): erreur JSON: '.$this->msg, DEBUG_MODE);
628 }
629 }
630
631 // une tâche entrante doit avoir une payload avec les clés requises
632 if ($this->correct && (isset($this->valF['stream']) === false ||
633 $this->valF['stream'] == 'input')) {
634
635 // décode la payload JSON
636 // TODO : COMMENTER
637 $json_payload = json_decode($this->valF['json_payload'], true);
638
639 // défini une liste de chemin de clés requises
640 $paths = array();
641 if ($this->valF['category'] === PLATAU) {
642 $paths = array(
643 'external_uids/dossier'
644 );
645 }
646
647 // tâche de type création de DI/DA
648 if (isset($this->valF['type']) !== false && $this->valF['type'] == 'create_DI_for_consultation') {
649
650 $paths = array_merge($paths, array(
651 'dossier/dossier',
652 'dossier/dossier_autorisation_type_detaille_code',
653 'dossier/date_demande',
654 'dossier/depot_electronique',
655 ));
656
657 // si l'option commune est activée (mode MC)
658 if ($this->f->is_option_dossier_commune_enabled()) {
659 $paths[] = 'dossier/insee';
660 }
661
662 // présence d'un moyen d'identifier la collectivité/le service
663 if (! isset($json_payload['external_uids']['acteur']) &&
664 ! isset($json_payload['dossier']['om_collectivite'])) {
665 $this->correct = false;
666 $this->addToMessage(sprintf(
667 __("L'une des clés %s ou %s est obligatoire dans le contenu du champ %s pour une tâche entrante."),
668 sprintf('<span class="bold">%s</span>', 'external_uids/acteur'),
669 sprintf('<span class="bold">%s</span>', 'dossier/om_collectivite'),
670 sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
671 ));
672 $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
673 }
674 }
675
676 // pas d'erreur déjà trouvée
677 if($this->correct) {
678
679 // pour chaque chemin
680 foreach($paths as $path) {
681
682 // décompose le chemin
683 $tokens = explode('/', $path);
684 $cur_depth = $json_payload;
685
686 // descend au et à mesure dans l'arborescence du chemin
687 foreach($tokens as $token) {
688
689 // en vérifiant que chaque élément du chemin est défini et non-nul
690 if (isset($cur_depth[$token]) === false) {
691
692 // sinon on produit une erreur
693 $this->correct = false;
694 $this->addToMessage(sprintf(
695 __("La clé %s est obligatoire dans le contenu du champ %s pour une tâche entrante."),
696 sprintf('<span class="bold">%s</span>', $path),
697 sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
698 ));
699 $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
700 break 2;
701 }
702 $cur_depth = $cur_depth[$token];
703 }
704 }
705 }
706 }
707
708 return $ret && $this->correct;
709 }
710
711 /**
712 * [task_exists description]
713 * @param string $type [description]
714 * @param string $object_id [description]
715 * @param bool $is_not_done [description]
716 * @return [type] [description]
717 */
718 public function task_exists(string $type, string $object_id, string $dossier = null, bool $is_not_done = true) {
719 $qres = $this->f->get_one_result_from_db_query(
720 sprintf(
721 'SELECT
722 task
723 FROM
724 %1$stask
725 WHERE
726 %2$s
727 type = \'%3$s\'
728 AND (
729 object_id = \'%4$s\'
730 %5$s
731 )
732 AND state != \'%6$s\'',
733 DB_PREFIXE,
734 $is_not_done == true ? 'state != \''.self::STATUS_DONE.'\' AND' : '',
735 $type,
736 $object_id,
737 $dossier !== null ? sprintf('OR dossier = \'%s\'', $dossier) : '',
738 self::STATUS_CANCELED
739 ),
740 array(
741 "origin" => __METHOD__,
742 )
743 );
744 if ($qres["result"] !== null && $qres["result"] !== "") {
745 return $qres["result"];
746 }
747 return false;
748 }
749
750 /**
751 * Permet la recherche multi-critères des tasks.
752 *
753 * @param array $search_values Chaque entrée du tableau est une ligne dans le WHERE
754 * @return mixed Retourne le résultat de la requête ou false
755 */
756 public function task_exists_multi_search(array $search_values) {
757 $query = sprintf('
758 SELECT *
759 FROM %1$stask
760 %2$s
761 %3$s
762 ORDER BY task ASC
763 ',
764 DB_PREFIXE,
765 empty($search_values) === false ? ' WHERE ' : '',
766 implode(' AND ', $search_values)
767 );
768 $res = $this->f->get_all_results_from_db_query(
769 $query,
770 array(
771 "origin" => __METHOD__,
772 )
773 );
774 if (count($res['result']) > 0) {
775 return $res['result'];
776 }
777 return false;
778 }
779
780 /**
781 * TRIGGER - triggerajouter.
782 *
783 * @param string $id
784 * @param null &$dnu1 @deprecated Ne pas utiliser.
785 * @param array $val Tableau des valeurs brutes.
786 * @param null $dnu2 @deprecated Ne pas utiliser.
787 *
788 * @return boolean
789 */
790 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
791
792 // tâche entrante
793 if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
794
795 // décode la paylod JSON pour extraire les données métiers à ajouter
796 // en tant que métadonnées de la tâche
797 $json_payload = json_decode($this->valF['json_payload'], true);
798
799 // si la tâche possède déjà une clé dossier
800 if (isset($json_payload['dossier']['dossier']) &&
801 ! empty($json_payload['dossier']['dossier'])) {
802 $this->valF["dossier"] = $json_payload['dossier']['dossier'];
803 }
804 }
805
806 // gestion d'une tache de type notification et de category mail
807 if (isset($val['type'])
808 && (($val['type'] === 'notification_instruction' || $val['type'] === 'notification_decision')
809 && isset($val['category'])
810 && $val['category'] === 'mail')
811 || $val['type'] === 'notification_service_consulte'
812 || $val['type'] === 'notification_tiers_consulte'
813 || $val['type'] === 'notification_depot_demat'
814 || $val['type'] === 'notification_commune'
815 || $val['type'] === 'notification_signataire'
816 ) {
817 // Récupère la payload de la tache
818 $data = array();
819 $data['instruction_notification'] = $this->get_instruction_notification_data(
820 $this->valF['category'],
821 'with-id',
822 array('with-id' => $this->valF['object_id'])
823 );
824 $data['dossier'] = $this->get_dossier_data($this->valF['dossier']);
825
826 // Récupère l'instance de la notification
827 $inst_notif = $this->f->get_inst__om_dbform(array(
828 "obj" => "instruction_notification",
829 "idx" => $val['object_id'],
830 ));
831 // Envoi le mail et met à jour le suivi
832 $envoiMail = $inst_notif->send_mail_notification($data, $val['type']);
833 // Passage de la tache à done si elle a réussi et à error
834 // si l'envoi a échoué
835 $this->valF['state'] = 'done';
836 if ($envoiMail === false) {
837 $this->valF['state'] = 'error';
838 }
839 }
840 }
841
842 /**
843 * TRIGGER - triggermodifier.
844 *
845 * @param string $id
846 * @param null &$dnu1 @deprecated Ne pas utiliser.
847 * @param array $val Tableau des valeurs brutes.
848 * @param null $dnu2 @deprecated Ne pas utiliser.
849 *
850 * @return boolean
851 */
852 function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
853 parent::triggermodifier($id, $dnu1, $val, $dnu2);
854 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
855
856 // Mise à jour des valeurs, notamment du timestamp_log en fonction de plusieurs critères
857 $values = array(
858 'state' => $this->valF['state'],
859 'object_id' => $this->valF['object_id'],
860 'comment' => $this->valF['comment'],
861 );
862 $new_values = $this->set_values_for_update($values);
863 if ($new_values === false) {
864 $this->addToLog(__METHOD__."(): erreur timestamp log", DEBUG_MODE);
865 return false;
866 }
867
868 // Mise à jour des valeurs
869 $this->valF['timestamp_log'] = $new_values['timestamp_log'];
870 $this->valF['state'] = $new_values['state'];
871 $this->valF['object_id'] = $new_values['object_id'];
872 $this->valF['last_modification_date'] = date('Y-m-d');
873 $this->valF['last_modification_time'] = date('H:i:s');
874 if ($val['stream'] === 'output') {
875 // Lorsque la task passe d'un état qui n'est pas "done" à l'état "done"
876 if ($this->getVal("state") !== self::STATUS_DONE
877 && $this->valF['state'] === self::STATUS_DONE) {
878 //
879 $this->valF['json_payload'] = $this->view_form_json(true);
880 }
881 // Lorsque la task passe d'un état "done" à un état qui n'est pas "done"
882 if ($this->getVal("state") === self::STATUS_DONE
883 && $this->valF['state'] !== self::STATUS_DONE) {
884 //
885 $this->valF['json_payload'] = "{}";
886 }
887 }
888
889 return true;
890 }
891
892
893 /**
894 * Applique nouvelle valeur après traitement.
895 *
896 * @param array $params Tableau des valeurs en entrées
897 * @return array Tableau des valeurs en sorties
898 */
899 public function set_values_for_update($params = array()) {
900
901 // Récupération du timestamp_log existant
902 $timestamp_log = $this->get_timestamp_log();
903 if ($timestamp_log === false) {
904 return false;
905 }
906
907 // Vérification des object_id précédent en cas de tentative d'appliquer
908 // l'état CANCELED sur la tâche
909 if (isset($params['state']) === true
910 && $params['state'] === self::STATUS_CANCELED) {
911 // Récupération du journal d'activité de la tâche sous forme de tableau
912 // trié par ordre décroissant
913 $log = $timestamp_log;
914 krsort($log);
915 // Pour chaque entrée dans le journal d'activité de la tâche :
916 // - vérification de la présence de l'object_id précédent
917 // - vérification que l'object_id précédent existe toujours dans la base de données
918 // - l'object_id est mise à jour avec la valeur de l'object_id précédent
919 // - le state n'est pas modifié
920 // - sortie du traitement dès que le premier object_id précédent existant est trouvé
921 // - si aucun object_id précédent existant n'est trouvé alors ni le state, ni l'object_id n'est modifiés
922 foreach ($log as $key => $value) {
923 //
924 if (isset($value['prev_object_id']) === true
925 && $this->getVal('object_id') !== $value['prev_object_id']) {
926 // Récupère la liste des tables potentielles pour un type de tâche
927 $tables = $this->get_tables_by_task_type($this->getVal('type'), $this->getVal('stream'));
928 foreach ($tables as $table) {
929 // Vérifie s'il y a un ou aucun résultat
930 $qres = $this->f->get_one_result_from_db_query(
931 sprintf(
932 'SELECT
933 COUNT(%2$s)
934 FROM
935 %1$s%2$s
936 WHERE
937 %2$s::CHARACTER VARYING = \'%3$s\'',
938 DB_PREFIXE,
939 $table,
940 $value['prev_object_id']
941 ),
942 array(
943 "origin" => __METHOD__,
944 "force_return" => true,
945 )
946 );
947 if ($qres["code"] !== "OK") {
948 return $this->end_treatment(__METHOD__, false);
949 }
950 // Affectation des valeurs et sortie de la boucle
951 if ($qres["result"] == '1') {
952 $params['object_id'] = $value['prev_object_id'];
953 $params['state'] = $this->getVal('state');
954 break;
955 }
956 }
957 // Sortie de la boucle si les valeurs sont affectées
958 if ($params['object_id'] !== null
959 && $params['object_id'] === $value['prev_object_id']) {
960 //
961 break;
962 }
963 }
964 }
965 }
966
967 // Mise à jour du journal d'activité de la tâche
968 array_push($timestamp_log, array(
969 'modification_date' => date('Y-m-d H:i:s'),
970 'object_id' => $params['object_id'] !== null ? $params['object_id'] : $this->getVal('object_id'),
971 'prev_object_id' => $this->getVal('object_id'),
972 'state' => $params['state'],
973 'prev_state' => $this->getVal('state'),
974 'comment' => isset($params['comment']) ? $params['comment'] : $this->getVal('comment'),
975 ));
976 //
977 $timestamp_log = json_encode($timestamp_log);
978
979
980 // Les nouvelles valeurs après vérification des critères
981 $result = array(
982 'timestamp_log' => $timestamp_log,
983 'object_id' => $params['object_id'],
984 'state' => $params['state'],
985 'comment' => $params['comment'],
986 );
987 return $result;
988 }
989
990
991 /**
992 * TRIGGER - triggermodifierapres.
993 *
994 * @param string $id
995 * @param null &$dnu1 @deprecated Ne pas utiliser.
996 * @param array $val Tableau des valeurs brutes.
997 * @param null $dnu2 @deprecated Ne pas utiliser.
998 *
999 * @return boolean
1000 */
1001 public function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1002 parent::triggermodifierapres($id, $dnu1, $val, $dnu2);
1003
1004 // Suivi des notificiations
1005 // En cas de changement de l'état de la tâche de notification, alors
1006 // le suivi des dates de la notification et de l'instruction, est effectué
1007 if (isset($val['category']) === true
1008 && $val['category'] === PORTAL
1009 && isset($val['type']) === true
1010 && ($val['type'] === 'notification_recepisse'
1011 || $val['type'] === 'notification_instruction'
1012 || $val['type'] === 'notification_decision'
1013 || $val['type'] === 'notification_service_consulte'
1014 || $val['type'] === 'notification_tiers_consulte')) {
1015 //
1016 if (isset($this->valF['state']) === true
1017 && $this->valF['state'] !== $this->getVal('state')
1018 && $this->valF['state'] !== self::STATUS_CANCELED) {
1019 //
1020 $inst_in = $this->f->get_inst__om_dbform(array(
1021 "obj" => "instruction_notification",
1022 "idx" => $val['object_id'],
1023 ));
1024 $valF_in = array();
1025 foreach ($inst_in->champs as $champ) {
1026 $valF_in[$champ] = $inst_in->getVal($champ);
1027 }
1028 // Par défaut la date d'envoi et la date de premier accès sur
1029 // la notification ne sont pas renseignées
1030 $valF_in['date_envoi'] = null;
1031 $valF_in['date_premier_acces'] = null;
1032 // Lorsque la tâche est correctement traitée
1033 if ($this->valF['state'] === self::STATUS_DONE) {
1034 //
1035 $valF_in['statut'] = __("envoyé");
1036 $valF_in['commentaire'] = __("Notification traitée");
1037 $valF_in['date_envoi'] = date('d/m/Y H:i:s');
1038 // Si l'instruction possède un document lié, alors ses dates
1039 // de suivi sont mises à jour
1040 $inst_instruction = $this->f->get_inst__om_dbform(array(
1041 "obj" => "instruction",
1042 "idx" => $inst_in->getVal('instruction'),
1043 ));
1044 if ($inst_instruction->has_an_edition() === true) {
1045 $valF_instruction = array();
1046 foreach ($inst_instruction->champs as $champ) {
1047 $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1048 }
1049 $valF_instruction['date_envoi_rar'] = date('d/m/Y');
1050 $valF_instruction['date_retour_rar'] = date('d/m/Y', strtotime('now + 1 day'));
1051 // Action spécifique pour identifier que la modification
1052 // est une notification de demandeur
1053 $inst_instruction->setParameter('maj', 175);
1054 $update_instruction = $inst_instruction->modifier($valF_instruction);
1055 if ($update_instruction === false) {
1056 $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, DEBUG_MODE);
1057 return false;
1058 }
1059 }
1060 }
1061 // En cas d'erreur lors du traitement de la task
1062 if ($this->valF['state'] === self::STATUS_ERROR) {
1063 $valF_in['statut'] = __("échec");
1064 $valF_in['commentaire'] = __("Le traitement de la notification a échoué");
1065 }
1066 // Met à jour la notification
1067 $inst_in->setParameter('maj', 1);
1068 $update_in = $inst_in->modifier($valF_in);
1069 if ($update_in === false) {
1070 $this->addToLog(__METHOD__."(): ".$inst_in->msg, DEBUG_MODE);
1071 return false;
1072 }
1073 }
1074 }
1075
1076 // Envoi au contrôle de légalité
1077 // En cas de changement de l'état de la tâche envoi_CL, alors le suivi
1078 // des dates de l'instruction est effectué
1079 if ($val['type'] === 'envoi_CL'
1080 && isset($this->valF['state']) === true
1081 && $this->valF['state'] === self::STATUS_DONE) {
1082 //
1083 $inst_instruction = $this->f->get_inst__om_dbform(array(
1084 "obj" => "instruction",
1085 "idx" => $this->getVal('object_id'),
1086 ));
1087 if ($inst_instruction->has_an_edition() === true) {
1088 $valF_instruction = array();
1089 foreach ($inst_instruction->champs as $champ) {
1090 $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1091 }
1092 }
1093 $valF_instruction['date_envoi_controle_legalite'] = date("Y-m-d");
1094 $inst_instruction->setParameter('maj', 1);
1095 $update_instruction = $inst_instruction->modifier($valF_instruction);
1096 if ($update_instruction === false) {
1097 $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, DEBUG_MODE);
1098 return false;
1099 }
1100 }
1101
1102 //
1103 return true;
1104 }
1105
1106 /**
1107 * TREATMENT - add_task
1108 * Ajoute un enregistrement.
1109 *
1110 * @param array $params Tableau des paramètres
1111 * @return boolean
1112 */
1113 public function add_task($params = array()) {
1114 $this->begin_treatment(__METHOD__);
1115
1116 // Vérifie si la task doit être ajoutée en fonction du mode de l'application,
1117 // seulement pour les tasks output
1118 $task_types_si = self::TASK_TYPE_SI;
1119 $task_types_sc = self::TASK_TYPE_SC;
1120 $stream = isset($params['val']['stream']) === true ? $params['val']['stream'] : 'output';
1121 if ($stream === 'output'
1122 && isset($params['val']['type']) === true
1123 && $this->f->is_option_mode_service_consulte_enabled() === true
1124 && in_array($params['val']['type'], $task_types_sc) === false) {
1125 //
1126 return $this->end_treatment(__METHOD__, true);
1127 }
1128 if ($stream === 'output'
1129 && isset($params['val']['type']) === true
1130 && $this->f->is_option_mode_service_consulte_enabled() === false
1131 && in_array($params['val']['type'], $task_types_si) === false) {
1132 //
1133 return $this->end_treatment(__METHOD__, true);
1134 }
1135
1136 //
1137 $timestamp_log = json_encode(array());
1138
1139 //
1140 $category = isset($params['val']['category']) === true ? $params['val']['category'] : $this->category;
1141
1142 // Si la tâche est de type ajout_piece et de stream input alors on ajoute le fichier
1143 // et on ajoute l'uid dans le champ json_payload avant l'ajout de la tâche
1144 if (isset($params['val']['type'])
1145 && in_array($params['val']['type'], self::TASK_WITH_DOCUMENT)
1146 && isset($params['val']['stream'])
1147 && $params['val']['stream'] == "input" ) {
1148 //
1149 $json_payload = json_decode($params['val']['json_payload'], true);
1150 if (json_last_error() !== JSON_ERROR_NONE) {
1151 $this->addToMessage(__("Le contenu JSON de la tâche n'est pas valide."));
1152 return $this->end_treatment(__METHOD__, false);
1153 }
1154 if (isset($json_payload['document_numerise']["file_content"]) === true
1155 && empty($json_payload['document_numerise']["file_content"]) === false) {
1156 //
1157 $document_numerise = $json_payload['document_numerise'];
1158 $file_content = base64_decode($document_numerise["file_content"]);
1159 if ($file_content === false){
1160 $this->addToMessage(__("Le contenu du fichier lié à la tâche n'a pas pu etre recupere."));
1161 return $this->end_treatment(__METHOD__, false);
1162 }
1163 $metadata = array(
1164 "filename" => $document_numerise['nom_fichier'],
1165 "size" => strlen($file_content),
1166 "mimetype" => $document_numerise['file_content_type'],
1167 "date_creation" => isset($document_numerise['date_creation']) === true ? $document_numerise['date_creation'] : date("Y-m-d"),
1168 );
1169 $uid_fichier = $this->f->storage->create($file_content, $metadata, "from_content", "task.uid_fichier");
1170 if ($uid_fichier === OP_FAILURE) {
1171 $this->addToMessage(__("Erreur lors de la creation du fichier lié à la tâche."));
1172 return $this->end_treatment(__METHOD__, false);
1173 }
1174 $json_payload["document_numerise"]["uid"] = $uid_fichier;
1175 // Le fichier a été ajouté nous n'avons plus besoin du champ file_content dans la payload
1176 unset($json_payload["document_numerise"]["file_content"]);
1177 $params['val']['json_payload'] = json_encode($json_payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
1178 }
1179 }
1180
1181 // Valeurs de la tâche
1182 $valF = array(
1183 'task' => '',
1184 'type' => $params['val']['type'],
1185 'timestamp_log' => $timestamp_log,
1186 'state' => isset($params['val']['state']) === true ? $params['val']['state'] : self::STATUS_NEW,
1187 'object_id' => isset($params['val']['object_id']) ? $params['val']['object_id'] : '',
1188 'dossier' => isset($params['val']['dossier']) ? $params['val']['dossier'] : '',
1189 'stream' => $stream,
1190 'json_payload' => isset($params['val']['json_payload']) === true ? $params['val']['json_payload'] : '{}',
1191 'category' => $category,
1192 'creation_date' => date('Y-m-d'),
1193 'creation_time' => date('H:i:s'),
1194 'last_modification_date' => null,
1195 'last_modification_time' => null,
1196 'comment' => null,
1197 );
1198
1199 // Gestion de la mise à jour des tâches sortantes
1200 $typeNonConcerne = array(
1201 'notification_recepisse',
1202 'notification_instruction',
1203 'notification_decision',
1204 'notification_service_consulte',
1205 'notification_tiers_consulte',
1206 'notification_signataire'
1207 );
1208 if ($valF["stream"] == "output"
1209 && ! in_array($valF['type'], $typeNonConcerne)) {
1210 // Vérification de l'existance d'une tâche pour l'objet concerné
1211 // La vérification diffère en fonction de certains types de tâche
1212 $search_values_common = array(
1213 sprintf('state != \'%s\'', self::STATUS_CANCELED),
1214 sprintf('state != \'%s\'', self::STATUS_DONE),
1215 );
1216 $search_values_others = array(
1217 sprintf('type = \'%s\'', $valF['type']),
1218 sprintf('(object_id = \'%s\' OR dossier = \'%s\')', $valF['object_id'], $valF['dossier']),
1219 );
1220 $search_values_specifics = array(
1221 sprintf('object_id = \'%s\'', $valF['object_id']),
1222 );
1223
1224 // Recherche multi-critères sur les tâches
1225 // Si l'object id/dossier à des tâches de type $valF['type'] qui lui est associé
1226 // Et que ces tâches ont des statut différents de canceled et done
1227 // Alors on récupère ces tâches
1228 // Sinon return false
1229 $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_others));
1230
1231 // S'il n'existe pas de tâche de type 'modification DI' pour l'object id/dossier
1232 if ($valF['type'] === 'modification_DI' && $task_exists === false) {
1233 // On se réfère à la tâche de type 'creation DI' de l'object id
1234 $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = 'creation_DI'")));
1235 }
1236 // S'il n'existe pas de tâche de type 'modification DA' pour l'object id/dossier
1237 if ($valF['type'] === 'modification_DA' && $task_exists === false) {
1238 // On se réfère à la tâche de type 'creation DA' de l'object id
1239 $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = 'creation_DA'")));
1240 }
1241 if ($valF['type'] === 'ajout_piece') {
1242 // On se réfère à la tâche de type 'ajout piece' de l'object id
1243 $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = 'ajout_piece'")));
1244 }
1245 if ($valF['type'] === 'creation_consultation') {
1246 // On se réfère à la tâche de type 'creation consultation' de l'object id
1247 $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = 'creation_consultation'")));
1248 }
1249 // S'il existe une tâche pour l'objet concerné, pas d'ajout de nouvelle
1250 // tâche mais mise à jour de l'existante
1251 if ($task_exists !== false) {
1252 // Plusieurs tâches pourraient exister, elles sont contôler par ordre croissant
1253 foreach ($task_exists as $task) {
1254 $inst_task = $this->f->get_inst__om_dbform(array(
1255 "obj" => "task",
1256 "idx" => $task['task'],
1257 ));
1258 $update_state = $inst_task->getVal('state');
1259 if (isset($params['update_val']['state']) === true) {
1260 $update_state = $params['update_val']['state'];
1261 }
1262 $object_id = $inst_task->getVal('object_id');
1263 if (!empty($valF['object_id'])) {
1264 $object_id = $valF['object_id'];
1265 }
1266 // Pour être mise à jour, la tâche existante ne doit pas être en cours de traitement
1267 $task_pending = $inst_task->getVal('state') === self::STATUS_PENDING
1268 && $update_state === self::STATUS_PENDING
1269 && $inst_task->getVal('object_id') !== $object_id;
1270 if ($task_pending === false) {
1271 $update_params = array(
1272 'val' => array(
1273 'state' => $update_state,
1274 ),
1275 'object_id' => $object_id,
1276 );
1277 return $inst_task->update_task($update_params);
1278 }
1279 }
1280 }
1281 }
1282 $add = $this->ajouter($valF);
1283 $this->addToLog(__METHOD__."(): retour de l'ajout de tâche: ".var_export($add, true), VERBOSE_MODE);
1284 if ($add === false) {
1285 $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
1286 return $this->end_treatment(__METHOD__, false);
1287 }
1288 return $this->end_treatment(__METHOD__, true);
1289 }
1290
1291 /**
1292 * TREATMENT - update_task
1293 * Met à jour l'enregistrement instancié.
1294 *
1295 * @param array $params Tableau des paramètres
1296 * @return boolean
1297 */
1298 public function update_task($params = array()) {
1299 $this->begin_treatment(__METHOD__);
1300
1301 // Mise à jour de la tâche
1302 $valF = array(
1303 'task' => $this->getVal($this->clePrimaire),
1304 'type' => $this->getVal('type'),
1305 'timestamp_log' => '[]',
1306 'state' => $params['val']['state'],
1307 'object_id' => isset($params['object_id']) == true ? $params['object_id'] : $this->getVal('object_id'),
1308 'stream' => $this->getVal('stream'),
1309 'dossier' => $this->getVal('dossier'),
1310 'json_payload' => $this->getVal('json_payload'),
1311 'category' => $this->getVal('category'),
1312 'creation_date' => $this->getVal('creation_date'),
1313 'creation_time' => $this->getVal('creation_time'),
1314 'last_modification_date' => date('Y-m-d'),
1315 'last_modification_time' => date('H:i:s'),
1316 'comment' => isset($params['comment']) == true ? $params['comment'] : $this->getVal('comment'),
1317 );
1318 $update = $this->modifier($valF);
1319 if ($update === false) {
1320 $this->addToLog($this->msg, DEBUG_MODE);
1321 return $this->end_treatment(__METHOD__, false);
1322 }
1323 return $this->end_treatment(__METHOD__, true);
1324 }
1325
1326 /**
1327 * Récupère le journal d'horodatage dans le champ timestamp_log de
1328 * l'enregistrement instancié.
1329 *
1330 * @param array $params Tableau des paramètres
1331 * @return array sinon false en cas d'erreur
1332 */
1333 protected function get_timestamp_log($params = array()) {
1334 $val = $this->getVal('timestamp_log');
1335 if ($val === '') {
1336 $val = json_encode(array());
1337 }
1338 if($this->isJson($val) === false) {
1339 return false;
1340 }
1341 return json_decode($val, true);
1342 }
1343
1344 /**
1345 * VIEW - view_json_data
1346 * Affiche l'enregistrement dans le format JSON.
1347 *
1348 * @return void
1349 */
1350 public function view_json_data() {
1351 $this->checkAccessibility();
1352 $this->f->disableLog();
1353 if ($this->getParameter('idx') !== ']'
1354 && $this->getParameter('idx') !== '0') {
1355 //
1356 $this->view_form_json();
1357 }
1358 else {
1359 $this->view_tab_json();
1360 }
1361 }
1362
1363 protected function view_tab_json() {
1364 $where = '';
1365 $category = null;
1366 // Liste des paramètres possibles pour la recherche des tâches
1367 $params = array(
1368 'task',
1369 'type',
1370 'state',
1371 'object_id',
1372 'dossier',
1373 'stream',
1374 'category',
1375 'lien_id_interne_uid_externe',
1376 'object',
1377 'external_uid',
1378 );
1379 // Pour chaque paramètre possible, vérification de son existance et de sa
1380 // valeur pour compléter la requête de recherche
1381 foreach ($params as $param) {
1382 //
1383 if ($this->f->get_submitted_get_value($param) !== null
1384 && $this->f->get_submitted_get_value($param) !== '') {
1385 // Condition spécifique au champ 'category'
1386 if ($param === 'category') {
1387 $category = $this->f->get_submitted_get_value('category');
1388 }
1389 //
1390 $where_or_and = 'WHERE';
1391 if ($where !== '') {
1392 $where_or_and = 'AND';
1393 }
1394 $table = 'task';
1395 if ($param === 'lien_id_interne_uid_externe'
1396 || $param === 'object'
1397 || $param === 'external_uid') {
1398 //
1399 $table = 'lien_id_interne_uid_externe';
1400 }
1401 $where .= sprintf(' %s %s.%s = \'%s\' ', $where_or_and, $table, $param, $this->f->get_submitted_get_value($param));
1402 }
1403 }
1404 //
1405 $query = sprintf('
1406 SELECT
1407 task.*
1408 FROM %1$stask
1409 LEFT JOIN %1$slien_id_interne_uid_externe
1410 ON task.object_id = lien_id_interne_uid_externe.object_id
1411 AND task.category = lien_id_interne_uid_externe.category
1412 %2$s
1413 ORDER BY task ASC
1414 ',
1415 DB_PREFIXE,
1416 $where
1417 );
1418 $res = $this->f->get_all_results_from_db_query(
1419 $query,
1420 array(
1421 "origin" => __METHOD__,
1422 "force_return" => true,
1423 )
1424 );
1425 if ($res['code'] === 'KO') {
1426 return false;
1427 }
1428 $list_tasks = array();
1429 foreach ($res['result'] as $task) {
1430 unset($task['timestamp_log']);
1431 unset($task['json_payload']);
1432 if ($task['type'] === 'ajout_piece') {
1433 $val_dn = $this->get_document_numerise_data($task['object_id']);
1434 }
1435 if ($task['stream'] === 'output') {
1436 $task['external_uids'] = array_merge(
1437 $this->get_all_external_uids($task['dossier'], array(), $category !== null ? $category : $task['category']),
1438 $this->get_all_external_uids($task['object_id'], array(), $category !== null ? $category : $task['category'])
1439 );
1440 }
1441 $list_tasks[$task['task']] = $task;
1442 }
1443 echo(json_encode($list_tasks));
1444 }
1445
1446 protected function get_dossier_data(string $dossier) {
1447 $val_di = array();
1448 $inst_di = $this->f->get_inst__om_dbform(array(
1449 "obj" => "dossier",
1450 "idx" => $dossier,
1451 ));
1452 if (empty($inst_di->val) === true) {
1453 return $val_di;
1454 }
1455 $val_di = $inst_di->get_json_data();
1456 if ($val_di['dossier_instruction_type_code'] === 'T') {
1457 $val_di['date_decision_transfert'] = $val_di['date_decision'];
1458 }
1459 unset($val_di['initial_dt']);
1460 unset($val_di['log_instructions']);
1461 return $val_di;
1462 }
1463
1464 protected function get_dossier_autorisation_data(string $da) {
1465 $val_da = array();
1466 $inst_da = $this->f->get_inst__om_dbform(array(
1467 "obj" => "dossier_autorisation",
1468 "idx" => $da,
1469 ));
1470 $val_da = $inst_da->get_json_data();
1471 return $val_da;
1472 }
1473
1474 protected function get_donnees_techniques_data(string $fk_idx, string $fk_field) {
1475 $val_dt = array();
1476 $inst_dt = $this->f->get_inst__by_other_idx(array(
1477 "obj" => "donnees_techniques",
1478 "fk_field" => $fk_field,
1479 "fk_idx" => $fk_idx,
1480 ));
1481 $val_dt = array(
1482 'donnees_techniques' => $inst_dt->getVal($inst_dt->clePrimaire),
1483 'cerfa' => $inst_dt->getVal('cerfa'),
1484 );
1485 $val_dt = array_merge($val_dt, $inst_dt->get_donnees_techniques_applicables());
1486 if (isset($val_dt['am_exist_date']) === true) {
1487 $val_dt['am_exist_date_num'] = '';
1488 if (is_numeric($val_dt['am_exist_date']) === true) {
1489 $val_dt['am_exist_date_num'] = $val_dt['am_exist_date'];
1490 }
1491 }
1492 // Correspond à la nomenclature de Plat'AU STATUT_INFO
1493 $val_dt['tax_statut_info'] = 'Déclaré';
1494 //
1495 if ($inst_dt->is_tab_surf_ssdest_enabled() === true) {
1496 $fields_tab_surf_dest = $inst_dt->get_fields_tab_surf_dest();
1497 foreach ($fields_tab_surf_dest as $field) {
1498 if (isset($val_dt[$field]) === true) {
1499 unset($val_dt[$field]);
1500 }
1501 }
1502 } else {
1503 $fields_tab_surf_ssdest = $inst_dt->get_fields_tab_surf_ssdest();
1504 foreach ($fields_tab_surf_ssdest as $field) {
1505 if (isset($val_dt[$field]) === true) {
1506 unset($val_dt[$field]);
1507 }
1508 }
1509 }
1510 // Correspond à la nouvelle ligne CERFA v7 dans le DENSI imposition 1.2.3
1511 if (isset($val_dt['tax_su_non_habit_surf2']) === true
1512 && isset($val_dt['tax_su_non_habit_surf3']) === true
1513 && (($val_dt['tax_su_non_habit_surf2'] !== null
1514 && $val_dt['tax_su_non_habit_surf2'] !== '')
1515 || ($val_dt['tax_su_non_habit_surf3'] !== null
1516 && $val_dt['tax_su_non_habit_surf3'] !== ''))) {
1517 //
1518 $val_dt['tax_su_non_habit_surf8'] = intval($val_dt['tax_su_non_habit_surf2']) + intval($val_dt['tax_su_non_habit_surf3']);
1519 }
1520 if (isset($val_dt['tax_su_non_habit_surf_stat2']) === true
1521 && isset($val_dt['tax_su_non_habit_surf_stat3']) === true
1522 && (($val_dt['tax_su_non_habit_surf_stat2'] !== null
1523 && $val_dt['tax_su_non_habit_surf_stat2'] !== '')
1524 || ($val_dt['tax_su_non_habit_surf_stat3'] !== null
1525 && $val_dt['tax_su_non_habit_surf_stat3'] !== ''))) {
1526 //
1527 $val_dt['tax_su_non_habit_surf_stat8'] = intval($val_dt['tax_su_non_habit_surf_stat2']) + intval($val_dt['tax_su_non_habit_surf_stat3']);
1528 }
1529 // Cas particulier d'un projet réduit à l'extension d'une habitation existante
1530 $particular_case = false;
1531 $fields_tab_crea_loc_hab = $inst_dt->get_fields_tab_crea_loc_hab();
1532 foreach ($fields_tab_crea_loc_hab as $field) {
1533 if (isset($val_dt[$field]) === false
1534 || (isset($val_dt[$field]) === true
1535 && ($val_dt[$field] === null
1536 || $val_dt[$field] === ''))) {
1537 //
1538 $particular_case = true;
1539 }
1540 }
1541 if ($particular_case === true) {
1542 if (isset($val_dt['tax_ext_pret']) === true
1543 && $val_dt['tax_ext_pret'] === 'f') {
1544 //
1545 $val_dt['tax_su_princ_surf1'] = isset($val_dt['tax_surf_tot_cstr']) === true ? $val_dt['tax_surf_tot_cstr'] : '';
1546 $val_dt['tax_su_princ_surf_stat1'] = isset($val_dt['tax_surf_loc_stat']) === true ? $val_dt['tax_surf_loc_stat'] : '';
1547 }
1548 if (isset($val_dt['tax_ext_pret']) === true
1549 && $val_dt['tax_ext_pret'] === 't') {
1550 //
1551 if (isset($val_dt['tax_ext_desc']) === true) {
1552 if (preg_match('/[pP].*[lL].*[aA].*[iI]/', $val_dt['tax_ext_desc']) === 1
1553 || preg_match('/[lL].*[lL].*[tT].*[sS]/', $val_dt['tax_ext_desc']) === 1) {
1554 //
1555 $val_dt['tax_su_princ_surf2'] = isset($val_dt['tax_surf_tot_cstr']) === true ? $val_dt['tax_surf_tot_cstr'] : '';
1556 $val_dt['tax_su_princ_surf_stat2'] = isset($val_dt['tax_surf_loc_stat']) === true ? $val_dt['tax_surf_loc_stat'] : '';
1557 }
1558 // if (preg_match('/[pP].*[tT].*[zZ]/', $val_dt['tax_ext_desc']) === 1) {
1559 // $val_dt['tax_su_princ_surf4'] = $val_dt['tax_surf_tot_cstr'];
1560 // $val_dt['tax_su_princ_surf_stat4'] = $val_dt['tax_surf_loc_stat'];
1561 // }
1562 // if (preg_match('/[pP].*[lL].*[uU].*[sS]/', $val_dt['tax_ext_desc']) === 1
1563 // || preg_match('/[lL].*[eE].*[sS]/', $val_dt['tax_ext_desc']) === 1
1564 // || preg_match('/[pP].*[sS].*[lL].*[aA]/', $val_dt['tax_ext_desc']) === 1
1565 // || preg_match('/[pP].*[lL].*[sS]/', $val_dt['tax_ext_desc']) === 1
1566 // || preg_match('/[lL].*[lL].*[sS]/', $val_dt['tax_ext_desc']) === 1) {
1567 // //
1568 // $val_dt['tax_su_princ_surf3'] = $val_dt['tax_surf_tot_cstr'];
1569 // $val_dt['tax_su_princ_surf_stat3'] = $val_dt['tax_surf_loc_stat'];
1570 // }
1571 }
1572 }
1573 }
1574 // Cas particulier de la surface taxable démolie
1575 if (isset($val_dt['tax_surf_tot_demo']) === true
1576 && isset($val_dt['tax_surf_tax_demo']) === true
1577 && ($val_dt['tax_surf_tot_demo'] === null
1578 || $val_dt['tax_surf_tot_demo'] === '')) {
1579 //
1580 $val_dt['tax_surf_tot_demo'] = $val_dt['tax_surf_tax_demo'];
1581 }
1582 return $val_dt;
1583 }
1584
1585 /**
1586 * Récupère la liste des objets distincts existants dans la table des liens
1587 * entre identifiants internes et identifiants externes.
1588 *
1589 * @return array
1590 */
1591 protected function get_list_distinct_objects_external_link() {
1592 $query = sprintf('
1593 SELECT
1594 DISTINCT(object)
1595 FROM %1$slien_id_interne_uid_externe
1596 ORDER BY object ASC
1597 ',
1598 DB_PREFIXE
1599 );
1600 $res = $this->f->get_all_results_from_db_query(
1601 $query,
1602 array(
1603 "origin" => __METHOD__,
1604 "force_return" => true,
1605 )
1606 );
1607 if ($res['code'] === 'KO') {
1608 return array();
1609 }
1610 $result = array();
1611 foreach ($res['result'] as $object) {
1612 $result[] = $object['object'];
1613 }
1614 return $result;
1615 }
1616
1617 protected function get_external_uid($fk_idx, string $fk_idx_2, $fk_idx_3 = PLATAU, $order_asc_desc = 'DESC') {
1618 $inst_external_uid = $this->f->get_inst__by_other_idx(array(
1619 "obj" => "lien_id_interne_uid_externe",
1620 "fk_field" => 'object_id',
1621 "fk_idx" => $fk_idx,
1622 "fk_field_2" => 'object',
1623 "fk_idx_2" => $fk_idx_2,
1624 "fk_field_3" => 'category',
1625 "fk_idx_3" => $fk_idx_3,
1626 "order_field" => 'lien_id_interne_uid_externe',
1627 "order_asc_desc" => $order_asc_desc,
1628 ));
1629 return $inst_external_uid->getVal('external_uid');
1630 }
1631
1632 protected function get_all_external_uids($fk_idx, $link_objects = array(), $category=PLATAU) {
1633 if (count($link_objects) == 0) {
1634 $link_objects = $this->get_list_distinct_objects_external_link();
1635 }
1636 $val_external_uid = array();
1637 foreach ($link_objects as $link_object) {
1638 $external_uid = $this->get_external_uid($fk_idx, $link_object, $category);
1639 if ($external_uid !== '' && $external_uid !== null) {
1640 $val_external_uid[$link_object] = $external_uid;
1641 }
1642 }
1643 return $val_external_uid;
1644 }
1645
1646 protected function get_demandeurs_data($dossier) {
1647 $val_demandeur = array();
1648 if ($dossier === null) {
1649 return $val_demandeur;
1650 }
1651 $inst_di = $this->f->get_inst__om_dbform(array(
1652 "obj" => "dossier",
1653 "idx" => $dossier,
1654 ));
1655 $list_demandeurs = $inst_di->get_demandeurs();
1656 foreach ($list_demandeurs as $demandeur) {
1657 $inst_demandeur = $this->f->get_inst__om_dbform(array(
1658 "obj" => "demandeur",
1659 "idx" => $demandeur['demandeur'],
1660 ));
1661 $val_demandeur[$demandeur['demandeur']] = $inst_demandeur->get_json_data();
1662 $val_demandeur[$demandeur['demandeur']]['petitionnaire_principal'] = $demandeur['petitionnaire_principal'];
1663 }
1664 return $val_demandeur;
1665 }
1666
1667 protected function get_architecte_data($architecte = null) {
1668 $val_architecte = null;
1669 if ($architecte !== null
1670 && $architecte !== '') {
1671 //
1672 $inst_architecte = $this->f->get_inst__om_dbform(array(
1673 "obj" => "architecte",
1674 "idx" => $architecte,
1675 ));
1676 $val_architecte = $inst_architecte->get_json_data();
1677 }
1678 return $val_architecte;
1679 }
1680
1681 protected function get_instruction_data($dossier, $type = 'decision', $extra_params = array()) {
1682 $val_instruction = null;
1683 if ($dossier === null) {
1684 return $val_instruction;
1685 }
1686 $instruction_with_doc = null;
1687 $inst_di = $this->f->get_inst__om_dbform(array(
1688 "obj" => "dossier",
1689 "idx" => $dossier,
1690 ));
1691 $idx = null;
1692 if ($type === 'decision') {
1693 $idx = $inst_di->get_last_instruction_decision();
1694 }
1695 if ($type === 'incompletude') {
1696 $idx = $inst_di->get_last_instruction_incompletude();
1697 }
1698 // XXX Permet de récupérer l'instruction par son identifiant
1699 if ($type === 'with-id') {
1700 $idx = $extra_params['with-id'];
1701 }
1702 $inst_instruction = $this->f->get_inst__om_dbform(array(
1703 "obj" => "instruction",
1704 "idx" => $idx,
1705 ));
1706 if (count($inst_instruction->val) > 0) {
1707 $val_instruction = array();
1708 $instruction_data = $inst_instruction->get_json_data();
1709 $val_instruction = $this->sort_instruction_data($instruction_data, $val_instruction);
1710 if ($instruction_data['om_fichier_instruction'] !== null
1711 && $instruction_data['om_fichier_instruction'] !== '') {
1712 //
1713 $instruction_with_doc = $inst_instruction->getVal($inst_instruction->clePrimaire);
1714 }
1715 $inst_ev = $this->f->get_inst__om_dbform(array(
1716 "obj" => "evenement",
1717 "idx" => $inst_instruction->getVal('evenement'),
1718 ));
1719 if ($inst_ev->getVal('retour') === 't') {
1720 $instructions_related = $inst_instruction->get_related_instructions();
1721 foreach ($instructions_related as $instruction) {
1722 if ($instruction !== null && $instruction !== '') {
1723 $inst_related_instruction = $this->f->get_inst__om_dbform(array(
1724 "obj" => "instruction",
1725 "idx" => $instruction,
1726 ));
1727 $instruction_data = $inst_related_instruction->get_json_data();
1728 $val_instruction = $this->sort_instruction_data($instruction_data, $val_instruction);
1729 if ($instruction_data['om_fichier_instruction'] !== null
1730 && $instruction_data['om_fichier_instruction'] !== '') {
1731 //
1732 $instruction_with_doc = $inst_related_instruction->getVal($inst_related_instruction->clePrimaire);
1733 }
1734 }
1735 }
1736 }
1737 if ($instruction_with_doc !== null) {
1738 //
1739 $val_instruction['path'] = sprintf('%s&snippet=%s&obj=%s&champ=%s&id=%s', 'app/index.php?module=form', 'file', 'instruction', 'om_fichier_instruction', $instruction_with_doc);
1740 }
1741 }
1742 return $val_instruction;
1743 }
1744
1745
1746 /**
1747 * Récupère les informations pour les notifications ayant plusieurs annexe
1748 */
1749 protected function get_instruction_notification_data($category, $type = '', $extra_params = array()) {
1750 $val_in = null;
1751
1752 $idx = null;
1753 if ($type === 'with-id') {
1754 $idx = $extra_params['with-id'];
1755 }
1756
1757 // Récupération du type de notification. Le type est nécessaire pour récupérer
1758 // le message et le titre de notification.
1759 $typeNotification = $this->getVal('type');
1760 if (isset($this->valF['type'])) {
1761 $typeNotification = $this->valF['type'];
1762 }
1763
1764 // récupére les données à intégrer à la payload
1765 $inst_in = $this->f->get_inst__om_dbform(array(
1766 "obj" => "instruction_notification",
1767 "idx" => $idx,
1768 ));
1769 if (count($inst_in->val) > 0) {
1770 $val_in = $inst_in->get_json_data();
1771
1772 $val_in['parametre_courriel_type_titre'] = '';
1773 $val_in['parametre_courriel_type_message'] = '';
1774 // Récupération du message et du titre
1775 if ($category === 'mail') {
1776 $inst_instruction = $this->f->get_inst__om_dbform(array(
1777 "obj" => "instruction",
1778 "idx" => $inst_in->getVal('instruction'),
1779 ));
1780 $collectivite_id = $inst_instruction->get_dossier_instruction_om_collectivite($inst_instruction->getVal('dossier'));
1781 $phrase_type_notification = $this->f->get_notification_parametre_courriel_type($collectivite_id, $typeNotification);
1782 $val_in['parametre_courriel_type_titre'] = $phrase_type_notification['parametre_courriel_type_titre'];
1783 $val_in['parametre_courriel_type_message'] = $phrase_type_notification['parametre_courriel_type_message'];
1784 }
1785
1786 if ($typeNotification == 'notification_signataire') {
1787 $val_in['lien_page_signature'] = $inst_in->getLienPageSignature($inst_instruction);
1788 }
1789 else {
1790 // Récupération des liens vers les documents et des id et type des annexes
1791 $infoDocNotif = $inst_in->getInfosDocumentsNotif($inst_in->getVal($inst_in->clePrimaire), $category);
1792 $cle = $category == PORTAL ? 'path' : 'lien_telechargement_document';
1793 $val_in[$cle] = $infoDocNotif['document']['path'];
1794 $val_in['annexes'] = $infoDocNotif['annexes'];
1795 }
1796 }
1797 return $val_in;
1798 }
1799
1800 /**
1801 * Récupère les informations concernant la lettre au pétitionnaire.
1802 *
1803 * @param string identifiant du dossier
1804 * @param string type de tâche
1805 * @param array paramètre supplémentaire permettant de récupérer les informations
1806 *
1807 * @return array information concernant la lettre au pétitionnaire
1808 */
1809 protected function get_lettre_petitionnaire_data($dossier, $type, $extra_params = array()) {
1810 // Si la date limite de notification n'a pas été dépassé le type de lettre est 1
1811 // Si la date a été dépassé et qu'il s'agit d'une demande de pièce le type est 3
1812 // Si la date a été dépassé et qu'il s'agit d'une prolongation le type est 4
1813 // Le type de document dépend du type de pièce
1814 $nomTypeLettre = '';
1815 $nomTypeDocument = '';
1816 if ($type === 'lettre_incompletude') {
1817 $nomTypeLettre = '3';
1818 $nomTypeDocument = '4';
1819 } elseif ($type === 'lettre_majoration') {
1820 $nomTypeLettre = '4';
1821 $nomTypeDocument = '6';
1822 }
1823
1824 $inst_di = $this->f->get_inst__om_dbform(array(
1825 "obj" => "dossier",
1826 "idx" => $dossier,
1827 ));
1828 $date_limite_notification = DateTime::createFromFormat('Y-m-d', $inst_di->getVal('date_notification_delai'));
1829 $aujourdhui = new DateTime();
1830 if (! $date_limite_notification instanceof DateTime) {
1831 $nomTypeLettre = '';
1832 $nomTypeDocument = '';
1833 } elseif ($aujourdhui < $date_limite_notification) {
1834 $nomTypeLettre = '1';
1835 $nomTypeDocument = '3';
1836 }
1837
1838 return array(
1839 'nomEtatLettre' => '3',
1840 'nomModaliteNotifMetier' => '4',
1841 'nomTypeLettre' => $nomTypeLettre,
1842 'nomTypeDocument' => $nomTypeDocument
1843 );
1844 }
1845
1846 protected function sort_instruction_data(array $values, array $res) {
1847 $fields = array(
1848 "date_evenement",
1849 "date_envoi_signature",
1850 "date_retour_signature",
1851 "date_envoi_rar",
1852 "date_retour_rar",
1853 "date_envoi_controle_legalite",
1854 "date_retour_controle_legalite",
1855 "signataire_arrete",
1856 "om_fichier_instruction",
1857 "tacite",
1858 "lettretype",
1859 "commentaire",
1860 "complement_om_html",
1861 );
1862 foreach ($values as $key => $value) {
1863 if (in_array($key, $fields) === true) {
1864 if (array_key_exists($key, $res) === false
1865 && $value !== null
1866 && $value !== '') {
1867 //
1868 $res[$key] = $value;
1869 } elseif ($key === 'tacite'
1870 && $value === 't') {
1871 //
1872 $res[$key] = $value;
1873 }
1874 }
1875 }
1876 return $res;
1877 }
1878
1879 /**
1880 * Permet de définir si l'instruction passée en paramètre est une instruction
1881 * récépissé d'une demande et si la demande en question a générée un dossier d'instruction.
1882 *
1883 * @param integer $instruction Identifiant de l'instruction
1884 * @return boolean
1885 */
1886 protected function is_demande_instruction_recepisse_without_dossier($instruction) {
1887 if ($instruction === null) {
1888 return false;
1889 }
1890 $qres = $this->f->get_one_result_from_db_query(
1891 sprintf(
1892 'SELECT
1893 demande_type.dossier_instruction_type
1894 FROM
1895 %1$sdemande
1896 INNER JOIN %1$sdemande_type
1897 ON demande.demande_type = demande_type.demande_type
1898 WHERE
1899 demande.instruction_recepisse = %2$s',
1900 DB_PREFIXE,
1901 intval($instruction)
1902 ),
1903 array(
1904 "origin" => __METHOD__,
1905 "force_return" => true,
1906 )
1907 );
1908 if ($qres["code"] !== "OK") {
1909 return null;
1910 }
1911 if ($qres["result"] === "") {
1912 return true;
1913 }
1914 return false;
1915 }
1916
1917 protected function get_document_numerise_data(string $dn) {
1918 $val_dn = array();
1919 $inst_dn = $this->f->get_inst__om_dbform(array(
1920 "obj" => "document_numerise",
1921 "idx" => $dn,
1922 ));
1923 $val_dn = $inst_dn->get_json_data();
1924 $val_dn['path'] = sprintf('%s&snippet=%s&obj=%s&champ=%s&id=%s', 'app/index.php?module=form', 'file', 'document_numerise', 'uid', $this->getVal('object_id'));
1925 // Correspond à la nomenclature Plat'AU NATURE_PIECE
1926 $val_dn['nature'] = $val_dn['document_numerise_nature_libelle'];
1927 return $val_dn;
1928 }
1929
1930 protected function get_parcelles_data(string $object, string $idx) {
1931 $val_dp = array();
1932 $inst_di = $this->f->get_inst__om_dbform(array(
1933 "obj" => $object,
1934 "idx" => $idx,
1935 ));
1936 $list_parcelles = $inst_di->get_parcelles();
1937 $no_ordre = 1;
1938 foreach ($list_parcelles as $parcelle) {
1939 $val_dp[$parcelle[$object.'_parcelle']] = array(
1940 $object.'_parcelle' => $parcelle[$object.'_parcelle'],
1941 'libelle' => $parcelle['libelle'],
1942 'no_ordre' => $no_ordre,
1943 );
1944 $no_ordre++;
1945 }
1946 return $val_dp;
1947 }
1948
1949 protected function get_avis_decision_data(string $dossier) {
1950 $inst_di = $this->f->get_inst__om_dbform(array(
1951 "obj" => "dossier",
1952 "idx" => $dossier,
1953 ));
1954 $ad = $inst_di->getVal('avis_decision');
1955 $val_ad = array();
1956 if ($ad !== null && trim($ad) !== '') {
1957 $inst_ad = $this->f->get_inst__om_dbform(array(
1958 "obj" => "avis_decision",
1959 "idx" => $ad,
1960 ));
1961 $val_ad = $inst_ad->get_json_data();
1962 $val_ad['txAvis'] = "Voir document joint";
1963 if (isset($val_ad['tacite']) === true
1964 && $val_ad['tacite'] === 't') {
1965 //
1966 $val_ad['txAvis'] = "Sans objet";
1967 }
1968 }
1969 return $val_ad;
1970 }
1971
1972 protected function get_signataire_arrete_data(string $sa) {
1973 $inst_sa = $this->f->get_inst__om_dbform(array(
1974 "obj" => "signataire_arrete",
1975 "idx" => $sa,
1976 ));
1977 $val_sa = array_combine($inst_sa->champs, $inst_sa->val);
1978 foreach ($val_sa as $key => $value) {
1979 $val_sa[$key] = strip_tags($value);
1980 }
1981 return $val_sa;
1982 }
1983
1984 // XXX WIP
1985 protected function get_consultation_data(string $consultation) {
1986 $val_consultation = array();
1987 $inst_consultation = $this->f->get_inst__om_dbform(array(
1988 "obj" => "consultation",
1989 "idx" => $consultation,
1990 ));
1991 $val_consultation = $inst_consultation->get_json_data();
1992 if (isset($val_consultation['fichier']) === true
1993 && $val_consultation['fichier'] !== '') {
1994 //
1995 $val_consultation['path_fichier'] = sprintf('%s&snippet=%s&obj=%s&champ=%s&id=%s', 'app/index.php?module=form', 'file', 'consultation', 'fichier', $this->getVal('object_id'));
1996 }
1997 if (isset($val_consultation['om_fichier_consultation']) === true
1998 && $val_consultation['om_fichier_consultation'] !== '') {
1999 //
2000 $val_consultation['path_om_fichier_consultation'] = sprintf('%s&snippet=%s&obj=%s&champ=%s&id=%s', 'app/index.php?module=form', 'file', 'consultation', 'om_fichier_consultation', $this->getVal('object_id'));
2001 }
2002 return $val_consultation;
2003 }
2004
2005 // XXX WIP
2006 protected function get_service_data(string $service) {
2007 $val_service = array();
2008 $inst_service = $this->f->get_inst__om_dbform(array(
2009 "obj" => "service",
2010 "idx" => $service,
2011 ));
2012 $val_service = $inst_service->get_json_data();
2013 return $val_service;
2014 }
2015
2016 protected function view_form_json($in_field = false) {
2017 //
2018 $check_state = isset($this->valF['state']) === true ? $this->valF['state'] : $this->getVal('state');
2019 if ($check_state !== self::STATUS_CANCELED) {
2020 // Liste des valeurs à afficher
2021 $val = array();
2022 //
2023 $val_task = array_combine($this->champs, $this->val);
2024 foreach ($val_task as $key => $value) {
2025 $val_task[$key] = strip_tags($value);
2026 }
2027
2028 // Vérifie pour les tâches dont l'affichage de la payload est calculée si l'objet
2029 // de référence de la tâche existe.
2030 $objectRefExist = true;
2031 if ($val_task['stream'] === 'output'
2032 && (empty($val_task['json_payload']) || $val_task['json_payload'] === '{}')) {
2033 $objectRefExist = $this->does_referenced_object_exist(
2034 $val_task['object_id'],
2035 $val_task['type']
2036 );
2037 }
2038
2039 // Si l'objet de référence n'existe pas log le numéro de la tâche concerné et
2040 // renvoie une payload contenant le message d'erreur.
2041 // Sinon constitue la payload du json.
2042 if (! $objectRefExist) {
2043 $this->f->addToLog(
2044 sprintf(
2045 __('Impossible de récupérer la payload car l\'objet de réference n\'existe pas pour la tâche : %s'),
2046 $val_task['task']
2047 ),
2048 DEBUG_MODE
2049 );
2050 $val = __('Impossible de recuperer la payload car l\'objet de reference n\'existe pas.');
2051 } else {
2052
2053 $val_task['timestamp_log'] = json_decode($val_task['timestamp_log'], true);
2054 unset($val_task['timestamp_log_hidden']);
2055 $val['task'] = $val_task;
2056 //
2057 if ($this->getVal('type') === 'creation_DA'
2058 || $this->getVal('type') === 'modification_DA') {
2059 //
2060 $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($this->getVal('object_id'));
2061 $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_autorisation');
2062 $val['dossier_autorisation_parcelle'] = $this->get_parcelles_data('dossier_autorisation', $val['dossier_autorisation']['dossier_autorisation']);
2063 $val_external_uid = array();
2064 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier_autorisation']['dossier_autorisation'], 'dossier_autorisation');
2065 $val['external_uids'] = $val_external_uid;
2066 }
2067 //
2068 if ($this->getVal('type') === 'creation_DI'
2069 || $this->getVal('type') === 'modification_DI'
2070 || $this->getVal('type') === 'depot_DI') {
2071 //
2072 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));
2073 $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_instruction');
2074 $val['demandeur'] = $this->get_demandeurs_data($val['dossier']['dossier']);
2075 $architecte = isset($val['donnees_techniques']['architecte']) === true ? $val['donnees_techniques']['architecte'] : null;
2076 $val['architecte'] = $this->get_architecte_data($architecte);
2077 $val['dossier_parcelle'] = $this->get_parcelles_data('dossier', $val['dossier']['dossier']);
2078 $val_external_uid = array();
2079 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2080 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2081 $val['external_uids'] = $val_external_uid;
2082 }
2083 //
2084 if ($this->getVal('type') === 'qualification_DI') {
2085 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2086 $val_external_uid = array();
2087 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2088 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2089 $val['external_uids'] = $val_external_uid;
2090 }
2091 //
2092 if ($this->getVal('type') === 'ajout_piece') {
2093 $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
2094 $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);
2095 $val_external_uid = array();
2096 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2097 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2098 $val_external_uid['piece'] = $this->get_external_uid($val['document_numerise']['document_numerise'], 'piece');
2099 $val['external_uids'] = $val_external_uid;
2100 }
2101 //
2102 if ($this->getVal('type') === 'decision_DI') {
2103 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2104 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2105 $val['instruction']['final'] = 't';
2106 if (isset($val['instruction']['signataire_arrete']) === true) {
2107 $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2108 }
2109 $val_external_uid = array();
2110 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2111 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2112 $val['external_uids'] = $val_external_uid;
2113 }
2114 //
2115 if ($this->getVal('type') === 'incompletude_DI') {
2116 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2117 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2118 $val_external_uid = array();
2119 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2120 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2121 $val['external_uids'] = $val_external_uid;
2122 }
2123 //
2124 if ($this->getVal('type') === 'completude_DI') {
2125 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2126 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2127 $val_external_uid = array();
2128 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2129 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2130 $val['external_uids'] = $val_external_uid;
2131 }
2132 //
2133 if ($this->getVal('type') === 'lettre_incompletude'
2134 || $this->getVal('type') === 'lettre_majoration') {
2135 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2136 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2137 $val['lettre_petitionnaire'] = $this->get_lettre_petitionnaire_data($val['dossier']['dossier'], $this->getVal('type'));
2138 $val_external_uid = array();
2139 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2140 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2141 $val['external_uids'] = $val_external_uid;
2142 }
2143 //
2144 if ($this->getVal('type') === 'pec_metier_consultation') {
2145 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2146 $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2147 $val_external_uid = array();
2148 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2149 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2150 $val_external_uid['dossier_consultation'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier_consultation');
2151 $val['external_uids'] = $val_external_uid;
2152 }
2153 //
2154 if ($this->getVal('type') === 'avis_consultation') {
2155 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2156 $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2157 $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2158 if (isset($val['instruction']['signataire_arrete']) === true) {
2159 $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2160 }
2161 $val_external_uid = array();
2162 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2163 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2164 $val_external_uid['dossier_consultation'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier_consultation');
2165 $val_external_uid['avis_dossier_consultation'] = $this->get_external_uid($this->getVal('object_id'), 'avis_dossier_consultation');
2166 $val['external_uids'] = $val_external_uid;
2167 }
2168 // XXX WIP
2169 if ($this->getVal('type') === 'creation_consultation') {
2170 //
2171 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2172 $val['consultation'] = $this->get_consultation_data($this->getVal('object_id'));
2173 $val['service'] = $this->get_service_data($val['consultation']['service']);
2174 $val_external_uid = array();
2175 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2176 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2177 $val['external_uids'] = $val_external_uid;
2178 }
2179 //
2180 if ($this->getVal('type') === 'envoi_CL') {
2181 //
2182 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2183 $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2184 $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($val['dossier']['dossier_autorisation']);
2185 $val_external_uid = array();
2186 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2187 $val_external_uid['dossier'] = $this->get_external_uid($this->getVal('dossier'), 'dossier');
2188 $val_external_uid['decision'] = $this->get_external_uid($this->getVal('object_id'), 'instruction');
2189 if ($val_external_uid['decision'] === '') {
2190 $inst_instruction = $this->f->get_inst__om_dbform(array(
2191 "obj" => "instruction",
2192 "idx" => $this->getVal('object_id'),
2193 ));
2194 $val_external_uid['decision'] = $this->get_external_uid($inst_instruction->get_related_instructions_next('retour_signature'), 'instruction');
2195 }
2196 $val['external_uids'] = $val_external_uid;
2197 }
2198 if ($this->getVal('type') === 'notification_instruction'
2199 || $this->getVal('type') === 'notification_recepisse'
2200 || $this->getVal('type') === 'notification_decision'
2201 || $this->getVal('type') === 'notification_service_consulte'
2202 || $this->getVal('type') === 'notification_tiers_consulte'
2203 || $this->getVal('type') === 'notification_signataire') {
2204 //
2205 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2206 $dossier_id = isset($val['dossier']['dossier']) === true ? $val['dossier']['dossier'] : null;
2207 $val['demandeur'] = $this->get_demandeurs_data($dossier_id);
2208 $val['instruction_notification'] = $this->get_instruction_notification_data($this->getVal('category'), 'with-id', array('with-id' => $this->getVal('object_id')));
2209 $instruction_id = isset($val['instruction_notification']['instruction']) === true ? $val['instruction_notification']['instruction'] : null;
2210 $instruction_annexes = isset($val['instruction_notification']['annexes']) === true ? $val['instruction_notification']['annexes'] : null;
2211 $val['instruction'] = $this->get_instruction_data($dossier_id, 'with-id', array('with-id' => $instruction_id));
2212 // Précise qu'il s'agit d'une instruction final si l'instruction est liée à une
2213 // demande dont le type ne génère pas de dossier
2214 if ($this->is_demande_instruction_recepisse_without_dossier($instruction_id) === true) {
2215 $val['instruction']['final'] = 't';
2216 }
2217 $val_external_uid = array();
2218 // Affiche l'identifiant externe lié à l'instruction si cette combinaison existe, sinon celui lié au dossier
2219 $val_external_uid['demande'] = $this->get_external_uid($instruction_id, 'demande') !== '' ? $this->get_external_uid($instruction_id, 'demande') : $this->get_external_uid($dossier_id, 'demande');
2220 $val_external_uid['demande (instruction)'] = $this->get_external_uid($instruction_id, 'demande', PORTAL, 'ASC');
2221 $val_external_uid['instruction_notification'] = $this->get_external_uid($this->getVal('object_id'), 'instruction_notification', PORTAL);
2222 $val['external_uids'] = $val_external_uid;
2223 }
2224 //
2225 if ($this->getVal('type') === 'prescription') {
2226 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2227 $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2228 $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2229 if (isset($val['instruction']['signataire_arrete']) === true) {
2230 $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2231 }
2232 $val_external_uid = array();
2233 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');
2234 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');
2235 $val_external_uid['dossier_consultation'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier_consultation');
2236 $val_external_uid['prescription'] = $this->get_external_uid($this->getVal('object_id'), 'prescription');
2237 $val['external_uids'] = $val_external_uid;
2238 }
2239 }
2240
2241 if ($in_field === true) {
2242 return json_encode($val, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
2243 } else {
2244 // Liste des valeurs affichée en JSON
2245 echo(json_encode($val, JSON_UNESCAPED_SLASHES));
2246 }
2247 }
2248 }
2249
2250 function post_update_task() {
2251 // Mise à jour des valeurs
2252
2253 // Modification de l'état de la tâche
2254 if ($this->f->get_submitted_post_value('state') !== null) {
2255 $params = array(
2256 'val' => array(
2257 'state' => $this->f->get_submitted_post_value('state')
2258 ),
2259 );
2260 if ($this->f->get_submitted_post_value('comment') !== null) {
2261 $params['comment'] = $this->f->get_submitted_post_value('comment');
2262 }
2263 $update = $this->update_task($params);
2264 $message_class = "valid";
2265 $message = $this->msg;
2266 if ($update === false) {
2267 $this->addToLog($this->msg, DEBUG_MODE);
2268 $message_class = "error";
2269 $message = sprintf(
2270 '%s %s',
2271 __('Impossible de mettre à jour la tâche.'),
2272 __('Veuillez contacter votre administrateur.')
2273 );
2274 }
2275 $this->f->displayMessage($message_class, $message);
2276 }
2277
2278 // Sauvegarde de l'uid externe retourné
2279 if ($this->f->get_submitted_post_value('external_uid') !== null) {
2280 //
2281 $objects = $this->get_objects_by_task_type($this->getVal('type'), $this->getVal('stream'));
2282 foreach ($objects as $object) {
2283 $inst_lien = $this->f->get_inst__om_dbform(array(
2284 "obj" => "lien_id_interne_uid_externe",
2285 "idx" => ']',
2286 ));
2287 $object_id = $this->getVal('object_id');
2288 $is_exists = $inst_lien->is_exists($object, $object_id, $this->f->get_submitted_post_value('external_uid'), $this->getVal('dossier'));
2289 // Dans le cas spécifique de la mise à jour d'une notification
2290 // et de la création d'une liaison d'identifiant pour l'objet demande,
2291 // l'identifiant de l'objet n'est plus celui de la notification
2292 // d'instruction mais celui du dossier d'instruction
2293 if ($object === 'demande'
2294 && ($this->getVal('type') === 'notification_recepisse'
2295 || $this->getVal('type') === 'notification_instruction'
2296 || $this->getVal('type') === 'notification_decision'
2297 || $this->getVal('type') === 'notification_service_consulte'
2298 || $this->getVal('type') === 'notification_tiers_consulte'
2299 || $this->getVal('type') === 'notification_signataire')) {
2300 //
2301 $object_id = $this->getVal('dossier');
2302 // Il ne doit y avoir qu'une liaison entre le numéro du dossier interne et un uid externe de "demande"
2303 $is_exists = $inst_lien->is_exists($object, $object_id, null, $this->getVal('dossier'));
2304 }
2305 if ($is_exists === false) {
2306 $valF = array(
2307 'lien_id_interne_uid_externe' => '',
2308 'object' => $object,
2309 'object_id' => $object_id,
2310 'external_uid' => $this->f->get_submitted_post_value('external_uid'),
2311 'dossier' => $this->getVal('dossier'),
2312 'category' => $this->getVal('category'),
2313 );
2314 $add = $inst_lien->ajouter($valF);
2315 $message_class = "valid";
2316 $message = $inst_lien->msg;
2317 if ($add === false) {
2318 $this->addToLog($inst_lien->msg, DEBUG_MODE);
2319 $message_class = "error";
2320 $message = sprintf(
2321 '%s %s',
2322 __("Impossible de mettre à jour le lien entre l'identifiant interne et l'identifiant de l'application externe."),
2323 __('Veuillez contacter votre administrateur.')
2324 );
2325 }
2326 $this->f->displayMessage($message_class, $message);
2327 }
2328 }
2329 }
2330 }
2331
2332 function post_add_task() {
2333 // TODO Tester de remplacer la ligne de json_payload par un $_POST
2334 $result = $this->add_task(array(
2335 'val' => array(
2336 'stream' => 'input',
2337 'json_payload' => html_entity_decode($this->f->get_submitted_post_value('json_payload'), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401),
2338 'type' => $this->f->get_submitted_post_value('type'),
2339 'category' => $this->f->get_submitted_post_value('category'),
2340 )
2341 ));
2342 $message = sprintf(
2343 __("Tâche %s ajoutée avec succès"),
2344 $this->getVal($this->clePrimaire)).
2345 '<br/><br/>'.
2346 $this->msg;
2347 $message_class = "valid";
2348 if ($result === false){
2349 $this->addToLog($this->msg, DEBUG_MODE);
2350 $message_class = "error";
2351 $message = sprintf(
2352 '%s %s',
2353 __('Impossible d\'ajouter la tâche.'),
2354 __('Veuillez contacter votre administrateur.')
2355 );
2356 }
2357 $this->f->displayMessage($message_class, $message);
2358 }
2359
2360 function setLayout(&$form, $maj) {
2361 //
2362 $form->setBloc('json_payload', 'D', '', 'col_6');
2363 $fieldset_title_payload = __("json_payload (calculée)");
2364 if ($this->getVal('json_payload') !== "{}") {
2365 $fieldset_title_payload = __("json_payload");
2366 }
2367 $form->setFieldset('json_payload', 'DF', $fieldset_title_payload, "collapsible, startClosed");
2368 $form->setBloc('json_payload', 'F');
2369 $form->setBloc('timestamp_log', 'DF', __("historique"), 'col_9 timestamp_log_jsontotab');
2370 }
2371
2372 /**
2373 * Récupère le nom de l'objet à mentionner dans la table lien_id_interne_uid_externe
2374 * en fonction du type et du stream de la tâche.
2375 *
2376 * @param string $type Type de la tâche
2377 * @param string $stream Stream de la tâche
2378 *
2379 * @return array
2380 */
2381 function get_objects_by_task_type($type, $stream = 'all') {
2382 $objects = array();
2383 if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2384 $objects = array('dossier_autorisation', );
2385 }
2386 if (in_array($type, array('creation_DI', 'depot_DI', 'notification_DI', 'qualification_DI', )) === true) {
2387 $objects = array('dossier', );
2388 }
2389 if (in_array($type, array('create_DI_for_consultation', )) === true) {
2390 $objects = array('dossier', 'dossier_consultation', );
2391 }
2392 if (in_array($type, array('create_DI', )) === true
2393 && $stream === 'input') {
2394 $objects = array('dossier', 'dossier_autorisation', 'demande', );
2395 }
2396 if (in_array($type, array(
2397 'decision_DI',
2398 'incompletude_DI',
2399 'completude_DI',
2400 'lettre_incompletude',
2401 'lettre_majoration'
2402 )) === true) {
2403 $objects = array('instruction', );
2404 }
2405 if (in_array($type, array('envoi_CL', )) === true) {
2406 $objects = array('instruction_action_cl', );
2407 }
2408 if (in_array($type, array('pec_metier_consultation', )) === true
2409 && $stream === 'output') {
2410 $objects = array('pec_dossier_consultation', );
2411 }
2412 if (in_array($type, array('avis_consultation', )) === true
2413 && $stream === 'output') {
2414 $objects = array('avis_dossier_consultation', );
2415 }
2416 if (in_array($type, array('prescription', )) === true
2417 && $stream === 'output') {
2418 $objects = array('prescription', );
2419 }
2420 if (in_array($type, array('ajout_piece', 'add_piece', )) === true) {
2421 $objects = array('piece', );
2422 }
2423 if (in_array($type, array('creation_consultation', )) === true) {
2424 $objects = array('consultation', );
2425 }
2426 if (in_array($type, array('pec_metier_consultation', )) === true
2427 && $stream === 'input') {
2428 $objects = array('pec_metier_consultation', );
2429 }
2430 if (in_array($type, array('avis_consultation', )) === true
2431 && $stream === 'input') {
2432 $objects = array('avis_consultation', );
2433 }
2434 if (in_array($type, array('create_message', )) === true
2435 && $stream === 'input') {
2436 $objects = array('dossier_message', );
2437 }
2438 if (in_array(
2439 $type,
2440 array(
2441 'notification_recepisse',
2442 'notification_instruction',
2443 'notification_decision',
2444 'notification_service_consulte',
2445 'notification_tiers_consulte',
2446 'notification_signataire',
2447 )
2448 ) === true) {
2449 $objects = array('instruction_notification', 'demande', );
2450 }
2451 return $objects;
2452 }
2453
2454 /**
2455 * Récupère les tables auxquelles pourrait être rattaché l'objet lié à la tâche,
2456 * par rapport à son type.
2457 *
2458 * @param string $type Type de la tâche
2459 * @param string $stream input ou output
2460 * @return array
2461 */
2462 function get_tables_by_task_type($type, $stream = 'all') {
2463 $tables = array();
2464 if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2465 $tables = array('dossier_autorisation', );
2466 }
2467 if (in_array($type, array('creation_DI', 'depot_DI', )) === true) {
2468 $tables = array('dossier', );
2469 }
2470 if (in_array($type, array('qualification_DI', )) === true) {
2471 $tables = array('instruction', 'dossier', );
2472 }
2473 if (in_array($type, array('create_DI_for_consultation', )) === true) {
2474 $tables = array('dossier', );
2475 }
2476 if (in_array($type, array('create_DI', )) === true
2477 && $stream === 'input') {
2478 $tables = array('dossier', 'dossier_autorisation', 'demande', );
2479 }
2480 if (in_array($type, array(
2481 'decision_DI',
2482 'incompletude_DI',
2483 'completude_DI',
2484 'lettre_incompletude',
2485 'lettre_majoration'
2486 )) === true) {
2487 $tables = array('instruction', );
2488 }
2489 if (in_array($type, array('envoi_CL', )) === true) {
2490 $objects = array('instruction', );
2491 }
2492 if (in_array($type, array('pec_metier_consultation', )) === true
2493 && $stream === 'output') {
2494 $tables = array('instruction', );
2495 }
2496 if (in_array($type, array('avis_consultation', )) === true
2497 && $stream === 'output') {
2498 $tables = array('instruction', );
2499 }
2500 if (in_array($type, array('prescription', )) === true
2501 && $stream === 'output') {
2502 $tables = array('instruction', );
2503 }
2504 if (in_array($type, array('ajout_piece', 'add_piece', )) === true) {
2505 $tables = array('document_numerise', );
2506 }
2507 if (in_array($type, array('creation_consultation', )) === true) {
2508 $tables = array('consultation', );
2509 }
2510 if (in_array($type, array('pec_metier_consultation', )) === true
2511 && $stream === 'input') {
2512 $tables = array('consultation', );
2513 }
2514 if (in_array($type, array('avis_consultation', )) === true
2515 && $stream === 'input') {
2516 $tables = array('consultation', );
2517 }
2518 if (in_array($type, array('create_message', )) === true
2519 && $stream === 'input') {
2520 $tables = array('dossier_message', );
2521 }
2522 if (in_array(
2523 $type,
2524 array(
2525 'notification_recepisse',
2526 'notification_instruction',
2527 'notification_decision',
2528 'notification_service_consulte',
2529 'notification_tiers_consulte',
2530 'notification_signataire'
2531 )
2532 ) === true) {
2533 $tables = array('instruction_notification', );
2534 }
2535 return $tables;
2536 }
2537
2538 /**
2539 * Vérifie si l'objet référencé par la tâche existe en base de données.
2540 *
2541 * Récupère la liste des tables de référence associé à la tâche à partir
2542 * du type de tâche et de son flux (input ou output).
2543 * Pour chaque table potentiellement référencé par la tâche on essaye d'instancier
2544 * l'objet correspondant à partir de l'identifiant de l'objet de référence de la tâche.
2545 * Si l'élément instancié existe renvoie true sinon renvoie false.
2546 *
2547 * @param string|integer $taskObjectId : identifiant de l'objet de référence de la tâche
2548 * @param string $taskType : type de la tâche
2549 * @param string $taskStream : flux entrant (output - valeur par défaut) ou sortant (input)
2550 * @return boolean
2551 */
2552 protected function does_referenced_object_exist($taskObjectId, string $taskType, string $taskStream = 'output') {
2553 $refTables = $this->get_tables_by_task_type($taskType, $taskStream);
2554 if (empty($refTables) === true) {
2555 $this->f->addToLog(
2556 sprintf(
2557 __("Impossible de vérifier si l'objet de référence existe, car le type de task '%s' n'a pas de correspondance avec une table dans la méthode %s."),
2558 $taskType,
2559 "get_tables_by_task_type()"
2560 ),
2561 DEBUG_MODE
2562 );
2563 return true;
2564 }
2565 foreach ($refTables as $table) {
2566 $inst = $this->f->get_inst__om_dbform(array(
2567 'obj' => $table,
2568 'idx' => $taskObjectId
2569 ));
2570 if ($inst->exists() === true) {
2571 return true;
2572 }
2573 }
2574 return false;
2575 }
2576
2577 }

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26