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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26