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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26