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

Legend:
Removed from v.9403  
changed lines
  Added in v.18435

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26