/[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_demat/obj/task.class.php revision 9667 by gmalvolti, Thu Nov 5 16:04:34 2020 UTC trunk/obj/task.class.php revision 18876 by softime, Tue Oct 8 08:41:06 2024 UTC
# Line 1  Line 1 
1  <?php  <?php
2  //$Id$  //$Id$
3  //gen openMairie le 14/04/2020 14:11  //gen openMairie le 14/04/2020 14:11
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';
11        const STATUS_NEW = 'new';
12        const STATUS_PENDING = 'pending';
13        const STATUS_DONE = 'done';
14        const STATUS_ERROR = 'error';
15        const STATUS_DEBUG = 'debug';
16        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.
101       *       *
# Line 19  class task extends task_gen { Line 109  class task extends task_gen {
109              "view" => "view_json_data",              "view" => "view_json_data",
110              "permission_suffix" => "consulter",              "permission_suffix" => "consulter",
111          );          );
112            $this->class_actions[997] = array(
113                "identifier" => "json_data",
114                "view" => "post_update_task",
115                "permission_suffix" => "modifier",
116            );
117            $this->class_actions[996] = array(
118                "identifier" => "json_data",
119                "view" => "post_add_task",
120                "permission_suffix" => "ajouter",
121            );
122      }      }
123    
124      public function setvalF($val = array()) {      public function setvalF($val = array()) {
125    
126            // // les guillets doubles sont remplacés automatiquement par des simples
127            // // dans core/om_formulaire.clasS.php::recupererPostvar()
128            // // voir le ticket https://dev.atreal.fr/projets/openmairie/tracker/209
129            // // ceci est un hack sale temporaire en attendant résolution du ticket
130            // foreach(array('json_payload', 'timestamp_log') as $key) {
131            //     if (isset($val[$key]) && ! empty($val[$key]) &&
132            //             isset($_POST[$key]) && ! empty($_POST[$key])) {
133            //         $submited_payload = $_POST[$key];
134            //         if (! empty($submited_payload)) {
135            //             $new_payload = str_replace("'", '"', $val[$key]);
136            //             if ($new_payload == $submited_payload ||
137            //                     strpos($submited_payload, '"') === false) {
138            //                 $val[$key] = $new_payload;
139            //             }
140            //             else {
141            //                 $error_msg = sprintf(
142            //                     __("La convertion des guillemets de la payload JSON '%s' ".
143            //                         "n'est pas idempotente (courante: %s, postée: %s, convertie: %s)"),
144            //                     $key, var_export($val[$key], true), var_export($submited_payload, true),
145            //                     var_export($new_payload, true));
146            //                 $this->correct = false;
147            //                 $this->addToMessage($error_msg);
148            //                 $this->addToLog(__METHOD__."() erreur : $error_msg", DEBUG_MODE);
149            //                 return false;
150            //             }
151            //         }
152            //     }
153            // }
154    
155          parent::setvalF($val);          parent::setvalF($val);
156          //  
157            // XXX Ancien code : permet de ne pas avoir d'erreru lors de la modification d'une task
158          if (array_key_exists('timestamp_log', $val) === true) {          if (array_key_exists('timestamp_log', $val) === true) {
159              $this->valF['timestamp_log'] = str_replace("'", '"', $val['timestamp_log']);              $this->valF['timestamp_log'] = str_replace("'", '"', $val['timestamp_log']);
160          }          }
161    
162            // récupération de l'ID de l'objet existant
163            $id = property_exists($this, 'id') ? $this->id : null;
164            if(isset($val[$this->clePrimaire])) {
165                $id = $val[$this->clePrimaire];
166            } elseif(isset($this->valF[$this->clePrimaire])) {
167                $id = $this->valF[$this->clePrimaire];
168            }
169    
170            // MODE MODIFIER
171            if (! empty($id)) {
172    
173                // si aucune payload n'est fourni (devrait toujours être le cas)
174                if (! isset($val['json_payload']) || empty($val['json_payload'])) {
175    
176                    // récupère l'objet existant
177                    $existing = $this->f->findObjectById('task', $id);
178                    if (! empty($existing)) {
179    
180                        // récupère la payload de l'objet
181                        $val['json_payload'] = $existing->getVal('json_payload');
182                        $this->valF['json_payload'] = $existing->getVal('json_payload');
183                        $this->f->addToLog(__METHOD__."() récupère la payload de la tâche existante ".
184                            "'$id': ".$existing->getVal('json_payload'), EXTRA_VERBOSE_MODE);
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 40  class task extends task_gen { Line 221  class task extends task_gen {
221              "state",              "state",
222              "object_id",              "object_id",
223              "dossier",              "dossier",
224                "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    
239      function setType(&$form, $maj) {      function setType(&$form, $maj) {
240          parent::setType($form, $maj);          parent::setType($form, $maj);
241    
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          if ($maj < 2) {          // ALL
246            $form->setType("category", "hidden");
247            $form->setType("timestamp_log_hidden", "hidden");
248    
249            // MODE CREER
250            if ($maj == 0 || $crud == 'create') {
251                $form->setType("type", "select");
252              $form->setType("state", "select");              $form->setType("state", "select");
253                $form->setType("stream", "select");
254              $form->setType("json_payload", "textarea");              $form->setType("json_payload", "textarea");
255          }          }
256          if ($maj == 3){          // MODE MODIFIER
257            if ($maj == 1 || $crud == 'update') {
258                $form->setType("task", "hiddenstatic");
259                $form->setType("state", "select");
260                $form->setType("stream", "hiddenstatic");
261                $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
274            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', 'ARCHIVED', 'CANCELED', 'INVALID') as $key) {
329                    $const_name = 'STATUS_'.$key;
330                    $const_value = constant("self::$const_name");
331                    $contenu[0][] = $const_value;
332    
333              $contenu[0][0]="draft";  
334              $contenu[1][0]=_('draft');                  $contenu[1][] = $this->stateTranslation($const_value);
335              $contenu[0][1]="new";  
336              $contenu[1][1]=_('new');              }
             $contenu[0][2]="pending";  
             $contenu[1][2]=_('pending');  
             $contenu[0][3]="done";  
             $contenu[1][3]=_('done');  
             $contenu[0][4]="archived";  
             $contenu[1][4]=_('archived');  
             $contenu[0][5]="error";  
             $contenu[1][5]=_('error');  
             $contenu[0][6]="debug";  
             $contenu[1][6]=_('debug');  
337    
338              $form->setSelect("state", $contenu);              $form->setSelect("state", $contenu);
339    
340                $contenu_stream =array();
341                $contenu_stream[0][0]="input";
342                $contenu_stream[1][0]=__('input');
343                $contenu_stream[0][1]="output";
344                $contenu_stream[1][1]=__('output');
345                $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              $inst_dossier = $this->f->get_inst__om_dbform(array(              $dossier = $form->val['dossier'];
454                  "obj" => "dossier",              // Récupération du numéro du dossier si il n'est pas renseigné dans la tâche
455                  "idx" => $form->val['dossier'],  
456              ));              if ($dossier == '' || $dossier == null) {
457                                // Récupération de la payload de la taĉhe.
458              if($form->val['type'] == "creation_DA"){                  // Si la tâche est une tâche input la payload est associée à la tâche.
459                  $obj_link = 'dossier_autorisation';                  // Si la tâche est une tâche en output la payload est "calculé" à l'ouverture
460              } else {                  // du formulaire.
461                  $obj_link = 'dossier_instruction';                  if ($this->getVal('stream') == 'input') {
462                        $json_payload = json_decode($this->getVal('json_payload'), true);
463                    } else {
464                        $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                    // 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);              $form->setSelect("dossier", $params);
573          }          }
574      }      }
# Line 115  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          $form->setVal('json_payload', $this->view_form_json(true));          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));
590            } else {
591                $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    
601        function setLib(&$form, $maj) {
602            parent::setLib($form, $maj);
603    
604            // Récupération du mode de l'action
605            $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
612            if ($maj != 0 || $crud != 'create') {
613                $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          parent::verifier($val, $dnu1, $dnu2);          $ret = parent::verifier($val, $dnu1, $dnu2);
625          //  
626          if (array_key_exists('timestamp_log', $this->valF) === true          $allowed_state = array(
627              && is_array(json_decode($this->valF['timestamp_log'], true)) === false) {              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;              $this->correct = false;
645              $this->addToMessage(sprintf(              $err_msg = sprintf(
646                  __("Le champ %s doit être dans un format JSON valide."),                  __("Champ '%s' obligatoire pour %s"),
647                  sprintf('<span class="bold">%s</span>', $this->getLibFromField('timestamp_log'))                  '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
661            if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
662                if (isset($this->valF['type']) === false) {
663                    $this->correct = false;
664                    $this->addToMessage(sprintf(
665                        __("Le champ %s est obligatoire pour une tâche entrante."),
666                        sprintf('<span class="bold">%s</span>', $this->getLibFromField('type'))
667                    ));
668                    $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
669                }
670                if (isset($this->valF['json_payload']) === false) {
671                    $this->correct = false;
672                    $this->addToMessage(sprintf(
673                        __("Le champ %s est obligatoire pour une tâche entrante."),
674                        sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
675                    ));
676                    $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
677                }
678            }
679    
680            // les JSONs doivent être décodables
681            foreach(array('json_payload', 'timestamp_log') as $key) {
682                if (isset($this->valF[$key]) && ! empty($this->valF[$key]) && (
683                        is_array(json_decode($this->valF[$key], true)) === false
684                        || json_last_error() !== JSON_ERROR_NONE)) {
685                    $this->correct = false;
686                    $champ_text = sprintf('<span class="bold">%s</span>', $this->getLibFromField($key));
687                    $this->addToMessage(sprintf(
688                        __("Le champ %s doit être dans un format JSON valide (erreur: %s).".
689                        "<p>%s valF:</br><pre>%s</pre></p>".
690                        "<p>%s val:</br><pre>%s</pre></p>".
691                        "<p>%s POST:</br><pre>%s</pre></p>".
692                        "<p>%s submitted POST value:</br><pre>%s</pre></p>"),
693                        $champ_text,
694                        json_last_error() !== JSON_ERROR_NONE ? json_last_error_msg() : __('invalide'),
695                        $champ_text,
696                        $this->valF[$key],
697                        $champ_text,
698                        $val[$key],
699                        $champ_text,
700                        isset($_POST[$key]) ? $_POST[$key] : '',
701                        $champ_text,
702                        $this->f->get_submitted_post_value($key)
703                    ));
704                    $this->addToLog(__METHOD__.'(): erreur JSON: '.$this->msg, DEBUG_MODE);
705                }
706            }
707    
708            // une tâche entrante doit avoir une payload avec les clés requises
709            if ($this->correct && (isset($this->valF['stream']) === false ||
710                                   $this->valF['stream'] == 'input')) {
711    
712                // décode la payload JSON
713                // TODO : COMMENTER
714                $json_payload = json_decode($this->valF['json_payload'], true);
715    
716                // défini une liste de chemin de clés requises
717                $paths = array();
718                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
725                if (isset($this->valF['type']) !== false && $this->valF['type'] == 'create_DI_for_consultation') {
726    
727                    $paths = array_merge($paths, array(
728                        'dossier/dossier',
729                        'dossier/dossier_autorisation_type_detaille_code',
730                        'dossier/date_demande',
731                        'dossier/depot_electronique',
732                    ));
733    
734                    // si l'option commune est activée (mode MC)
735                    if ($this->f->is_option_dossier_commune_enabled()) {
736                        $paths[] = 'dossier/insee';
737                    }
738    
739                    // présence d'un moyen d'identifier la collectivité/le service
740                    if (! isset($json_payload['external_uids']['acteur']) &&
741                            ! isset($json_payload['dossier']['om_collectivite'])) {
742                        $this->correct = false;
743                        $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."),
745                            sprintf('<span class="bold">%s</span>', 'external_uids/acteur'),
746                            sprintf('<span class="bold">%s</span>', 'dossier/om_collectivite'),
747                            sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
748                        ));
749                        $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
750                    }
751                }
752    
753                // pas d'erreur déjà trouvée
754                if($this->correct) {
755    
756                    // pour chaque chemin
757                    foreach($paths as $path) {
758    
759                        // décompose le chemin
760                        $tokens = explode('/', $path);
761                        $cur_depth = $json_payload;
762    
763                        // descend au et à mesure dans l'arborescence du chemin
764                        foreach($tokens as $token) {
765    
766                            // en vérifiant que chaque élément du chemin est défini et non-nul
767                            if (isset($cur_depth[$token]) === false) {
768    
769                                // sinon on produit une erreur
770                                $this->correct = false;
771                                $this->addToMessage(sprintf(
772                                    __("La clé %s est obligatoire dans le contenu du champ %s pour une tâche entrante."),
773                                    sprintf('<span class="bold">%s</span>', $path),
774                                    sprintf('<span class="bold">%s</span>', $this->getLibFromField('json_payload'))
775                                ));
776                                $this->addToLog(__METHOD__.'(): erreur: '.$this->msg, DEBUG_MODE);
777                                break 2;
778                            }
779                            $cur_depth = $cur_depth[$token];
780                        }
781                    }
782                }
783          }          }
784    
785            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              'done',              empty($search_values) === false ? ' WHERE ' : '',
846              $type,              implode(' AND ', $search_values)
847              $object_id          );
848            $res = $this->f->get_all_results_from_db_query(
849                $query,
850                array(
851                    "origin" => __METHOD__,
852                )
853          );          );
854          $res = $this->f->get_one_result_from_db_query($query);          if (count($res['result']) > 0) {
         if ($res['result'] !== null && $res['result'] !== '') {  
855              return $res['result'];              return $res['result'];
856          }          }
857          return false;          return false;
858      }      }
859    
860      /**      /**
861         * TRIGGER - triggerajouter.
862         *
863         * @param string $id
864         * @param null &$dnu1 @deprecated  Ne pas utiliser.
865         * @param array $val Tableau des valeurs brutes.
866         * @param null $dnu2 @deprecated  Ne pas utiliser.
867         *
868         * @return boolean
869         */
870        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
875            if (isset($this->valF['stream']) === false || $this->valF['stream'] == 'input') {
876    
877                // décode la paylod JSON pour extraire les données métiers à ajouter
878                // en tant que métadonnées de la tâche
879                $json_payload = json_decode($this->valF['json_payload'], true);
880    
881                // si la tâche possède déjà une clé dossier
882                if (isset($json_payload['dossier']['dossier']) &&
883                        ! empty($json_payload['dossier']['dossier'])) {
884                    $this->valF["dossier"] = $json_payload['dossier']['dossier'];
885                }
886            }
887    
888            // gestion d'une tache de type notification et de category mail
889            if (isset($val['type'])
890                && (($val['type'] === 'notification_instruction' || $val['type'] === 'notification_decision')
891                    && isset($val['category'])
892                    && $val['category'] === 'mail')
893                || $val['type'] === 'notification_service_consulte'
894                || $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                // Récupère l'instance de la notification
909                $inst_notif = $this->f->get_inst__om_dbform(array(
910                    "obj" => "instruction_notification",
911                    "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            if ($val['stream'] === 'output'
957                && $val['type'] !== 'suppression_piece') {
958                // Lorsque la task passe d'un état qui n'est pas "done" à l'état "done"
959                if ($this->getVal("state") !== self::STATUS_DONE
960                    && $this->valF['state'] === self::STATUS_DONE) {
961                    //
962                    $this->valF['json_payload'] = $this->view_form_json(true);
963                }
964                // Lorsque la task passe d'un état "done" à un état qui n'est pas "done"
965                if ($this->getVal("state") === self::STATUS_DONE
966                    && $this->valF['state'] !== self::STATUS_DONE) {
967                    //
968                    $this->valF['json_payload'] = "{}";
969                }
970            }
971    
972            return true;
973        }
974    
975    
976        /**
977         * Applique nouvelle valeur après traitement.
978         *
979         * @param array $params Tableau des valeurs en entrées
980         * @return array        Tableau des valeurs en sorties
981         */
982        public function set_values_for_update($params = array()) {
983    
984            // Récupération du timestamp_log existant
985            $timestamp_log = $this->get_timestamp_log();
986            if ($timestamp_log === false) {
987                return false;
988            }
989    
990            // Vérification des object_id précédent en cas de tentative d'appliquer
991            // l'état CANCELED sur la tâche
992            if (isset($params['state']) === true
993                && $params['state'] === self::STATUS_CANCELED) {
994                // Récupération du journal d'activité de la tâche sous forme de tableau
995                // trié par ordre décroissant
996                $log = $timestamp_log;
997                krsort($log);
998                // Pour chaque entrée dans le journal d'activité de la tâche :
999                // - vérification de la présence de l'object_id précédent
1000                // - vérification que l'object_id précédent existe toujours dans la base de données
1001                // - l'object_id est mise à jour avec la valeur de l'object_id précédent
1002                // - le state n'est pas modifié
1003                // - sortie du traitement dès que le premier object_id précédent existant est trouvé
1004                // - si aucun object_id précédent existant n'est trouvé alors ni le state, ni l'object_id n'est modifiés
1005                foreach ($log as $key => $value) {
1006                    //
1007                    if (isset($value['prev_object_id']) === true
1008                        && $this->getVal('object_id') !== $value['prev_object_id']) {
1009                        // Récupère la liste des tables potentielles pour un type de tâche
1010                        $tables = $this->get_tables_by_task_type($this->getVal('type'), $this->getVal('stream'));
1011                        foreach ($tables as $table) {
1012                            // Vérifie s'il y a un ou aucun résultat
1013                            $qres = $this->f->get_one_result_from_db_query(
1014                                sprintf(
1015                                    'SELECT
1016                                        COUNT(%2$s)
1017                                    FROM
1018                                        %1$s%2$s
1019                                    WHERE
1020                                        %2$s::CHARACTER VARYING = \'%3$s\'',
1021                                    DB_PREFIXE,
1022                                    $table,
1023                                    $value['prev_object_id']
1024                                ),
1025                                array(
1026                                    "origin" => __METHOD__,
1027                                    "force_return" => true,
1028                                )
1029                            );
1030                            if ($qres["code"] !== "OK") {
1031                                return $this->end_treatment(__METHOD__, false);
1032                            }
1033                            // Affectation des valeurs et sortie de la boucle
1034                            if ($qres["result"] == '1') {
1035                                $params['object_id'] = $value['prev_object_id'];
1036                                $params['state'] = $this->getVal('state');
1037                                break;
1038                            }
1039                        }
1040                        // Sortie de la boucle si les valeurs sont affectées
1041                        if ($params['object_id'] !== null
1042                            && $params['object_id'] === $value['prev_object_id']) {
1043                            //
1044                            break;
1045                        }
1046                    }
1047                }
1048            }
1049    
1050            // Mise à jour du journal d'activité de la tâche
1051            array_push($timestamp_log, array(
1052                'modification_date' => date('Y-m-d H:i:s'),
1053                'object_id' => $params['object_id'] !== null ? $params['object_id'] : $this->getVal('object_id'),
1054                'prev_object_id' => $this->getVal('object_id'),
1055                'state' =>  $params['state'],
1056                'prev_state' => $this->getVal('state'),
1057                'comment' => isset($params['comment']) ? $params['comment'] : $this->getVal('comment'),
1058            ));
1059            //
1060            $timestamp_log = json_encode($timestamp_log);
1061            
1062    
1063            // Les nouvelles valeurs après vérification des critères
1064            $result = array(
1065                'timestamp_log' => $timestamp_log,
1066                'object_id' => $params['object_id'],
1067                'state' => $params['state'],
1068                'comment' => $params['comment'],
1069            );
1070            return $result;
1071        }
1072    
1073        
1074        /**
1075         * TRIGGER - triggermodifierapres.
1076         *
1077         * @param string $id
1078         * @param null &$dnu1 @deprecated  Ne pas utiliser.
1079         * @param array $val Tableau des valeurs brutes.
1080         * @param null $dnu2 @deprecated  Ne pas utiliser.
1081         *
1082         * @return boolean
1083         */
1084        public function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1085            parent::triggermodifierapres($id, $dnu1, $val, $dnu2);
1086    
1087            // Suivi des notificiations
1088            // En cas de changement de l'état de la tâche de notification, alors
1089            // le suivi des dates de la notification et de l'instruction, est effectué
1090            if (isset($val['category']) === true
1091                && $val['category'] === PORTAL
1092                && isset($val['type']) === true
1093                && ($val['type'] === 'notification_recepisse'
1094                    || $val['type'] === 'notification_instruction'
1095                    || $val['type'] === 'notification_decision'
1096                    || $val['type'] === 'notification_service_consulte'
1097                    || $val['type'] === 'notification_tiers_consulte')) {
1098                //
1099                if (isset($this->valF['state']) === true
1100                    && $this->valF['state'] !== $this->getVal('state')
1101                    && $this->valF['state'] !== self::STATUS_CANCELED) {
1102                    //
1103                    $inst_in = $this->f->get_inst__om_dbform(array(
1104                        "obj" => "instruction_notification",
1105                        "idx" => $val['object_id'],
1106                    ));
1107                    $valF_in = array();
1108                    foreach ($inst_in->champs as $champ) {
1109                        $valF_in[$champ] = $inst_in->getVal($champ);
1110                    }
1111                    // Par défaut la date d'envoi et la date de premier accès sur
1112                    // la notification ne sont pas renseignées
1113                    $valF_in['date_envoi'] = null;
1114                    $valF_in['date_premier_acces'] = null;
1115                    // Lorsque la tâche est correctement traitée
1116                    if ($this->valF['state'] === self::STATUS_DONE) {
1117                        //
1118                        $valF_in['statut'] = __("envoyé");
1119                        $valF_in['commentaire'] = __("Notification traitée");
1120                        $valF_in['date_envoi'] = date('d/m/Y H:i:s');
1121                        // Si l'instruction possède un document lié, alors ses dates
1122                        // de suivi sont mises à jour
1123                        $inst_instruction = $this->f->get_inst__om_dbform(array(
1124                            "obj" => "instruction",
1125                            "idx" => $inst_in->getVal('instruction'),
1126                        ));
1127                        if ($inst_instruction->has_an_edition() === true) {
1128                            $valF_instruction = array();
1129                            foreach ($inst_instruction->champs as $champ) {
1130                                $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1131                            }
1132                            $valF_instruction['date_envoi_rar'] = date('d/m/Y');
1133                            $valF_instruction['date_retour_rar'] = date('d/m/Y', strtotime('now + 1 day'));
1134                            // Action spécifique pour identifier que la modification
1135                            // est une notification de demandeur
1136                            $inst_instruction->setParameter('maj', 175);
1137                            $update_instruction = $inst_instruction->modifier($valF_instruction);
1138                            if ($update_instruction === false) {
1139                                $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, DEBUG_MODE);
1140                                return false;
1141                            }
1142                        }
1143                    }
1144                    // En cas d'erreur lors du traitement de la task
1145                    if ($this->valF['state'] === self::STATUS_ERROR) {
1146                        $valF_in['statut'] = __("échec");
1147                        $valF_in['commentaire'] = __("Le traitement de la notification a échoué");
1148                    }
1149                    // Met à jour la notification
1150                    $inst_in->setParameter('maj', 1);
1151                    $update_in = $inst_in->modifier($valF_in);
1152                    if ($update_in === false) {
1153                        $this->addToLog(__METHOD__."(): ".$inst_in->msg, DEBUG_MODE);
1154                        return false;
1155                    }
1156                }
1157            }
1158    
1159            // Envoi au contrôle de légalité
1160            // En cas de changement de l'état de la tâche envoi_CL, alors le suivi
1161            // des dates de l'instruction est effectué
1162            if ($val['type'] === 'envoi_CL'
1163                && isset($this->valF['state']) === true
1164                && $this->valF['state'] === self::STATUS_DONE) {
1165                //
1166                $inst_instruction = $this->f->get_inst__om_dbform(array(
1167                    "obj" => "instruction",
1168                    "idx" => $this->getVal('object_id'),
1169                ));
1170                $valF_instruction = array();
1171                foreach ($inst_instruction->champs as $champ) {
1172                    $valF_instruction[$champ] = $inst_instruction->getVal($champ);
1173                }
1174                // On met à jour la date d'envoi au CL seulement si l'instruction a une édition liée
1175                $valF_instruction['date_envoi_controle_legalite'] = date("Y-m-d");
1176                $inst_instruction->setParameter('maj', 1);
1177                $update_instruction = $inst_instruction->modifier($valF_instruction);
1178                if ($update_instruction === false) {
1179                    $this->addToLog(__METHOD__."(): ".$inst_instruction->msg, DEBUG_MODE);
1180                    return false;
1181                }
1182            }
1183    
1184            //
1185            return true;
1186        }
1187    
1188        /**
1189       * TREATMENT - add_task       * TREATMENT - add_task
1190       * Ajoute un enregistrement.       * Ajoute un enregistrement.
1191       *       *
# Line 161  class task extends task_gen { Line 1194  class task extends task_gen {
1194       */       */
1195      public function add_task($params = array()) {      public function add_task($params = array()) {
1196          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
1197          $timestamp_log = json_encode(array(  
1198              'creation_date' => date('Y-m-d H:i:s'),          // Vérifie si la task doit être ajoutée en fonction du mode de l'application,
1199          ));          // seulement pour les tasks output
1200          // Mise à jour du DI          $task_types_si = self::TASK_TYPE_SI;
1201            $task_types_sc = self::TASK_TYPE_SC;
1202            $stream = isset($params['val']['stream']) === true ? $params['val']['stream'] : 'output';
1203            if ($stream === 'output'
1204                && isset($params['val']['type']) === true
1205                && $this->f->is_option_mode_service_consulte_enabled() === true
1206                && in_array($params['val']['type'], $task_types_sc) === false) {
1207                //
1208                return $this->end_treatment(__METHOD__, true);
1209            }
1210            if ($stream === 'output'
1211                && isset($params['val']['type']) === true
1212                && $this->f->is_option_mode_service_consulte_enabled() === false
1213                && in_array($params['val']['type'], $task_types_si) === false) {
1214                //
1215                return $this->end_treatment(__METHOD__, true);
1216            }
1217    
1218            //
1219            $timestamp_log = json_encode(array());
1220    
1221            //
1222            $category = isset($params['val']['category']) === true ? $params['val']['category'] : $this->category;
1223    
1224            // Si la tâche est de type ajout_piece et de stream input alors on ajoute le fichier
1225            // et on ajoute l'uid dans le champ json_payload avant l'ajout de la tâche
1226            if (isset($params['val']['type'])
1227                && in_array($params['val']['type'], self::TASK_WITH_DOCUMENT)
1228                && isset($params['val']['stream'])
1229                && $params['val']['stream'] == "input" ) {
1230                //
1231                $json_payload = json_decode($params['val']['json_payload'], true);
1232                if (json_last_error() !== JSON_ERROR_NONE) {
1233                    $this->addToMessage(__("Le contenu JSON de la tâche n'est pas valide."));
1234                    return $this->end_treatment(__METHOD__, false);
1235                }
1236                if (isset($json_payload['document_numerise']["file_content"]) === true
1237                    && empty($json_payload['document_numerise']["file_content"]) === false) {
1238                    //
1239                    $document_numerise = $json_payload['document_numerise'];
1240                    $file_content = base64_decode($document_numerise["file_content"]);
1241                    if ($file_content === false){
1242                        $this->addToMessage(__("Le contenu du fichier lié à la tâche n'a pas pu etre recupere."));
1243                        return $this->end_treatment(__METHOD__, false);
1244                    }
1245                    $metadata = array(
1246                        "filename" => $document_numerise['nom_fichier'],
1247                        "size" => strlen($file_content),
1248                        "mimetype" => $document_numerise['file_content_type'],
1249                        "date_creation" => isset($document_numerise['date_creation']) === true ? $document_numerise['date_creation'] : date("Y-m-d"),
1250                    );
1251                    $uid_fichier = $this->f->storage->create($file_content, $metadata, "from_content", "task.uid_fichier");
1252                    if ($uid_fichier === OP_FAILURE) {
1253                        $this->addToMessage(__("Erreur lors de la creation du fichier lié à la tâche."));
1254                        return $this->end_treatment(__METHOD__, false);
1255                    }
1256                    $json_payload["document_numerise"]["uid"] = $uid_fichier;
1257                    // Le fichier a été ajouté nous n'avons plus besoin du champ file_content dans la payload
1258                    unset($json_payload["document_numerise"]["file_content"]);
1259                    $params['val']['json_payload'] = json_encode($json_payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
1260                }
1261            }
1262    
1263            if (isset($params['val']['state'])) {
1264                $allowed_state = array(
1265                    self::STATUS_DRAFT,
1266                    self::STATUS_NEW,
1267                    self::STATUS_PENDING,
1268                    self::STATUS_DONE,
1269                    self::STATUS_ERROR,
1270                    self::STATUS_DEBUG,
1271                    self::STATUS_ARCHIVED,
1272                    self::STATUS_CANCELED,
1273                    self::STATUS_INVALID);
1274    
1275                if (empty($params['val']['state'])) {
1276                    throw new InvalidArgumentException(
1277                        "État ('state') vide pour la nouvelle tâche");
1278                }
1279                elseif (! in_array($params['val']['state'], $allowed_state)) {
1280                    throw new InvalidArgumentException(
1281                        "État ('state') invalide (".var_export($params['val']['state'], true).
1282                        ") pour la nouvelle tâche");
1283                }
1284            }
1285    
1286            // Valeurs de la tâche
1287          $valF = array(          $valF = array(
1288              'task' => '',              'task' => '',
1289              'type' => $params['val']['type'],              'type' => $params['val']['type'],
1290              'timestamp_log' => $timestamp_log,              'timestamp_log' => $timestamp_log,
1291              'state' => isset($params['val']['state']) === true ? $params['val']['state'] : 'new',              'state' => isset($params['val']['state']) === true ? $params['val']['state'] : self::STATUS_NEW,
1292              'object_id' => $params['val']['object_id'],              'object_id' => isset($params['val']['object_id']) ? $params['val']['object_id'] : '',
1293              'dossier' => $params['val']['dossier'],              'dossier' => isset($params['val']['dossier']) ? $params['val']['dossier'] : '',
1294              'json_payload' => '{}',              'stream' => $stream,
1295          );              'json_payload' => isset($params['val']['json_payload']) === true ? $params['val']['json_payload'] : '{}',
1296          $task_exists = $this->task_exists($valF['type'], $valF['object_id']);              'category' => $category,
1297          if ($valF['type'] === 'modification_DI' && $task_exists === false) {              'creation_date' => date('Y-m-d'),
1298              $task_exists = $this->task_exists('creation_DI', $valF['object_id']);              'creation_time' => date('H:i:s'),
1299                'last_modification_date' => null,
1300                'last_modification_time' => null,
1301                'comment' => null,
1302            );
1303    
1304            // Gestion de la mise à jour des tâches sortantes
1305            $typeNonConcerne = array(
1306                'notification_recepisse',
1307                'notification_instruction',
1308                'notification_decision',
1309                'notification_service_consulte',
1310                'notification_tiers_consulte',
1311                'notification_depot_demat',
1312                'notification_commune',
1313                'notification_signataire',
1314            );
1315            if ($valF["stream"] == "output"
1316                && ! in_array($valF['type'], $typeNonConcerne)) {
1317                // Vérification de l'existance d'une tâche pour l'objet concerné
1318                // La vérification diffère en fonction de certains types de tâche
1319                $search_values_common = array(
1320                    sprintf('state != \'%s\'', self::STATUS_CANCELED),
1321                    sprintf('state != \'%s\'', self::STATUS_DONE),
1322                    sprintf('state != \'%s\'', self::STATUS_PENDING),
1323                );
1324                $search_values_others = array(
1325                    sprintf('type = \'%s\'', $valF['type']),
1326                    sprintf('(object_id = \'%s\' OR (object_id IS NULL AND dossier = \'%s\'))', $valF['object_id'], $valF['dossier']),
1327                );
1328                $search_values_specifics = array(
1329                    sprintf('object_id = \'%s\'', $valF['object_id']),
1330                );
1331    
1332                // Recherche multi-critères sur les tâches
1333                // Si l'object id/dossier à des tâches de type $valF['type'] qui lui est associé
1334                // Et que ces tâches ont des statut différents de canceled et done
1335                // Alors on récupère ces tâches
1336                // Sinon return false
1337                $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_others));
1338    
1339                // Vérifie si une tâche existe déjà pour les types de tâches ayant un fonctionnement particulier.
1340                // Il existe 2 cas :
1341                //   - Aucune tâche déjà existante n'a été récupérées mais on veut faire une vérification supplémentaire
1342                //   - Les tâches pour lesquelles on fait une vérification supplémentaire qu'une correspondance ait été
1343                //     trouvée ou pas
1344                // Une tâche ne pouvant avoir qu'un seul type si elle est trouvée, il n'est pas nécessaire de
1345                // vérifier les autres
1346                $is_type_voulu_traite = false;
1347                // Cas 1 : Aucune tâche déjà existante n'a été récupérées mais effectue une vérification supplémentaire
1348                $cas_specifiques_tache_non_existante = array(
1349                    'modification_DI' => array("type = 'creation_DI'"),
1350                    'modification_DA' => array("type = 'creation_DA'")
1351                );
1352                foreach ($cas_specifiques_tache_non_existante as $type_task => $conditions_specifiques) {
1353                    // S'il n'existe pas de tâche de type voulu pour l'object id/dossier
1354                    if ($valF['type'] === $type_task && $task_exists === false) {
1355                        // On se réfère à la tâche de type 'ajout piece' de l'object id
1356                        $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, $conditions_specifiques));
1357                        $is_type_voulu_traite = true;
1358                        break;
1359                    }
1360                }
1361    
1362                // Cas 2 : Vérification supplémentaire qu'une correspondance ait été trouvé ou pas
1363                if (! $is_type_voulu_traite) {
1364                    $cas_specifiques = array(
1365                        'ajout_piece',
1366                        'modification_piece',
1367                        'suppression_piece',
1368                        'creation_consultation',
1369                        'ajout_documents_specifiques',
1370                    );
1371                    foreach ($cas_specifiques as $type_task) {
1372                        if ($valF['type'] === $type_task) {
1373                            // On se réfère à la tâche de type 'ajout piece' de l'object id
1374                            $task_exists = $this->task_exists_multi_search(array_merge($search_values_common, $search_values_specifics, array("type = '$type_task'")));
1375                            break;
1376                        }
1377                    }
1378                }
1379    
1380                // S'il existe une tâche pour l'objet concerné, pas d'ajout de nouvelle
1381                // tâche mais mise à jour de l'existante
1382                if ($task_exists !== false) {
1383                    // Plusieurs tâches pourraient exister, elles sont contôler par ordre croissant
1384                    foreach ($task_exists as $task) {
1385                        $inst_task = $this->f->get_inst__om_dbform(array(
1386                            "obj" => "task",
1387                            "idx" => $task['task'],
1388                        ));
1389                        $update_state = $inst_task->getVal('state');
1390                        if (isset($params['update_val']['state']) === true) {
1391                            $update_state = $params['update_val']['state'];
1392                        }
1393                        $object_id = $inst_task->getVal('object_id');
1394                        if (!empty($valF['object_id'])) {
1395                            $object_id = $valF['object_id'];
1396                        }
1397                        // Pour être mise à jour, la tâche existante ne doit pas être en cours de traitement
1398                        $task_pending = $inst_task->getVal('state') === self::STATUS_PENDING
1399                            && $update_state === self::STATUS_PENDING
1400                            && $inst_task->getVal('object_id') !== $object_id;
1401                        if ($task_pending === false) {
1402                            $update_params = array(
1403                                'val' => array(
1404                                    'state' => $update_state,
1405                                ),
1406                                'object_id' => $object_id,
1407                            );
1408                            return $inst_task->update_task($update_params);
1409                        }
1410                    }
1411                }
1412          }          }
1413          if ($task_exists !== false) {          $add = $this->ajouter($valF);
1414            $this->addToLog(__METHOD__."(): retour de l'ajout de tâche: ".var_export($add, true), VERBOSE_MODE);
1415    
1416            // Création de la payload JSON dans le cas ou nous avons un suppression d'objet
1417            if ($stream === 'output'
1418                && $add === true
1419                && isset($valF['type']) === true
1420                && strpos($valF['type'], 'suppression_piece') !== false
1421            ) {
1422                $inst_task_empty = $this->f->get_inst__om_dbform(array(
1423                    "obj" => "task",
1424                    "idx" => 0,
1425                ));
1426                // Vérification de l'éxistence d'une tache de suppression de pièce
1427                $task_exists = $inst_task_empty->task_exists('suppression_piece', $valF['object_id']);
1428                $valF['task'] = $task_exists;
1429              $inst_task = $this->f->get_inst__om_dbform(array(              $inst_task = $this->f->get_inst__om_dbform(array(
1430                  "obj" => "task",                  "obj" => "task",
1431                  "idx" => $task_exists,                  "idx" => $task_exists,
1432              ));              ));
1433              $update_state = $inst_task->getVal('state');              $valF['json_payload'] = $inst_task->view_form_json(true);
1434              if (isset($params['update_val']['state']) === true) {              $update = $this->modifier($valF);
1435                  $update_state = $params['update_val']['state'];              if ($update === false) {
1436                    $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
1437                    return $this->end_treatment(__METHOD__, false);
1438              }              }
             $update_params = array(  
                 'val' => array(  
                     'state' => $update_state,  
                 ),  
             );  
             return $inst_task->update_task($update_params);  
1439          }          }
1440          $add = $this->ajouter($valF);  
1441          if ($add === false) {          if ($add === false) {
1442              $this->addToLog($this->msg, DEBUG_MODE);              $this->addToLog(__METHOD__."(): ".$this->msg, DEBUG_MODE);
1443              return $this->end_treatment(__METHOD__, false);              return $this->end_treatment(__METHOD__, false);
1444          }          }
1445          return $this->end_treatment(__METHOD__, true);          return $this->end_treatment(__METHOD__, true);
# Line 211  class task extends task_gen { Line 1454  class task extends task_gen {
1454       */       */
1455      public function update_task($params = array()) {      public function update_task($params = array()) {
1456          $this->begin_treatment(__METHOD__);          $this->begin_treatment(__METHOD__);
1457          $timestamp_log = $this->get_timestamp_log();  
1458          if ($timestamp_log === false) {          $allowed_state = array(
1459              $this->addToLog(__('XXX'), DEBUG_MODE);              self::STATUS_DRAFT,
1460              return $this->end_treatment(__METHOD__, false);              self::STATUS_NEW,
1461                self::STATUS_PENDING,
1462                self::STATUS_DONE,
1463                self::STATUS_ERROR,
1464                self::STATUS_DEBUG,
1465                self::STATUS_ARCHIVED,
1466                self::STATUS_CANCELED,
1467                self::STATUS_INVALID);
1468    
1469            $task_id = $this->getVal($this->clePrimaire);
1470    
1471            if (! isset($params['val']['state']) || empty($params['val']['state'])) {
1472                throw new InvalidArgumentException(
1473                    "État ('state') non spécifié ou vide pour la tâche '$task_id'");
1474            }
1475            elseif (! in_array($params['val']['state'], $allowed_state)) {
1476                throw new InvalidArgumentException(
1477                    "État ('state') invalide (".var_export($params['val']['state'], true).
1478                    ") pour la tâche '$task_id'");
1479          }          }
1480          array_push($timestamp_log, array(  
1481              'modification_date' => date('Y-m-d H:i:s'),          // Mise à jour de la tâche
             'state' => $params['val']['state'],  
             'prev_state' => $this->getVal('state'),  
         ));  
         $timestamp_log = json_encode($timestamp_log);  
1482          $valF = array(          $valF = array(
1483              'task' => $this->getVal($this->clePrimaire),              'task' => $task_id,
1484              'type' => $this->getVal('type'),              'type' => $this->getVal('type'),
1485              'timestamp_log' => $timestamp_log,              'timestamp_log' => '[]',
1486              'state' => $params['val']['state'],              'state' => $params['val']['state'],
1487              'object_id' => $this->getVal('object_id'),              'object_id' => isset($params['object_id']) == true ? $params['object_id'] : $this->getVal('object_id'),
1488                'stream' => $this->getVal('stream'),
1489              'dossier' => $this->getVal('dossier'),              'dossier' => $this->getVal('dossier'),
1490              'json_payload' => $this->getVal('json_payload'),              'json_payload' => $this->getVal('json_payload'),
1491                'category' => $this->getVal('category'),
1492                'creation_date' => $this->getVal('creation_date'),
1493                'creation_time' => $this->getVal('creation_time'),
1494                'last_modification_date' => date('Y-m-d'),
1495                'last_modification_time' => date('H:i:s'),
1496                'comment' => isset($params['comment']) == true ? $params['comment'] : $this->getVal('comment'),
1497          );          );
1498          $update = $this->modifier($valF);          $update = $this->modifier($valF);
1499          if ($update === false) {          if ($update === false) {
# Line 240  class task extends task_gen { Line 1504  class task extends task_gen {
1504      }      }
1505    
1506      /**      /**
1507         * A partir des éléments fournis en paramètre compose une url permettant
1508         * d'accéder à un document.
1509         *
1510         * @param string         $nom_objet : nom de l'objet d'appartenance du document
1511         * @param string         $champ     : champ contenant l'uid du document
1512         * @param string|integer $id_objet  : id de l'objet d'appartenance du document
1513         *
1514         * @return string url d'accès au document
1515         */
1516        function compose_url_acces_document(string $nom_objet, string $champ, $id_objet) {
1517            return sprintf(
1518                'app/index.php?module=form&snippet=file&obj=%s&champ=%s&id=%s',
1519                $nom_objet,
1520                $champ,
1521                $id_objet
1522            );
1523        }
1524    
1525        /**
1526       * 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
1527       * l'enregistrement instancié.       * l'enregistrement instancié.
1528       *       *
1529       * @param  array  $params Tableau des paramètres       * @param  array  $params Tableau des paramètres
1530       * @return array sinon false en cas d'erreur       * @return array sinon false en cas d'erreur
1531       */       */
# Line 267  class task extends task_gen { Line 1550  class task extends task_gen {
1550          $this->checkAccessibility();          $this->checkAccessibility();
1551          $this->f->disableLog();          $this->f->disableLog();
1552          if ($this->getParameter('idx') !== ']'          if ($this->getParameter('idx') !== ']'
1553              && $this->getParameter('idx') !== '0') {              && $this->getParameter('idx') !== '0'
1554              //          ) {
1555              $this->view_form_json();              if ($this->getVal('json_payload') !== "{}") {
1556                    // On prend la Payload en BDD
1557                    echo(
1558                        json_encode(
1559                            json_decode($this->getVal('json_payload'), true),
1560                            JSON_UNESCAPED_SLASHES
1561                        )
1562                    );
1563                } else {
1564                    // On Calcule la payload JSON
1565                    $this->view_form_json();
1566                }
1567          }          }
1568          else {          else {
1569              $this->view_tab_json();              $this->view_tab_json();
# Line 278  class task extends task_gen { Line 1572  class task extends task_gen {
1572    
1573      protected function view_tab_json() {      protected function view_tab_json() {
1574          $where = '';          $where = '';
1575          if ($this->f->get_submitted_get_value('state') !== null          $category = null;
1576              && $this->f->get_submitted_get_value('state') !== '') {          // Liste des paramètres possibles pour la recherche des tâches
1577            $params = array(
1578                'task',
1579                'type',
1580                'state',
1581                'object_id',
1582                'dossier',
1583                'stream',
1584                'category',
1585                'lien_id_interne_uid_externe',
1586                'object',
1587                'external_uid',
1588            );
1589            // Pour chaque paramètre possible, vérification de son existance et de sa
1590            // valeur pour compléter la requête de recherche
1591            foreach ($params as $param) {
1592              //              //
1593              $where = sprintf(' WHERE state = \'%s\' ', $this->f->get_submitted_get_value('state'));              if ($this->f->get_submitted_get_value($param) !== null
1594                    && $this->f->get_submitted_get_value($param) !== '') {
1595                    // Condition spécifique au champ 'category'
1596                    if ($param === 'category') {
1597                        $category = $this->f->get_submitted_get_value('category');
1598                    }
1599                    //
1600                    $where_or_and = 'WHERE';
1601                    if ($where !== '') {
1602                        $where_or_and = 'AND';
1603                    }
1604                    $table = 'task';
1605                    if ($param === 'lien_id_interne_uid_externe'
1606                        || $param === 'object'
1607                        || $param === 'external_uid') {
1608                        //
1609                        $table = 'lien_id_interne_uid_externe';
1610                    }
1611                    $where .= sprintf(' %s %s.%s = \'%s\' ', $where_or_and, $table, $param, $this->f->get_submitted_get_value($param));
1612                }
1613          }          }
1614            //
1615          $query = sprintf('          $query = sprintf('
1616              SELECT              SELECT
1617                  *                  DISTINCT (task.task),
1618                    task.type,
1619                    task.object_id,
1620                    task.dossier,
1621                    task.stream,
1622                    task.category,
1623                    task.creation_date,
1624                    task.creation_time,
1625                    task.last_modification_date,
1626                    task.last_modification_time,
1627                    task.comment
1628              FROM %1$stask              FROM %1$stask
1629                LEFT JOIN %1$slien_id_interne_uid_externe
1630                    ON task.object_id = lien_id_interne_uid_externe.object_id
1631                    AND task.category = lien_id_interne_uid_externe.category
1632              %2$s              %2$s
1633              ORDER BY task ASC              ORDER BY task ASC
1634              ',              ',
1635              DB_PREFIXE,              DB_PREFIXE,
1636              $where              $where
1637          );          );
1638          $res = $this->f->get_all_results_from_db_query($query, true);          $res = $this->f->get_all_results_from_db_query(
1639                $query,
1640                array(
1641                    "origin" => __METHOD__,
1642                    "force_return" => true,
1643                )
1644            );
1645          if ($res['code'] === 'KO') {          if ($res['code'] === 'KO') {
1646              return false;              return false;
1647          }          }
1648          $list_tasks = array();          $list_tasks = array();
1649          foreach ($res['result'] as $task) {          foreach ($res['result'] as $task) {
1650              $task['timestamp_log'] = json_decode($task['timestamp_log'], true);              if ($task['stream'] === 'output') {
1651              $task['dossier'] = $task['object_id'];                  $task['external_uids'] = array_merge(
1652              if ($this->get_lien_objet_by_type($task['type']) === 'document_numerise') {                      $this->get_all_external_uids($task['dossier'], array(), $category !== null ? $category : $task['category']),
1653                  $val_dn = $this->get_document_numerise_data($task['object_id']);                      $this->get_all_external_uids($task['object_id'], array(), $category !== null ? $category : $task['category'])
1654                  $task['dossier'] = $val_dn['dossier'];                  );
1655              }              }
1656              $list_tasks[$task['task']] = $task;              $list_tasks[$task['task']] = $task;
1657          }          }
1658          printf(json_encode($list_tasks));          echo(json_encode($list_tasks));
1659      }      }
1660    
1661      protected function get_dossier_data(string $dossier) {      protected function get_dossier_data(string $dossier) {
# Line 316  class task extends task_gen { Line 1664  class task extends task_gen {
1664              "obj" => "dossier",              "obj" => "dossier",
1665              "idx" => $dossier,              "idx" => $dossier,
1666          ));          ));
1667            if (empty($inst_di->val) === true) {
1668                return $val_di;
1669            }
1670          $val_di = $inst_di->get_json_data();          $val_di = $inst_di->get_json_data();
1671          if ($val_di['dossier_instruction_type_code'] === 'T') {          if ($val_di['dossier_instruction_type_code'] === 'T') {
1672              $val_di['date_decision_transfert'] = $val_di['date_decision'];              $val_di['date_decision_transfert'] = $val_di['date_decision'];
# Line 406  class task extends task_gen { Line 1757  class task extends task_gen {
1757              if (isset($val_dt['tax_ext_pret']) === true              if (isset($val_dt['tax_ext_pret']) === true
1758                  && $val_dt['tax_ext_pret'] === 'f') {                  && $val_dt['tax_ext_pret'] === 'f') {
1759                  //                  //
1760                  $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'] : '';
1761                  $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'] : '';
1762              }              }
1763              if (isset($val_dt['tax_ext_pret']) === true              if (isset($val_dt['tax_ext_pret']) === true
1764                  && $val_dt['tax_ext_pret'] === 't') {                  && $val_dt['tax_ext_pret'] === 't') {
# Line 416  class task extends task_gen { Line 1767  class task extends task_gen {
1767                      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
1768                          || preg_match('/[lL].*[lL].*[tT].*[sS]/', $val_dt['tax_ext_desc']) === 1) {                          || preg_match('/[lL].*[lL].*[tT].*[sS]/', $val_dt['tax_ext_desc']) === 1) {
1769                          //                          //
1770                          $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'] : '';
1771                          $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'] : '';
1772                      }                      }
                     // 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'];  
                     // }  
1773                  }                  }
1774              }              }
1775          }          }
# Line 446  class task extends task_gen { Line 1784  class task extends task_gen {
1784          return $val_dt;          return $val_dt;
1785      }      }
1786    
1787      protected function get_external_uid($fk_idx, string $fk_idx_2) {      /**
1788         * Récupère la liste des objets distincts existants dans la table des liens
1789         * entre identifiants internes et identifiants externes.
1790         *
1791         * @return array
1792         */
1793        protected function get_list_distinct_objects_external_link() {
1794            $query = sprintf('
1795                SELECT
1796                    DISTINCT(object)
1797                FROM %1$slien_id_interne_uid_externe
1798                ORDER BY object ASC
1799                ',
1800                DB_PREFIXE
1801            );
1802            $res = $this->f->get_all_results_from_db_query(
1803                $query,
1804                array(
1805                    "origin" => __METHOD__,
1806                    "force_return" => true,
1807                )
1808            );
1809            if ($res['code'] === 'KO') {
1810                return array();
1811            }
1812            $result = array();
1813            foreach ($res['result'] as $object) {
1814                $result[] = $object['object'];
1815            }
1816            return $result;
1817        }
1818    
1819        protected function get_external_uid($fk_idx, string $fk_idx_2, $fk_idx_3 = PLATAU, $order_asc_desc = 'DESC') {
1820          $inst_external_uid = $this->f->get_inst__by_other_idx(array(          $inst_external_uid = $this->f->get_inst__by_other_idx(array(
1821              "obj" => "lien_id_interne_uid_externe",              "obj" => "lien_id_interne_uid_externe",
1822              "fk_field" => 'object_id',              "fk_field" => 'object_id',
1823              "fk_idx" => $fk_idx,              "fk_idx" => $fk_idx,
1824              "fk_field_2" => 'object',              "fk_field_2" => 'object',
1825              "fk_idx_2" => $fk_idx_2,              "fk_idx_2" => $fk_idx_2,
1826                "fk_field_3" => 'category',
1827                "fk_idx_3" => $fk_idx_3,
1828                "order_field" => 'lien_id_interne_uid_externe',
1829                "order_asc_desc" => $order_asc_desc,
1830          ));          ));
1831          return $inst_external_uid->getVal('external_uid');          return $inst_external_uid->getVal('external_uid');
1832      }      }
1833    
1834      protected function get_demandeurs_data(string $dossier) {      protected function get_all_external_uids($fk_idx, $link_objects = array(), $category=PLATAU) {
1835            if (count($link_objects) == 0) {
1836                $link_objects = $this->get_list_distinct_objects_external_link();
1837            }
1838            $val_external_uid = array();
1839            foreach ($link_objects as $link_object) {
1840                $external_uid = $this->get_external_uid($fk_idx, $link_object, $category);
1841                if ($external_uid !== '' && $external_uid !== null) {
1842                    $val_external_uid[$link_object] = $external_uid;
1843                }
1844            }
1845            return $val_external_uid;
1846        }
1847    
1848        protected function get_demandeurs_data($dossier) {
1849          $val_demandeur = array();          $val_demandeur = array();
1850            if ($dossier === null) {
1851                return $val_demandeur;
1852            }
1853          $inst_di = $this->f->get_inst__om_dbform(array(          $inst_di = $this->f->get_inst__om_dbform(array(
1854              "obj" => "dossier",              "obj" => "dossier",
1855              "idx" => $dossier,              "idx" => $dossier,
# Line 489  class task extends task_gen { Line 1880  class task extends task_gen {
1880          return $val_architecte;          return $val_architecte;
1881      }      }
1882    
1883      protected function get_instruction_data(string $dossier, $type = 'decision') {      protected function get_instruction_data($dossier, $type = 'decision', $extra_params = array()) {
1884          $val_instruction = null;          $val_instruction = null;
1885            if ($dossier === null) {
1886                return $val_instruction;
1887            }
1888          $instruction_with_doc = null;          $instruction_with_doc = null;
1889          $inst_di = $this->f->get_inst__om_dbform(array(          $inst_di = $this->f->get_inst__om_dbform(array(
1890              "obj" => "dossier",              "obj" => "dossier",
# Line 503  class task extends task_gen { Line 1897  class task extends task_gen {
1897          if ($type === 'incompletude') {          if ($type === 'incompletude') {
1898              $idx = $inst_di->get_last_instruction_incompletude();              $idx = $inst_di->get_last_instruction_incompletude();
1899          }          }
1900            // XXX Permet de récupérer l'instruction par son identifiant
1901            if ($type === 'with-id') {
1902                $idx = $extra_params['with-id'];
1903            }
1904          $inst_instruction = $this->f->get_inst__om_dbform(array(          $inst_instruction = $this->f->get_inst__om_dbform(array(
1905              "obj" => "instruction",              "obj" => "instruction",
1906              "idx" => $idx,              "idx" => $idx,
1907          ));          ));
1908            $id_instruction = $inst_instruction->getVal($inst_instruction->clePrimaire);
1909          if (count($inst_instruction->val) > 0) {          if (count($inst_instruction->val) > 0) {
1910              $val_instruction = array();              $val_instruction = array();
1911              $instruction_data = $inst_instruction->get_json_data();              $instruction_data = $inst_instruction->get_json_data();
# Line 514  class task extends task_gen { Line 1913  class task extends task_gen {
1913              if ($instruction_data['om_fichier_instruction'] !== null              if ($instruction_data['om_fichier_instruction'] !== null
1914                  && $instruction_data['om_fichier_instruction'] !== '') {                  && $instruction_data['om_fichier_instruction'] !== '') {
1915                  //                  //
1916                  $instruction_with_doc = $inst_instruction->getVal($inst_instruction->clePrimaire);                  $instruction_with_doc = $id_instruction;
1917              }              }
1918              $inst_ev = $this->f->get_inst__om_dbform(array(              $inst_ev = $this->f->get_inst__om_dbform(array(
1919                  "obj" => "evenement",                  "obj" => "evenement",
# Line 540  class task extends task_gen { Line 1939  class task extends task_gen {
1939              }              }
1940              if ($instruction_with_doc !== null) {              if ($instruction_with_doc !== null) {
1941                  //                  //
1942                  $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);
1943                }
1944                // Si il y a des annexes compatibles avec l'instruction elles sont ajoutées à la payload
1945                if (! empty($annexes = $this->ajouter_annexes_a_la_payload($id_instruction, true))) {
1946                    $val_instruction['annexes'] = $annexes;
1947              }              }
1948          }          }
1949          return $val_instruction;          return $val_instruction;
1950      }      }
1951    
1952    
1953        /**
1954         * Récupère les informations pour les notifications ayant plusieurs annexe
1955        */
1956        protected function get_instruction_notification_data($category, $type = '', $extra_params = array()) {
1957            $val_in = null;
1958    
1959            $idx = null;
1960            if ($type === 'with-id') {
1961                $idx = $extra_params['with-id'];
1962            }
1963    
1964            // Récupération du type de notification. Le type est nécessaire pour récupérer
1965            // le message et le titre de notification.
1966            $typeNotification = $this->getVal('type');
1967            if (isset($this->valF['type'])) {
1968                $typeNotification = $this->valF['type'];
1969            }
1970    
1971            // récupére les données à intégrer à la payload
1972            $inst_in = $this->f->get_inst__om_dbform(array(
1973                "obj" => "instruction_notification",
1974                "idx" => $idx,
1975            ));
1976            if (count($inst_in->val) > 0) {
1977                $val_in = $inst_in->get_json_data();
1978    
1979                $val_in['parametre_courriel_type_titre'] = '';
1980                $val_in['parametre_courriel_type_message'] = '';
1981                // Récupération du message et du titre
1982                if ($category === 'mail') {
1983                    $inst_instruction = $this->f->get_inst__om_dbform(array(
1984                        "obj" => "instruction",
1985                        "idx" => $inst_in->getVal('instruction'),
1986                    ));
1987                    $collectivite_id = $inst_instruction->get_dossier_instruction_om_collectivite($inst_instruction->getVal('dossier'));
1988                    $phrase_type_notification = $this->f->get_notification_parametre_courriel_type($collectivite_id, $typeNotification);
1989                    $val_in['parametre_courriel_type_titre'] = $phrase_type_notification['parametre_courriel_type_titre'];
1990                    $val_in['parametre_courriel_type_message'] = $phrase_type_notification['parametre_courriel_type_message'];
1991                }
1992    
1993                if ($typeNotification == 'notification_signataire') {
1994                    $val_in['lien_page_signature'] = $inst_in->getLienPageSignature($inst_instruction);
1995                }
1996                else {
1997                    // Récupération des liens vers les documents et des id et type des annexes
1998                    $infoDocNotif = $inst_in->getInfosDocumentsNotif($inst_in->getVal($inst_in->clePrimaire), $category);
1999                    $cle = $category == PORTAL ? 'path' : 'lien_telechargement_document';
2000                    $val_in[$cle] = $infoDocNotif['document']['path'];
2001                    $val_in['annexes'] = $infoDocNotif['annexes'];
2002                }
2003            }
2004            return $val_in;
2005        }
2006    
2007        /**
2008         * Récupère les informations concernant la lettre au pétitionnaire.
2009         *
2010         * @param string identifiant du dossier
2011         * @param string type de tâche
2012         * @param array paramètre supplémentaire permettant de récupérer les informations
2013         *
2014         * @return array information concernant la lettre au pétitionnaire
2015         */
2016        protected function get_lettre_petitionnaire_data($dossier, $type, $extra_params = array()) {
2017            // Si la date limite de notification n'a pas été dépassé le type de lettre est 1
2018            // Si la date a été dépassé et qu'il s'agit d'une demande de pièce le type est 3
2019            // Si la date a été dépassé et qu'il s'agit d'une prolongation le type est 4
2020            // Le type de document dépend du type de pièce
2021            $nomTypeLettre = '';
2022            $nomTypeDocument = '';
2023            if ($type === 'lettre_incompletude') {
2024                $nomTypeLettre = '3';
2025                $nomTypeDocument = '4';
2026            } elseif ($type === 'lettre_majoration') {
2027                $nomTypeLettre = '4';
2028                $nomTypeDocument = '6';
2029            }
2030    
2031            $inst_di = $this->f->get_inst__om_dbform(array(
2032                "obj" => "dossier",
2033                "idx" => $dossier,
2034            ));
2035            $date_limite_notification = DateTime::createFromFormat('Y-m-d', $inst_di->getVal('date_notification_delai'));
2036            $aujourdhui = new DateTime();
2037            if (! $date_limite_notification instanceof DateTime) {
2038                $nomTypeLettre = '';
2039                $nomTypeDocument = '';
2040            } elseif ($aujourdhui < $date_limite_notification) {
2041                $nomTypeLettre = '1';
2042                $nomTypeDocument = '3';
2043            }
2044    
2045            return array(
2046                'nomEtatLettre' => '3',
2047                'nomModaliteNotifMetier' => '4',
2048                'nomTypeLettre' => $nomTypeLettre,
2049                'nomTypeDocument' => $nomTypeDocument
2050            );
2051        }
2052    
2053      protected function sort_instruction_data(array $values, array $res) {      protected function sort_instruction_data(array $values, array $res) {
2054          $fields = array(          $fields = array(
2055                "instruction",
2056                "date_evenement",
2057              "date_envoi_signature",              "date_envoi_signature",
2058              "date_retour_signature",              "date_retour_signature",
2059              "date_envoi_rar",              "date_envoi_rar",
# Line 558  class task extends task_gen { Line 2064  class task extends task_gen {
2064              "om_fichier_instruction",              "om_fichier_instruction",
2065              "tacite",              "tacite",
2066              "lettretype",              "lettretype",
2067                "commentaire",
2068                "complement_om_html",
2069          );          );
2070          foreach ($values as $key => $value) {          foreach ($values as $key => $value) {
2071              if (in_array($key, $fields) === true) {              if (in_array($key, $fields) === true) {
# Line 573  class task extends task_gen { Line 2081  class task extends task_gen {
2081                  }                  }
2082              }              }
2083          }          }
2084    
2085            if (! empty($values['document_type_instruction'])){
2086                // Gestion du type de document :
2087                $document_type = $this->f->get_inst__om_dbform(array(
2088                    "obj" => "document_type",
2089                    "idx" => $values['document_type_instruction'],
2090                ));
2091                if (count($document_type->val) > 0) {
2092                    $res['document_type'] = $document_type->getVal('code');
2093                }
2094            }
2095          return $res;          return $res;
2096      }      }
2097    
2098        /**
2099         * Permet de définir si l'instruction passée en paramètre est une instruction
2100         * récépissé d'une demande et si la demande en question a générée un dossier d'instruction.
2101         *
2102         * @param  integer  $instruction Identifiant de l'instruction
2103         * @return boolean
2104         */
2105        protected function is_demande_instruction_recepisse_without_dossier($instruction) {
2106            if ($instruction === null) {
2107                return false;
2108            }
2109            $qres = $this->f->get_one_result_from_db_query(
2110                sprintf(
2111                    'SELECT
2112                        demande_type.dossier_instruction_type
2113                    FROM
2114                        %1$sdemande
2115                            INNER JOIN %1$sdemande_type
2116                                ON demande.demande_type = demande_type.demande_type
2117                    WHERE
2118                        demande.instruction_recepisse = %2$d',
2119                    DB_PREFIXE,
2120                    intval($instruction)
2121                ),
2122                array(
2123                    "origin" => __METHOD__,
2124                    "force_return" => true,
2125                )
2126            );
2127            if ($qres["code"] !== "OK") {
2128                return null;
2129            }
2130            if ($qres["result"] === "") {
2131                return true;
2132            }
2133            return false;
2134        }
2135    
2136      protected function get_document_numerise_data(string $dn) {      protected function get_document_numerise_data(string $dn) {
2137          $val_dn = array();          $val_dn = array();
2138          $inst_dn = $this->f->get_inst__om_dbform(array(          $qres = $this->f->get_all_results_from_db_query(
2139              "obj" => "document_numerise",              sprintf(
2140              "idx" => $dn,                  'SELECT
2141          ));                      document_numerise.document_numerise,
2142          $val_dn = $inst_dn->get_json_data();                      document_numerise.uid,
2143          $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,
2144          // Correspond à la nomenclature Plat'AU NATURE_PIECE                      document_numerise.nom_fichier,
2145          $val_dn['nature'] = $val_dn['document_numerise_nature_libelle'];                      document_numerise.date_creation,
2146                        document_numerise.document_numerise_type,
2147                        document_numerise.uid_dossier_final,
2148                        document_numerise.document_numerise_nature,
2149                        document_numerise.uid_thumbnail,
2150                        document_numerise.description_type,
2151                        document_numerise.document_travail,
2152                        document_numerise_type.code AS document_numerise_type_code,
2153                        document_numerise_type.libelle AS document_numerise_type_libelle,
2154                        document_numerise_nature.code AS document_numerise_nature_code,
2155                        document_numerise_nature.libelle AS document_numerise_nature_libelle,
2156                        document_numerise_nature.libelle AS nature
2157                    FROM
2158                        %1$sdocument_numerise
2159                    LEFT JOIN %1$sdocument_numerise_type
2160                        ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
2161                    LEFT JOIN %1$sdocument_numerise_nature
2162                        ON document_numerise.document_numerise_nature = document_numerise_nature.document_numerise_nature
2163                    WHERE
2164                        document_numerise.document_numerise = %2$d',
2165                    DB_PREFIXE,
2166                    intval($dn)
2167                ),
2168                array(
2169                    "origin" => __METHOD__,
2170                )
2171            );
2172            if ($qres["result"] !== null
2173                && $qres["result"] !== ""
2174                && count($qres["result"]) > 0) {
2175                //
2176                $val_dn = $qres["result"][0];
2177            }
2178            $val_dn['path'] = $this->compose_url_acces_document('document_numerise', 'uid', $this->getVal('object_id'));
2179          return $val_dn;          return $val_dn;
2180      }      }
2181    
# Line 608  class task extends task_gen { Line 2198  class task extends task_gen {
2198          return $val_dp;          return $val_dp;
2199      }      }
2200    
2201      protected function view_form_json($in_field = false) {      protected function get_avis_decision_data(string $dossier) {
2202          // Mise à jour des valeurs          $inst_di = $this->f->get_inst__om_dbform(array(
2203          if ($this->f->get_submitted_post_value('valid') === 'true'              "obj" => "dossier",
2204              && $this->f->get_submitted_post_value('state') !== null) {              "idx" => $dossier,
2205            ));
2206            $ad = $inst_di->getVal('avis_decision');
2207            $val_ad = array();
2208            if ($ad !== null && trim($ad) !== '') {
2209                $inst_ad = $this->f->get_inst__om_dbform(array(
2210                    "obj" => "avis_decision",
2211                    "idx" => $ad,
2212                ));
2213                $val_ad = $inst_ad->get_json_data();
2214                $val_ad['txAvis'] = "Voir document joint";
2215                if (isset($val_ad['tacite']) ===  true
2216                    && $val_ad['tacite'] === 't') {
2217                    //
2218                    $val_ad['txAvis'] = "Sans objet";
2219                }
2220            }
2221            return $val_ad;
2222        }
2223    
2224        protected function get_signataire_arrete_data(string $sa) {
2225            $inst_sa = $this->f->get_inst__om_dbform(array(
2226                "obj" => "signataire_arrete",
2227                "idx" => $sa,
2228            ));
2229            $val_sa = array_combine($inst_sa->champs, $inst_sa->val);
2230            foreach ($val_sa as $key => $value) {
2231                $val_sa[$key] = strip_tags($value);
2232            }
2233            return $val_sa;
2234        }
2235    
2236        // XXX WIP
2237        protected function get_consultation_data(string $consultation) {
2238            $val_consultation = array();
2239            $inst_consultation = $this->f->get_inst__om_dbform(array(
2240                "obj" => "consultation",
2241                "idx" => $consultation,
2242            ));
2243            $val_consultation = $inst_consultation->get_json_data();
2244            if (isset($val_consultation['fichier']) === true
2245                && $val_consultation['fichier'] !== '') {
2246              //              //
2247              $params = array(              $val_consultation['path_fichier'] = $this->compose_url_acces_document('consultation', 'fichier', $this->getVal('object_id'));
2248                  'val' => array(          }
2249                      'state' => $this->f->get_submitted_post_value('state')          if (isset($val_consultation['om_fichier_consultation']) === true
2250                  ),              && $val_consultation['om_fichier_consultation'] !== '') {
2251                //
2252                $val_consultation['path_om_fichier_consultation'] = $this->compose_url_acces_document('consultation', 'om_fichier_consultation', $this->getVal('object_id'));
2253            }
2254            return $val_consultation;
2255        }
2256    
2257        // XXX WIP
2258        protected function get_service_data(string $service) {
2259            $val_service = array();
2260            $inst_service = $this->f->get_inst__om_dbform(array(
2261                "obj" => "service",
2262                "idx" => $service,
2263            ));
2264            $val_service = $inst_service->get_json_data();
2265            return $val_service;
2266        }
2267    
2268        /**
2269         * Recupere le numéro du dossier ou le numéro du dossier parent s'il existe,
2270         * @param string $dossier : le numéro du dossier
2271         *
2272         * @return string $dossier | $dossier_parent
2273         */
2274        protected function get_id_dossier_parent(string $dossier){
2275            $query = sprintf('
2276                SELECT
2277                    dossier.dossier_parent
2278                FROM
2279                    %1$sdossier
2280                WHERE
2281                    dossier.dossier = \'%2$s\'
2282                ORDER BY
2283                    dossier.dossier',
2284                DB_PREFIXE,
2285                $dossier
2286            );
2287    
2288            $res = $this->f->get_all_results_from_db_query(
2289                $query,
2290                array(
2291                    "origin" => __METHOD__,
2292                    // "force_return" => true,
2293                )
2294            );
2295            if ($res['code'] === 'KO') {
2296                return false;
2297            }
2298            if ( isset($res['result'][0]["dossier_parent"])
2299                && ! empty($res['result'][0]["dossier_parent"] )
2300            ) {
2301                return $res['result'][0]["dossier_parent"];
2302            }
2303            return $dossier;
2304    
2305        }
2306    
2307        /**
2308         * Renvoie un tableau, contenant les informations nécessaire à l'ajout des annexes
2309         * à une payload.
2310         *
2311         * Récupère la liste des annexes paramétrées dans la table parametrage_annexe
2312         * pour l'instruction voulu. A partir de cette liste, construit un tableau avec
2313         * une entrée par annexe. Chaque entrées contiens les informations suivantes :
2314         *   - path          : url d'accès au fichier
2315         *   - document_type : code du document dans plat'au
2316         *   - document_id   : uid du document
2317         *
2318         * @param int  $instruction_id             : identifiant de l'instruction dont ont doit récuperer les annexes
2319         * @param bool $document_platau_uniquement : limite les annexes renvoyées a celles typées pour platau
2320         *
2321         * @return array $annexes
2322         */
2323        protected function ajouter_annexes_a_la_payload(int $instruction_id, bool $document_platau_uniquement = false) {
2324            $annexes = array();
2325            $annexes_a_lier = $this->f->recuperer_documents_a_annexe($instruction_id, $document_platau_uniquement);
2326            foreach ($annexes_a_lier as $annexe_info) {
2327                $objet = $annexe_info['objet'];
2328                $id_objet = $annexe_info['id'];
2329                // Récupère l'objet identifié en tant qu'annexe. Si l'objet n'est pas
2330                // récupéré on passe à l'itération suivante
2331                if (empty($inst_objet = $this->f->findObjectById($objet, $id_objet, true))) {
2332                    $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.");
2333                    continue;
2334                }
2335    
2336                // Détermine le champ contenant l'uid et le type de document
2337                switch ($objet) {
2338                    case 'document_numerise':
2339                        $champ_uid = 'uid';
2340                        /* TODO : Gestion du document_type
2341                            $document_numerise_type = $this->f->get_inst__om_dbform(array(
2342                                "obj" => 'document_numerise_type',
2343                                "idx" => $inst_objet->getVal('document_numerise_type'),
2344                            ));
2345                            $document_numerise_type_categorie = $this->f->get_inst__om_dbform(array(
2346                                "obj" => 'document_numerise_type_categorie',
2347                                "idx" => $document_numerise_type->getVal('document_numerise_type_categorie'),
2348                            ));
2349                            $annexe['document_type'] =
2350                        */
2351                        $document_type = '';
2352                        break;
2353                    case 'instruction':
2354                        $champ_uid = 'om_fichier_instruction';
2355                        $inst_document_type = $this->f->findObjectById('document_type', $inst_objet->getVal('document_type_instruction'));
2356                        $document_type = $inst_document_type->getVal('code');
2357                        break;
2358                    case 'consultation':
2359                        $champ_uid = 'fichier';
2360                        // Gestion du document_type, Code platau de la consultation
2361                        $document_type = self::CODE_PLATAU_CONSULTATION;
2362                        break;
2363                    default :
2364                        // Si le type de document n'est pas géré on passe au document suivant.
2365                        // Ajoute une ligne dans les logs pour comprendre pourquoi le document n'apparaît pas.
2366                        $this->f->addToLog(
2367                            __METHOD__.
2368                            "() : L'ajout d'annexe lié aux *$objet* n'est pas implémenté.
2369                            Le document de *$objet* et d'identifiant *$id_objet* n'a pas été ajouté aux annexes.",
2370                            DEBUG_MODE
2371                        );
2372                        continue 2;
2373                }
2374    
2375                $annexes[] = array(
2376                    'path' => $this->compose_url_acces_document($objet, $champ_uid, $id_objet),
2377                    'document_type' => $document_type,
2378                    'document_id' => $inst_objet->getVal($champ_uid)
2379              );              );
2380              $update = $this->update_task($params);          }
2381              $message_class = "valid";          return $annexes;
2382              $message = $this->msg;      }
2383              if ($update === false) {  
2384                  $this->addToLog($this->msg, DEBUG_MODE);      /**
2385                  $message_class = "error";       * Fonction de récupération des UID externes en fonction des besoins.
2386                  $message = sprintf(       * - Factorisation du code
2387                      '%s %s',       *
2388                      __('Impossible de mettre à jour la tâche.'),       * @param array $val : Tableau des valeurs du flux.
2389                      __('Veuillez contacter votre administrateur.')       * @param array $elements default array() : liste des élément à ajouter au tableau des UID_externes
2390                  );       * @param array $val_external_uid default array() : tableau des UIDs externes du flux
2391         *
2392         * @return array $val_external_uid
2393         *
2394         */
2395        protected function val_external_uid(array $val, array $elements = array(), array $val_external_uid = array()) {
2396    
2397            if (in_array('dossier_autorisation', $elements)) {
2398                if (empty($val['dossier_autorisation']['dossier_autorisation'])) {
2399                    $dossier_autorisation = $val['dossier']['dossier_autorisation'];
2400                } else {
2401                    $dossier_autorisation = $val['dossier_autorisation']['dossier_autorisation'];
2402              }              }
2403              $this->f->displayMessage($message_class, $message);              $val_external_uid['dossier_autorisation'] = $this->get_external_uid($dossier_autorisation, 'dossier_autorisation');
2404          }          }
2405          //  
2406          if ($this->f->get_submitted_post_value('valid') === 'true'          if (in_array('dossier', $elements)) {
2407              && $this->f->get_submitted_post_value('external_uid') !== null) {              $val_external_uid['dossier'] = $this->get_external_uid(
2408              //                  $this->get_id_dossier_parent($val['dossier']['dossier']),
2409              $inst_lien = $this->f->get_inst__om_dbform(array(                  'dossier'
                 "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'),  
2410              );              );
2411              $add = $inst_lien->ajouter($valF);          }
2412              $message_class = "valid";  
2413              $message = $inst_lien->msg;          if (in_array('piece', $elements)) {
2414              if ($add === false) {              $val_external_uid['piece'] = $this->get_external_uid($val['document_numerise']['document_numerise'], 'piece');
2415                  $this->addToLog($inst_lien->msg, DEBUG_MODE);          }
2416                  $message_class = "error";          if (in_array('dossier_consultation', $elements)) {
2417                  $message = sprintf(              $val_external_uid['dossier_consultation'] = $this->get_external_uid(
2418                      '%s %s',                  $this->get_id_dossier_parent($val['dossier']['dossier']),
2419                      __("Impossible de mettre à jour le lien entre l'identifiant interne et l'identifiant de l'application externe."),                  'dossier_consultation'
2420                      __('Veuillez contacter votre administrateur.')              );
2421                  );          }
2422            if (in_array('prescription', $elements)) {
2423                $val_external_uid['prescription'] = $this->get_external_uid($this->getVal('object_id'), 'prescription');
2424            }
2425            if (in_array('avis_dossier_consultation', $elements)) {
2426                $val_external_uid['avis_dossier_consultation'] = $this->get_external_uid(
2427                    $this->getVal('object_id'), 'avis_dossier_consultation');
2428            }
2429            if (in_array('decision', $elements)) {
2430                $val_external_uid['decision'] = $this->get_external_uid($this->getVal('object_id'), 'instruction');
2431                if ($val_external_uid['decision'] === '') {
2432                    $inst_instruction = $this->f->get_inst__om_dbform(array(
2433                        "obj" => "instruction",
2434                        "idx" => $this->getVal('object_id'),
2435                    ));
2436                    $val_external_uid['decision'] = $this->get_external_uid($inst_instruction->get_related_instructions_next('retour_signature'), 'instruction');
2437              }              }
             $this->f->displayMessage($message_class, $message);  
2438          }          }
2439            if (in_array('instruction_notification', $elements)) {
2440                $val_external_uid['instruction_notification'] = $this->get_external_uid($this->getVal('object_id'), 'instruction_notification', PORTAL);
2441            }
2442            return $val_external_uid;
2443        }
2444    
2445        /**
2446         *
2447         *
2448         */
2449        protected function view_form_json(bool $in_field = false) {
2450          //          //
2451          if ($this->f->get_submitted_post_value('valid') === null) {          $check_state = isset($this->valF['state']) === true ? $this->valF['state'] : $this->getVal('state');
2452            if ($check_state !== self::STATUS_CANCELED) {
2453    
2454                $data = array('in_field' => $in_field);
2455                $this->f->module_manager->run_hooks('view_form_json_pre', $this, $data);
2456    
2457              // Liste des valeurs à afficher              // Liste des valeurs à afficher
2458              $val = array();              $val = array();
2459    
2460              //              //
2461              $val_task = array_combine($this->champs, $this->val);              $val_task = array_combine($this->champs, $this->val);
2462              foreach ($val_task as $key => $value) {              foreach ($val_task as $key => $value) {
2463                  $val_task[$key] = strip_tags($value);                  $val_task[$key] = strip_tags($value);
2464              }              }
2465              $val_task['timestamp_log'] = json_decode($val_task['timestamp_log'], true);  
2466              $val['task'] = $val_task;              // Vérifie pour les tâches dont l'affichage de la payload est calculée si l'objet
2467              //              // de référence de la tâche existe.
2468              if ($this->getVal('type') === 'creation_DA') {              $objectRefExist = true;
2469                  $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($this->getVal('object_id'));              if ($val_task['stream'] === 'output'
2470                  $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_autorisation');                  && (empty($val_task['json_payload']) || $val_task['json_payload'] === '{}')) {
2471                  $val['dossier_autorisation_parcelle'] = $this->get_parcelles_data('dossier_autorisation', $val['dossier_autorisation']['dossier_autorisation']);                  $objectRefExist = $this->does_referenced_object_exist(
2472                  $val_external_uid = array();                      $val_task['object_id'],
2473                  $val_external_uid['dossier_autorisation'] = $this->get_external_uid($val['dossier_autorisation']['dossier_autorisation'], 'dossier_autorisation');                      $val_task['type']
2474                  $val['external_uid'] = $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_uid'] = $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_uid'] = $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_uid'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'decision_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));  
                 $val['instruction'] = $this->get_instruction_data($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_uid'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'incompletude_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));  
                 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'incompletude');  
                 $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'] = $val_external_uid;  
             }  
             //  
             if ($this->getVal('type') === 'completude_DI') {  
                 $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));  
                 $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'completude');  
                 $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'] = $val_external_uid;  
2475              }              }
2476    
2477                // Si l'objet de référence n'existe pas log le numéro de la tâche concerné et
2478                // renvoie une payload contenant le message d'erreur.
2479                // Sinon constitue la payload du json.
2480                if (! $objectRefExist) {
2481                    $this->f->addToLog(
2482                        sprintf(
2483                            __('Impossible de récupérer la payload car l\'objet de réference n\'existe pas pour la tâche : %s'),
2484                            $val_task['task']
2485                        ),
2486                        DEBUG_MODE
2487                    );
2488                    $val = __('Impossible de recuperer la payload car l\'objet de reference n\'existe pas.');
2489                } else {
2490    
2491                    // L'historique n'est pas nécessaire dans l'affichage en JSON
2492                    if ($in_field === true) {
2493                        $val_task['timestamp_log'] = json_decode($val_task['timestamp_log'], true);
2494                    } else {
2495                        unset($val_task['timestamp_log']);
2496                    }
2497                    unset($val_task['timestamp_log_hidden']);
2498                    $val['task'] = $val_task;
2499                    //
2500                    if ($this->getVal('type') === 'creation_DA'
2501                        || $this->getVal('type') === 'modification_DA') {
2502                        //
2503                        $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($this->getVal('object_id'));
2504                        $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_autorisation');
2505                        $val['dossier_autorisation_parcelle'] = $this->get_parcelles_data('dossier_autorisation', $val['dossier_autorisation']['dossier_autorisation']);
2506                        // Recupération des UID externes
2507                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation'));
2508                    }
2509                    //
2510                    if ($this->getVal('type') === 'creation_DI'
2511                        || $this->getVal('type') === 'modification_DI'
2512                        || $this->getVal('type') === 'depot_DI') {
2513                        //
2514                        $val['dossier'] = $this->get_dossier_data($this->getVal('object_id'));
2515                        $val['donnees_techniques'] = $this->get_donnees_techniques_data($this->getVal('object_id'), 'dossier_instruction');
2516                        $val['demandeur'] = $this->get_demandeurs_data($val['dossier']['dossier']);
2517                        $architecte = isset($val['donnees_techniques']['architecte']) === true ? $val['donnees_techniques']['architecte'] : null;
2518                        $val['architecte'] = $this->get_architecte_data($architecte);
2519                        $val['dossier_parcelle'] = $this->get_parcelles_data('dossier', $val['dossier']['dossier']);
2520                        // Recupération des UID externes
2521                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2522                    }
2523                    //
2524                    if ($this->getVal('type') === 'qualification_DI') {
2525                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2526                        // Recupération des UID externes
2527                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2528                    }
2529                    //
2530                    if ($this->getVal('type') === 'ajout_piece') {
2531                        $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
2532                        $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);
2533                        // Recupération des UID externes
2534                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'piece'));
2535                    }
2536                    //
2537                    if ($this->getVal('type') === 'modification_piece') {
2538                        $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
2539                        $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);
2540                        // Recupération des UID externes
2541                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'piece'));
2542                    }
2543                    //
2544                    if ($this->getVal('type') === 'suppression_piece') {
2545                        $val['document_numerise'] = $this->get_document_numerise_data($this->getVal('object_id'));
2546                        $val['dossier'] = $this->get_dossier_data($val['document_numerise']['dossier']);
2547                        // Recupération des UID externes
2548                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'piece'));
2549                    }
2550                    //
2551                    if ($this->getVal('type') === 'decision_DI') {
2552                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2553                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2554                        $val['instruction']['final'] = 't';
2555                        if (isset($val['instruction']['signataire_arrete']) === true) {
2556                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2557                        }
2558                        // Recupération des UID externes
2559                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2560                    }
2561                    //
2562                    if ($this->getVal('type') === 'incompletude_DI') {
2563                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2564                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2565                        // Recupération des UID externes
2566                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2567                    }
2568                    //
2569                    if ($this->getVal('type') === 'completude_DI') {
2570                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2571                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2572                        // Recupération des UID externes
2573                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2574                    }
2575                    //
2576                    if ($this->getVal('type') === 'lettre_incompletude'
2577                        || $this->getVal('type') === 'lettre_majoration') {
2578                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2579                        $val['instruction'] = $this->get_instruction_data($val['dossier']['dossier'], 'with-id', array('with-id' => $this->getVal('object_id')));
2580                        $val['lettre_petitionnaire'] = $this->get_lettre_petitionnaire_data($val['dossier']['dossier'], $this->getVal('type'));
2581                        // Recupération des UID externes
2582                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2583                    }
2584                    //
2585                    if ($this->getVal('type') === 'pec_metier_consultation') {
2586                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2587                        $val['instruction'] = $this->get_instruction_data(
2588                            $this->getVal('dossier'),
2589                            'with-id',
2590                            array('with-id' => $this->getVal('object_id'))
2591                        );
2592                        // Recupération des UID externes
2593                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation'));
2594                    }
2595                    //
2596                    if ($this->getVal('type') === 'avis_consultation') {
2597                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2598                        $val['instruction'] = $this->get_instruction_data(
2599                            $this->getVal('dossier'),
2600                            'with-id',
2601                            array('with-id' => $this->getVal('object_id'))
2602                        );
2603                        $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2604                        if (isset($val['instruction']['signataire_arrete']) === true) {
2605                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2606                        }
2607                        // Recupération des UID externes
2608                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation', 'avis_dossier_consultation'));
2609                    }
2610                    //
2611                    if ($this->getVal('type') === 'creation_consultation') {
2612                        //
2613                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2614                        $val['consultation'] = $this->get_consultation_data($this->getVal('object_id'));
2615                        $val['service'] = $this->get_service_data($val['consultation']['service']);
2616                        // Recupération des UID externes
2617                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier'));
2618                    }
2619                    //
2620                    if ($this->getVal('type') === 'envoi_CL') {
2621                        //
2622                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2623                        $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2624                        $val['dossier_autorisation'] = $this->get_dossier_autorisation_data($val['dossier']['dossier_autorisation']);
2625                        // Recupération des UID externes
2626                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'decision'));
2627                    }
2628                    if ($this->getVal('type') === 'notification_instruction'
2629                        || $this->getVal('type') === 'notification_recepisse'
2630                        || $this->getVal('type') === 'notification_decision'
2631                        || $this->getVal('type') === 'notification_service_consulte'
2632                        || $this->getVal('type') === 'notification_tiers_consulte'
2633                        || $this->getVal('type') === 'notification_signataire') {
2634                        //
2635                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2636                        $dossier_id = isset($val['dossier']['dossier']) === true ? $val['dossier']['dossier'] : null;
2637                        $val['demandeur'] = $this->get_demandeurs_data($dossier_id);
2638                        $val['instruction_notification'] = $this->get_instruction_notification_data($this->getVal('category'), 'with-id', array('with-id' => $this->getVal('object_id')));
2639                        $instruction_id = isset($val['instruction_notification']['instruction']) === true ? $val['instruction_notification']['instruction'] : null;
2640                        $val['instruction'] = $this->get_instruction_data($dossier_id, 'with-id', array('with-id' => $instruction_id));
2641                        // Précise qu'il s'agit d'une instruction final si l'instruction est liée à une
2642                        // demande dont le type ne génère pas de dossier
2643                        if ($this->is_demande_instruction_recepisse_without_dossier($instruction_id) === true) {
2644                            $val['instruction']['final'] = 't';
2645                        }
2646                        // Recupération des UID externes
2647                        $val_external_uid = array();
2648                        // Affiche l'identifiant externe lié à l'instruction si cette combinaison existe, sinon celui lié au dossier
2649                        $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');
2650                        $val_external_uid['demande (instruction)'] = $this->get_external_uid($instruction_id, 'demande', PORTAL, 'ASC');
2651                        $val['external_uids'] = $this->val_external_uid($val, array('demande', 'demande (instruction)', 'instruction_notification'), $val_external_uid );
2652                    }
2653                    //
2654                    if ($this->getVal('type') === 'prescription') {
2655                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2656                        $val['instruction'] = $this->get_instruction_data($this->getVal('dossier'), 'with-id', array('with-id' => $this->getVal('object_id')));
2657                        $val['avis_decision'] = $this->get_avis_decision_data($this->getVal('dossier'));
2658                        if (isset($val['instruction']['signataire_arrete']) === true) {
2659                            $val['signataire_arrete'] = $this->get_signataire_arrete_data($val['instruction']['signataire_arrete']);
2660                        }
2661                        // Recupération des UID externes
2662                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation', 'prescription'));
2663                    }
2664                    //
2665                    if ($this->getVal('type') === 'ajout_documents_specifiques') {
2666                        // Data blocs
2667                        $val['dossier'] = $this->get_dossier_data($this->getVal('dossier'));
2668                        $val['instruction'] = $this->get_instruction_data(
2669                            $this->getVal('dossier'),
2670                            'with-id',
2671                            array('with-id' => $this->getVal('object_id'))
2672                        );
2673                        // Recupération des UID externes
2674                        $val['external_uids'] = $this->val_external_uid($val, array('dossier_autorisation', 'dossier', 'dossier_consultation'));
2675                    }
2676                }
2677    
2678                $data = array('in_field' => $in_field, 'val' => &$val);
2679                $this->f->module_manager->run_hooks('view_form_json_post', $this, $data);
2680    
2681              if ($in_field === true) {              if ($in_field === true) {
2682                  return json_encode($val, JSON_PRETTY_PRINT ,JSON_UNESCAPED_SLASHES);                  return json_encode($val, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
2683              } else {              } else {
2684                  // Liste des valeurs affichée en JSON                  // Liste des valeurs affichée en JSON
2685                  printf(json_encode($val, JSON_UNESCAPED_SLASHES));                  echo(json_encode($val, JSON_UNESCAPED_SLASHES));
2686              }              }
2687          }          }
2688      }      }
2689    
2690      protected function get_lien_objet_by_type($type) {      function post_update_task() {
2691          //          // Mise à jour des valeurs
2692          $objet = '';  
2693          if ($type === 'creation_DA') {          // Modification de l'état de la tâche
2694              $objet = 'dossier_autorisation';          if ($this->f->get_submitted_post_value('state') !== null) {
2695          }              $params = array(
2696          if ($type === 'creation_DI'                  'val' => array(
2697              || $type === 'depot_DI'                      'state' => $this->f->get_submitted_post_value('state')
2698              || $type === 'modification_DI'                  ),
2699              || $type === 'qualification_DI'              );
2700              || $type === 'decision_DI'              if ($this->f->get_submitted_post_value('comment') !== null) {
2701              || $type === 'incompletude_DI'                  $params['comment'] = $this->f->get_submitted_post_value('comment');
2702              || $type === 'completude_DI') {              }
2703                $update = $this->update_task($params);
2704                $message_class = "valid";
2705                $message = $this->msg;
2706                if ($update === false) {
2707                    $this->addToLog($this->msg, DEBUG_MODE);
2708                    $message_class = "error";
2709                    $message = sprintf(
2710                        '%s %s',
2711                        __('Impossible de mettre à jour la tâche.'),
2712                        __('Veuillez contacter votre administrateur.')
2713                    );
2714                }
2715                $this->f->displayMessage($message_class, $message);
2716            }
2717    
2718            // Sauvegarde de l'uid externe retourné
2719            $external_uid = $this->f->get_submitted_post_value('external_uid');
2720            if ($external_uid !== null) {
2721              //              //
2722              $objet = 'dossier';              $objects = $this->get_objects_by_task_type($this->getVal('type'), $this->getVal('stream'));
2723                // Si l'identifiant externe contient le préfixe pour identifier les codes de suivi,
2724                // le seul objet concerné sera celui du code de suivi
2725                if (strpos($external_uid, self::CS_PREFIX) !== false) {
2726                    $objects = array('code-suivi', );
2727                    $external_uid = str_replace(self::CS_PREFIX, '', $external_uid);
2728                }
2729                foreach ($objects as $object) {
2730                    $inst_lien = $this->f->get_inst__om_dbform(array(
2731                        "obj" => "lien_id_interne_uid_externe",
2732                        "idx" => ']',
2733                    ));
2734                    $object_id = $this->getVal('object_id');
2735                    $is_exists = $inst_lien->is_exists($object, $object_id, $external_uid, $this->getVal('dossier'));
2736                    // Dans le cas spécifique de la mise à jour d'une notification
2737                    // et de la création d'une liaison d'identifiant pour l'objet demande,
2738                    // l'identifiant de l'objet n'est plus celui de la notification
2739                    // d'instruction mais celui du dossier d'instruction
2740                    if ($object === 'demande'
2741                        && ($this->getVal('type') === 'notification_recepisse'
2742                            || $this->getVal('type') === 'notification_instruction'
2743                            || $this->getVal('type') === 'notification_decision'
2744                            || $this->getVal('type') === 'notification_service_consulte'
2745                            || $this->getVal('type') === 'notification_tiers_consulte'
2746                            || $this->getVal('type') === 'notification_signataire')) {
2747                        //
2748                        $object_id = $this->getVal('dossier');
2749                        // Il ne doit y avoir qu'une liaison entre le numéro du dossier interne et un uid externe de "demande"
2750                        $is_exists = $inst_lien->is_exists($object, $object_id, null, $this->getVal('dossier'));
2751                    }
2752                    if ($is_exists === false) {
2753                        $valF = array(
2754                            'lien_id_interne_uid_externe' => '',
2755                            'object' => $object,
2756                            'object_id' => $object_id,
2757                            'external_uid' => $external_uid,
2758                            'dossier' => $this->getVal('dossier'),
2759                            'category' => $this->getVal('category'),
2760                        );
2761                        $add = $inst_lien->ajouter($valF);
2762                        $message_class = "valid";
2763                        $message = $inst_lien->msg;
2764                        if ($add === false) {
2765                            $this->addToLog($inst_lien->msg, DEBUG_MODE);
2766                            $message_class = "error";
2767                            $message = sprintf(
2768                                '%s %s',
2769                                __("Impossible de mettre à jour le lien entre l'identifiant interne et l'identifiant de l'application externe."),
2770                                __('Veuillez contacter votre administrateur.')
2771                            );
2772                        }
2773                        $this->f->displayMessage($message_class, $message);
2774                    }
2775                }
2776          }          }
2777          if ($type === 'ajout_piece') {      }
2778              $objet = 'document_numerise';  
2779        function post_add_task() {
2780            // TODO Tester de remplacer la ligne de json_payload par un $_POST
2781            $result = $this->add_task(array(
2782                'val' => array(
2783                    'stream' => 'input',
2784                    'json_payload' => html_entity_decode($this->f->get_submitted_post_value('json_payload'), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401),
2785                    'type' => $this->f->get_submitted_post_value('type'),
2786                    'category' => $this->f->get_submitted_post_value('category'),
2787                )
2788            ));
2789            $message = sprintf(
2790                __("Tâche %s ajoutée avec succès"),
2791                $this->getVal($this->clePrimaire)).
2792                '<br/><br/>'.
2793                $this->msg;
2794            $message_class = "valid";
2795            if ($result === false){
2796                $this->addToLog($this->msg, DEBUG_MODE);
2797                $message_class = "error";
2798                $message = sprintf(
2799                    '%s %s',
2800                    __('Impossible d\'ajouter la tâche.'),
2801                    __('Veuillez contacter votre administrateur.')
2802                );
2803          }          }
2804          return $objet;          $this->f->displayMessage($message_class, $message);
2805      }      }
2806    
2807      function setLayout(&$form, $maj) {      function setLayout(&$form, $maj) {
2808            //
2809          $form->setBloc('json_payload', 'D', '', 'col_6');          $form->setBloc('json_payload', 'D', '', 'col_6');
2810              $form->setFieldset('json_payload', 'DF', _("json_payload"), "collapsible, startClosed");          $fieldset_title_payload = __("json_payload (calculée)");
2811            if ($this->getVal('json_payload') !== "{}") {
2812                $fieldset_title_payload = __("json_payload");
2813            }
2814            $form->setFieldset('json_payload', 'DF', $fieldset_title_payload, "collapsible, startClosed");
2815          $form->setBloc('json_payload', 'F');          $form->setBloc('json_payload', 'F');
2816          $form->setBloc('timestamp_log', 'DF', '', 'col_9');          $form->setBloc('timestamp_log', 'DF', __("historique"), 'col_9 timestamp_log_jsontotab');
2817        }
2818    
2819        /**
2820         * Récupère le nom de l'objet à mentionner dans la table lien_id_interne_uid_externe
2821         * en fonction du type et du stream de la tâche.
2822         *
2823         * @param  string $type   Type de la tâche
2824         * @param  string $stream Stream de la tâche
2825         *
2826         * @return array
2827         */
2828        function get_objects_by_task_type($type, $stream = 'all') {
2829            $objects = array();
2830            if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2831                $objects = array('dossier_autorisation', );
2832            }
2833            if (in_array($type, array('creation_DI', 'depot_DI', 'notification_DI', 'qualification_DI', )) === true) {
2834                $objects = array('dossier', );
2835            }
2836            if (in_array($type, array('create_DI_for_consultation', )) === true) {
2837                $objects = array('dossier', 'dossier_consultation', );
2838            }
2839            if (in_array($type, array('create_DI', )) === true
2840                && $stream === 'input') {
2841                $objects = array('dossier', 'dossier_autorisation', 'demande', );
2842            }
2843            if (in_array($type, array(
2844                'decision_DI',
2845                'incompletude_DI',
2846                'completude_DI',
2847                'lettre_incompletude',
2848                'lettre_majoration'
2849                )) === true) {
2850                $objects = array('instruction', );
2851            }
2852            if (in_array($type, array('envoi_CL', )) === true) {
2853                $objects = array('instruction_action_cl', );
2854            }
2855            if (in_array($type, array('pec_metier_consultation', )) === true
2856                && $stream === 'output') {
2857                $objects = array('pec_dossier_consultation', );
2858            }
2859            if (in_array($type, array('avis_consultation', )) === true
2860                && $stream === 'output') {
2861                $objects = array('avis_dossier_consultation', );
2862            }
2863            if (in_array($type, array('prescription', )) === true
2864                && $stream === 'output') {
2865                $objects = array('prescription', );
2866            }
2867            if (in_array($type, array('ajout_piece', 'add_piece', 'modification_piece', 'suppression_piece', )) === true) {
2868                $objects = array('piece', );
2869            }
2870            if (in_array($type, array('creation_consultation', )) === true) {
2871                $objects = array('consultation', );
2872            }
2873            if (in_array($type, array('ajout_documents_specifiques', )) === true
2874                && $stream === 'output') {
2875                $objects = array('dossier', 'instruction', 'instruction_notification',);
2876            }
2877            if (in_array($type, array('pec_metier_consultation', )) === true
2878                && $stream === 'input') {
2879                $objects = array('pec_metier_consultation', );
2880            }
2881            if (in_array($type, array('avis_consultation', )) === true
2882                && $stream === 'input') {
2883                $objects = array('avis_consultation', );
2884            }
2885            if (in_array($type, array('create_message', )) === true
2886                && $stream === 'input') {
2887                $objects = array('dossier_message', );
2888            }
2889            if (in_array(
2890                $type,
2891                array(
2892                    'notification_recepisse',
2893                    'notification_instruction',
2894                    'notification_decision',
2895                    'notification_service_consulte',
2896                    'notification_tiers_consulte',
2897                    'notification_signataire',
2898                )
2899            ) === true) {
2900                $objects = array('instruction_notification', 'demande', );
2901            }
2902            return $objects;
2903        }
2904    
2905        /**
2906         * Récupère les tables auxquelles pourrait être rattaché l'objet lié à la tâche,
2907         * par rapport à son type.
2908         *
2909         * @param  string $type   Type de la tâche
2910         * @param  string $stream input ou output
2911         * @return array
2912         */
2913        function get_tables_by_task_type($type, $stream = 'all') {
2914            $tables = array();
2915            if (in_array($type, array('creation_DA', 'modification_DA', )) === true) {
2916                $tables = array('dossier_autorisation', );
2917            }
2918            if (in_array($type, array('creation_DI', 'depot_DI', 'modification_DI',)) === true) {
2919                $tables = array('dossier', );
2920            }
2921            if (in_array($type, array('qualification_DI', )) === true) {
2922                $tables = array('instruction', 'dossier', );
2923            }
2924            if (in_array($type, array('create_DI_for_consultation', )) === true) {
2925                $tables = array('dossier', );
2926            }
2927            if (in_array($type, array('create_DI', )) === true
2928                && $stream === 'input') {
2929                $tables = array('dossier', 'dossier_autorisation', 'demande', );
2930            }
2931            if (in_array($type, array(
2932                'decision_DI',
2933                'incompletude_DI',
2934                'completude_DI',
2935                'lettre_incompletude',
2936                'lettre_majoration'
2937            )) === true) {
2938                $tables = array('instruction', );
2939            }
2940            if (in_array($type, array('ajout_documents_specifiques', )) === true
2941                && in_array($stream, array('output', 'all', )) === true ) {
2942                $tables = array('instruction', 'dossier', );
2943            }
2944            if (in_array($type, array('envoi_CL', )) === true) {
2945                $tables = array('instruction', );
2946            }
2947            if (in_array($type, array('pec_metier_consultation', )) === true
2948                && $stream === 'output') {
2949                $tables = array('dossier', 'instruction', 'instruction_notification', );
2950            }
2951            if (in_array($type, array('avis_consultation', )) === true
2952                && $stream === 'output') {
2953                $tables = array('instruction', );
2954            }
2955            if (in_array($type, array('prescription', )) === true
2956                && $stream === 'output') {
2957                $tables = array('instruction', );
2958            }
2959            if (in_array($type, array('ajout_piece', 'add_piece', 'modification_piece', 'suppression_piece', )) === true) {
2960                $tables = array('document_numerise', );
2961            }
2962            if (in_array($type, array('creation_consultation', )) === true) {
2963                $tables = array('consultation', );
2964            }
2965            if (in_array($type, array('pec_metier_consultation', )) === true
2966                && $stream === 'input') {
2967                $tables = array('consultation', );
2968            }
2969            if (in_array($type, array('avis_consultation', )) === true
2970                && $stream === 'input') {
2971                $tables = array('consultation', );
2972            }
2973            if (in_array($type, array('create_message', )) === true
2974                && $stream === 'input') {
2975                $tables = array('dossier_message', );
2976            }
2977            if (in_array(
2978                $type,
2979                array(
2980                    'notification_recepisse',
2981                    'notification_instruction',
2982                    'notification_decision',
2983                    'notification_service_consulte',
2984                    'notification_tiers_consulte',
2985                    'notification_signataire'
2986                )
2987            ) === true) {
2988                $tables = array('instruction_notification', );
2989            }
2990            return $tables;
2991        }
2992    
2993        /**
2994         * Vérifie si l'objet référencé par la tâche existe en base de données.
2995         *
2996         * Récupère la liste des tables de référence associé à la tâche à partir
2997         * du type de tâche et de son flux (input ou output).
2998         * Pour chaque table potentiellement référencé par la tâche on essaye d'instancier
2999         * l'objet correspondant à partir de l'identifiant de l'objet de référence de la tâche.
3000         * Si l'élément instancié existe renvoie true sinon renvoie false.
3001         *
3002         * @param string|integer $taskObjectId : identifiant de l'objet de référence de la tâche
3003         * @param string $taskType : type de la tâche
3004         * @param string $taskStream : flux entrant (output - valeur par défaut) ou sortant (input)
3005         * @return boolean
3006         */
3007        protected function does_referenced_object_exist($taskObjectId, string $taskType, string $taskStream = 'output') {
3008            $refTables = $this->get_tables_by_task_type($taskType, $taskStream);
3009            if (empty($refTables) === true) {
3010                $this->f->addToLog(
3011                    sprintf(
3012                        __("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."),
3013                        $taskType,
3014                        "get_tables_by_task_type()"
3015                    ),
3016                    DEBUG_MODE
3017                );
3018                return true;
3019            }
3020            foreach ($refTables as $table) {
3021                $inst = $this->f->get_inst__om_dbform(array(
3022                    'obj' => $table,
3023                    'idx' => $taskObjectId
3024                ));
3025                if ($inst->exists() === true) {
3026                    return true;
3027                }
3028            }
3029            return false;
3030      }      }
3031    
3032  }  }

Legend:
Removed from v.9667  
changed lines
  Added in v.18876

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26