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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

branches/4.14.0-develop/obj/task.class.php revision 9872 by softime, Fri Jan 22 10:52:37 2021 UTC trunk/obj/task.class.php revision 19307 by softime, Wed Nov 6 10:57:56 2024 UTC
# Line 4  Line 4 
4    
5  require_once "../gen/obj/task.class.php";  require_once "../gen/obj/task.class.php";
6    
7    
8  class task extends task_gen {  class task extends task_gen {
9    
10      const STATUS_DRAFT = 'draft';      const STATUS_DRAFT = 'draft';
# Line 13  class task extends task_gen { Line 14  class task extends task_gen {
14      const STATUS_ERROR = 'error';      const STATUS_ERROR = 'error';
15      const STATUS_DEBUG = 'debug';      const STATUS_DEBUG = 'debug';
16      const STATUS_ARCHIVED = 'archived';      const STATUS_ARCHIVED = 'archived';
17        const STATUS_CANCELED = 'canceled';
18        const STATUS_INVALID = 'invalid';
19    
20        /**
21         * Définie le code platau correspondant aux documents de type consultation
22         *
23         * @var integer
24         */
25        const CODE_PLATAU_CONSULTATION = 7;
26    
27        /**
28         * Liste des types de tâche concernant les services instructeurs
29         */
30        const TASK_TYPE_SI = array(
31            'creation_DA',
32            'creation_DI',
33            'depot_DI',
34            'modification_DI',
35            'qualification_DI',
36            'decision_DI',
37            'incompletude_DI',
38            'completude_DI',
39            'ajout_piece',
40            'modification_piece',
41            'suppression_piece',
42            'add_piece',
43            'creation_consultation',
44            'modification_DA',
45            'create_DI',
46            'envoi_CL',
47            'notification_recepisse',
48            'notification_instruction',
49            'notification_decision',
50            'notification_service_consulte',
51            'notification_tiers_consulte',
52            'notification_depot_demat',
53            'notification_commune',
54            'notification_signataire',
55            'lettre_incompletude',
56            'lettre_majoration',
57            'ajout_documents_specifiques'
58        );
59    
60        /**
61         * Liste des types de tâche concernant les services consultés
62         */
63        const TASK_TYPE_SC = array(
64            'create_DI_for_consultation',
65            'avis_consultation',
66            'pec_metier_consultation',
67            'create_message',
68            'notification_recepisse',
69            'notification_instruction',
70            'notification_decision',
71            'notification_service_consulte',
72            'notification_tiers_consulte',
73            'notification_depot_demat',
74            'prescription',
75            'ajout_documents_specifiques'
76        );
77    
78        /**
79         * Liste des types de tâche pouvant avoir des documents associés
80         */
81        const TASK_WITH_DOCUMENT = array(
82            'add_piece',
83            'avis_consultation',
84            'pec_metier_consultation',
85            'ajout_documents_specifiques'
86        );
87    
88        /**
89         * Préfixe pour identifier les codes de suivi
90         * @var string
91         */
92        const CS_PREFIX = 'code-suivi://';
93    
94        /**
95         * Catégorie de la tâche
96         */
97        var $category = PLATAU;
98    
99      /**      /**
100       * Définition des actions disponibles sur la classe.       * Définition des actions disponibles sur la classe.
# Line 92  class task extends task_gen { Line 174  class task extends task_gen {
174              if (! isset($val['json_payload']) || empty($val['json_payload'])) {              if (! isset($val['json_payload']) || empty($val['json_payload'])) {
175    
176                  // récupère l'objet existant                  // récupère l'objet existant
177                  $existing = $this->f->findObjectById(get_class($this), $id);                  $existing = $this->f->findObjectById('task', $id);
178                  if (! empty($existing)) {                  if (! empty($existing)) {
179    
180                      // récupère la payload de l'objet                      // récupère la payload de l'objet
# Line 103  class task extends task_gen { Line 185  class task extends task_gen {
185                  }                  }
186              }              }
187          }          }
188    
189            if (array_key_exists('category', $val) === false
190                || $this->valF['category'] === ''
191                || $this->valF['category'] === null) {
192                //
193                $this->valF['category'] = $this->category;
194            }
195    
196            // Si last_modification_time est vide, la valeur est remplacée par NULL
197            // pour eviter d'avoir une erreur de base de données car le champ est au format time.
198            if ($val['last_modification_time'] == "") {
199                $this->valF['last_modification_time'] = NULL;
200            } else {
201                $this->valF['last_modification_time'] = $val['last_modification_time'];
202            }
203    
204            // Si creation_time est vide, la valeur est remplacée par NULL
205            // pour eviter d'avoir une erreur de base de données car le champ est au format time.
206            if ($val['creation_time'] == "") {
207                $this->valF['creation_time'] = NULL;
208            } else {
209                $this->valF['creation_time'] = $val['creation_time'];
210            }
211      }      }
212    
213      /**      /**
# Line 117  class task extends task_gen { Line 222  class task extends task_gen {
222              "object_id",              "object_id",
223              "dossier",              "dossier",
224              "stream",              "stream",
225                "creation_date",
226                "creation_time",
227                "CONCAT_WS(' ', to_char(task.creation_date, 'DD/MM/YYYY'), task.creation_time) AS date_creation",
228                'last_modification_date',
229                'last_modification_time',
230                "CONCAT_WS(' ', to_char(task.last_modification_date, 'DD/MM/YYYY'), task.last_modification_time) AS date_modification",
231                "comment",
232              "json_payload",              "json_payload",
233              "timestamp_log",              "timestamp_log",
234                "timestamp_log AS timestamp_log_hidden",
235                "category",
236          );          );
237      }      }
238    
# Line 128  class task extends task_gen { Line 242  class task extends task_gen {
242          // Récupération du mode de l'action          // Récupération du mode de l'action
243          $crud = $this->get_action_crud($maj);          $crud = $this->get_action_crud($maj);
244    
245            // ALL
246            $form->setType("category", "hidden");
247            $form->setType("timestamp_log_hidden", "hidden");
248    
249          // MODE CREER          // MODE CREER
250          if ($maj == 0 || $crud == 'create') {          if ($maj == 0 || $crud == 'create') {
251                $form->setType("type", "select");
252              $form->setType("state", "select");              $form->setType("state", "select");
253              $form->setType("stream", "select");              $form->setType("stream", "select");
254              $form->setType("json_payload", "textarea");              $form->setType("json_payload", "textarea");
255          }          }
256          // MDOE MODIFIER          // MODE MODIFIER
257          if ($maj == 1 || $crud == 'update') {          if ($maj == 1 || $crud == 'update') {
258                $form->setType("task", "hiddenstatic");
259              $form->setType("state", "select");              $form->setType("state", "select");
260              $form->setType("stream", "select");              $form->setType("stream", "hiddenstatic");
261              $form->setType("json_payload", "jsonprettyprint");              $form->setType("json_payload", "jsonprettyprint");
262                $form->setType("timestamp_log", "jsontotab");
263                $form->setType("type", "hiddenstatic");
264                $form->setType("creation_date", "hidden");
265                $form->setType("creation_time", "hidden");
266                $form->setType("object_id", "hiddenstatic");
267                $form->setType("dossier", "hiddenstatic");
268                $form->setType("date_creation", "hiddenstatic");
269                $form->setType("last_modification_date", "hidden");
270                $form->setType("last_modification_time", "hidden");
271                $form->setType("date_modification", "static");
272          }          }
273          // MODE CONSULTER          // MODE CONSULTER
274          if ($maj == 3 || $crud == 'read') {          if ($maj == 3 || $crud == 'read') {
275                $form->setType("state", "selecthiddenstatic");
276                $form->setType("stream", "selecthiddenstatic");
277              $form->setType('dossier', 'link');              $form->setType('dossier', 'link');
278              $form->setType('json_payload', 'jsonprettyprint');              $form->setType('json_payload', 'jsonprettyprint');
279                $form->setType("type", "selecthiddenstatic");
280                $form->setType("creation_date", "hidden");
281                $form->setType("creation_time", "hidden");
282                $form->setType("date_creation", "static");
283                $form->setType("last_modification_date", "hidden");
284                $form->setType("last_modification_time", "hidden");
285                $form->setType("date_modification", "static");
286                $form->setType("timestamp_log", "jsontotab");
287          }          }
288        }
289    
290        function stateTranslation ($currentState) {
291            switch ($currentState){
292                case self::STATUS_DRAFT:
293                    return __('brouillon');
294                    break;
295                case self::STATUS_NEW:
296                    return __('à traiter');
297                    break;
298                case self::STATUS_PENDING:
299                    return __('en cours');
300                    break;
301                case self::STATUS_DONE:
302                    return __('terminé');
303                    break;
304                case self::STATUS_ARCHIVED:
305                    return __('archivé');
306                    break;
307                case self::STATUS_ERROR:
308                    return __('erreur');
309                    break;
310                case self::STATUS_DEBUG:
311                    return __('debug');
312                    break;
313                case self::STATUS_CANCELED:
314                    return __('annulé');
315                    break;
316                case self::STATUS_INVALID:
317                    return __('invalide');
318                    break;
319            }
320      }      }
321    
322      /**      /**
323       *       *
324       */       */
325      function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {      function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
326          if($maj < 2) {          if($maj <= 3) {
   
327              $contenu = array();              $contenu = array();
328              foreach(array('DRAFT', 'NEW', 'PENDING', 'DONE', 'ERROR', 'DEBUG') as $key) {              foreach(array('DRAFT', 'NEW', 'PENDING', 'DONE', 'ERROR', 'DEBUG', 'ARCHIVED', 'CANCELED', 'INVALID') as $key) {
329                  $const_name = 'STATUS_'.$key;                  $const_name = 'STATUS_'.$key;
330                  $const_value = constant("self::$const_name");                  $const_value = constant("self::$const_name");
331                  $contenu[0][] = $const_value;                  $contenu[0][] = $const_value;
332                  $contenu[1][] = __($const_value);  
333    
334                    $contenu[1][] = $this->stateTranslation($const_value);
335    
336              }              }
337    
338              $form->setSelect("state", $contenu);              $form->setSelect("state", $contenu);
339    
340              $contenu_stream =array();              $contenu_stream =array();
341              $contenu_stream[0][0]="input";              $contenu_stream[0][0]="input";
342              $contenu_stream[1][0]=_('input');              $contenu_stream[1][0]=__('input');
343              $contenu_stream[0][1]="output";              $contenu_stream[0][1]="output";
344              $contenu_stream[1][1]=_('output');              $contenu_stream[1][1]=__('output');
345              $form->setSelect("stream", $contenu_stream);              $form->setSelect("stream", $contenu_stream);
346    
347                $tab_type = array_unique(array_merge(self::TASK_TYPE_SI, self::TASK_TYPE_SC));
348    
349                foreach ($tab_type as $type) {
350    
351                    $contenu_type[0][] = $type;
352    
353                    switch ($type) {
354                        case "creation_DA":
355                            $value_type = __('Création DA');
356                            break;
357                        case "create_DI":
358                            $value_type = __('Création demande');
359                            break;
360                        case "creation_DI":
361                            $value_type = __('Création DI');
362                            break;
363                        case "modification_DA":
364                            $value_type = __('Modification DA');
365                            break;
366                        case "modification_DI":
367                            $value_type = __('Modification DI');
368                            break;
369                        case "ajout_piece":
370                            $value_type = __('Ajout pièce (sortant)');
371                            break;
372                        case "add_piece":
373                            $value_type = __('Ajout pièce (entrant)');
374                            break;
375                        case "modification_piece":
376                            $value_type = __('Modification pièce (sortant)');
377                            break;
378                        case "suppression_piece":
379                            $value_type = __('Suppression pièce (sortant)');
380                            break;
381                        case "depot_DI":
382                            $value_type = __('Dépôt DI');
383                            break;
384                        case "qualification_DI":
385                            $value_type = __('Qualification DI');
386                            break;
387                        case "creation_consultation":
388                            $value_type = __('Création consultation');
389                            break;
390                        case "decision_DI":
391                            $value_type = __('Décision DI');
392                            break;
393                        case "envoi_CL":
394                            $value_type = __('Envoi contrôle de légalité');
395                            break;
396                        case "pec_metier_consultation":
397                            $value_type = __('PeC consultation');
398                            break;
399                        case "avis_consultation":
400                            $value_type = __('Avis');
401                            break;
402                        case "prescription":
403                            $value_type = __('Prescription');
404                            break;
405                        case "create_DI_for_consultation":
406                            $value_type = __('Création DI pour consultation');
407                            break;
408                        case "create_message":
409                            $value_type = __('Message');
410                            break;
411                        case "notification_recepisse":
412                            $value_type = __('Notification récépissé');
413                            break;
414                        case "notification_instruction":
415                            $value_type = __('Notification instruction');
416                            break;
417                        case "notification_decision":
418                            $value_type = __('Notification décision');
419                            break;
420                        case "notification_service_consulte":
421                            $value_type = __('Notification service consulté');
422                            break;
423                        case "notification_tiers_consulte":
424                            $value_type = __('Notification tiers consulté');
425                            break;
426                        case "notification_signataire":
427                            $value_type = __('Notification signataire');
428                            break;
429                        case "completude_DI":
430                            $value_type = __('complétude DI');
431                            break;
432                        case "incompletude_DI":
433                            $value_type = __('incomplétude DI');
434                            break;
435                        case "lettre_incompletude":
436                            $value_type = __('Lettre au pétitionnaire d\'incompletude');
437                            break;
438                        case "lettre_majoration":
439                            $value_type = __('Lettre au pétitionnaire de majoration');
440                            break;
441                        case "ajout_documents_specifiques":
442                            $value_type = __('Ajout Document Spécifique');
443                            break;
444                    }
445    
446                    $contenu_type[1][] = $value_type;
447                }
448    
449                $form->setselect('type', $contenu_type);
450          }          }
451    
452          if ($maj == 3) {          if ($maj == 3) {
453              if ($this->getVal('stream') == 'output') {              $dossier = $form->val['dossier'];
454                  $inst_dossier = $this->f->get_inst__om_dbform(array(              // Récupération du numéro du dossier si il n'est pas renseigné dans la tâche
                     "obj" => "dossier",  
                     "idx" => $form->val['dossier'],  
                 ));  
455    
456                  if($form->val['type'] == "creation_DA"){              if ($dossier == '' || $dossier == null) {
457                      $obj_link = 'dossier_autorisation';                  // Récupération de la payload de la taĉhe.
458                    // Si la tâche est une tâche input la payload est associée à la tâche.
459                    // Si la tâche est une tâche en output la payload est "calculé" à l'ouverture
460                    // du formulaire.
461                    if ($this->getVal('stream') == 'input') {
462                        $json_payload = json_decode($this->getVal('json_payload'), true);
463                  } else {                  } else {
464                      $obj_link = 'dossier_instruction';                      $json_payload = json_decode($form->val['json_payload'], true);
465                  }                  }
466                    // A partir de la payload de la tâche ont récupère les externals uid
467                    // Si un external uid de DI (dossier) existe ont le récupère et on stocke le numéro
468                    // pour l'afficher sur le formulaire.
469                    // Si l'external UID du DI n'existe pas on récupère celui du DA
470                    if (! empty($json_payload) ){
471                        $external_uid = '';
472                        if (array_key_exists('external_uids', $json_payload)
473                            && array_key_exists('dossier', $json_payload['external_uids'])
474                        ) {
475                            $external_uid = $json_payload['external_uids']['dossier'];
476                        } elseif (array_key_exists('external_uids', $json_payload)
477                            && array_key_exists('demande', $json_payload['external_uids'])) {
478                            $external_uid = $json_payload['external_uids']['demande'];
479                        }
480                        // Recherche l'external uid dans la base de données pour récupèrer le numéro de
481                        // DI / DA correspondant. On stocke le numéro de dossier dans la propriété val
482                        // du formulaire pour pouvoir l'afficher
483                        if ($external_uid != '') {
484                            $qres = $this->f->get_one_result_from_db_query(
485                                sprintf(
486                                    'SELECT
487                                        lien_id_interne_uid_externe.dossier
488                                    FROM
489                                        %1$slien_id_interne_uid_externe
490                                    WHERE
491                                        lien_id_interne_uid_externe.external_uid = \'%2$s\'',
492                                    DB_PREFIXE,
493                                    $this->f->db->escapeSimple($external_uid)
494                                ),
495                                array(
496                                    "origin" => __METHOD__,
497                                )
498                            );
499                            if (! empty($qres["result"])) {
500                                $dossier = $qres["result"];
501                            }
502                        }
503                    }
504                }
505    
506                  $params = array();              // Vérifie si le numéro de dossier associé à la tâche existe dans la base.
507                  $params['obj'] = $obj_link;              // Si c'est le cas ce numéro sera lié au dossier (DI ou DA) correspondant
508                  $params['libelle'] = $inst_dossier->getVal('dossier');              // TODO : vérifier la liste des tâches lié à des DA
509                  $params['title'] = "Consulter le dossier";              $obj_link = '';
510                  $params['idx'] = $form->val['dossier'];              if ($form->val['type'] == "creation_DA" || $form->val['type'] == "modification_DA") {
511                  $form->setSelect("dossier", $params);                  // Vérification que le numéro de DA affiché dans le formulaire existe
512                    $qres = $this->f->get_one_result_from_db_query(
513                        sprintf(
514                            'SELECT
515                                dossier_autorisation.dossier_autorisation
516                            FROM
517                                %1$sdossier_autorisation
518                            WHERE
519                                dossier_autorisation.dossier_autorisation = \'%2$s\'',
520                            DB_PREFIXE,
521                            $this->f->db->escapeSimple($form->val['dossier'])
522                        ),
523                        array(
524                            "origin" => __METHOD__,
525                        )
526                    );
527                    // Si on a un résultat c'est que le dossier existe, il faut afficher le lien
528                    if (! empty($qres["result"])) {
529                        $obj_link = 'dossier_autorisation';
530                    }
531                } else {
532                    // Vérification que le numéro de DI affiché dans le formulaire existe
533                    $sql = sprintf(
534                        'SELECT
535                            dossier.dossier,
536                            dossier.dossier_parent
537                        FROM
538                            %1$sdossier
539                        WHERE
540                            dossier.dossier = \'%2$s\'',
541                        DB_PREFIXE,
542                        $this->f->db->escapeSimple($dossier)
543                    );
544                    $qres = $this->f->get_all_results_from_db_query(
545                        $sql,
546                        array(
547                            "origin" => __METHOD__,
548                        )
549                    );
550                    // Si on a un résultat c'est que le dossier existe, il faut afficher le lien
551                    if (! empty($qres['result']) && $qres['row_count'] > 0) {
552                        $obj_link = 'dossier_instruction';
553                        if (! empty($qres['result'][0]['dossier_parent'])) {
554                            $dossier = $qres['result'][0]['dossier_parent'];
555                        }
556                    }
557              }              }
558                // Pour afficher le lien vers un dossier ont utilise un champ de type "link".
559                // Pour paramétrer ce champs on a besoin de savoir :
560                //  - quel objet est visé par le lien
561                //  - le label (libellé) du lien
562                //  - l'identifiant de l'objet qui sera utilisé dans le lien
563                //  - le titre associé au lien
564                // Pour cela on remplit le champs comme un select et les valeurs du select
565                // contiennent les informations nécessaire à l'affichage du champs.
566                $params = array(
567                    'obj' => $obj_link,
568                    'libelle' => $dossier,
569                    'title' => "Consulter le dossier",
570                    'idx' => $dossier
571                );
572                $form->setSelect("dossier", $params);
573          }          }
574      }      }
575    
# Line 204  class task extends task_gen { Line 581  class task extends task_gen {
581      function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {      function setVal(&$form, $maj, $validation, &$dnu1 = null, $dnu2 = null) {
582          // parent::setVal($form, $maj, $validation);          // parent::setVal($form, $maj, $validation);
583          //          //
584          if ($this->getVal('stream') == "output") {          if ($this->getVal('stream') == "output"
585                && $this->getVal('type') !== 'suppression_piece'
586                && ($this->getVal('state') !== self::STATUS_DONE
587                    || $this->getVal('json_payload') === "{}")) {
588                //
589              $form->setVal('json_payload', $this->view_form_json(true));              $form->setVal('json_payload', $this->view_form_json(true));
590          } else {          } else {
591              $form->setVal('json_payload', htmlentities($this->getVal('json_payload')));              $form->setVal('json_payload', json_encode(json_decode($this->getVal('json_payload'), true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
592            }
593            // Gestion du contenu de l'historique
594            if ($this->getVal('timestamp_log') !== ''
595                && $this->getVal('timestamp_log') !== null) {
596                //
597                $form->setVal('timestamp_log', $this->getVal('timestamp_log'));
598          }          }
599      }      }
600    
# Line 217  class task extends task_gen { Line 604  class task extends task_gen {
604          // Récupération du mode de l'action          // Récupération du mode de l'action
605          $crud = $this->get_action_crud($maj);          $crud = $this->get_action_crud($maj);
606    
607            $form->setLib('date_creation', __("Date de création"));
608            $form->setLib('date_modification', __("Date de dernière modification"));
609            $form->setLib('comment', __("commentaire"));
610    
611          // MODE different de CREER          // MODE different de CREER
612          if ($maj != 0 || $crud != 'create') {          if ($maj != 0 || $crud != 'create') {
613              $form->setLib('json_payload', '');              $form->setLib('json_payload', '');
614                $form->setLib("task", __("identifiant"));
615                $form->setLib("Task_portal", __("task_portal"));
616                $form->setLib("type", __("type"));
617                $form->setLib("object_id", __("Réf. interne"));
618                $form->setLib("stream", __("flux"));
619                $form->setLib("timestamp_log", __("Historique"));
620          }          }
621      }      }
622    
623      public function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {      public function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
624          $ret = parent::verifier($val, $dnu1, $dnu2);          $ret = parent::verifier($val, $dnu1, $dnu2);
625    
626            $allowed_state = array(
627                self::STATUS_DRAFT,
628                self::STATUS_NEW,
629                self::STATUS_PENDING,
630                self::STATUS_DONE,
631                self::STATUS_ERROR,
632                self::STATUS_DEBUG,
633                self::STATUS_ARCHIVED,
634                self::STATUS_CANCELED,
635                self::STATUS_INVALID);
636    
637            $task_id = $this->getVal($this->clePrimaire);
638            $task_id_text = sprintf(__("la tâche '%s'"), $task_id);
639            if (empty($task_id) || $task_id === ']') {
640                $task_id_text = __("la nouvelle tâche");
641            }
642    
643            if (! isset($this->valF['state']) || empty($this->valF['state'])) {
644                $this->correct = false;
645                $err_msg = sprintf(
646                    __("Champ '%s' obligatoire pour %s"),
647                    'state', $task_id_text);
648                $this->addToMessage($err_msg);
649                $this->addToLog(__METHOD__.'(): '.$err_msg, DEBUG_MODE);
650            }
651            elseif (! in_array($this->valF['state'], $allowed_state)) {
652                $this->correct = false;
653                $err_msg = sprintf(
654                    __("Champ '%s' invalide (%s) pour %s"),
655                    'state', var_export($this->valF['state'], true), $task_id_text);
656                $this->addToMessage($err_msg);
657                $this->addToLog(__METHOD__.'(): '.$err_msg, DEBUG_MODE);
658            }
659    
660          // une tâche entrante doit avoir un type et une payload non-vide          // une tâche entrante doit avoir un type et une payload non-vide
661          if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {          if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
662              if (isset($this->valF['type']) === false) {              if (isset($this->valF['type']) === false) {
# Line 279  class task extends task_gen { Line 710  class task extends task_gen {
710                                 $this->valF['stream'] == 'input')) {                                 $this->valF['stream'] == 'input')) {
711    
712              // décode la payload JSON              // décode la payload JSON
713                // TODO : COMMENTER
714              $json_payload = json_decode($this->valF['json_payload'], true);              $json_payload = json_decode($this->valF['json_payload'], true);
715    
716              // défini une liste de chemin de clés requises              // défini une liste de chemin de clés requises
717              $paths = array(              $paths = array();
718                  'external_uids/dossier'              if ($this->valF['category'] === PLATAU) {
719              );                  $paths = array(
720                        'external_uids/dossier'
721                    );
722                }
723    
724              // tâche de type création de DI/DA              // tâche de type création de DI/DA
725              if (isset($this->valF['type']) !== false && $this->valF['type'] == 'create_DI_for_consultation') {              if (isset($this->valF['type']) !== false && $this->valF['type'] == 'create_DI_for_consultation') {
# Line 302  class task extends task_gen { Line 737  class task extends task_gen {
737                  }                  }
738    
739                  // présence d'un moyen d'identifier la collectivité/le service                  // présence d'un moyen d'identifier la collectivité/le service
740                  if (! isset($json_payload['dossier']['acteur']) &&                  if (! isset($json_payload['external_uids']['acteur']) &&
741                          ! isset($json_payload['dossier']['om_collectivite'])) {                          ! isset($json_payload['dossier']['om_collectivite'])) {
742                      $this->correct = false;                      $this->correct = false;
743                      $this->addToMessage(sprintf(                      $this->addToMessage(sprintf(
744                          __("L'une des clés %s ou %s est obligatoire dans le contenu du champ %s pour une tâche entrante."),                          __("L'une des clés %s ou %s est obligatoire dans le contenu du champ %s pour une tâche entrante."),
745                          sprintf('<span class="bold">%s</span>', 'dossier/acteur'),                          sprintf('<span class="bold">%s</span>', 'external_uids/acteur'),
746                          sprintf('<span class="bold">%s</span>', 'dossier/om_collectivite'),                          sprintf('<span class="bold">%s</span>', 'dossier/om_collectivite'),
747                          sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))                          sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
748                      ));                      ));
# Line 350  class task extends task_gen { Line 785  class task extends task_gen {
785          return $ret && $this->correct;          return $ret && $this->correct;
786      }      }
787    
788      protected function task_exists(string $type, string $object_id) {      /**
789         * [task_exists description]
790         * @param  string $type      [description]
791         * @param  string $object_id [description]
792         * @param  bool   $is_not_done   [description]
793         * @return [type]            [description]
794         *
795         * Cette méthode est déprécier, car elle cause des cas illogique avec PENDING qui ne compte pas dans le is_not_done.
796         * L'utilisation de task_exists_multi_search() est à privilegier pour éviter les problèmes et les risques
797         */
798        public function task_exists(string $type, string $object_id, string $dossier = null, bool $is_not_done = true) {
799            $qres = $this->f->get_one_result_from_db_query(
800                sprintf(
801                    'SELECT
802                        task
803                    FROM
804                        %1$stask
805                    WHERE
806                        %2$s
807                        type = \'%3$s\'
808                        AND (
809                            object_id = \'%4$s\'
810                            %5$s
811                        )
812                        AND state != \'%6$s\'',
813                    DB_PREFIXE,
814                    $is_not_done == true ? 'state != \''.self::STATUS_DONE.'\' AND' : '',
815                    $type,
816                    $object_id,
817                    $dossier !== null ? sprintf('OR (object_id IS NULL AND dossier = \'%s\')', $dossier) : '',
818                    self::STATUS_CANCELED
819                ),
820                array(
821                    "origin" => __METHOD__,
822                )
823            );
824            if (! empty($qres["result"])) {
825                return $qres["result"];
826            }
827            return false;
828        }
829    
830        /**
831         * Permet la recherche multi-critères des tasks.
832         *
833         * @param  array  $search_values Chaque entrée du tableau est une ligne dans le WHERE
834         * @return mixed                 Retourne le résultat de la requête ou false
835         */
836        public function task_exists_multi_search(array $search_values) {
837          $query = sprintf('          $query = sprintf('
838              SELECT task              SELECT task, state
839              FROM %1$stask              FROM %1$stask
840              WHERE state != \'%2$s\'              %2$s
841              AND type = \'%3$s\'              %3$s
842              AND object_id = \'%4$s\'              ORDER BY task ASC
843              ',              ',
844              DB_PREFIXE,              DB_PREFIXE,
845              self::STATUS_DONE,              empty($search_values) === false ? ' WHERE ' : '',
846              $type,              implode(' AND ', $search_values)
             $object_id  
847          );          );
848          $res = $this->f->get_one_result_from_db_query($query);          $res = $this->f->get_all_results_from_db_query(
849          if ($res['result'] !== null && $res['result'] !== '') {              $query,
850                array(
851                    "origin" => __METHOD__,
852                )
853            );
854            if (count($res['result']) > 0) {
855              return $res['result'];              return $res['result'];
856          }          }
857          return false;          return false;
# Line 381  class task extends task_gen { Line 868  class task extends task_gen {
868       * @return boolean       * @return boolean
869       */       */
870      function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {      function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
871            $parent_res = parent::triggerajouter($id, $dnu1, $val);
872            if ($parent_res === false) return $parent_res;
873    
874          // tâche entrante          // tâche entrante
875          if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {          if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
# Line 394  class task extends task_gen { Line 883  class task extends task_gen {
883                      ! empty($json_payload['dossier']['dossier'])) {                      ! empty($json_payload['dossier']['dossier'])) {
884                  $this->valF["dossier"] = $json_payload['dossier']['dossier'];                  $this->valF["dossier"] = $json_payload['dossier']['dossier'];
885              }              }
886            }
887    
888              /**          // gestion d'une tache de type notification et de category mail
889               * Puisque le dossier n'a potentiellement pas encore été créé          if (isset($val['type'])
890               * alors il faut ne faut chercher à récupérer le numéro de dossier openADS              && (($val['type'] === 'notification_instruction' || $val['type'] === 'notification_decision')
891               * à partir de l'external_uids (en passant par la table de liens)                  && isset($val['category'])
892              // sinon si la tâche possède une clé external_uids/dossier                  && $val['category'] === 'mail')
893              elseif(isset($json_payload['external_uids']['dossier']) &&              || $val['type'] === 'notification_service_consulte'
894                      ! empty($json_payload['external_uids']['dossier'])) {              || $val['type'] === 'notification_tiers_consulte'
895                || $val['type'] === 'notification_depot_demat'
896                || $val['type'] === 'notification_commune'
897                || $val['type'] === 'notification_signataire'
898                ) {
899                // Récupère la payload de la tache
900                $data = array();
901                $data['instruction_notification'] = $this->get_instruction_notification_data(
902                    $this->valF['category'],
903                    'with-id',
904                    array('with-id' => $this->valF['object_id'])
905                );
906                $data['dossier'] = $this->get_dossier_data($this->valF['dossier']);
907    
908                  // instancie l'objet lien_id_interne_uid_externe              // Récupère l'instance de la notification
909                  $inst_lien = $this->f->get_inst__om_dbform(array(              $inst_notif = $this->f->get_inst__om_dbform(array(
910                      "obj" => "lien_id_interne_uid_externe",                  "obj" => "instruction_notification",
911                      "idx" => ']',                  "idx" => $val['object_id'],
912                ));
913                // Envoi le mail et met à jour le suivi
914                $envoiMail = $inst_notif->send_mail_notification($data, $val['type']);
915                // Passage de la tache à done si elle a réussi et à error
916                // si l'envoi a échoué
917                $this->valF['state'] = self::STATUS_DONE;
918                if ($envoiMail === false) {
919                    $this->valF['state'] = self::STATUS_ERROR;
920                }
921            }
922        }
923    
924        /**
925         * TRIGGER - triggermodifier.
926         *
927         * @param string $id
928         * @param null &$dnu1 @deprecated  Ne pas utiliser.
929         * @param array $val Tableau des valeurs brutes.
930         * @param null $dnu2 @deprecated  Ne pas utiliser.
931         *
932         * @return boolean
933         */
934        function triggermodifier($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
935            parent::triggermodifier($id, $dnu1, $val, $dnu2);
936            $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
937    
938            // Mise à jour des valeurs, notamment du timestamp_log en fonction de plusieurs critères
939            $values = array(
940                'state' => $this->valF['state'],
941                'object_id' => $this->valF['object_id'],
942                'comment' => $this->valF['comment'],
943            );
944            $new_values = $this->set_values_for_update($values);
945            if ($new_values === false) {
946                $this->addToLog(__METHOD__."(): erreur timestamp log", DEBUG_MODE);
947                return false;
948            }
949    
950            // Mise à jour des valeurs
951            $this->valF['timestamp_log'] = $new_values['timestamp_log'];
952            $this->valF['state'] = $new_values['state'];
953            $this->valF['object_id'] = $new_values['object_id'];
954            $this->valF['last_modification_date'] = date('Y-m-d');
955            $this->valF['last_modification_time'] = date('H:i:s');
956    
957            if ($val['stream'] === 'output'
958                && $val['type'] !== 'suppression_piece') {
959                // Lorsque la task passe d'un état "done" à un état qui n'est pas "done"
960                if ($this->getVal("state") === self::STATUS_DONE
961                    && $this->valF['state'] !== self::STATUS_DONE) {
962                    //
963                    $this->valF['json_payload'] = "{}";
964                }
965            }
966    
967            return true;
968        }
969    
970    
971        /**
972         * Applique nouvelle valeur après traitement.
973         *
974         * @param array $params Tableau des valeurs en entrées
975         * @return array        Tableau des valeurs en sorties
976         */
977        public function set_values_for_update($params = array()) {
978    
979            // Récupération du timestamp_log existant
980            $timestamp_log = $this->get_timestamp_log();
981            if ($timestamp_log === false) {
982                return false;
983            }
984    
985            // Vérification des object_id précédent en cas de tentative d'appliquer
986            // l'état CANCELED sur la tâche
987            if (isset($params['state']) === true
988                && $params['state'] === self::STATUS_CANCELED) {
989                // Récupération du journal d'activité de la tâche sous forme de tableau
990                // trié par ordre décroissant
991                $log = $timestamp_log;
992                krsort($log);
993                // Pour chaque entrée dans le journal d'activité de la tâche :
994                // - vérification de la présence de l'object_id précédent
995                // - vérification que l'object_id précédent existe toujours dans la base de données
996                // - l'object_id est mise à jour avec la valeur de l'object_id précédent
997                // - le state n'est pas modifié
998                // - sortie du traitement dès que le premier object_id précédent existant est trouvé
999                // - si aucun object_id précédent existant n'est trouvé alors ni le state, ni l'object_id n'est modifiés
1000                foreach ($log as $key => $value) {
1001                    //
1002                    if (isset($value['prev_object_id']) === true
1003                        && $this->getVal('object_id') !== $value['prev_object_id']) {
1004                        // Récupère la liste des tables potentielles pour un type de tâche
1005                        $tables = $this->get_tables_by_task_type($this->getVal('type'), $this->getVal('stream'));
1006                        foreach ($tables as $table) {
1007                            // Vérifie s'il y a un ou aucun résultat
1008                            $qres = $this->f->get_one_result_from_db_query(
1009                                sprintf(
1010                                    'SELECT
1011                                        COUNT(%2$s)
1012                                    FROM
1013                                        %1$s%2$s
1014                                    WHERE
1015                                        %2$s::CHARACTER VARYING = \'%3$s\'',
1016                                    DB_PREFIXE,
1017                                    $table,
1018                                    $value['prev_object_id']
1019                                ),
1020                                array(
1021                                    "origin" => __METHOD__,
1022                                    "force_return" => true,
1023                                )
1024                            );
1025                            if ($qres["code"] !== "OK") {
1026                                return $this->end_treatment(__METHOD__, false);
1027                            }
1028                            // Affectation des valeurs et sortie de la boucle
1029                            if ($qres["result"] == '1') {
1030                                $params['object_id'] = $value['prev_object_id'];
1031                                $params['state'] = $this->getVal('state');
1032                                break;
1033                            }
1034                        }
1035                        // Sortie de la boucle si les valeurs sont affectées
1036                        if ($params['object_id'] !== null
1037                            && $params['object_id'] === $value['prev_object_id']) {
1038                            //
1039                            break;
1040                        }
1041                    }
1042                }
1043            }
1044    
1045            // Mise à jour du journal d'activité de la tâche
1046            array_push($timestamp_log, array(
1047                'modification_date' => date('Y-m-d H:i:s'),
1048                'object_id' => $params['object_id'] !== null ? $params['object_id'] : $this->getVal('object_id'),
1049                'prev_object_id' => $this->getVal('object_id'),
1050                'state' =>  $params['state'],
1051                'prev_state' => $this->getVal('state'),
1052                'comment' => isset($params['comment']) ? $params['comment'] : $this->getVal('comment'),
1053            ));
1054            //
1055            $timestamp_log = json_encode($timestamp_log);
1056            
1057    
1058            // Les nouvelles valeurs après vérification des critères
1059            $result = array(
1060                'timestamp_log' => $timestamp_log,
1061                'object_id' => $params['object_id'],
1062                'state' => $params['state'],
1063                'comment' => $params['comment'],
1064            );
1065            return $result;
1066        }
1067    
1068        
1069        /**
1070         * TRIGGER - triggermodifierapres.
1071         *
1072         * @param string $id
1073         * @param null &$dnu1 @deprecated  Ne pas utiliser.
1074         * @param array $val Tableau des valeurs brutes.
1075         * @param null $dnu2 @deprecated  Ne pas utiliser.
1076         *
1077         * @return boolean
1078         */
1079        public function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1080            $res = parent::triggermodifierapres($id, $dnu1, $val, $dnu2);
1081    
1082            if ($res !== false) {
1083                if ($val['stream'] === 'output') {
1084                    // Si le type de la tache est suppression alors il faut gerer le state dans la payload figée.
1085                    if (in_array($val['type'], array('suppression_piece'))) {
1086                        $json_payload = json_decode($this->valF['json_payload']);
1087                        // Si le state de la payload est différent du nouveau state de la tache.
1088                        if ($json_payload->task->state !== $this->valF['state']) {
1089                            $json_payload->task->state = $this->valF['state'];
1090                            $task_val = array();
1091                            // Avec la nouvelle payload.
1092                            $task_val['json_payload'] = json_encode($json_payload);
1093                            $res = $this->f->db->autoExecute(
1094                                sprintf('%s%s', DB_PREFIXE, "task"),
1095                                $task_val,
1096                                DB_AUTOQUERY_UPDATE,
1097                                sprintf("task = '%s'", $val['task'])
1098                            );
1099                            $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, 'task')."\", ".print_r($task_val, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("task = '%s'", $val['task'])."\");", VERBOSE_MODE);
1100                            if ($this->f->isDatabaseError($res, true) === true) {
1101                                return false;
1102                            }
1103                            # Choix de l'autoExecute pour évité le double trigger de l'enregistrement de l'historique
1104                            # $instance_task->modifier($task_val);
1105                        }
1106                    }
1107                    if ($val['type'] !== 'suppression_piece') {
1108                        // Lorsque la task passe d'un état qui n'est pas "done" à l'état "done".
1109                        if ($this->getVal("state") !== self::STATUS_DONE
1110                            && $this->valF['state'] === self::STATUS_DONE) {
1111                            if ($this->valF['json_payload'] == '{}' ) {
1112                                $this->valF['json_payload'] = $this->view_form_json(true);
1113                            }
1114                            $json_payload = json_decode($this->valF['json_payload']);
1115                            // Si le state de la payload est différent du nouveau state de la tache.
1116                            if ($json_payload->task->state !== $this->valF['state']) {
1117                                $json_payload->task->state = $this->valF['state'];
1118                                $task_val = array();
1119                                // Avec la nouvelle payload.
1120                                $task_val['json_payload'] = json_encode($json_payload);
1121                                $res = $this->f->db->autoExecute(
1122                                    sprintf('%s%s', DB_PREFIXE, "task"),
1123                                    $task_val,
1124                                    DB_AUTOQUERY_UPDATE,
1125                                    sprintf("task = '%s'", $val['task'])
1126                                );
1127                                $this->f->addToLog(__METHOD__."(): db->autoexecute(\"".sprintf('%s%s', DB_PREFIXE, 'task')."\", ".print_r($task_val, true).", DB_AUTOQUERY_UPDATE, \"".sprintf("task = '%s'", $val['task'])."\");", VERBOSE_MODE);
1128                                if ($this->f->isDatabaseError($res, true) === true) {
1129                                    return false;
1130                                }
1131                                # Choix de l'autoExecute pour évité le double trigger de l'enregistrement de l'historique
1132                                # $instance_task->modifier($task_val);
1133                            }
1134                        }
1135                    }
1136                }
1137            }
1138    
1139            // Suivi des notificiations
1140            // En cas de changement de l'état de la tâche de notification, alors
1141            // le suivi des dates de la notification et de l'instruction, est effectué
1142            if (isset($val['category']) === true
1143                && $val['category'] === PORTAL
1144                && isset($val['type']) === true
1145                && ($val['type'] === 'notification_recepisse'
1146                    || $val['type'] === 'notification_instruction'
1147                    || $val['type'] === 'notification_decision'
1148                    || $val['type'] === 'notification_service_consulte'
1149                    || $val['type'] === 'notification_tiers_consulte')) {
1150                //
1151                if (isset($this->valF['state']) === true
1152                    && $this->valF['state'] !== $this->getVal('state')
1153                    && $this->valF['state'] !== self::STATUS_CANCELED) {
1154                    //
1155                    $inst_in = $this->f->get_inst__om_dbform(array(
1156                        "obj" => "instruction_notification",
1157                        "idx" => $val['object_id'],
1158                  ));                  ));
1159                  if(! $dossier = $inst_lien->get_id_dossier_from_external_uid(                  $valF_in = array();
1160                          $json_payload['external_uids']['dossier'])){                  foreach ($inst_in->champs as $champ) {
1161                      $error_msg = sprintf(                      $valF_in[$champ] = $inst_in->getVal($champ);
1162                          __("Aucune correspondance de dossier pour l'external_uid.dossier '%s'."),                  }
1163                          $json_payload['external_uids']['dossier']);                  // Par défaut la date d'envoi et la date de premier accès sur
1164                      $this->addToLog(__METHOD__."() : erreur : $error_msg", DEBUG_MODE);                  // la notification ne sont pas renseignées
1165                      $this->addToMessage($error_msg);                  $valF_in['date_envoi'] = null;
1166                      $this->correct = false;                  $valF_in['date_premier_acces'] = null;
1167                    // Lorsque la tâche est correctement traitée
1168                    if ($this->valF['state'] === self::STATUS_DONE) {
1169                        //
1170                        $valF_in['statut'] = __("envoyé");
1171                        $valF_in['commentaire'] = __("Notification traitée");
1172                        $valF_in['date_envoi'] = date('d/m/Y H:i:s');
1173                        // Si l'instruction possède un document lié, alors ses dates
1174                        // de suivi sont mises à jour
1175                        $inst_instruction = $this->f->get_inst__om_dbform(array(
1176                            "obj" => "instruction",
1177                            "idx" => $inst_in->getVal('instruction'),
1178                        ));
1179                        if ($inst_instruction->has_an_edition() === true) {
1180                            $valF_instruction = array();
1181                            foreach ($inst_instruction->champs as $champ) {
1182                                $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1183                            }
1184                            $valF_instruction['date_envoi_rar'] = date('d/m/Y');
1185                            $valF_instruction['date_retour_rar'] = date('d/m/Y', strtotime('now + 1 day'));
1186                            // Action spécifique pour identifier que la modification
1187                            // est une notification de demandeur
1188                            $inst_instruction->setParameter('maj', 175);
1189                            $update_instruction = $inst_instruction->modifier($valF_instruction);
1190                            if ($update_instruction === false) {
1191                                $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, VERBOSE_MODE);
1192                                return false;
1193                            }
1194                        }
1195                    }
1196                    // En cas d'erreur lors du traitement de la task
1197                    if ($this->valF['state'] === self::STATUS_ERROR) {
1198                        $valF_in['statut'] = __("échec");
1199                        $valF_in['commentaire'] = __("Le traitement de la notification a échoué");
1200                    }
1201                    // Met à jour la notification
1202                    $inst_in->setParameter('maj', 1);
1203                    $update_in = $inst_in->modifier($valF_in);
1204                    if ($update_in === false) {
1205                        $this->addToLog(__METHOD__."(): ".$inst_in->msg, VERBOSE_MODE);
1206                      return false;                      return false;
1207                  }                  }
1208                  $this->valF["dossier"] = $dossier;              }
1209              }*/          }
1210    
1211            // Envoi au contrôle de légalité
1212            // En cas de changement de l'état de la tâche envoi_CL, alors le suivi
1213            // des dates de l'instruction est effectué
1214            if ($val['type'] === 'envoi_CL'
1215                && isset($this->valF['state']) === true
1216                && $this->valF['state'] === self::STATUS_DONE) {
1217                //
1218                $inst_instruction = $this->f->get_inst__om_dbform(array(
1219                    "obj" => "instruction",
1220                    "idx" => $this->getVal('object_id'),
1221                ));
1222                $valF_instruction = array();
1223                foreach ($inst_instruction->champs as $champ) {
1224                    $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1225                }
1226                // On met à jour la date d'envoi au CL seulement si l'instruction a une édition liée
1227                $valF_instruction['date_envoi_controle_legalite'] = date("Y-m-d");
1228                $inst_instruction->setParameter('maj', 1);
1229                $update_instruction = $inst_instruction->modifier($valF_instruction);
1230                if ($update_instruction === false) {
1231                    $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, VERBOSE_MODE);
1232                    return false;
1233                }
1234          }          }
1235    
1236            //
1237            return true;
1238      }      }
1239    
1240      /**      /**
# Line 435  class task extends task_gen { Line 1249  class task extends task_gen {
1249    
1250          // Vérifie si la task doit être ajoutée en fonction du mode de l'application,          // Vérifie si la task doit être ajoutée en fonction du mode de l'application,
1251          // seulement pour les tasks output          // seulement pour les tasks output
1252          $task_types_si = array(          $task_types_si = self::TASK_TYPE_SI;
1253              'creation_DA',          $task_types_sc = self::TASK_TYPE_SC;
             'creation_DI',  
             'depot_DI',  
             'modification_DI',  
             'qualification_DI',  
             'decision_DI',  
             'incompletude_DI',  
             'completude_DI',  
             'ajout_piece',  
             'add_piece',  
         );  
         $task_types_sc = array(  
             'create_DI_for_consultation',  
             'avis_consultation',  
             'pec_metier_consultation',  
         );  
1254          $stream = isset($params['val']['stream']) === true ? $params['val']['stream'] : 'output';          $stream = isset($params['val']['stream']) === true ? $params['val']['stream'] : 'output';
1255          if ($stream === 'output'          if ($stream === 'output'
1256              && isset($params['val']['type']) === true              && isset($params['val']['type']) === true
# Line 468  class task extends task_gen { Line 1267  class task extends task_gen {
1267              return $this->end_treatment(__METHOD__, true);              return $this->end_treatment(__METHOD__, true);
1268          }          }
1269    
1270          $timestamp_log = json_encode(array(          //
1271              'creation_date' => date('Y-m-d H:i:s'),          $timestamp_log = json_encode(array());
1272          ));  
1273            //
1274            $category = isset($params['val']['category']) === true ? $params['val']['category'] : $this->category;
1275    
1276          // Si la tâche est de type ajout_piece et de stream input alors on ajoute le fichier          // Si la tâche est de type ajout_piece et de stream input alors on ajoute le fichier
1277          // et on ajoute l'uid dans le champ json_payload avant l'ajout de la tâche          // et on ajoute l'uid dans le champ json_payload avant l'ajout de la tâche
1278          if (isset($params['val']['type'])          if (isset($params['val']['type'])
1279              && $params['val']['type'] == "add_piece"              && in_array($params['val']['type'], self::TASK_WITH_DOCUMENT)
1280              && isset($params['val']['stream'])              && isset($params['val']['stream'])
1281              && $params['val']['stream'] == "input" ) {              && $params['val']['stream'] == "input" ) {
1282              //              //
1283              $json_payload = json_decode($params['val']['json_payload'], true);              $json_payload = json_decode($params['val']['json_payload'], true);
1284              $document_numerise = $json_payload['document_numerise'];              if (json_last_error() !== JSON_ERROR_NONE) {
1285              $file_content = base64_decode($document_numerise["file_content"]);                  $this->addToMessage(__("Le contenu JSON de la tâche n'est pas valide."));
             if ($file_content === false){  
                 $this->addToMessage(__("Le contenu du fichier lié à la tâche n'a pas pu etre recupere."));  
1286                  return $this->end_treatment(__METHOD__, false);                  return $this->end_treatment(__METHOD__, false);
1287              }              }
1288              $metadata = array(              if (isset($json_payload['document_numerise']["file_content"]) === true
1289                  "filename" => $document_numerise['nom_fichier'],                  && empty($json_payload['document_numerise']["file_content"]) === false) {
1290                  "size" => strlen($file_content),                  //
1291                  "mimetype" => $document_numerise['file_content_type'],                  $document_numerise = $json_payload['document_numerise'];
1292                  "date_creation" => $document_numerise['date_creation'],                  $file_content = base64_decode($document_numerise["file_content"]);
1293              );                  if ($file_content === false){
1294              $uid_fichier = $this->f->storage->create($file_content, $metadata, "from_content");                      $this->addToMessage(__("Le contenu du fichier lié à la tâche n'a pas pu etre recupere."));
1295              if ($uid_fichier === OP_FAILURE) {                      return $this->end_treatment(__METHOD__, false);
1296                  $this->addToMessage(__("Erreur lors de la creation du fichier lié à la tâche."));                  }
1297                  return $this->end_treatment(__METHOD__, false);                  $metadata = array(
1298                        "filename" => $document_numerise['nom_fichier'],
1299                        "size" => strlen($file_content),
1300                        "mimetype" => $document_numerise['file_content_type'],
1301                        "date_creation" => isset($document_numerise['date_creation']) === true ? $document_numerise['date_creation'] : date("Y-m-d"),
1302                    );
1303                    $uid_fichier = $this->f->storage->create($file_content, $metadata, "from_content", "task.uid_fichier");
1304                    if ($uid_fichier === OP_FAILURE) {
1305                        $this->addToMessage(__("Erreur lors de la creation du fichier lié à la tâche."));
1306                        return $this->end_treatment(__METHOD__, false);
1307                    }
1308                    $json_payload["document_numerise"]["uid"] = $uid_fichier;
1309                    // Le fichier a été ajouté nous n'avons plus besoin du champ file_content dans la payload
1310                    unset($json_payload["document_numerise"]["file_content"]);
1311                    $params['val']['json_payload'] = json_encode($json_payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
1312              }              }
             $json_payload["document_numerise"]["uid"] = $uid_fichier;  
             // Le fichier a été ajouté nous n'avons plus besoin du champ file_content dans la payload  
             unset($json_payload["document_numerise"]["file_content"]);  
             $params['val']['json_payload'] = json_encode($json_payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);  
1313          }          }
1314    
1315          // Mise à jour du DI          if (isset($params['val']['state'])) {
1316                $allowed_state = array(
1317                    self::STATUS_DRAFT,
1318                    self::STATUS_NEW,
1319                    self::STATUS_PENDING,
1320                    self::STATUS_DONE,
1321                    self::STATUS_ERROR,
1322                    self::STATUS_DEBUG,
1323                    self::STATUS_ARCHIVED,
1324                    self::STATUS_CANCELED,
1325                    self::STATUS_INVALID);
1326    
1327                if (empty($params['val']['state'])) {
1328                    throw new InvalidArgumentException(
1329                        "État ('state') vide pour la nouvelle tâche");
1330                }
1331                elseif (! in_array($params['val']['state'], $allowed_state)) {
1332                    throw new InvalidArgumentException(
1333                        "État ('state') invalide (".var_export($params['val']['state'], true).
1334                        ") pour la nouvelle tâche");
1335                }
1336            }
1337    
1338            // Valeurs de la tâche
1339          $valF = array(          $valF = array(
1340              'task' => '',              'task' => '',
1341              'type' => $params['val']['type'],              'type' => $params['val']['type'],
# Line 513  class task extends task_gen { Line 1345  class task extends task_gen {
1345              'dossier' => isset($params['val']['dossier']) ? $params['val']['dossier'] : '',              'dossier' => isset($params['val']['dossier']) ? $params['val']['dossier'] : '',
1346              'stream' => $stream,              'stream' => $stream,
1347              'json_payload' => isset($params['val']['json_payload']) === true ? $params['val']['json_payload'] : '{}',              'json_payload' => isset($params['val']['json_payload']) === true ? $params['val']['json_payload'] : '{}',
1348                'category' => $category,
1349                'creation_date' => date('Y-m-d'),
1350                'creation_time' => date('H:i:s'),
1351                'last_modification_date' => null,
1352                'last_modification_time' => null,
1353                'comment' => null,
1354          );          );
1355    
1356          // tâche sortante          // Gestion de la mise à jour des tâches sortantes
1357          if($valF["stream"] == "output"){          $typeNonConcerne = array(
1358                'notification_recepisse',
1359                'notification_instruction',
1360                'notification_decision',
1361                'notification_service_consulte',
1362                'notification_tiers_consulte',
1363                'notification_depot_demat',
1364                'notification_commune',
1365                'notification_signataire',
1366            );
1367            if ($valF["stream"] == "output"
1368                && ! in_array($valF['type'], $typeNonConcerne)) {
1369                // Vérification de l'existance d'une tâche pour l'objet concerné
1370                // La vérification diffère en fonction de certains types de tâche
1371                $search_values_common = array(
1372                    sprintf('state != \'%s\'', self::STATUS_CANCELED),
1373                    sprintf('state != \'%s\'', self::STATUS_DONE),
1374                    sprintf('state != \'%s\'', self::STATUS_PENDING),
1375                );
1376                $search_values_others = array(
1377                    sprintf('type = \'%s\'', $valF['type']),
1378                    sprintf('(object_id = \'%s\' OR (object_id IS NULL AND dossier = \'%s\'))', $valF['object_id'], $valF['dossier']),
1379                );
1380                $search_values_specifics = array(
1381                    sprintf('object_id = \'%s\'', $valF['object_id']),
1382                );
1383    
1384              // TODO expliquer ce code              // Recherche multi-critères sur les tâches
1385              $task_exists = $this->task_exists($valF['type'], $valF['object_id']);              // Si l'object id/dossier à des tâches de type $valF['type'] qui lui est associé
1386              if ($valF['type'] === 'modification_DI' && $task_exists === false) {              // Et que ces tâches ont des statut différents de canceled et done
1387                  $task_exists = $this->task_exists('creation_DI', $valF['object_id']);              // Alors on récupère ces tâches
1388                // Sinon return false
1389                $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_others));
1390    
1391                // Vérifie si une tâche existe déjà pour les types de tâches ayant un fonctionnement particulier.
1392                // Il existe 2 cas :
1393                //   - Aucune tâche déjà existante n'a été récupérées mais on veut faire une vérification supplémentaire
1394                //   - Les tâches pour lesquelles on fait une vérification supplémentaire qu'une correspondance ait été
1395                //     trouvée ou pas
1396                // Une tâche ne pouvant avoir qu'un seul type si elle est trouvée, il n'est pas nécessaire de
1397                // vérifier les autres
1398                $is_type_voulu_traite = false;
1399                // Cas 1 : Aucune tâche déjà existante n'a été récupérées mais effectue une vérification supplémentaire
1400                $cas_specifiques_tache_non_existante = array(
1401                    'modification_DI' => array("type = 'creation_DI'"),
1402                    'modification_DA' => array("type = 'creation_DA'")
1403                );
1404                foreach ($cas_specifiques_tache_non_existante as $type_task => $conditions_specifiques) {
1405                    // S'il n'existe pas de tâche de type voulu pour l'object id/dossier
1406                    if ($valF['type'] === $type_task && $task_exists === false) {
1407                        // On se réfère à la tâche de type 'ajout piece' de l'object id
1408                        $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, $conditions_specifiques));
1409                        $is_type_voulu_traite = true;
1410                        break;
1411                    }
1412              }              }
1413              if ($task_exists !== false) {  
1414                  $inst_task = $this->f->get_inst__om_dbform(array(              // Cas 2 : Vérification supplémentaire qu'une correspondance ait été trouvé ou pas
1415                      "obj" => "task",              if (! $is_type_voulu_traite) {
1416                      "idx" => $task_exists,                  $cas_specifiques = array(
1417                  ));                      'ajout_piece',
1418                  $update_state = $inst_task->getVal('state');                      'modification_piece',
1419                  if (isset($params['update_val']['state']) === true) {                      'suppression_piece',
1420                      $update_state = $params['update_val']['state'];                      'creation_consultation',
1421                  }                      'ajout_documents_specifiques',
                 $update_params = array(  
                     'val' => array(  
                         'state' => $update_state,  
                     ),  
1422                  );                  );
1423                  return $inst_task->update_task($update_params);                  foreach ($cas_specifiques as $type_task) {
1424                        if ($valF['type'] === $type_task) {
1425                            // On se réfère à la tâche de type 'ajout piece' de l'object id
1426                            $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = '$type_task'")));
1427                            break;
1428                        }
1429                    }
1430              }              }
         }  
1431    
1432                // S'il existe une tâche pour l'objet concerné, pas d'ajout de nouvelle
1433                // tâche mais mise à jour de l'existante
1434                if ($task_exists !== false) {
1435                    // Plusieurs tâches pourraient exister, elles sont contôler par ordre croissant
1436                    foreach ($task_exists as $task) {
1437                        $inst_task = $this->f->get_inst__om_dbform(array(
1438                            "obj" => "task",
1439                            "idx" => $task['task'],
1440                        ));
1441                        $update_state = $inst_task->getVal('state');
1442                        if (isset($params['update_val']['state']) === true) {
1443                            $update_state = $params['update_val']['state'];
1444                        }
1445                        $object_id = $inst_task->getVal('object_id');
1446                        if (!empty($valF['object_id'])) {
1447                            $object_id = $valF['object_id'];
1448                        }
1449                        // Pour être mise à jour, la tâche existante ne doit pas être en cours de traitement
1450                        $task_pending = $inst_task->getVal('state') === self::STATUS_PENDING
1451                            && $update_state === self::STATUS_PENDING
1452                            && $inst_task->getVal('object_id') !== $object_id;
1453                        if ($task_pending === false) {
1454                            $update_params = array(
1455                                'val' => array(
1456                                    'state' => $update_state,
1457                                ),
1458                                'object_id' => $object_id,
1459                            );
1460                            return $inst_task->update_task($update_params);
1461                        }
1462                    }
1463                }
1464            }
1465          $add = $this->ajouter($valF);          $add = $this->ajouter($valF);
1466          $this->addToLog(__METHOD__."(): retour de l'ajout de tâche: ".var_export($add, true), VERBOSE_MODE);          $this->addToLog(__METHOD__."(): retour de l'ajout de tâche: ".var_export($add, true), VERBOSE_MODE);
1467    
1468            // Création de la payload JSON dans le cas ou nous avons un suppression d'objet
1469            if ($stream === 'output'
1470                && $add === true
1471                && isset($valF['type']) === true
1472                && strpos($valF['type'], 'suppression_piece') !== false
1473            ) {
1474                $inst_task_empty = $this->f->get_inst__om_dbform(array(
1475                    "obj" => "task",
1476                    "idx" => 0,
1477                ));
1478                // Vérification de l'éxistence d'une tache de suppression de pièce
1479                $task_exists = $inst_task_empty->task_exists('suppression_piece', $valF['object_id']);
1480                $valF['task'] = $task_exists;
1481                $inst_task = $this->f->get_inst__om_dbform(array(
1482                    "obj" => "task",
1483                    "idx" => $task_exists,
1484                ));
1485                $valF['json_payload'] = $inst_task->view_form_json(true);
1486                $update = $this->modifier($valF);
1487                if ($update === false) {
1488                    $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
1489                    return $this->end_treatment(__METHOD__, false);
1490                }
1491            }
1492    
1493          if ($add === false) {          if ($add === false) {
1494              $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);              $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
1495              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
# Line 559  class task extends task_gen { Line 1506  class task extends task_gen {
1506       */       */
1507      public function update_task($params = array()) {      public function update_task($params = array()) {
1508          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
1509          $timestamp_log = $this->get_timestamp_log();  
1510          if ($timestamp_log === false) {          $allowed_state = array(
1511              $this->addToLog(__METHOD__."(): erreur timestamp log", DEBUG_MODE);              self::STATUS_DRAFT,
1512              return $this->end_treatment(__METHOD__, false);              self::STATUS_NEW,
1513                self::STATUS_PENDING,
1514                self::STATUS_DONE,
1515                self::STATUS_ERROR,
1516                self::STATUS_DEBUG,
1517                self::STATUS_ARCHIVED,
1518                self::STATUS_CANCELED,
1519                self::STATUS_INVALID);
1520    
1521            $task_id = $this->getVal($this->clePrimaire);
1522    
1523            if (! isset($params['val']['state']) || empty($params['val']['state'])) {
1524                throw new InvalidArgumentException(
1525                    "État ('state') non spécifié ou vide pour la tâche '$task_id'");
1526          }          }
1527          array_push($timestamp_log, array(          elseif (! in_array($params['val']['state'], $allowed_state)) {
1528              'modification_date' => date('Y-m-d H:i:s'),              throw new InvalidArgumentException(
1529              'state' => $params['val']['state'],                  "État ('state') invalide (".var_export($params['val']['state'], true).
1530              'prev_state' => $this->getVal('state'),                  ") pour la tâche '$task_id'");
1531          ));          }
1532          $timestamp_log = json_encode($timestamp_log);  
1533            // Mise à jour de la tâche
1534          $valF = array(          $valF = array(
1535              'task' => $this->getVal($this->clePrimaire),              'task' => $task_id,
1536              'type' => $this->getVal('type'),              'type' => $this->getVal('type'),
1537              'timestamp_log' => $timestamp_log,              'timestamp_log' => '[]',
1538              'state' => $params['val']['state'],              'state' => $params['val']['state'],
1539              'object_id' => $this->getVal('object_id'),              'object_id' => isset($params['object_id']) == true ? $params['object_id'] : $this->getVal('object_id'),
1540              'stream' => $this->getVal('stream'),              'stream' => $this->getVal('stream'),
1541              'dossier' => $this->getVal('dossier'),              'dossier' => $this->getVal('dossier'),
1542              'json_payload' => $this->getVal('json_payload'),              'json_payload' => $this->getVal('json_payload'),
1543                'category' => $this->getVal('category'),
1544                'creation_date' => $this->getVal('creation_date'),
1545                'creation_time' => $this->getVal('creation_time'),
1546                'last_modification_date' => date('Y-m-d'),
1547                'last_modification_time' => date('H:i:s'),
1548                'comment' => isset($params['comment']) == true ? $params['comment'] : $this->getVal('comment'),
1549          );          );
1550          $update = $this->modifier($valF);          $update = $this->modifier($valF);
1551          if ($update === false) {          if ($update === false) {
# Line 589  class task extends task_gen { Line 1556  class task extends task_gen {
1556      }      }
1557    
1558      /**      /**
1559         * A partir des éléments fournis en paramètre compose une url permettant
1560         * d'accéder à un document.
1561         *
1562         * @param string         $nom_objet : nom de l'objet d'appartenance du document
1563         * @param string         $champ     : champ contenant l'uid du document
1564         * @param string|integer $id_objet  : id de l'objet d'appartenance du document
1565         *
1566         * @return string url d'accès au document
1567         */
1568        function compose_url_acces_document(string $nom_objet, string $champ, $id_objet) {
1569            return sprintf(
1570                'app/index.php?module=form&snippet=file&obj=%s&champ=%s&id=%s',
1571                $nom_objet,
1572                $champ,
1573                $id_objet
1574            );
1575        }
1576    
1577        /**
1578       * Récupère le journal d'horodatage dans le champ timestamp_log de       * Récupère le journal d'horodatage dans le champ timestamp_log de
1579       * l'enregistrement instancié.       * l'enregistrement instancié.
1580       *       *
# Line 616  class task extends task_gen { Line 1602  class task extends task_gen {
1602          $this->checkAccessibility();          $this->checkAccessibility();
1603          $this->f->disableLog();          $this->f->disableLog();
1604          if ($this->getParameter('idx') !== ']'          if ($this->getParameter('idx') !== ']'
1605              && $this->getParameter('idx') !== '0') {              && $this->getParameter('idx') !== '0'
1606              //          ) {
1607              $this->view_form_json();              if ($this->getVal('json_payload') !== "{}") {
1608                    // On prend la Payload en BDD
1609                    echo(
1610                        json_encode(
1611                            json_decode($this->getVal('json_payload'), true),
1612                            JSON_UNESCAPED_SLASHES
1613                        )
1614                    );
1615                } else {
1616                    // On Calcule la payload JSON
1617                    $this->view_form_json();
1618                }
1619          }          }
1620          else {          else {
1621              $this->view_tab_json();              $this->view_tab_json();
# Line 627  class task extends task_gen { Line 1624  class task extends task_gen {
1624    
1625      protected function view_tab_json() {      protected function view_tab_json() {
1626          $where = '';          $where = '';
1627          if ($this->f->get_submitted_get_value('state') !== null          $category = null;
1628              && $this->f->get_submitted_get_value('state') !== '') {          // Liste des paramètres possibles pour la recherche des tâches
1629              //          $params = array(
1630              $where = sprintf(' WHERE state = \'%s\' ', $this->f->get_submitted_get_value('state'));              'task',
1631                'type',
1632                'state',
1633                'object_id',
1634                'dossier',
1635                'stream',
1636                'category',
1637                'lien_id_interne_uid_externe',
1638                'object',
1639                'external_uid',
1640            );
1641            // Pour chaque paramètre possible, vérification de son existance et de sa
1642            // valeur pour compléter la requête de recherche
1643            foreach ($params as $param) {
1644                //
1645                if ($this->f->get_submitted_get_value($param) !== null
1646                    && $this->f->get_submitted_get_value($param) !== '') {
1647                    // Condition spécifique au champ 'category'
1648                    if ($param === 'category') {
1649                        $category = $this->f->get_submitted_get_value('category');
1650                    }
1651                    //
1652                    $where_or_and = 'WHERE';
1653                    if ($where !== '') {
1654                        $where_or_and = 'AND';
1655                    }
1656                    $table = 'task';
1657                    if ($param === 'lien_id_interne_uid_externe'
1658                        || $param === 'object'
1659                        || $param === 'external_uid') {
1660                        //
1661                        $table = 'lien_id_interne_uid_externe';
1662                    }
1663                    $where .= sprintf(' %s %s.%s = \'%s\' ', $where_or_and, $table, $param, $this->f->get_submitted_get_value($param));
1664                }
1665          }          }
1666            //
1667          $query = sprintf('          $query = sprintf('
1668              SELECT              SELECT
1669                  *                  DISTINCT (task.task),
1670                    task.type,
1671                    task.object_id,
1672                    task.dossier,
1673                    task.stream,
1674                    task.category,
1675                    task.creation_date,
1676                    task.creation_time,
1677                    task.last_modification_date,
1678                    task.last_modification_time,
1679                    task.comment
1680              FROM %1$stask              FROM %1$stask
1681                LEFT JOIN %1$slien_id_interne_uid_externe
1682                    ON task.object_id = lien_id_interne_uid_externe.object_id
1683                    AND task.category = lien_id_interne_uid_externe.category
1684              %2$s              %2$s
1685              ORDER BY task ASC              ORDER BY task ASC
1686              ',              ',
1687              DB_PREFIXE,              DB_PREFIXE,
1688              $where              $where
1689          );          );
1690          $res = $this->f->get_all_results_from_db_query($query, true);          $res = $this->f->get_all_results_from_db_query(
1691                $query,
1692                array(
1693                    "origin" => __METHOD__,
1694                    "force_return" => true,
1695                )
1696            );
1697          if ($res['code'] === 'KO') {          if ($res['code'] === 'KO') {
1698              return false;              return false;
1699          }          }
1700          $list_tasks = array();          $list_tasks = array();
1701          foreach ($res['result'] as $task) {          foreach ($res['result'] as $task) {
             $task['timestamp_log'] = json_decode($task['timestamp_log'], true);  
             $task['dossier'] = $task['dossier'];  
             if ($this->get_lien_objet_by_type($task['type']) === 'document_numerise') {  
                 $val_dn = $this->get_document_numerise_data($task['object_id']);  
             }  
1702              if ($task['stream'] === 'output') {              if ($task['stream'] === 'output') {
1703                  $task['external_uids'] = $this->get_all_external_uids($task['dossier']);                  $task['external_uids'] = array_merge(
1704                        $this->get_all_external_uids($task['dossier'], array(), $category !== null ? $category : $task['category']),
1705                        $this->get_all_external_uids($task['object_id'], array(), $category !== null ? $category : $task['category'])
1706                    );
1707              }              }
1708              $list_tasks[$task['task']] = $task;              $list_tasks[$task['task']] = $task;
1709          }          }
1710          printf(json_encode($list_tasks));          echo(json_encode($list_tasks));
1711      }      }
1712    
1713      protected function get_dossier_data(string $dossier) {      protected function get_dossier_data(string $dossier) {
# Line 667  class task extends task_gen { Line 1716  class task extends task_gen {
1716              "obj" => "dossier",              "obj" => "dossier",
1717              "idx" => $dossier,              "idx" => $dossier,
1718          ));          ));
1719            if (empty($inst_di->val) === true) {
1720                return $val_di;
1721            }
1722          $val_di = $inst_di->get_json_data();          $val_di = $inst_di->get_json_data();
1723          if ($val_di['dossier_instruction_type_code'] === 'T') {          if ($val_di['dossier_instruction_type_code'] === 'T') {
1724              $val_di['date_decision_transfert'] = $val_di['date_decision'];              $val_di['date_decision_transfert'] = $val_di['date_decision'];
# Line 757  class task extends task_gen { Line 1809  class task extends task_gen {
1809              if (isset($val_dt['tax_ext_pret']) === true              if (isset($val_dt['tax_ext_pret']) === true
1810                  && $val_dt['tax_ext_pret'] === 'f') {                  && $val_dt['tax_ext_pret'] === 'f') {
1811                  //                  //
1812                  $val_dt['tax_su_princ_surf1'] = $val_dt['tax_surf_tot_cstr'];                  $val_dt['tax_su_princ_surf1'] = isset($val_dt['tax_surf_tot_cstr']) === true ? $val_dt['tax_surf_tot_cstr'] : '';
1813                  $val_dt['tax_su_princ_surf_stat1'] = $val_dt['tax_surf_loc_stat'];                  $val_dt['tax_su_princ_surf_stat1'] = isset($val_dt['tax_surf_loc_stat']) === true ? $val_dt['tax_surf_loc_stat'] : '';
1814              }              }
1815              if (isset($val_dt['tax_ext_pret']) === true              if (isset($val_dt['tax_ext_pret']) === true
1816                  && $val_dt['tax_ext_pret'] === 't') {                  && $val_dt['tax_ext_pret'] === 't') {
# Line 767  class task extends task_gen { Line 1819  class task extends task_gen {
1819                      if (preg_match('/[pP].*[lL].*[aA].*[iI]/', $val_dt['tax_ext_desc']) === 1                      if (preg_match('/[pP].*[lL].*[aA].*[iI]/', $val_dt['tax_ext_desc']) === 1
1820                          || preg_match('/[lL].*[lL].*[tT].*[sS]/', $val_dt['tax_ext_desc']) === 1) {                          || preg_match('/[lL].*[lL].*[tT].*[sS]/', $val_dt['tax_ext_desc']) === 1) {
1821                          //                          //
1822                          $val_dt['tax_su_princ_surf2'] = $val_dt['tax_surf_tot_cstr'];                          $val_dt['tax_su_princ_surf2'] = isset($val_dt['tax_surf_tot_cstr']) === true ? $val_dt['tax_surf_tot_cstr'] : '';
1823                          $val_dt['tax_su_princ_surf_stat2'] = $val_dt['tax_surf_loc_stat'];                          $val_dt['tax_su_princ_surf_stat2'] = isset($val_dt['tax_surf_loc_stat']) === true ? $val_dt['tax_surf_loc_stat'] : '';
1824                      }                      }
                     // if (preg_match('/[pP].*[tT].*[zZ]/', $val_dt['tax_ext_desc']) === 1) {  
                     //     $val_dt['tax_su_princ_surf4'] = $val_dt['tax_surf_tot_cstr'];  
                     //     $val_dt['tax_su_princ_surf_stat4'] = $val_dt['tax_surf_loc_stat'];  
                     // }  
                     // if (preg_match('/[pP].*[lL].*[uU].*[sS]/', $val_dt['tax_ext_desc']) === 1  
                     //     || preg_match('/[lL].*[eE].*[sS]/', $val_dt['tax_ext_desc']) === 1  
                     //     || preg_match('/[pP].*[sS].*[lL].*[aA]/', $val_dt['tax_ext_desc']) === 1  
                     //     || preg_match('/[pP].*[lL].*[sS]/', $val_dt['tax_ext_desc']) === 1  
                     //     || preg_match('/[lL].*[lL].*[sS]/', $val_dt['tax_ext_desc']) === 1) {  
                     //     //  
                     //     $val_dt['tax_su_princ_surf3'] = $val_dt['tax_surf_tot_cstr'];  
                     //     $val_dt['tax_su_princ_surf_stat3'] = $val_dt['tax_surf_loc_stat'];  
                     // }  
1825                  }                  }
1826              }              }
1827          }          }
# Line 797  class task extends task_gen { Line 1836  class task extends task_gen {
1836          return $val_dt;          return $val_dt;
1837      }      }
1838    
1839      protected function get_external_uid($fk_idx, string $fk_idx_2) {      /**
1840         * Récupère la liste des objets distincts existants dans la table des liens
1841         * entre identifiants internes et identifiants externes.
1842         *
1843         * @return array
1844         */
1845        protected function get_list_distinct_objects_external_link() {
1846            $query = sprintf('
1847                SELECT
1848                    DISTINCT(object)
1849                FROM %1$slien_id_interne_uid_externe
1850                ORDER BY object ASC
1851                ',
1852                DB_PREFIXE
1853            );
1854            $res = $this->f->get_all_results_from_db_query(
1855                $query,
1856                array(
1857                    "origin" => __METHOD__,
1858                    "force_return" => true,
1859                )
1860            );
1861            if ($res['code'] === 'KO') {
1862                return array();
1863            }
1864            $result = array();
1865            foreach ($res['result'] as $object) {
1866                $result[] = $object['object'];
1867            }
1868            return $result;
1869        }
1870    
1871        protected function get_external_uid($fk_idx, string $fk_idx_2, $fk_idx_3 = PLATAU, $order_asc_desc = 'DESC') {
1872          $inst_external_uid = $this->f->get_inst__by_other_idx(array(          $inst_external_uid = $this->f->get_inst__by_other_idx(array(
1873              "obj" => "lien_id_interne_uid_externe",              "obj" => "lien_id_interne_uid_externe",
1874              "fk_field" => 'object_id',              "fk_field" => 'object_id',
1875              "fk_idx" => $fk_idx,              "fk_idx" => $fk_idx,
1876              "fk_field_2" => 'object',              "fk_field_2" => 'object',
1877              "fk_idx_2" => $fk_idx_2,              "fk_idx_2" => $fk_idx_2,
1878                "fk_field_3" => 'category',
1879                "fk_idx_3" => $fk_idx_3,
1880                "order_field" => 'lien_id_interne_uid_externe',
1881                "order_asc_desc" => $order_asc_desc,
1882          ));          ));
1883          return $inst_external_uid->getVal('external_uid');          return $inst_external_uid->getVal('external_uid');
1884      }      }
1885    
1886      protected function get_all_external_uids($fk_idx) {      protected function get_all_external_uids($fk_idx, $link_objects = array(), $category=PLATAU) {
1887          $link_objects = array(          if (count($link_objects) == 0) {
1888              'dossier_autorisation',              $link_objects = $this->get_list_distinct_objects_external_link();
1889              'dossier',          }
             'consultation',  
             'document_numerise',  
         );  
1890          $val_external_uid = array();          $val_external_uid = array();
1891          foreach ($link_objects as $link_object) {          foreach ($link_objects as $link_object) {
1892              $external_uid = $this->get_external_uid($fk_idx, $link_object);              $external_uid = $this->get_external_uid($fk_idx, $link_object, $category);
1893              if ($external_uid !== '' && $external_uid !== null) {              if ($external_uid !== '' && $external_uid !== null) {
1894                  $val_external_uid[$link_object] = $external_uid;                  $val_external_uid[$link_object] = $external_uid;
1895              }              }
# Line 825  class task extends task_gen { Line 1897  class task extends task_gen {
1897          return $val_external_uid;          return $val_external_uid;
1898      }      }
1899    
1900      protected function get_demandeurs_data(string $dossier) {      protected function get_demandeurs_data($dossier) {
1901          $val_demandeur = array();          $val_demandeur = array();
1902            if ($dossier === null) {
1903                return $val_demandeur;
1904            }
1905          $inst_di = $this->f->get_inst__om_dbform(array(          $inst_di = $this->f->get_inst__om_dbform(array(
1906              "obj" => "dossier",              "obj" => "dossier",
1907              "idx" => $dossier,              "idx" => $dossier,
# Line 857  class task extends task_gen { Line 1932  class task extends task_gen {
1932          return $val_architecte;          return $val_architecte;
1933      }      }
1934    
1935      protected function get_instruction_data(string $dossier, $type = 'decision', $extra_params = array()) {      protected function get_instruction_data($dossier, $type = 'decision', $extra_params = array()) {
1936          $val_instruction = null;          $val_instruction = null;
1937            if ($dossier === null) {
1938                return $val_instruction;
1939            }
1940          $instruction_with_doc = null;          $instruction_with_doc = null;
1941          $inst_di = $this->f->get_inst__om_dbform(array(          $inst_di = $this->f->get_inst__om_dbform(array(
1942              "obj" => "dossier",              "obj" => "dossier",
# Line 879  class task extends task_gen { Line 1957  class task extends task_gen {
1957              "obj" => "instruction",              "obj" => "instruction",
1958              "idx" => $idx,              "idx" => $idx,
1959          ));          ));
1960            $id_instruction = $inst_instruction->getVal($inst_instruction->clePrimaire);
1961          if (count($inst_instruction->val) > 0) {          if (count($inst_instruction->val) > 0) {
1962              $val_instruction = array();              $val_instruction = array();
1963              $instruction_data = $inst_instruction->get_json_data();              $instruction_data = $inst_instruction->get_json_data();
# Line 886  class task extends task_gen { Line 1965  class task extends task_gen {
1965              if ($instruction_data['om_fichier_instruction'] !== null              if ($instruction_data['om_fichier_instruction'] !== null
1966                  && $instruction_data['om_fichier_instruction'] !== '') {                  && $instruction_data['om_fichier_instruction'] !== '') {
1967                  //                  //
1968                  $instruction_with_doc = $inst_instruction->getVal($inst_instruction->clePrimaire);                  $instruction_with_doc = $id_instruction;
1969              }              }
1970              $inst_ev = $this->f->get_inst__om_dbform(array(              $inst_ev = $this->f->get_inst__om_dbform(array(
1971                  "obj" => "evenement",                  "obj" => "evenement",
# Line 912  class task extends task_gen { Line 1991  class task extends task_gen {
1991              }              }
1992              if ($instruction_with_doc !== null) {              if ($instruction_with_doc !== null) {
1993                  //                  //
1994                  $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);                  $val_instruction['path'] = $this->compose_url_acces_document('instruction', 'om_fichier_instruction', $instruction_with_doc);
1995                }
1996                // Si il y a des annexes compatibles avec l'instruction elles sont ajoutées à la payload
1997                if (! empty($annexes = $this->ajouter_annexes_a_la_payload($id_instruction, true))) {
1998                    $val_instruction['annexes'] = $annexes;
1999              }              }
2000          }          }
2001          return $val_instruction;          return $val_instruction;
2002      }      }
2003    
2004    
2005        /**
2006         * Récupère les informations pour les notifications ayant plusieurs annexe
2007        */
2008        protected function get_instruction_notification_data($category, $type = '', $extra_params = array()) {
2009            $val_in = null;
2010    
2011            $idx = null;
2012            if ($type === 'with-id') {
2013                $idx = $extra_params['with-id'];
2014            }
2015    
2016            // Récupération du type de notification. Le type est nécessaire pour récupérer
2017            // le message et le titre de notification.
2018            $typeNotification = $this->getVal('type');
2019            if (isset($this->valF['type'])) {
2020                $typeNotification = $this->valF['type'];
2021            }
2022    
2023            // récupére les données à intégrer à la payload
2024            $inst_in = $this->f->get_inst__om_dbform(array(
2025                "obj" => "instruction_notification",
2026                "idx" => $idx,
2027            ));
2028            if (count($inst_in->val) > 0) {
2029                $val_in = $inst_in->get_json_data();
2030    
2031                $val_in['parametre_courriel_type_titre'] = '';
2032                $val_in['parametre_courriel_type_message'] = '';
2033                // Récupération du message et du titre
2034                if ($category === 'mail') {
2035                    $inst_instruction = $this->f->get_inst__om_dbform(array(
2036                        "obj" => "instruction",
2037                        "idx" => $inst_in->getVal('instruction'),
2038                    ));
2039                    $collectivite_id = $inst_instruction->get_dossier_instruction_om_collectivite($inst_instruction->getVal('dossier'));
2040                    $phrase_type_notification = $this->f->get_notification_parametre_courriel_type($collectivite_id, $typeNotification);
2041                    $val_in['parametre_courriel_type_titre'] = $phrase_type_notification['parametre_courriel_type_titre'];
2042                    $val_in['parametre_courriel_type_message'] = $phrase_type_notification['parametre_courriel_type_message'];
2043                }
2044    
2045                if ($typeNotification == 'notification_signataire') {
2046                    $val_in['lien_page_signature'] = $inst_in->getLienPageSignature($inst_instruction);
2047                }
2048                else {
2049                    // Récupération des liens vers les documents et des id et type des annexes
2050                    $infoDocNotif = $inst_in->getInfosDocumentsNotif($inst_in->getVal($inst_in->clePrimaire), $category);
2051                    $cle = $category == PORTAL ? 'path' : 'lien_telechargement_document';
2052                    $val_in[$cle] = $infoDocNotif['document']['path'];
2053                    $val_in['annexes'] = $infoDocNotif['annexes'];
2054                }
2055            }
2056            return $val_in;
2057        }
2058    
2059        /**
2060         * Récupère les informations concernant la lettre au pétitionnaire.
2061         *
2062         * @param string identifiant du dossier
2063         * @param string type de tâche
2064         * @param array paramètre supplémentaire permettant de récupérer les informations
2065         *
2066         * @return array information concernant la lettre au pétitionnaire
2067         */
2068        protected function get_lettre_petitionnaire_data($dossier, $type, $extra_params = array()) {
2069            // Si la date limite de notification n'a pas été dépassé le type de lettre est 1
2070            // Si la date a été dépassé et qu'il s'agit d'une demande de pièce le type est 3
2071            // Si la date a été dépassé et qu'il s'agit d'une prolongation le type est 4
2072            // Le type de document dépend du type de pièce
2073            $nomTypeLettre = '';
2074            $nomTypeDocument = '';
2075            if ($type === 'lettre_incompletude') {
2076                $nomTypeLettre = '3';
2077                $nomTypeDocument = '4';
2078            } elseif ($type === 'lettre_majoration') {
2079                $nomTypeLettre = '4';
2080                $nomTypeDocument = '6';
2081            }
2082    
2083            $inst_di = $this->f->get_inst__om_dbform(array(
2084                "obj" => "dossier",
2085                "idx" => $dossier,
2086            ));
2087            $date_limite_notification = DateTime::createFromFormat('Y-m-d', $inst_di->getVal('date_notification_delai'));
2088            $aujourdhui = new DateTime();
2089            if (! $date_limite_notification instanceof DateTime) {
2090                $nomTypeLettre = '';
2091                $nomTypeDocument = '';
2092            } elseif ($aujourdhui < $date_limite_notification) {
2093                $nomTypeLettre = '1';
2094                $nomTypeDocument = '3';
2095            }
2096    
2097            return array(
2098                'nomEtatLettre' => '3',
2099                'nomModaliteNotifMetier' => '4',
2100                'nomTypeLettre' => $nomTypeLettre,
2101                'nomTypeDocument' => $nomTypeDocument
2102            );
2103        }
2104    
2105      protected function sort_instruction_data(array $values, array $res) {      protected function sort_instruction_data(array $values, array $res) {
2106          $fields = array(          $fields = array(
2107                "instruction",
2108              "date_evenement",              "date_evenement",
2109              "date_envoi_signature",              "date_envoi_signature",
2110              "date_retour_signature",              "date_retour_signature",
# Line 931  class task extends task_gen { Line 2116  class task extends task_gen {
2116              "om_fichier_instruction",              "om_fichier_instruction",
2117              "tacite",              "tacite",
2118              "lettretype",              "lettretype",
2119                "commentaire",
2120                "complement_om_html",
2121          );          );
2122          foreach ($values as $key => $value) {          foreach ($values as $key => $value) {
2123              if (in_array($key, $fields) === true) {              if (in_array($key, $fields) === true) {
# Line 946  class task extends task_gen { Line 2133  class task extends task_gen {
2133                  }                  }
2134              }              }
2135          }          }
2136    
2137            if (! empty($values['document_type_instruction'])){
2138                // Gestion du type de document :
2139                $document_type = $this->f->get_inst__om_dbform(array(
2140                    "obj" => "document_type",
2141                    "idx" => $values['document_type_instruction'],
2142                ));
2143                if (count($document_type->val) > 0) {
2144                    $res['document_type'] = $document_type->getVal('code');
2145                }
2146            }
2147          return $res;          return $res;
2148      }      }
2149    
2150        /**
2151         * Permet de définir si l'instruction passée en paramètre est une instruction
2152         * récépissé d'une demande et si la demande en question a générée un dossier d'instruction.
2153         *
2154         * @param  integer  $instruction Identifiant de l'instruction
2155         * @return boolean
2156         */
2157        protected function is_demande_instruction_recepisse_without_dossier($instruction) {
2158            if ($instruction === null) {
2159                return false;
2160            }
2161            $qres = $this->f->get_one_result_from_db_query(
2162                sprintf(
2163                    'SELECT
2164                        demande_type.dossier_instruction_type
2165                    FROM
2166                        %1$sdemande
2167                            INNER JOIN %1$sdemande_type
2168                                ON demande.demande_type = demande_type.demande_type
2169                    WHERE
2170                        demande.instruction_recepisse = %2$d',
2171                    DB_PREFIXE,
2172                    intval($instruction)
2173                ),
2174                array(
2175                    "origin" => __METHOD__,
2176                    "force_return" => true,
2177                )
2178            );
2179            if ($qres["code"] !== "OK") {
2180                return null;
2181            }
2182            if ($qres["result"] === "") {
2183                return true;
2184            }
2185            return false;
2186        }
2187    
2188      protected function get_document_numerise_data(string $dn) {      protected function get_document_numerise_data(string $dn) {
2189          $val_dn = array();          $val_dn = array();
2190          $inst_dn = $this->f->get_inst__om_dbform(array(          $qres = $this->f->get_all_results_from_db_query(
2191              "obj" => "document_numerise",              sprintf(
2192              "idx" => $dn,                  'SELECT
2193          ));                      document_numerise.document_numerise,
2194          $val_dn = $inst_dn->get_json_data();                      document_numerise.uid,
2195          $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'));                      document_numerise.dossier,
2196          // Correspond à la nomenclature Plat'AU NATURE_PIECE                      document_numerise.nom_fichier,
2197          $val_dn['nature'] = $val_dn['document_numerise_nature_libelle'];                      document_numerise.date_creation,
2198                        document_numerise.document_numerise_type,
2199                        document_numerise.uid_dossier_final,
2200                        document_numerise.document_numerise_nature,
2201                        document_numerise.uid_thumbnail,
2202                        document_numerise.description_type,
2203                        document_numerise.document_travail,
2204                        document_numerise_type.code AS document_numerise_type_code,
2205                        document_numerise_type.libelle AS document_numerise_type_libelle,
2206                        document_numerise_nature.code AS document_numerise_nature_code,
2207                        document_numerise_nature.libelle AS document_numerise_nature_libelle,
2208                        document_numerise_nature.libelle AS nature
2209                    FROM
2210                        %1$sdocument_numerise
2211                    LEFT JOIN %1$sdocument_numerise_type
2212                        ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
2213                    LEFT JOIN %1$sdocument_numerise_nature
2214                        ON document_numerise.document_numerise_nature = document_numerise_nature.document_numerise_nature
2215                    WHERE
2216                        document_numerise.document_numerise = %2$d',
2217                    DB_PREFIXE,
2218                    intval($dn)
2219                ),
2220                array(
2221                    "origin" => __METHOD__,
2222                )
2223            );
2224            if ($qres["result"] !== null
2225                && $qres["result"] !== ""
2226                && count($qres["result"]) > 0) {
2227                //
2228                $val_dn = $qres["result"][0];
2229            }
2230            $val_dn['path'] = $this->compose_url_acces_document('document_numerise', 'uid', $this->getVal('object_id'));
2231          return $val_dn;          return $val_dn;
2232      }      }
2233    
# Line 988  class task extends task_gen { Line 2257  class task extends task_gen {
2257          ));          ));
2258          $ad = $inst_di->getVal('avis_decision');          $ad = $inst_di->getVal('avis_decision');
2259          $val_ad = array();          $val_ad = array();
2260          $inst_ad = $this->f->get_inst__om_dbform(array(          if ($ad !== null && trim($ad) !== '') {
2261              "obj" => "avis_decision",              $inst_ad = $this->f->get_inst__om_dbform(array(
2262              "idx" => $ad,                  "obj" => "avis_decision",
2263          ));                  "idx" => $ad,
2264          $val_ad = $inst_ad->get_json_data();              ));
2265          $val_ad['txAvis'] = "Voir document joint";              $val_ad = $inst_ad->get_json_data();
2266          if (isset($val_ad['tacite']) ===  true              $val_ad['txAvis'] = "Voir document joint";
2267              && $val_ad['tacite'] === 't') {              if (isset($val_ad['tacite']) ===  true
2268              //                  && $val_ad['tacite'] === 't') {
2269              $val_ad['txAvis'] = "Sans objet";                  //
2270                    $val_ad['txAvis'] = "Sans objet";
2271                }
2272          }          }
2273          return $val_ad;          return $val_ad;
2274      }      }
# Line 1014  class task extends task_gen { Line 2285  class task extends task_gen {
2285          return $val_sa;          return $val_sa;
2286      }      }
2287    
2288      protected function view_form_json($in_field = false) {      // XXX WIP
2289        protected function get_consultation_data(string $consultation) {
2290            $val_consultation = array();
2291            $inst_consultation = $this->f->get_inst__om_dbform(array(
2292                "obj" => "consultation",
2293                "idx" => $consultation,
2294            ));
2295            $val_consultation = $inst_consultation->get_json_data();
2296            if (isset($val_consultation['fichier']) === true
2297                && $val_consultation['fichier'] !== '') {
2298                //
2299                $val_consultation['path_fichier'] = $this->compose_url_acces_document('consultation', 'fichier', $this->getVal('object_id'));
2300            }
2301            if (isset($val_consultation['om_fichier_consultation']) === true
2302                && $val_consultation['om_fichier_consultation'] !== '') {
2303                //
2304                $val_consultation['path_om_fichier_consultation'] = $this->compose_url_acces_document('consultation', 'om_fichier_consultation', $this->getVal('object_id'));
2305            }
2306            return $val_consultation;
2307        }
2308    
2309        // XXX WIP
2310        protected function get_service_data(string $service) {
2311            $val_service = array();
2312            $inst_service = $this->f->get_inst__om_dbform(array(
2313                "obj" => "service",
2314                "idx" => $service,
2315            ));
2316            $val_service = $inst_service->get_json_data();
2317            return $val_service;
2318        }
2319    
2320        /**
2321         * Recupere le numéro du dossier ou le numéro du dossier parent s'il existe,
2322         * @param string $dossier : le numéro du dossier
2323         *
2324         * @return string $dossier | $dossier_parent
2325         */
2326        protected function get_id_dossier_parent(string $dossier){
2327            $query = sprintf('
2328                SELECT
2329                    dossier.dossier_parent
2330                FROM
2331                    %1$sdossier
2332                WHERE
2333                    dossier.dossier = \'%2$s\'
2334                ORDER BY
2335                    dossier.dossier',
2336                DB_PREFIXE,
2337                $dossier
2338            );
2339    
2340            $res = $this->f->get_all_results_from_db_query(
2341                $query,
2342                array(
2343                    "origin" => __METHOD__,
2344                    // "force_return" => true,
2345                )
2346            );
2347            if ($res['code'] === 'KO') {
2348                return false;
2349            }
2350            if ( isset($res['result'][0]["dossier_parent"])
2351                && ! empty($res['result'][0]["dossier_parent"] )
2352            ) {
2353                return $res['result'][0]["dossier_parent"];
2354            }
2355            return $dossier;
2356    
2357        }
2358    
2359        /**
2360         * Renvoie un tableau, contenant les informations nécessaire à l'ajout des annexes
2361         * à une payload.
2362         *
2363         * Récupère la liste des annexes paramétrées dans la table parametrage_annexe
2364         * pour l'instruction voulu. A partir de cette liste, construit un tableau avec
2365         * une entrée par annexe. Chaque entrées contiens les informations suivantes :
2366         *   - path          : url d'accès au fichier
2367         *   - document_type : code du document dans plat'au
2368         *   - document_id   : uid du document
2369         *
2370         * @param int  $instruction_id             : identifiant de l'instruction dont ont doit récuperer les annexes
2371         * @param bool $document_platau_uniquement : limite les annexes renvoyées a celles typées pour platau
2372         *
2373         * @return array $annexes
2374         */
2375        protected function ajouter_annexes_a_la_payload(int $instruction_id, bool $document_platau_uniquement = false) {
2376            $annexes = array();
2377            $annexes_a_lier = $this->f->recuperer_documents_a_annexe($instruction_id, $document_platau_uniquement);
2378            foreach ($annexes_a_lier as $annexe_info) {
2379                $objet = $annexe_info['objet'];
2380                $id_objet = $annexe_info['id'];
2381                // Récupère l'objet identifié en tant qu'annexe. Si l'objet n'est pas
2382                // récupéré on passe à l'itération suivante
2383                if (empty($inst_objet = $this->f->findObjectById($objet, $id_objet, true))) {
2384                    $this->f->addToLog(__METHOD__."() : L'objet *$objet* d'identifiant *$id_objet* n'a pas pu être instancié, son document ne peut pas être ajouté aux annexes.");
2385                    continue;
2386                }
2387    
2388                // Détermine le champ contenant l'uid et le type de document
2389                switch ($objet) {
2390                    case 'document_numerise':
2391                        $champ_uid = 'uid';
2392                        /* TODO : Gestion du document_type
2393                            $document_numerise_type = $this->f->get_inst__om_dbform(array(
2394                                "obj" => 'document_numerise_type',
2395                                "idx" => $inst_objet->getVal('document_numerise_type'),
2396                            ));
2397                            $document_numerise_type_categorie = $this->f->get_inst__om_dbform(array(
2398                                "obj" => 'document_numerise_type_categorie',
2399                                "idx" => $document_numerise_type->getVal('document_numerise_type_categorie'),
2400                            ));
2401                            $annexe['document_type'] =
2402                        */
2403                        $document_type = '';
2404                        break;
2405                    case 'instruction':
2406                        $champ_uid = 'om_fichier_instruction';
2407                        $inst_document_type = $this->f->findObjectById('document_type', $inst_objet->getVal('document_type_instruction'));
2408                        $document_type = $inst_document_type->getVal('code');
2409                        break;
2410                    case 'consultation':
2411                        $champ_uid = 'fichier';
2412                        // Gestion du document_type, Code platau de la consultation
2413                        $document_type = self::CODE_PLATAU_CONSULTATION;
2414                        break;
2415                    default :
2416                        // Si le type de document n'est pas géré on passe au document suivant.
2417                        // Ajoute une ligne dans les logs pour comprendre pourquoi le document n'apparaît pas.
2418                        $this->f->addToLog(
2419                            __METHOD__.
2420                            "() : L'ajout d'annexe lié aux *$objet* n'est pas implémenté.
2421                            Le document de *$objet* et d'identifiant *$id_objet* n'a pas été ajouté aux annexes.",
2422                            DEBUG_MODE
2423                        );
2424                        continue 2;
2425                }
2426    
2427                $annexes[] = array(
2428                    'path' => $this->compose_url_acces_document($objet, $champ_uid, $id_objet),
2429                    'document_type' => $document_type,
2430                    'document_id' => $inst_objet->getVal($champ_uid)
2431                );
2432            }
2433            return $annexes;
2434        }
2435    
2436        /**
2437         * Fonction de récupération des UID externes en fonction des besoins.
2438         * - Factorisation du code
2439         *
2440         * @param array $val : Tableau des valeurs du flux.
2441         * @param array $elements default array() : liste des élément à ajouter au tableau des UID_externes
2442         * @param array $val_external_uid default array() : tableau des UIDs externes du flux
2443         *
2444         * @return array $val_external_uid
2445         *
2446         */
2447        protected function val_external_uid(array $val, array $elements = array(), array $val_external_uid = array()) {
2448    
2449            if (in_array('dossier_autorisation', $elements)) {
2450                if (empty($val['dossier_autorisation']['dossier_autorisation'])) {
2451                    $dossier_autorisation = $val['dossier']['dossier_autorisation'];
2452                } else {
2453                    $dossier_autorisation = $val['dossier_autorisation']['dossier_autorisation'];
2454                }
2455                $val_external_uid['dossier_autorisation'] = $this->get_external_uid($dossier_autorisation, 'dossier_autorisation');
2456            }
2457    
2458            if (in_array('dossier', $elements)) {
2459                $val_external_uid['dossier'] = $this->get_external_uid(
2460                    $this->get_id_dossier_parent($val['dossier']['dossier']),
2461                    'dossier'
2462                );
2463            }
2464    
2465            if (in_array('piece', $elements)) {
2466                $val_external_uid['piece'] = $this->get_external_uid($val['document_numerise']['document_numerise'], 'piece');
2467            }
2468            if (in_array('dossier_consultation', $elements)) {
2469                $val_external_uid['dossier_consultation'] = $this->get_external_uid(
2470                    $this->get_id_dossier_parent($val['dossier']['dossier']),
2471                    'dossier_consultation'
2472                );
2473            }
2474            if (in_array('prescription', $elements)) {
2475                $val_external_uid['prescription'] = $this->get_external_uid($this->getVal('object_id'), 'prescription');
2476            }
2477            if (in_array('avis_dossier_consultation', $elements)) {
2478                $val_external_uid['avis_dossier_consultation'] = $this->get_external_uid(
2479                    $this->getVal('object_id'), 'avis_dossier_consultation');
2480            }
2481            if (in_array('decision', $elements)) {
2482                $val_external_uid['decision'] = $this->get_external_uid($this->getVal('object_id'), 'instruction');
2483                if ($val_external_uid['decision'] === '') {
2484                    $inst_instruction = $this->f->get_inst__om_dbform(array(
2485                        "obj" => "instruction",
2486                        "idx" => $this->getVal('object_id'),
2487                    ));
2488                    $val_external_uid['decision'] = $this->get_external_uid($inst_instruction->get_related_instructions_next('retour_signature'), 'instruction');
2489                }
2490            }
2491            if (in_array('instruction_notification', $elements)) {
2492                $val_external_uid['instruction_notification'] = $this->get_external_uid($this->getVal('object_id'), 'instruction_notification', PORTAL);
2493            }
2494            return $val_external_uid;
2495        }
2496    
2497        /**
2498         *
2499         *
2500         */
2501        protected function view_form_json(bool $in_field = false) {
2502          //          //
2503          if ($this->f->get_submitted_post_value('valid') === null) {          $check_state = isset($this->valF['state']) === true ? $this->valF['state'] : $this->getVal('state');
2504            if ($check_state !== self::STATUS_CANCELED) {
2505    
2506                $data = array('in_field' => $in_field);
2507                $this->f->module_manager->run_hooks('view_form_json_pre', $this, $data);
2508    
2509              // Liste des valeurs à afficher              // Liste des valeurs à afficher
2510              $val = array();              $val = array();
2511    
2512              //              //
2513              $val_task = array_combine($this->champs, $this->val);              $val_task = array_combine($this->champs, $this->val);
2514              foreach ($val_task as $key => $value) {              foreach ($val_task as $key => $value) {
2515                  $val_task[$key] = strip_tags($value);                  $val_task[$key] = strip_tags($value);
2516              }              }
2517              $val_task['timestamp_log'] = json_decode($val_task['timestamp_log'], true);  
2518              $val['task'] = $val_task;              // Vérifie pour les tâches dont l'affichage de la payload est calculée si l'objet
2519              //              // de référence de la tâche existe.
2520              if ($this->getVal('type') === 'creation_DA') {              $objectRefExist = true;
2521                  $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($this->getVal('object_id'));              if ($val_task['stream'] === 'output'
2522                  $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_autorisation');                  && (empty($val_task['json_payload']) || $val_task['json_payload'] === '{}')) {
2523                  $val['dossier_autorisation_parcelle'] = $this->get_parcelles_data('dossier_autorisation', $val['dossier_autorisation']['dossier_autorisation']);                  $objectRefExist = $this->does_referenced_object_exist(
2524                  $val_external_uid = array();                      $val_task['object_id'],
2525                  $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier_autorisation']['dossier_autorisation'], 'dossier_autorisation');                      $val_task['type']
2526                  $val['external_uids'] = $val_external_uid;                  );
             }  
             //  
             if ($this->getVal('type') === 'creation_DI'  
                 || $this->getVal('type') === 'modification_DI'  
                 || $this->getVal('type') === 'depot_DI') {  
                 //  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));  
                 $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_instruction');  
                 $val['demandeur'] = $this->get_demandeurs_data($val['dossier']['dossier']);  
                 $architecte = isset($val['donnees_techniques']['architecte']) === true ? $val['donnees_techniques']['architecte'] : null;  
                 $val['architecte'] = $this->get_architecte_data($architecte);  
                 $val['dossier_parcelle'] = $this->get_parcelles_data('dossier', $val['dossier']['dossier']);  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'qualification_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'ajout_piece') {  
                 $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));  
                 $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val_external_uid['document_numerise'] = $this->get_external_uid($val['document_numerise']['document_numerise'], 'document_numerise');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'decision_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));  
                 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'incompletude_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));  
                 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'completude_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));  
                 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val['external_uids'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'pec_metier_consultation') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));  
                 $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));  
                 $val_external_uid = array();  
                 $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');  
                 $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');  
                 $val_external_uid['consultation'] = $this->get_external_uid($val['dossier']['dossier'], 'consultation');  
                 $val['external_uids'] = $val_external_uid;  
2527              }              }
2528              //  
2529              if ($this->getVal('type') === 'avis_consultation') {              // Si l'objet de référence n'existe pas log le numéro de la tâche concerné et
2530                  $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));              // renvoie une payload contenant le message d'erreur.
2531                  $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));              // Sinon constitue la payload du json.
2532                  $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));              if (! $objectRefExist) {
2533                  if (isset($val['instruction']['signataire_arrete']) === true) {                  $this->f->addToLog(
2534                      $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);                      sprintf(
2535                  }                          __('Impossible de récupérer la payload car l\'objet de réference n\'existe pas pour la tâche : %s'),
2536                  $val_external_uid = array();                          $val_task['task']
2537                  $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier']['dossier_autorisation'], 'dossier_autorisation');                      ),
2538                  $val_external_uid['dossier'] = $this->get_external_uid($val['dossier']['dossier'], 'dossier');                      DEBUG_MODE
2539                  $val_external_uid['consultation'] = $this->get_external_uid($val['dossier']['dossier'], 'consultation');                  );
2540                  $val['external_uids'] = $val_external_uid;                  $val = __('Impossible de recuperer la payload car l\'objet de reference n\'existe pas.');
2541                } else {
2542    
2543                    // L'historique n'est pas nécessaire dans l'affichage en JSON
2544                    if ($in_field === true) {
2545                        $val_task['timestamp_log'] = json_decode($val_task['timestamp_log'], true);
2546                    } else {
2547                        unset($val_task['timestamp_log']);
2548                    }
2549                    unset($val_task['timestamp_log_hidden']);
2550                    $val['task'] = $val_task;
2551                    //
2552                    if (in_array($this->getVal('type'), array('creation_DA', 'modification_DA'))) {
2553                        //
2554                        $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($this->getVal('object_id'));
2555                        $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_autorisation');
2556                        $val['dossier_autorisation_parcelle'] = $this->get_parcelles_data('dossier_autorisation', $val['dossier_autorisation']['dossier_autorisation']);
2557                        // Recupération des UID externes
2558                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation'));
2559                    }
2560                    //
2561                    if (in_array($this->getVal('type'), array('creation_DI', 'modification_DI', 'depot_DI'))) {
2562                        //
2563                        $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));
2564                        $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_instruction');
2565                        $val['demandeur'] = $this->get_demandeurs_data($val['dossier']['dossier']);
2566                        $architecte = isset($val['donnees_techniques']['architecte']) === true ? $val['donnees_techniques']['architecte'] : null;
2567                        $val['architecte'] = $this->get_architecte_data($architecte);
2568                        $val['dossier_parcelle'] = $this->get_parcelles_data('dossier', $val['dossier']['dossier']);
2569                        // Recupération des UID externes
2570                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2571                    }
2572                    //
2573                    if ($this->getVal('type') === 'qualification_DI') {
2574                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2575                        // Recupération des UID externes
2576                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2577                    }
2578                    //
2579                    if (in_array($this->getVal('type'), array('ajout_piece', 'modification_piece', 'suppression_piece'))) {
2580                        $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
2581                        $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);
2582                        // Recupération des UID externes
2583                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'piece'));
2584                    }
2585                    //
2586                    if ($this->getVal('type') === 'decision_DI') {
2587                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2588                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2589                        $val['instruction']['final'] = 't';
2590                        if (isset($val['instruction']['signataire_arrete']) === true) {
2591                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2592                        }
2593                        // Recupération des UID externes
2594                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2595                    }
2596                    //
2597                    if (in_array($this->getVal('type'), array('incompletude_DI', 'completude_DI'))) {
2598                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2599                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2600                        // Recupération des UID externes
2601                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2602                    }
2603                    //
2604                    if (in_array($this->getVal('type'), array('lettre_incompletude', 'lettre_majoration'))) {
2605                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2606                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2607                        $val['lettre_petitionnaire'] = $this->get_lettre_petitionnaire_data($val['dossier']['dossier'], $this->getVal('type'));
2608                        // Recupération des UID externes
2609                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2610                    }
2611                    //
2612                    if ($this->getVal('type') === 'pec_metier_consultation') {
2613                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2614                        $val['instruction'] = $this->get_instruction_data(
2615                            $this->getVal('dossier'),
2616                            'with-id',
2617                            array('with-id' => $this->getVal('object_id'))
2618                        );
2619                        // Recupération des UID externes
2620                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation'));
2621                    }
2622                    //
2623                    if ($this->getVal('type') === 'avis_consultation') {
2624                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2625                        $val['instruction'] = $this->get_instruction_data(
2626                            $this->getVal('dossier'),
2627                            'with-id',
2628                            array('with-id' => $this->getVal('object_id'))
2629                        );
2630                        $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2631                        if (isset($val['instruction']['signataire_arrete']) === true) {
2632                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2633                        }
2634                        // Recupération des UID externes
2635                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation', 'avis_dossier_consultation'));
2636                    }
2637                    //
2638                    if ($this->getVal('type') === 'creation_consultation') {
2639                        //
2640                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2641                        $val['consultation'] = $this->get_consultation_data($this->getVal('object_id'));
2642                        $val['service'] = $this->get_service_data($val['consultation']['service']);
2643                        // Recupération des UID externes
2644                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2645                    }
2646                    //
2647                    if ($this->getVal('type') === 'envoi_CL') {
2648                        //
2649                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2650                        $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2651                        $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($val['dossier']['dossier_autorisation']);
2652                        // Recupération des UID externes
2653                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'decision'));
2654                    }
2655                    if (in_array(
2656                            $this->getVal('type'),
2657                            array(
2658                                'notification_instruction',
2659                                'notification_recepisse',
2660                                'notification_decision',
2661                                'notification_service_consulte',
2662                                'notification_tiers_consulte',
2663                                'notification_signataire'
2664                            )
2665                    )) {
2666                        //
2667                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2668                        $dossier_id = isset($val['dossier']['dossier']) === true ? $val['dossier']['dossier'] : null;
2669                        $val['demandeur'] = $this->get_demandeurs_data($dossier_id);
2670                        $val['instruction_notification'] = $this->get_instruction_notification_data($this->getVal('category'), 'with-id', array('with-id' => $this->getVal('object_id')));
2671                        $instruction_id = isset($val['instruction_notification']['instruction']) === true ? $val['instruction_notification']['instruction'] : null;
2672                        $val['instruction'] = $this->get_instruction_data($dossier_id, 'with-id', array('with-id' => $instruction_id));
2673                        // Précise qu'il s'agit d'une instruction final si l'instruction est liée à une
2674                        // demande dont le type ne génère pas de dossier
2675                        if ($this->is_demande_instruction_recepisse_without_dossier($instruction_id) === true) {
2676                            $val['instruction']['final'] = 't';
2677                        }
2678                        // Recupération des UID externes
2679                        $val_external_uid = array();
2680                        // Affiche l'identifiant externe lié à l'instruction si cette combinaison existe, sinon celui lié au dossier
2681                        $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');
2682                        $val_external_uid['demande (instruction)'] = $this->get_external_uid($instruction_id, 'demande', PORTAL, 'ASC');
2683                        $val['external_uids'] = $this->val_external_uid($val, array('demande', 'demande (instruction)', 'instruction_notification'), $val_external_uid );
2684                    }
2685                    //
2686                    if ($this->getVal('type') === 'prescription') {
2687                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2688                        $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2689                        $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2690                        if (isset($val['instruction']['signataire_arrete']) === true) {
2691                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2692                        }
2693                        // Recupération des UID externes
2694                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation', 'prescription'));
2695                    }
2696                    //
2697                    if ($this->getVal('type') === 'ajout_documents_specifiques') {
2698                        // Data blocs
2699                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2700                        $val['instruction'] = $this->get_instruction_data(
2701                            $this->getVal('dossier'),
2702                            'with-id',
2703                            array('with-id' => $this->getVal('object_id'))
2704                        );
2705                        // Recupération des UID externes
2706                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation'));
2707                    }
2708              }              }
2709    
2710                $data = array('in_field' => $in_field, 'val' => &$val);
2711                $this->f->module_manager->run_hooks('view_form_json_post', $this, $data);
2712    
2713              if ($in_field === true) {              if ($in_field === true) {
2714                  return json_encode($val, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);                  return json_encode($val, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
2715              } else {              } else {
2716                  // Liste des valeurs affichée en JSON                  // Liste des valeurs affichée en JSON
2717                  printf(json_encode($val, JSON_UNESCAPED_SLASHES));                  echo(json_encode($val, JSON_UNESCAPED_SLASHES));
2718              }              }
2719          }          }
2720      }      }
2721    
2722      function post_update_task() {      function post_update_task() {
2723          // Mise à jour des valeurs          // Mise à jour des valeurs
2724          //  
2725          $params = array(          // Modification de l'état de la tâche
2726              'val' => array(          if ($this->f->get_submitted_post_value('state') !== null) {
2727                  'state' => $this->f->get_submitted_post_value('state')              $params = array(
2728              ),                  'val' => array(
2729          );                      'state' => $this->f->get_submitted_post_value('state')
2730          $update = $this->update_task($params);                  ),
         $message_class = "valid";  
         $message = $this->msg;  
         if ($update === false) {  
             $this->addToLog($this->msg, DEBUG_MODE);  
             $message_class = "error";  
             $message = sprintf(  
                 '%s %s',  
                 __('Impossible de mettre à jour la tâche.'),  
                 __('Veuillez contacter votre administrateur.')  
             );  
         }  
         $this->f->displayMessage($message_class, $message);  
         //  
         if ($this->f->get_submitted_post_value('external_uid') !== null  
             && $this->f->get_submitted_post_value('external_uid') != "") {  
             $inst_lien = $this->f->get_inst__om_dbform(array(  
                 "obj" => "lien_id_interne_uid_externe",  
                 "idx" => ']',  
             ));  
             $valF = array(  
                 'lien_id_interne_uid_externe' => '',  
                 'object' => $this->get_lien_objet_by_type($this->getVal('type')),  
                 'object_id' => $this->getVal('object_id'),  
                 'external_uid' => $this->f->get_submitted_post_value('external_uid'),  
2731              );              );
2732              $add = $inst_lien->ajouter($valF);              if ($this->f->get_submitted_post_value('comment') !== null) {
2733                    $params['comment'] = $this->f->get_submitted_post_value('comment');
2734                }
2735                $update = $this->update_task($params);
2736              $message_class = "valid";              $message_class = "valid";
2737              $message = $inst_lien->msg;              $message = $this->msg;
2738              if ($add === false) {              if ($update === false) {
2739                  $this->addToLog($inst_lien->msg, DEBUG_MODE);                  $this->addToLog($this->msg, DEBUG_MODE);
2740                  $message_class = "error";                  $message_class = "error";
2741                  $message = sprintf(                  $message = sprintf(
2742                      '%s %s',                      '%s %s',
2743                      __("Impossible de mettre à jour le lien entre l'identifiant interne et l'identifiant de l'application externe."),                      __('Impossible de mettre à jour la tâche.'),
2744                      __('Veuillez contacter votre administrateur.')                      __('Veuillez contacter votre administrateur.')
2745                  );                  );
2746              }              }
2747              $this->f->displayMessage($message_class, $message);              $this->f->displayMessage($message_class, $message);
2748          }          }
2749    
2750            // Sauvegarde de l'uid externe retourné
2751            $external_uid = $this->f->get_submitted_post_value('external_uid');
2752            if ($external_uid !== null) {
2753                //
2754                $objects = $this->get_objects_by_task_type($this->getVal('type'), $this->getVal('stream'));
2755                // Si l'identifiant externe contient le préfixe pour identifier les codes de suivi,
2756                // le seul objet concerné sera celui du code de suivi
2757                if (strpos($external_uid, self::CS_PREFIX) !== false) {
2758                    $objects = array('code-suivi', );
2759                    $external_uid = str_replace(self::CS_PREFIX, '', $external_uid);
2760                }
2761                foreach ($objects as $object) {
2762                    $inst_lien = $this->f->get_inst__om_dbform(array(
2763                        "obj" => "lien_id_interne_uid_externe",
2764                        "idx" => ']',
2765                    ));
2766                    $object_id = $this->getVal('object_id');
2767                    $is_exists = $inst_lien->is_exists($object, $object_id, $external_uid, $this->getVal('dossier'));
2768                    // Dans le cas spécifique de la mise à jour d'une notification
2769                    // et de la création d'une liaison d'identifiant pour l'objet demande,
2770                    // l'identifiant de l'objet n'est plus celui de la notification
2771                    // d'instruction mais celui du dossier d'instruction
2772                    if ($object === 'demande'
2773                        && ($this->getVal('type') === 'notification_recepisse'
2774                            || $this->getVal('type') === 'notification_instruction'
2775                            || $this->getVal('type') === 'notification_decision'
2776                            || $this->getVal('type') === 'notification_service_consulte'
2777                            || $this->getVal('type') === 'notification_tiers_consulte'
2778                            || $this->getVal('type') === 'notification_signataire')) {
2779                        //
2780                        $object_id = $this->getVal('dossier');
2781                        // Il ne doit y avoir qu'une liaison entre le numéro du dossier interne et un uid externe de "demande"
2782                        $is_exists = $inst_lien->is_exists($object, $object_id, null, $this->getVal('dossier'));
2783                    }
2784                    if ($is_exists === false) {
2785                        $valF = array(
2786                            'lien_id_interne_uid_externe' => '',
2787                            'object' => $object,
2788                            'object_id' => $object_id,
2789                            'external_uid' => $external_uid,
2790                            'dossier' => $this->getVal('dossier'),
2791                            'category' => $this->getVal('category'),
2792                        );
2793                        $add = $inst_lien->ajouter($valF);
2794                        $message_class = "valid";
2795                        $message = $inst_lien->msg;
2796                        if ($add === false) {
2797                            $this->addToLog($inst_lien->msg, DEBUG_MODE);
2798                            $message_class = "error";
2799                            $message = sprintf(
2800                                '%s %s',
2801                                __("Impossible de mettre à jour le lien entre l'identifiant interne et l'identifiant de l'application externe."),
2802                                __('Veuillez contacter votre administrateur.')
2803                            );
2804                        }
2805                        $this->f->displayMessage($message_class, $message);
2806                    }
2807                }
2808            }
2809      }      }
2810    
2811      function post_add_task() {      function post_add_task() {
# Line 1185  class task extends task_gen { Line 2813  class task extends task_gen {
2813          $result = $this->add_task(array(          $result = $this->add_task(array(
2814              'val' => array(              'val' => array(
2815                  'stream' => 'input',                  'stream' => 'input',
2816                  'json_payload' => html_entity_decode($this->f->get_submitted_post_value('json_payload')),                  'json_payload' => html_entity_decode($this->f->get_submitted_post_value('json_payload'), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401),
2817                  'type' => $this->f->get_submitted_post_value('type'),                  'type' => $this->f->get_submitted_post_value('type'),
2818                    'category' => $this->f->get_submitted_post_value('category'),
2819              )              )
2820          ));          ));
2821          $message = $this->msg;          $message = sprintf(
2822                __("Tâche %s ajoutée avec succès"),
2823                $this->getVal($this->clePrimaire)).
2824                '<br/><br/>'.
2825                $this->msg;
2826          $message_class = "valid";          $message_class = "valid";
2827          if ($result === false){          if ($result === false){
2828              $this->addToLog($this->msg, DEBUG_MODE);              $this->addToLog($this->msg, DEBUG_MODE);
# Line 1203  class task extends task_gen { Line 2836  class task extends task_gen {
2836          $this->f->displayMessage($message_class, $message);          $this->f->displayMessage($message_class, $message);
2837      }      }
2838    
2839      function get_lien_objet_by_type($type) {      function setLayout(&$form, $maj) {
2840          //          //
2841          $objet = '';          $form->setBloc('json_payload', 'D', '', 'col_6');
2842          if ($type === 'creation_DA') {          $fieldset_title_payload = __("json_payload (calculée)");
2843              $objet = 'dossier_autorisation';          if ($this->getVal('json_payload') !== "{}") {
2844          }              $fieldset_title_payload = __("json_payload");
2845          if ($type === 'creation_DI'          }
2846              || $type === 'create_DI_for_consultation'          $form->setFieldset('json_payload', 'DF', $fieldset_title_payload, "collapsible, startClosed");
2847              || $type === 'depot_DI'          $form->setBloc('json_payload', 'F');
2848              || $type === 'modification_DI'          $form->setBloc('timestamp_log', 'DF', __("historique"), 'col_9 timestamp_log_jsontotab');
2849              || $type === 'qualification_DI') {      }
2850              //  
2851              $objet = 'dossier';      /**
2852         * Récupère le nom de l'objet à mentionner dans la table lien_id_interne_uid_externe
2853         * en fonction du type et du stream de la tâche.
2854         *
2855         * @param  string $type   Type de la tâche
2856         * @param  string $stream Stream de la tâche
2857         *
2858         * @return array
2859         */
2860        function get_objects_by_task_type($type, $stream = 'all') {
2861            $objects = array();
2862            if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2863                $objects = array('dossier_autorisation', );
2864            }
2865            if (in_array($type, array('creation_DI', 'depot_DI', 'notification_DI', 'qualification_DI', )) === true) {
2866                $objects = array('dossier', );
2867            }
2868            if (in_array($type, array('create_DI_for_consultation', )) === true) {
2869                $objects = array('dossier', 'dossier_consultation', );
2870            }
2871            if (in_array($type, array('create_DI', )) === true
2872                && $stream === 'input') {
2873                $objects = array('dossier', 'dossier_autorisation', 'demande', );
2874          }          }
2875          if ($type === 'pec_metier_consultation'          if (in_array($type, array(
2876              || $type === 'decision_DI'              'decision_DI',
2877              || $type === 'avis_consultation'              'incompletude_DI',
2878              || $type === 'incompletude_DI'              'completude_DI',
2879              || $type === 'completude_DI') {              'lettre_incompletude',
2880              //              'lettre_majoration'
2881              $objet = 'instruction';              )) === true) {
2882                $objects = array('instruction', );
2883            }
2884            if (in_array($type, array('envoi_CL', )) === true) {
2885                $objects = array('instruction_action_cl', );
2886            }
2887            if (in_array($type, array('pec_metier_consultation', )) === true
2888                && $stream === 'output') {
2889                $objects = array('pec_dossier_consultation', );
2890            }
2891            if (in_array($type, array('avis_consultation', )) === true
2892                && $stream === 'output') {
2893                $objects = array('avis_dossier_consultation', );
2894            }
2895            if (in_array($type, array('prescription', )) === true
2896                && $stream === 'output') {
2897                $objects = array('prescription', );
2898            }
2899            if (in_array($type, array('ajout_piece', 'add_piece', 'modification_piece', 'suppression_piece', )) === true) {
2900                $objects = array('piece', );
2901            }
2902            if (in_array($type, array('creation_consultation', )) === true) {
2903                $objects = array('consultation', );
2904            }
2905            if (in_array($type, array('ajout_documents_specifiques', )) === true
2906                && $stream === 'output') {
2907                $objects = array('dossier', 'instruction', 'instruction_notification',);
2908            }
2909            if (in_array($type, array('pec_metier_consultation', )) === true
2910                && $stream === 'input') {
2911                $objects = array('pec_metier_consultation', );
2912          }          }
2913          if ($type === 'ajout_piece') {          if (in_array($type, array('avis_consultation', )) === true
2914              $objet = 'document_numerise';              && $stream === 'input') {
2915                $objects = array('avis_consultation', );
2916          }          }
2917          // La tâche entrante se nomme add_piece          if (in_array($type, array('create_message', )) === true
2918          if ($type === 'add_piece') {              && $stream === 'input') {
2919              $objet = 'piece';              $objects = array('dossier_message', );
2920          }          }
2921          return $objet;          if (in_array(
2922                $type,
2923                array(
2924                    'notification_recepisse',
2925                    'notification_instruction',
2926                    'notification_decision',
2927                    'notification_service_consulte',
2928                    'notification_tiers_consulte',
2929                    'notification_signataire',
2930                )
2931            ) === true) {
2932                $objects = array('instruction_notification', 'demande', );
2933            }
2934            return $objects;
2935      }      }
2936    
2937      function setLayout(&$form, $maj) {      /**
2938         * Récupère les tables auxquelles pourrait être rattaché l'objet lié à la tâche,
2939          // Récupération du mode de l'action       * par rapport à son type.
2940          $crud = $this->get_action_crud($maj);       *
2941         * @param  string $type   Type de la tâche
2942         * @param  string $stream input ou output
2943         * @return array
2944         */
2945        function get_tables_by_task_type($type, $stream = 'all') {
2946            $tables = array();
2947            if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2948                $tables = array('dossier_autorisation', );
2949            }
2950            if (in_array($type, array('creation_DI', 'depot_DI', 'modification_DI',)) === true) {
2951                $tables = array('dossier', );
2952            }
2953            if (in_array($type, array('qualification_DI', )) === true) {
2954                $tables = array('instruction', 'dossier', );
2955            }
2956            if (in_array($type, array('create_DI_for_consultation', )) === true) {
2957                $tables = array('dossier', );
2958            }
2959            if (in_array($type, array('create_DI', )) === true
2960                && $stream === 'input') {
2961                $tables = array('dossier', 'dossier_autorisation', 'demande', );
2962            }
2963            if (in_array($type, array(
2964                'decision_DI',
2965                'incompletude_DI',
2966                'completude_DI',
2967                'lettre_incompletude',
2968                'lettre_majoration'
2969            )) === true) {
2970                $tables = array('instruction', );
2971            }
2972            if (in_array($type, array('ajout_documents_specifiques', )) === true
2973                && in_array($stream, array('output', 'all', )) === true ) {
2974                $tables = array('instruction', 'dossier', );
2975            }
2976            if (in_array($type, array('envoi_CL', )) === true) {
2977                $tables = array('instruction', );
2978            }
2979            if (in_array($type, array('pec_metier_consultation', )) === true
2980                && $stream === 'output') {
2981                $tables = array('dossier', 'instruction', 'instruction_notification', );
2982            }
2983            if (in_array($type, array('avis_consultation', )) === true
2984                && $stream === 'output') {
2985                $tables = array('instruction', );
2986            }
2987            if (in_array($type, array('prescription', )) === true
2988                && $stream === 'output') {
2989                $tables = array('instruction', );
2990            }
2991            if (in_array($type, array('ajout_piece', 'add_piece', 'modification_piece', 'suppression_piece', )) === true) {
2992                $tables = array('document_numerise', );
2993            }
2994            if (in_array($type, array('creation_consultation', )) === true) {
2995                $tables = array('consultation', );
2996            }
2997            if (in_array($type, array('pec_metier_consultation', )) === true
2998                && $stream === 'input') {
2999                $tables = array('consultation', );
3000            }
3001            if (in_array($type, array('avis_consultation', )) === true
3002                && $stream === 'input') {
3003                $tables = array('consultation', );
3004            }
3005            if (in_array($type, array('create_message', )) === true
3006                && $stream === 'input') {
3007                $tables = array('dossier_message', );
3008            }
3009            if (in_array(
3010                $type,
3011                array(
3012                    'notification_recepisse',
3013                    'notification_instruction',
3014                    'notification_decision',
3015                    'notification_service_consulte',
3016                    'notification_tiers_consulte',
3017                    'notification_signataire'
3018                )
3019            ) === true) {
3020                $tables = array('instruction_notification', );
3021            }
3022            return $tables;
3023        }
3024    
3025          // MODE different de CREER      /**
3026          if ($maj != 0 || $crud != 'create') {       * Vérifie si l'objet référencé par la tâche existe en base de données.
3027              $form->setBloc('json_payload', 'D', '', 'col_6');       *
3028                  $form->setFieldset('json_payload', 'DF', __("json_payload"), "collapsible, startClosed");       * Récupère la liste des tables de référence associé à la tâche à partir
3029              $form->setBloc('json_payload', 'F');       * du type de tâche et de son flux (input ou output).
3030         * Pour chaque table potentiellement référencé par la tâche on essaye d'instancier
3031         * l'objet correspondant à partir de l'identifiant de l'objet de référence de la tâche.
3032         * Si l'élément instancié existe renvoie true sinon renvoie false.
3033         *
3034         * @param string|integer $taskObjectId : identifiant de l'objet de référence de la tâche
3035         * @param string $taskType : type de la tâche
3036         * @param string $taskStream : flux entrant (output - valeur par défaut) ou sortant (input)
3037         * @return boolean
3038         */
3039        protected function does_referenced_object_exist($taskObjectId, string $taskType, string $taskStream = 'output') {
3040            $refTables = $this->get_tables_by_task_type($taskType, $taskStream);
3041            if (empty($refTables) === true) {
3042                $this->f->addToLog(
3043                    sprintf(
3044                        __("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."),
3045                        $taskType,
3046                        "get_tables_by_task_type()"
3047                    ),
3048                    DEBUG_MODE
3049                );
3050                return true;
3051          }          }
3052          $form->setBloc('timestamp_log', 'DF', '', 'col_9');          foreach ($refTables as $table) {
3053                $inst = $this->f->get_inst__om_dbform(array(
3054                    'obj' => $table,
3055                    'idx' => $taskObjectId
3056                ));
3057                if ($inst->exists() === true) {
3058                    return true;
3059                }
3060            }
3061            return false;
3062      }      }
3063    
3064  }  }

Legend:
Removed from v.9872  
changed lines
  Added in v.19307

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26