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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (show annotations)
Tue Oct 8 08:41:06 2024 UTC (3 months, 3 weeks ago) by softime
File size: 134970 byte(s)
merge: fusion de la branche d'intégration 6.8.0-develop dans le trunk

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

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26