FormulairesController.php 30.4 KB
Newer Older
1 2 3 4 5
<?php

/**
 * FormulairesController
 *
6
 * web-DPO : Outil de gestion de vos traitements dans le cadre de la
7
 * réglementation relative à la protection des données personnelles (RGPD)
8
 *
9 10 11 12 13
 * Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
 *
 * Licensed under The CeCiLL V2 License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
14
 *
15
 * @copyright   Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
16
 * @link        https://www.libriciel.fr/web-dpo/
17 18 19 20 21 22 23 24
 * @since       web-DPO v1.0.0
 * @license     http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html CeCiLL V2 License
 * @version     v1.0.0
 * @package     App.Controller
 */

App::uses('ListeDroit', 'Model');

25 26
class FormulairesController extends AppController
{
27
    public $uses = [
28
        'Champ',
tguillon's avatar
tguillon committed
29
        'Formulaire',
30 31 32
        'Organisation'
    ];

33 34 35 36 37 38 39 40 41 42 43 44
    /**
     * Vérification de l'accès aux actions en fonction du profil de l'utilisateur connecté.
     * Les vérifications de l'accès aux enregistrements se font dans les méthodes d'actions.
     */
    public function beforeFilter() {
        parent::beforeFilter();

        if ($this->Droits->isSu() === true || true !== $this->Droits->authorized([ListeDroit::GESTION_FORMULAIRE])) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }
    }

45 46
    /**
     * @access public
47
     *
48 49
     * @created 18/06/2015
     * @version V1.0.0
50 51 52 53
     *
     * @modified 26/02/2020
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
54 55 56
     */
    public function index() {
        $this->set('title', __d('formulaire', 'formulaire.titreListeFormulaire') . $this->Session->read('Organisation.raisonsociale'));
57

58 59 60 61 62
        $formulaires = $this->Formulaire->find('all', [
            'conditions' => [
                'organisations_id' => $this->Session->read('Organisation.id')
            ],
            'fields' => [
63 64 65 66 67 68 69 70 71
                'Formulaire.id',
                'Formulaire.organisations_id',
                'Formulaire.libelle',
                'Formulaire.active',
                'Formulaire.description',
                'Formulaire.oldformulaire',
                'Formulaire.rt_externe',
                'Formulaire.created',
                $this->Formulaire->vfLinkedFichesCount()
72 73
            ],
            'order' => [
74
                'Formulaire.libelle ASC'
75
            ]
76
        ]);
77

78 79 80
        $params = [
            'conditions' => [
                'OrganisationUser.organisation_id !=' => $this->Session->read('Organisation.id')
81
            ]
82 83
        ];
        $mesOrganisations = $this->WebcilUsers->mesOrganisations('list', $params);
84
        $this->set(compact('formulaires', 'mesOrganisations'));
85
    }
86

87
    /**
88 89
     * Permet de dupliquer un formulaire qui est vérouiller
     *
90 91 92
     * @access public
     * @created 26/04/2016
     * @version V1.0.0
93 94
     *
     * @modified 18/06/2020
95
     */
96 97 98
    public function dupliquer()
    {
        if ($this->request->is('post') === false && $this->request->is('put') === false) {
99
            throw new MethodNotAllowedException();
100 101
        }

102
        $this->Formulaire->begin();
103

104
        $success = $this->copyFormulaire($this->request->data);
105

106 107 108 109 110 111
        if ($success == true) {
            $this->Formulaire->commit();
            $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireDupliquer'), 'flashsuccess');
        } else {
            $this->Formulaire->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
112
        }
113 114

        $this->redirect($this->Referers->get());
115
    }
116

117 118 119
    /**
     * Dupliquer un formulaire d'un organisation à une autre en tant que DPO
     * dans une collectivité ou on a les droits.
120
     *
121 122 123 124
     * @access public
     * @created 18/05/2017
     * @version v1.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
125 126
     *
     * @modified 18/06/2020
127
     */
128 129 130
    public function dupliquerOrganisation()
    {
        if ($this->request->is('post') === false && $this->request->is('put') === false) {
131
            throw new MethodNotAllowedException();
132 133
        }

134 135 136
        $this->Formulaire->begin();

        $success = $this->copyFormulaire($this->request->data);
137

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
        if ($success == true) {
            $this->Formulaire->commit();
            $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireDupliquerOtherOrganisation'), 'flashsuccess');
        } else {
            $this->Formulaire->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
        }

        $this->redirect($this->Referers->get());
    }

    /**
     * @param $data
     * @return bool
     *
     * @access protected
     * @version v2.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     *
     * @created 18/06/2020
     */
    protected function copyFormulaire($data)
    {
161
        $success = true;
162

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
        if (!isset($data['Formulaire']['organisationCible'])) {
            $organisation_id = $this->Session->read('Organisation.id');
        } else {
            $organisation_id = $data['Formulaire']['organisationCible'];
        }

        $id = $data['Formulaire']['id'];
        $this->Droits->assertRecordAuthorized('Formulaire', $id);

        $formulaireToDuplicate = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $id,
                'organisations_id' => $this->Session->read('Organisation.id')
            ],
            'fields' => [
                'soustraitant',
                'usesousfinalite',
                'usebaselegale',
                'usedecisionautomatisee',
                'usetransferthorsue',
                'usedonneessensible',
                'useallextensionfiles',
185
                'usepia'
186
            ]
187
        ]);
188

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
        if (!empty($formulaireToDuplicate)) {
            // C'est un nouveau formulaire en renseignant les infos
            $this->Formulaire->create([
                'organisations_id' => $organisation_id,
                'libelle' => $data['Formulaire']['libelle'],
                'active' => false,
                'description' => $data['Formulaire']['description'],
                'soustraitant' => $formulaireToDuplicate['Formulaire']['soustraitant'],
                'usesousfinalite' => $formulaireToDuplicate['Formulaire']['usesousfinalite'],
                'usebaselegale' => $formulaireToDuplicate['Formulaire']['usebaselegale'],
                'usedecisionautomatisee' => $formulaireToDuplicate['Formulaire']['usedecisionautomatisee'],
                'usetransferthorsue' => $formulaireToDuplicate['Formulaire']['usetransferthorsue'],
                'usedonneessensible' => $formulaireToDuplicate['Formulaire']['usedonneessensible'],
                'useallextensionfiles' => $formulaireToDuplicate['Formulaire']['useallextensionfiles'],
                'usepia' => $formulaireToDuplicate['Formulaire']['usepia'],
                'rt_externe' => $data['Formulaire']['rt_externe'],
            ]);

            // On enregistre le formualire
            $success = $success && false !== $this->Formulaire->save(null, ['atomic' => false]);
        } else {
            $success = false;
        }
212

213 214 215
        if ($success == true) {
            // On recupere l'id du formulaire qu'on vien d'enregistré
            $idForm = $this->Formulaire->getLastInsertId();
216

217 218 219 220 221 222
            // On recupere en BDD tout les champs qui corresponde a $id
            $champs = $this->Champ->find('all', [
                'conditions' => [
                    'formulaire_id' => $id
                ]
            ]);
223

224 225 226 227 228 229 230 231
            foreach ($champs as $key => $champ) {
                // On cree un nouveau champs avec l'id du nouveau formulaire qu'on a cree et les info qu'on a décodé
                $this->Champ->create([
                    'formulaire_id' => $idForm,
                    'type' => $champ['Champ']['type'],
                    'ligne' => $champ['Champ']['ligne'],
                    'colonne' => $champ['Champ']['colonne'],
                    'details' => $champ['Champ']['details']
232 233
                ]);

234 235
                // On enregistre le champ
                $success = $success && false !== $this->Champ->save(null, ['atomic' => false]);
236
            }
237
        }
238

239
        return $success;
240 241 242 243
    }

    /**
     * Supprime un formulaire
244
     *
245
     * @param int $id
246
     *
247 248 249 250 251
     * @access public
     * @created 18/06/2015
     * @version V1.0.0
     */
    public function delete($id) {
252 253 254 255 256 257 258 259 260 261 262 263 264
        $this->Droits->assertRecordAuthorized('Formulaire', $id);

        $query = [
            'fields' => [
                'Formulaire.active',
                'Formulaire.oldformulaire',
                $this->Formulaire->vfLinkedFichesCount()
            ],
            'conditions' => ['Formulaire.id' => $id]
        ];
        $formulaire = $this->Formulaire->find('first', $query);

        if ($formulaire['Formulaire']['active'] === true || $formulaire['Formulaire']['oldformulaire'] === true || $formulaire['Formulaire']['fiches_count'] > 0) {
265 266 267
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }

268
        $this->Formulaire->begin();
269

270 271 272
        if (false !== $this->Formulaire->delete($id)) {
            $this->Formulaire->commit();
            $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireSupprimer'), 'flashsuccess');
273
        } else {
274 275
            $this->Formulaire->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
276
        }
277

278 279 280 281 282 283 284 285 286
        $this->redirect($this->referer());
    }

    /**
     * @access public
     * @created 18/06/2015
     * @version V1.0.0
     */
    public function addFirst() {
287 288
        if($this->request->is('post') === false) {
            throw new MethodNotAllowedException();
289 290
        }

291 292 293
        $data = $this->request->data;
        $data['Formulaire']['organisations_id'] = $this->Session->read('Organisation.id');
        $this->Formulaire->create($data);
294

295 296 297 298 299 300 301 302
        if (false !== $this->Formulaire->save(null, ['atomic' => true])) {
            $this->redirect([
                'controller' => 'formulaires',
                'action' => 'add',
                $this->Formulaire->getInsertId()
            ]);
        } else {
            $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
303
        }
304

305
        $this->redirect(['controller' => 'formulaires', 'action' => 'index']);
306 307 308
    }

    /**
309 310 311
     * Ajout des champs et options d'un formulaire
     *
     * @param int $id ID du formulaire ajouter dans la fonction addFirst()
312
     *
313
     * @access public
314
     *
315 316 317
     * @created 18/06/2015
     * @edit 24/12/2015
     * @version V1.0.0
318 319 320 321
     *
     * @modified 26/02/2020
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
322
     */
323 324 325
    public function add($id)
    {
        return $this->edit($id);
326 327 328 329
    }

    /**
     * @param int $id
330
     * @param bool $state
331
     *
332 333 334 335 336 337
     * @access public
     * @created 18/06/2015
     * @edit 24/12/2015
     * @version V1.0.0
     */
    public function toggle($id, $state = null) {
338
        $this->Droits->assertRecordAuthorized('Formulaire', $id);
339

340 341 342 343 344 345
        $success = true;
        $this->Formulaire->begin();

        $this->Formulaire->id = $id;

        $success = $success && $this->Formulaire->updateAll([
346 347 348 349
                'active' => (int) !$state
            ], [
                'id' => $id
            ]) !== false;
350 351 352 353 354 355 356 357 358 359 360 361 362

        if ($success == true) {
            $this->Formulaire->commit();
            $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess');

            $this->redirect($this->Referers->get());
        } else {
            $this->Formulaire->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
        }
    }

    /**
363 364 365 366
     * Edition des champs et options d'un formulaire
     *
     * @param int $id ID du formulaire ajouter dans la fonction addFirst()
     *
367
     * @access public
368
     *
369
     * @version V1.0.0
370 371 372 373
     *
     * @modified 26/02/2020
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
374
     */
375 376
    public function edit($id)
    {
377
        $this->Droits->assertRecordAuthorized('Formulaire', $id);
378

379
        $query = [
380
            'fields' => [
381 382 383 384 385 386 387 388 389 390 391 392
                'Formulaire.libelle',
                'Formulaire.active',
                'Formulaire.oldformulaire',
                'Formulaire.rt_externe',
                $this->Formulaire->vfLinkedFichesCount()
            ],
            'conditions' => ['Formulaire.id' => $id]
        ];
        $formulaire = $this->Formulaire->find('first', $query);

        if ($formulaire['Formulaire']['active'] === true || $formulaire['Formulaire']['oldformulaire'] === true || $formulaire['Formulaire']['fiches_count'] > 0) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
393 394
        }

395 396
        if ($this->request->params['action'] === 'add') {
            $title = __d('formulaire', 'formulaire.titreCreerFormulaire');
397
        } else {
398
            $title = __d('formulaire', 'formulaire.titreEditerFormulaire');
399
        }
400
        $this->set('title', $title . $formulaire['Formulaire']['libelle']);
401
        $this->set('rt_externe', $formulaire['Formulaire']['rt_externe']);
402

403 404 405 406
        if ($this->request->is('POST') || $this->request->is('PUT')) {
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                $this->redirect($this->Referers->get());
            }
tguillon's avatar
tguillon committed
407 408 409 410 411

            $success = true;
            $this->Formulaire->begin();

            $data = $this->request->data;
412
            unset($data['Fiche'], $data['Trash']);
tguillon's avatar
tguillon committed
413

414 415 416 417 418 419
            $this->Formulaire->create([
                'id' => $id,
                'usesousfinalite' => $data['Formulaire']['usesousfinalite'],
                'usebaselegale' => $data['Formulaire']['usebaselegale'],
                'usedecisionautomatisee' => $data['Formulaire']['usedecisionautomatisee'],
                'usetransferthorsue' => $data['Formulaire']['usetransferthorsue'],
420
                'usedonneessensible' => $data['Formulaire']['usedonneessensible'],
tguillon's avatar
tguillon committed
421
                'useallextensionfiles' => $data['Formulaire']['useallextensionfiles'],
422 423
                'usepia' => $data['Formulaire']['usepia'],
                'rt_externe' => $formulaire['Formulaire']['rt_externe']
424
            ]);
425
            $success = false !== $this->Formulaire->save(null, ['atomic' => false]) && $success;
tguillon's avatar
tguillon committed
426

427 428 429 430
            if ($success === true && $this->request->params['action'] === 'edit') {
                $success = false !== $this->Champ->deleteAll(['formulaire_id' => $id]) && $success;
            }

tguillon's avatar
tguillon committed
431
            if ($success == true) {
432 433 434
                if (isset($data['Formulaire']['form-container-formulaire'])) {
                    foreach ($data['Formulaire']['form-container-formulaire'] as $key => $fields) {
                        $success = $this->saveFields($id, $fields);
tguillon's avatar
tguillon committed
435
                    }
436
                }
tguillon's avatar
tguillon committed
437

438 439 440 441 442 443 444 445 446 447
                if (isset($data['Formulaire']['form-container-coresponsable']) && $success == true) {
                    foreach ($data['Formulaire']['form-container-coresponsable'] as $key => $fields) {
                        $success = $this->saveFields($id, $fields, true);
                    }
                }

                if (isset($data['Formulaire']['form-container-soustraitant']) && $success == true) {
                    foreach ($data['Formulaire']['form-container-soustraitant'] as $key => $fields) {
                        $success = $this->saveFields($id, $fields, false, true);
                    }
tguillon's avatar
tguillon committed
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
                }
            }

            if ($success == true) {
                $this->Formulaire->commit();
                $this->Session->setFlash(__d('formulaire', 'formulaire.flashsuccessFormulaireEnregistrer'), 'flashsuccess');

                $this->redirect([
                    'controller' => 'formulaires',
                    'action' => 'index'
                ]);
            } else {
                $this->Formulaire->rollback();
                $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
            }
        }
464

465
        $this->getFields($id);
466

467 468 469 470
        if ($formulaire['Formulaire']['rt_externe'] === true) {
            $this->getOrganisationForSt();
        }

471 472 473
        $this->view = 'edit';
    }

474 475 476 477
    private function begnWith($str, $begnString)
    {
        $len = strlen($begnString);
        return (substr($str, 0, $len) === $begnString);
478
    }
479

480 481 482 483
    private function saveFields($formulaire_id, $fields, $ongletChampCoresponsable = false, $ongletChampSoustraitant = false)
    {
        $success = true;

484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
        $typeFields = [
            'input',
            'textarea',
            'date',
            'checkboxes',
            'radios',
            'deroulant',
            'multi-select',
            'title',
            'help',
            'texte',
        ];

        $valueConditionResult = [
            'shown',
            'hidden',
        ];

502 503 504 505 506 507
        foreach ($fields as $field) {
            $array = (array)json_decode($field['details'], true);
            $valeur = array_merge($field, $array);
            unset($valeur['details']);

            foreach ($valeur as $clef => $val) {
508 509 510 511
                if ($success == false) {
                    break;
                }

512 513
                switch ($clef) {
                    case 'type':
514 515 516 517 518
                        if (in_array($val, $typeFields)) {
                            $type = $val;
                        } else {
                            $success = false;
                        }
519 520 521 522 523 524 525 526 527 528 529
                        break;

                    case 'ligne':
                        $ligne = (int)round($val, 0);
                        break;

                    case 'colonne':
                        $colonne = (int)round($val, 0);
                        break;

                    case 'name':
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
                        $formatName = LettercaseFormattableBehavior::formatageVariable($val);

                        if ($ongletChampCoresponsable === true && $ongletChampSoustraitant === false) {
                            if ($this->begnWith($formatName, 'coresponsable_') === false) {
                                $formatName = 'coresponsable_'.$formatName;
                            }
                        }

                        if ($ongletChampSoustraitant === true && $ongletChampCoresponsable === false) {
                            if ($this->begnWith($formatName, 'soustraitant_') === false) {
                                $formatName = 'soustraitant_'.$formatName;
                            }
                        }

                        $sortie[$clef] = $formatName;
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
                        break;

                    case 'options':
                        $options = [];
                        foreach ($val as $key => $option) {
                            $options[$key] = trim($option);
                        }

                        $sortie[$clef] = $options;
                        break;

                    case 'default':
                        if (!is_array($val)) {
                            $sortie[$clef] = trim($val);
                        } else {
                            $options = [];
                            foreach ($val as $key => $option) {
                                $options[$key] = trim($option);
                            }

                            $sortie[$clef] = $options;
                        }
                        break;

569
                    case 'conditions':
570 571 572
                        if (empty($val)) {
                            break;
                        }
573

574
                        $conditionsChecked = [];
575
                        $conditions = json_decode($val, true);
576 577 578 579 580

                        if (empty($conditions)){
                            break;
                        }

581 582 583 584 585 586 587 588 589 590
                        foreach ($conditions as  $uuid => $condition) {
                            $condition = (array)$condition;

                            if (!isset($condition['ifTheField']) || $condition['ifTheField'] == '') {
                                $success = false;
                            }

                            if (!isset($condition['hasValue']) || $condition['hasValue'] == '') {
                                $success = false;
                            }
591

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
                            if (!isset($condition['thenTheField']) || $condition['thenTheField'] == '') {
                                $success = false;
                            }

                            if (!isset($condition['mustBe']) || in_array($condition['mustBe'], $valueConditionResult)  == false) {
                                $success = false;
                            }

                            if (!isset($condition['ifNot']) || in_array($condition['ifNot'], $valueConditionResult) == false) {
                                $success = false;
                            }

                            if ($success == true) {
                                $save = true;

                                // On recupère uniquement les champs qui nous interesse
                                $tmpCondition = [
                                    'ifTheField' => $condition['ifTheField'],
                                    'hasValue' => $condition['hasValue'],
                                    'thenTheField' => $condition['thenTheField'],
                                    'mustBe' => $condition['mustBe'],
                                    'ifNot' => $condition['ifNot'],
                                ];

                                if (!empty($conditionsChecked)) {
                                    // On vérifie dans les conditions près à être sauvegarder qu'il n'y a pas de doublon
                                    foreach ($conditionsChecked as $tmp) {
                                        if ($save == false) {
                                            break;
                                        }

                                        $diff_result = array_diff($tmpCondition, $tmp);
                                        if (empty($diff_result)) {
                                            $save = false;
                                        }
                                    }
                                }

                                if ($save == true) {
                                    $conditionsChecked[$uuid] = $tmpCondition;
                                }
                            }
                        }

                        $sortie[$clef] = json_encode($conditionsChecked, JSON_FORCE_OBJECT);
637
                        break;
638

639 640 641 642 643 644
                    default:
                        $sortie[$clef] = $val;
                        break;
                }
            }

645 646 647 648
            if ($success == false) {
                break;
            }
            $data = [
649 650 651 652 653 654 655
                'formulaire_id' => $formulaire_id,
                'type' => $type,
                'ligne' => $ligne,
                'colonne' => $colonne,
                'details' => json_encode($sortie),
                'champ_coresponsable' => $ongletChampCoresponsable,
                'champ_soustraitant' => $ongletChampSoustraitant,
656 657
            ];
            $this->Champ->create($data);
658 659 660 661 662 663
            $success = false !== $this->Champ->save(null, ['atomic' => false]) && $success;
        }

        return $success;
    }

664 665 666 667 668
    /**
     * Récupére en BDD les champs défini dans le formulaire en fonction des différents onglet
     * Ajoute les valeurs par défault défini dans le formulaire
     *
     * @param int $formulaire_id ID du formulaire utilisé
669
     * @param bool $formulaireOLD TRUE si le formulaire vien d'une version antérieur à la v1.2.0
670 671 672 673 674 675 676
     *
     * @access private
     *
     * @created 26/02/2020
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
677
    private function getFields($formulaire_id, $formulaireOLD = false)
678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
    {
        $formulaireFields = $this->Champ->find('all', [
            'conditions' => [
                'formulaire_id' => $formulaire_id,
                'champ_coresponsable' => false,
                'champ_soustraitant' => false,
            ],
            'fields' => [
                'type',
                'ligne',
                'colonne',
                'details'
            ],
            'order' => [
                'colonne ASC',
                'ligne ASC'
            ]
        ]);

697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
        if ($formulaireOLD === false) {
            $coresponsableFields = $this->Champ->find('all', [
                'conditions' => [
                    'formulaire_id' => $formulaire_id,
                    'champ_coresponsable' => true,
                    'champ_soustraitant' => false,
                ],
                'fields' => [
                    'type',
                    'ligne',
                    'colonne',
                    'details'
                ],
                'order' => [
                    'colonne ASC',
                    'ligne ASC'
                ]
            ]);
715

716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
            $soustraitantFields = $this->Champ->find('all', [
                'conditions' => [
                    'formulaire_id' => $formulaire_id,
                    'champ_coresponsable' => false,
                    'champ_soustraitant' => true,
                ],
                'fields' => [
                    'type',
                    'ligne',
                    'colonne',
                    'details'
                ],
                'order' => [
                    'colonne ASC',
                    'ligne ASC'
                ]
            ]);
        } else {
            $coresponsableFields = [];
            $soustraitantFields = [];
        }
737 738 739 740 741 742 743

        $fields =  [
            'formulaire' =>  $formulaireFields,
            'coresponsable' =>  $coresponsableFields,
            'soustraitant' =>  $soustraitantFields,
        ];

744

745
        if (empty($this->request->data)) {
746
            if ($formulaireOLD === false && $this->request->params['action'] === 'edit' || $this->request->params['action'] === 'show') {
747 748 749 750 751 752 753 754 755 756
                $this->request->data = $this->Formulaire->find('first', [
                    'conditions' => [
                        'id' => $formulaire_id
                    ],
                    'fields' => [
                        'usesousfinalite',
                        'usebaselegale',
                        'usedecisionautomatisee',
                        'usetransferthorsue',
                        'usedonneessensible',
tguillon's avatar
tguillon committed
757 758
                        'useallextensionfiles',
                        'usepia'
759 760 761
                    ]
                ]);
            }
762 763 764 765 766 767

            foreach ($fields as $field) {
                $details = Hash::extract($field, '{n}.Champ.details');
                foreach ($details as $detail) {
                    $detail = (array)json_decode($detail);

768
                    if (isset($detail['default']) === true) {
769
                        $this->request->data['Formulaire'][$detail['name']] = $detail['default'];
770 771
                    } else {
                        $this->request->data['Formulaire']['default'] = null;
772 773 774 775
                    }
                }
            }

776 777 778 779
            $this->request->data['Formulaire']['form-container-formulaire'] = $fields['formulaire'];
            $this->request->data['Formulaire']['form-container-coresponsable'] = $fields['coresponsable'];
            $this->request->data['Formulaire']['form-container-soustraitant'] = $fields['soustraitant'];
        }
780 781 782 783 784
    }


    /**
     * Permet de visualiser un formulaire
785
     *
786 787 788 789 790 791 792 793 794
     * @param int $id ID du formulaire
     *
     * @access public
     *
     * @created 03/11/2016
     * @version V1.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
    public function show($id) {
795
        $this->Droits->assertRecordAuthorized('Formulaire', $id);
796 797 798 799 800 801

        $formulaire = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $id
            ],
            'fields' => [
802 803
                'libelle',
                'oldformulaire',
804 805
                'soustraitant',
                'rt_externe'
806 807 808 809
            ]
        ]);
        $this->set('title', __d('formulaire', 'formulaire.titreShowFormulaire') . $formulaire['Formulaire']['libelle']);

810 811 812 813
        if ($formulaire['Formulaire']['rt_externe'] === true) {
            $this->getOrganisationForSt();
        }

814 815 816 817 818
        $formulaireOLD = $formulaire['Formulaire']['oldformulaire'];
        $soustraitantOLD = $formulaire['Formulaire']['soustraitant'];

        $this->getFields($id, $formulaireOLD);

819
        $this->set('rt_externe', $formulaire['Formulaire']['rt_externe']);
820
        $this->set(compact('formulaireOLD', 'soustraitantOLD'));
tguillon's avatar
tguillon committed
821 822
    }

823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
    /**
     *
     *
     * @access public
     *
     * @created 01/06/2020
     * @version V2.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
    protected function getOrganisationForSt()
    {
        $organisation = $this->Organisation->find('first', [
            'joins' => [
                $this->Organisation->join('Dpo', ['type' => 'INNER']),
            ],
            'conditions' => [
                'Organisation.id' => $this->Session->read('Organisation.id'),
                'Dpo.id = Organisation.dpo'
            ],
            'fields' => [
                'Organisation.raisonsociale',
                'Organisation.telephone',
                'Organisation.fax',
                'Organisation.adresse',
                'Organisation.email',
                'Organisation.sigle',
                'Organisation.siret',
                'Organisation.ape',
                'Organisation.civiliteresponsable',
                'Organisation.prenomresponsable',
                'Organisation.nomresponsable',
                'Organisation.emailresponsable',
                'Organisation.telephoneresponsable',
                'Organisation.fonctionresponsable',
                'Organisation.numerodpo',
                $this->Organisation->Dpo->vfNomComplet(),
                'Dpo.email',
                'Dpo.telephonefixe',
                'Dpo.telephoneportable',
            ]
        ]);

        foreach ($organisation['Organisation'] as $key => $value) {
            $this->request->data['Trash']['st_organisation_'.$key] = $value;
        }

        foreach ($organisation['Dpo'] as $key => $value) {
            $this->request->data['Trash']['st_organisation_'.$key.'_dpo'] = $value;
        }
    }
873
}