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

Legend:
Removed from v.9297  
changed lines
  Added in v.11876

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26