FichesController.php 81.7 KB
Newer Older
1 2 3 4 5
<?php

/**
 * FichesController : Controller des fiches
 *
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 16 17 18 19 20 21 22 23 24 25
 * @copyright   Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
 * @link        https://www.libriciel.fr/web-cil/
 * @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');
App::uses('File', 'Utility');

26 27 28
/**
 * @property mixed ResponsableOrganisation
 */
29 30
class FichesController extends AppController
{
31 32 33 34 35 36

    public $helpers = [
        'Html',
        'Form',
        'Session'
    ];
37

38
    public $uses = [
39
        'Champ',
40
        'Coresponsable',
41 42
        'Responsable',
        'ResponsableOrganisation',
43 44 45 46 47
        'EtatFiche',
        'Extrait',
        'ExtraitRegistre',
        'Fiche',
        'Fichier',
48
        'Formulaire',
49 50 51
        'Historique',
        'Modele',
        'ModeleExtraitRegistre',
52
        'ModelePresentation',
53 54 55
        'Norme',
        'Organisation',
        'Service',
56
        'Soustraitant',
57
        'Soustraitance',
58
        'SoustraitantOrganisation',
59 60
        'Typage',
        'TypageOrganisation',
61 62
        'TraitementRegistre',
        'User',
63
        'Valeur',
64 65 66
        'WebdpoFiche',
        'WebdpoCoresponsable',
        'WebdpoSoustraitance'
67 68 69 70 71 72 73 74 75
    ];

    /**
     * La page d'accueil des fiches est celle du pannel général
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
76 77
    public function index()
    {
78 79 80 81 82 83
        $this->redirect([
            'controller' => 'pannel',
            'action' => 'index'
        ]);
    }

84
    public function saveFileTmp($formulaire_id)
85
    {
86 87 88
        $this->autoRender = false;

        if (!empty($this->request->params['form']['fichiers']) && !empty($this->request->params['pass'])) {
89
            if (empty($this->Session->read('Auth.User.uuid'))) {
tguillon's avatar
tguillon committed
90
                $this->Session->write('Auth.User.uuid', CakeText::uuid());
91
            }
tguillon's avatar
tguillon committed
92

93
            // On verifie si le dossier file existe. Si c'est pas le cas on le cree
94
            create_arborescence_files($this->Session->read('Auth.User.id'));
95

96 97 98 99 100 101 102 103 104 105 106 107
            $allextentionFile = $this->Formulaire->find('first', [
               'conditions' => [
                   'id' => $formulaire_id
               ],
               'fields' => [
                   'useallextensionfiles'
               ]
            ]);

            if ($allextentionFile['Formulaire']['useallextensionfiles'] == true) {
                $accepted = Configure::read('allFileAnnexeAcceptedTypes');
            } else {
108
                $accepted = ['application/pdf', 'application/vnd.oasis.opendocument.text'];
109
            }
110

111 112
            $typages = $this->_typages();

113 114 115
            $json = [];
            foreach ($this->request->params['form']['fichiers']['tmp_name'] as $key => $tmpFile) {
                $dir = CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid');
116

117 118 119
                if (!is_dir($dir)) {
                    mkdir($dir);
                }
120

121
                $filename = $this->request->params['form']['fichiers']['name'][$key];
122
                $path = $dir . DS . $filename;
123 124 125 126

                $mime = mime_content_type($tmpFile);

                if (in_array($mime, $accepted) === true) {
127 128
                    move_uploaded_file($tmpFile, $path);

129
                    $allTmpFiles = $files = $this->Fichier->scan_dir($dir);
130 131
                    $last_key_file = key(array_slice( $allTmpFiles, -1, 1, true ));

132 133
                    $selectType = '';
                    if (!empty($typages)) {
134
                        $selectType = '<div class="form-group"><label for="typage_tmp_'.$last_key_file.'" class="col-md-4 control-label"></label><div class="col-md-8"><select name="data[Fichier][typage_tmp_'.$last_key_file.']" id="typage_tmp_'.$last_key_file.'" class="form-control">'
135
                            . '<option value="">Séléctionnez un type pour le fichier</option>';
136 137
                        foreach ($typages as $val => $typage) {
                            $selectType = $selectType . '<option value="' . $val . '">' . $typage . '</option>';
138 139 140 141
                        }
                        $selectType = $selectType . '</select></div></div>';
                    }

142 143
                    $json[] = [
                        'filename' => $filename,
144 145
                        'path' => $path,
                        'optionType' => $selectType,
146 147 148
                    ];
                }
            }
149

150 151 152 153
            header('Content-type: "application/json"');
            echo json_encode($json);
        }
    }
154

155 156
    public function deleteFile()
    {
157
        $this->autoRender = false;
158 159

        $file = new File(CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid') . DS . $this->request->data('filename'));
160
        $file->delete();
161

162
    }
163

164 165
    /**
     * Suppression de l'enregistrement de la présente d'un fichier dans la table
166 167
     * "fichiers"
     *
168 169 170
     * @access public
     * @created 19/10/2018
     * @version V1.0.1²
171
     */
172 173
    public function deleteRecordingFile()
    {
174
        $this->autoRender = false;
175

176 177 178 179 180 181 182
        $success = true;
        $this->Fichier->begin();

        $success = $success && false !== $this->Fichier->delete($this->request->data('idFile'));

        if ($success == true) {
            $this->Fiche->commit();
183

184
            $this->deleteFileDisk($this->request->data('urlFile'));
185 186 187 188 189
            $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
        } else {
            $this->Fiche->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
        }
190
    }
191

192 193
    /**
     * Supprimer physiquement le fichier sur le disque
194
     *
195
     * @param char $urlFile
196
     *
197 198 199 200
     * @access protected
     * @created 19/10/2018
     * @version V1.0.1
     */
201 202
    protected function deleteFileDisk($urlFile)
    {
203
        $targetFileDelete = CHEMIN_PIECE_JOINT . $urlFile;
204

205 206
        if (file_exists($targetFileDelete) === true) {
            $mimeFile = mime_content_type($targetFileDelete);
207

208 209 210 211 212 213 214 215 216 217 218 219
            if ($mimeFile === 'application/pdf') {
                $filename = CHEMIN_PIECE_JOINT_CONVERSION . preg_replace('/\.pdf$/i', '.odt', $urlFile);

                if (file_exists($filename) === true) {
                    $filenameConversion = new File($filename);
                    $filenameConversion->delete();
                }
            }

            $file = new File($targetFileDelete);
            $file->delete();
        }
220
    }
221

222 223 224 225 226 227 228 229
    /**
     * Gère l'ajout de fiches
     *
     * @param int $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
230 231 232 233
     *
     * @modified 11/12/2019
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
234
     */
235
    public function add($formulaire_id, $initialisation = false)
236
    {
237 238 239 240 241
        if (true !== $this->Droits->authorized(ListeDroit::REDIGER_TRAITEMENT)) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }

        if (empty($this->Session->read($this->Session->read('Auth.User.uuid')))) {
242
            $dir = CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid');
243
            $files = $this->Fichier->scan_dir($dir);
244

245 246
            $this->set('files', $files);
        }
247

248
        if ($this->Droits->existDPO() === false) {
249 250
            throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
        }
251

252
        $this->set('title', __d('fiche', 'fiche.titreCrationFiche'));
253 254

        if ($this->request->is('POST')) {
255 256
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
257 258
                    $this->Session->delete('Auth.User.uuid');
                }
259

260 261
                $this->redirect($this->Referers->get());
            }
tguillon's avatar
tguillon committed
262

263 264 265
            $success = true;
            $this->Fiche->begin();

266 267
            $data = $this->request->data;
            $data['Fiche']['user_id'] = $this->Auth->user('id');
268
            $data['Fiche']['form_id'] = $formulaire_id;
269
            $data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
270

271
            $formulaireFields = $this->Champ->find('all', [
272 273 274 275
                'conditions' => [
                    'formulaire_id' => $formulaire_id
                ],
                'fields' => [
276
                    'type',
277 278 279
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
280 281
                ]
            ]);
tguillon's avatar
tguillon committed
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296

            $formulaireOptions = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $formulaire_id
                ],
                'fields' => [
                    'usesousfinalite',
                    'usebaselegale',
                    'usedecisionautomatisee',
                    'usetransferthorsue',
                    'usedonneessensible',
                    'usepia'
                ]
            ]);

tguillon's avatar
tguillon committed
297 298 299 300
            if ($formulaireOptions['Formulaire']['usepia'] == true) {
                $data['Fiche']['obligation_pia'] = $this->deductValueFieldObligationPia($data);
            }

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
            $formulaireRT = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $formulaire_id
                ],
                'fields' => [
                    'rt_externe'
                ]
            ]);

            if ($formulaireRT['Formulaire']['rt_externe'] === true) {
                $data['Fiche']['rt_externe'] = true;
            } else {
                $data['Fiche']['rt_externe'] = 0;
            }

tguillon's avatar
tguillon committed
316
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, false, true);
317

318 319
            if ($success == true) {
                $last = $this->Fiche->getLastInsertID();
320

321
                if ($success == true) {
322 323 324 325 326 327 328 329
                    if ($initialisation == true) {
                        $commentaireHistorique = __d('historique', 'historique.initialisationTraitement');
                        $etat_id_traitement = EtatFiche::INITIALISATION_TRAITEMENT;
                    } else {
                        $commentaireHistorique = __d('historique', 'historique.creationTraitement');
                        $etat_id_traitement = EtatFiche::ENCOURS_REDACTION;
                    }

330 331
                    $this->Historique->create([
                        'Historique' => [
332
                            'content' => $commentaireHistorique . ' ' . $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom'),
333 334 335 336 337 338 339 340
                            'fiche_id' => $last
                        ]
                    ]);
                    $success = $success && false !== $this->Historique->save();

                    $this->EtatFiche->create([
                        'EtatFiche' => [
                            'fiche_id' => $last,
341
                            'etat_id' => $etat_id_traitement,
342 343 344 345 346
                            'previous_user_id' => $this->Auth->user('id'),
                            'user_id' => $this->Auth->user('id')
                        ]
                    ]);
                    $success = $success && false !== $this->EtatFiche->save();
347

348 349
                    if (!empty($this->Session->read('Auth.User.uuid'))) {
                        if ($success == true) {
350 351 352 353 354 355 356 357 358 359 360 361 362
                            $useAllExtensionFiles = $this->Formulaire->find('first', [
                                'condititons' => [
                                    'id' => $formulaire_id
                                ],
                                'fields' => [
                                    'useallextensionfiles'
                                ]
                            ]);

                            $success = $success && false !== $this->Fichier->transfereSave(
                                $last,
                                $useAllExtensionFiles['Formulaire']['useallextensionfiles'],
                                $this->Session->read('Auth.User.uuid'),
363 364
                                $this->Session->read('Auth.User.id'),
                                $data['Fichier']
365
                            );
366 367 368 369 370
                        }
                    }
                }
            }

371 372 373 374 375 376
            if ($success == true &&
                empty($this->Fiche->validationErrors) &&
                empty($this->WebdpoFiche->validationErrors) &&
                empty($this->WebdpoCoresponsable->validationErrors) &&
                empty($this->WebdpoSoustraitance->validationErrors)
            ) {
377 378 379 380
                $this->Fiche->commit();
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementEnregistrer'), 'flashsuccess');

                $this->Session->delete('Auth.User.uuid');
381

382 383 384 385 386 387
                $this->redirect($this->Referers->get());
            } else {
                $this->Fiche->rollback();
                $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
            }
        }
388

389
        $useValueDefault = false;
390
        if (empty($this->request->data)) {
391 392
            $useValueDefault = true;

393 394 395 396 397 398 399 400 401 402 403 404
            // User
            $userLog = $this->User->find('first', [
                'conditions' => [
                    'User.id' => $this->Session->read("Auth.User.id")
                ],
                'fields' => [
                    'nom_complet_court',
                    'email',
                    'telephonefixe',
                    'telephoneportable'
                ]
            ]);
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
            $this->request->data['WebdpoFiche']['declarantpersonnenom'] = $userLog['User']['nom_complet_court'];
            $this->request->data['WebdpoFiche']['declarantpersonneemail'] = $userLog['User']['email'];
            $this->request->data['WebdpoFiche']['declarantpersonnefix'] = $userLog['User']['telephonefixe'];
            $this->request->data['WebdpoFiche']['declarantpersonneportable'] = $userLog['User']['telephoneportable'];
        }

        $formulaireOLD = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $formulaire_id
            ],
            'fields' => [
                'oldformulaire',
                'soustraitant'
            ]
        ]);

        if (in_array(true, $formulaireOLD['Formulaire'], true)) {
            $this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
            $this->redirect($this->Referers->get());
424
        }
425

426 427 428 429 430 431 432 433 434 435 436 437 438 439
        $rt_externe = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $formulaire_id
            ],
            'fields' => [
                'rt_externe',
            ]
        ]);
        $this->set('rt_externe', $rt_externe['Formulaire']['rt_externe']);

        if ($rt_externe['Formulaire']['rt_externe'] === true) {
            $this->getOrganisationForSt();
        }

440
        $this->getFormulaireFields($formulaire_id, $useValueDefault);
441

442 443
        // Récupére en BDD les options des champs défini lors de la création du formulaire
        $this->getOptionsFields($formulaire_id);
444

445 446
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
447

448 449
        $typages = $this->_typages();

450 451 452
        // On récupère les responsable
        $responsables = $this->_responsables();

453 454 455 456
        // On récupère les soustraitant
        $soustraitants = $this->_soustraitants();

        $this->set(compact('formulaire_id', 'formulaireOLD', 'typages', 'responsables', 'soustraitants'));
457 458
    }

459 460 461 462 463
    /**
     * @return mixed
     */
    protected function _responsables()
    {
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
        $condition = [];
        $query = [
            'conditions' => $condition,
            'order' => [
                'Responsable.raisonsocialestructure ASC'
            ]
        ];

        $subQuery = [
            'alias' => 'responsables_organisations',
            'fields' => [
                'responsables_organisations.responsable_id'
            ],
            'conditions' => [
                'responsables_organisations.responsable_id = Responsable.id',
                'responsables_organisations.organisation_id' => $this->Session->read('Organisation.id')
            ]
        ];
        $sql = $this->ResponsableOrganisation->sql($subQuery);
483

484 485 486
        $query['conditions'][] = "Responsable.id IN ( {$sql} )";

        $responsables = $this->Responsable->find('all', $query);
487

488 489
        return $responsables;
    }
490

491 492
    protected function _coresponsables($fiche_id)
    {
493 494 495 496 497 498 499 500
        $coresponsables = null;

        if (empty($this->request->data['Coresponsable'])) {
            $coresponsables = $this->Coresponsable->find('all', [
                'conditions' => [
                    'fiche_id' => $fiche_id
                ]
            ]);
501

502
            $coresponsableSelected = Hash::extract($coresponsables, '{n}.Coresponsable.responsable_id');
503

504 505
            $this->request->data['Coresponsable']['coresponsables'] = $coresponsableSelected;
        }
506 507 508 509

        $this->set(compact('coresponsables'));
    }

510 511 512 513 514
    /**
     * @return array
     */
    protected function _soustraitants()
    {
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
        $soustraitants = [];
        $condition = [];
        $query = [
            'conditions' => $condition,
            'order' => [
                'Soustraitant.raisonsociale ASC'
            ]
        ];

        $subQuery = [
            'alias' => 'soustraitants_organisations',
            'fields' => [
                'soustraitants_organisations.soustraitant_id'
            ],
            'conditions' => [
                'soustraitants_organisations.organisation_id' => $this->Session->read('Organisation.id')
            ]
        ];
        $sql = $this->SoustraitantOrganisation->sql($subQuery);
        $query['conditions'][] = "Soustraitant.id IN ( {$sql} )";

        $soustraitants = $this->Soustraitant->find('all', $query);
537

538 539
        return $soustraitants;
    }
540

541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
    protected function _soustraitances($fiche_id)
    {
        $soustraitances = null;

        if (empty($this->request->data['Soustraitance'])) {
            $soustraitances = $this->Soustraitance->find('all', [
                'conditions' => [
                    'fiche_id' => $fiche_id
                ]
            ]);

            $soustraitanceSelected = Hash::extract($soustraitances, '{n}.Soustraitance.soustraitant_id');

            $this->request->data['Soustraitance']['soustraitances'] = $soustraitanceSelected;
        }

        $this->set(compact('soustraitances'));
    }

560 561 562 563 564 565 566 567 568
    /**
     * Gère la suppression de traitement
     *
     * @param int|null $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
569 570
    public function delete($id = null)
    {
571 572 573 574 575 576
        if ($this->Droits->authorized(ListeDroit::REDIGER_TRAITEMENT) && $this->Droits->isOwner($id)) {
            if (!$this->Droits->isDeletable($id)) {
                $this->Session->setFlash(__d('fiche', 'fiche.flasherrorPasAccesTraitement'), 'flasherror');
                $this->redirect($this->Referers->get());
            }

577 578 579 580 581 582 583 584
            $fichiers = $this->Fichier->find('all', [
                'conditions' => [
                    'fiche_id' => $id
                ],
                'fields' => [
                    'url'
                ]
            ]);
585

586 587 588 589 590 591 592
            $success = true;
            $this->Fiche->begin();

            $success = $success && false !== $this->Fiche->delete($id);

            if ($success == true) {
                $this->Fiche->commit();
593

594 595 596 597 598
                if (!empty($fichiers)) {
                    foreach ($fichiers as $fichier) {
                        $this->deleteFileDisk($fichier['Fichier']['url']);
                    }
                }
599

600 601 602 603 604 605 606 607 608 609 610 611 612
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
            } else {
                $this->Fiche->rollback();
                $this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
            }
        } else {
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorSupprimerTraitementImpossible'), 'flasherror');
        }

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

    /**
613
     * Modification d'un traitement
614 615 616 617
     *
     * @param int $id
     *
     * @access public
618
     *
619 620
     * @created 17/06/2015
     * @version V1.0.0
621 622 623 624
     *
     * @modified 27/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
625
     */
626
    public function edit($id)
627
    {
628 629 630 631 632 633
        if (!$this->Droits->isEditable($id)) {
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorPasAccesTraitement'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

        if (empty($this->Session->read($this->Session->read('Auth.User.uuid')))) {
634 635 636 637
            $dir = CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid');
            $files = $this->Fichier->scan_dir($dir);

            $this->set(compact('files'));
638 639 640 641 642 643
        }

        if ($this->Droits->existDPO() === false) {
            throw new ForbiddenException("Aucun DPO n'a été défini pour votre entité. Veuillez contacter votre administrateur.");
        }

644 645 646 647 648 649 650 651
        if (!$id && !$this->request->data['Fiche']['id']) {
            $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

        if (!$id) {
            $id = $this->request->data['Fiche']['id'];
        }
652

653 654 655 656 657 658 659
        $nameTraiment = $this->Valeur->find('first', [
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
            ]
        ]);
        $this->set('title', __d('fiche', 'fiche.titreEditionFiche') . $nameTraiment['Valeur']['valeur']);
660

661
        if ($this->request->is(['POST', 'PUT'])) {
662 663
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
664 665
                    $this->Session->delete('Auth.User.uuid');
                }
666

667 668
                $this->redirect($this->Referers->get());
            }
669

670 671
            $success = true;
            $this->Fiche->begin();
672 673

            $data = $this->request->data;
674

675
            unset($data['Trash']);
676
            $data['Fiche']['id'] = $id;
677

678 679 680 681 682 683 684 685 686
            $form_id = $this->Fiche->find('first', [
                'conditions' => [
                    'id' => $id
                ],
                'fields' => [
                    'form_id'
                ]
            ]);

687
            $formulaireFields = $this->Champ->find('all', [
688 689 690 691
                'conditions' => [
                    'formulaire_id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
692
                    'type',
693 694 695 696 697
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
                ]
            ]);
698

tguillon's avatar
tguillon committed
699 700 701 702 703 704 705 706 707 708 709 710 711 712
            $formulaireOptions = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'usesousfinalite',
                    'usebaselegale',
                    'usedecisionautomatisee',
                    'usetransferthorsue',
                    'usedonneessensible',
                    'usepia'
                ]
            ]);

713 714 715 716 717 718 719 720
            $formulaireOLD = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'oldformulaire'
                ]
            ]);
721

tguillon's avatar
tguillon committed
722 723 724 725 726 727
            if ($formulaireOLD['Formulaire']['oldformulaire'] === false) {
                if ($formulaireOptions['Formulaire']['usepia'] == true) {
                    $data['Fiche']['obligation_pia'] = $this->deductValueFieldObligationPia($data);
                }
            }

728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
            $formulaireRT = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'rt_externe'
                ]
            ]);

            if ($formulaireRT['Formulaire']['rt_externe'] === true) {
                $data['Fiche']['rt_externe'] = true;
            } else {
                $data['Fiche']['rt_externe'] = 0;
            }

tguillon's avatar
tguillon committed
743
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, $formulaireOLD['Formulaire']['oldformulaire']);
744

745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770
            if ($success == true) {
                $etatTraitement = $this->EtatFiche->find('first', [
                    'conditions' => [
                        'fiche_id' => $id,
                        'actif' => true
                    ],
                    'fields' => [
                        'etat_id'
                    ]
                ]);

                if ($etatTraitement['EtatFiche']['etat_id'] === EtatFiche::MODIFICATION_TRAITEMENT_REGISTRE) {
                    $texteHistorique = __d('historique', 'historique.modifierTraitementRegistre');
                } else {
                    $texteHistorique = __d('historique', 'historique.modifierTraitement');
                }

                $this->Historique->create([
                    'Historique' => [
                        'content' => $this->Auth->user('nom_complet') . ' ' . $texteHistorique,
                        'fiche_id' => $id
                    ]
                ]);
                $success = false !== $this->Historique->save(null, ['atomic' => false]) && $success;

                if (isset($this->request->data['delfiles']) && !empty($this->request->data['delfiles'])) {
771
                    debug("lalal");die;
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
                    foreach (array_unique($this->request->data['delfiles']) as $val) {
                        $success = $success && $this->Fichier->deleteFichier($val);
                    }
                }

                if (!empty($this->Session->read('Auth.User.uuid'))) {
                    if ($success == true) {
                        $useAllExtensionFiles = $this->Formulaire->find('first', [
                            'condititons' => [
                                'id' => $form_id['Fiche']['form_id']
                            ],
                            'fields' => [
                                'useallextensionfiles'
                            ]
                        ]);

                        $success = $success && false !== $this->Fichier->transfereSave(
                            $id,
                            $useAllExtensionFiles['Formulaire']['useallextensionfiles'],
                            $this->Session->read('Auth.User.uuid'),
                            $this->Session->read('Auth.User.id'),
                            $data['Fichier']
                        );
                    }
                }
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813

                $filesBDD = $this->Fichier->find('all', [
                    'conditions' => [
                        'fiche_id' => $id
                    ]
                ]);

                if (!empty($filesBDD)) {
                    foreach ($filesBDD as $key => $file) {
                        if (isset($data['Fichier']['typage_'.$key]) && !empty($data['Fichier']['typage_'.$key]) && $success === true) {
                            if ($file['Fichier']['typage_id'] !== $data['Fichier']['typage_'.$key]) {
                                $file['Fichier']['typage_id'] = $data['Fichier']['typage_' . $key];
                                $success = $success && $this->Fichier->save($file, ['atomic' => false]);
                            }
                        }
                    }
                }
814 815
            }

816 817 818 819 820 821
            if ($success == true &&
                empty($this->Fiche->validationErrors) &&
                empty($this->WebdpoFiche->validationErrors) &&
                empty($this->WebdpoCoresponsable->validationErrors) &&
                empty($this->WebdpoSoustraitance->validationErrors)
            ) {
822
                $this->Fiche->commit();
823 824 825 826
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementModifier'), 'flashsuccess');

                $this->redirect($this->Referers->get());
            } else {
827
                $this->Fiche->rollback();
828 829
                $this->Session->setFlash(__d('fiche', 'Une erreur inattendue est survenue...'), 'flasherror');
            }
830
        }
831

832 833 834 835 836 837 838 839 840
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
            ],
            'fields' => [
                'form_id',
                'norme_id',
                'coresponsable',
                'soustraitance',
841 842 843
                'obligation_pia',
                'realisation_pia',
                'depot_pia',
844
                'rt_externe'
845 846
            ]
        ]);
847

848
        // On récupère en BDD les champs tous les champs du formulaire
849
        $this->getFormulaireFields($fiche['Fiche']['form_id'], false);
850

851 852
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
853

854
        if (empty($this->request->data)) {
855 856 857 858 859 860 861 862
            $this->request->data['Fiche']['norme_id'] = $fiche['Fiche']['norme_id'];
            $this->request->data['Fiche']['coresponsable'] = $fiche['Fiche']['coresponsable'];
            $this->request->data['Fiche']['soustraitance'] = $fiche['Fiche']['soustraitance'];

            $this->request->data['Fiche']['obligation_pia'] = $fiche['Fiche']['obligation_pia'];
            $this->request->data['Fiche']['realisation_pia'] = $fiche['Fiche']['realisation_pia'];
            $this->request->data['Fiche']['depot_pia'] = $fiche['Fiche']['depot_pia'];

863
            // Récupère les valeurs des champs du traitement
864
            $this->getValueFields($id, $fiche['Fiche']['rt_externe']);
865
        }
866

867 868
        $this->getFilesSave($id);

869 870 871 872 873 874 875 876 877 878
        $formulaireOLD = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $fiche['Fiche']['form_id']
            ],
            'fields' => [
                'oldformulaire',
                'soustraitant'
            ]
        ]);

879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899
        $this->set('rt_externe', $fiche['Fiche']['rt_externe']);

        $etatTraitement = $this->EtatFiche->find('first', [
            'conditions' => [
                'fiche_id' => $id,
                'actif' => true
            ],
            'fields' => [
                'etat_id'
            ]
        ]);

        $showRegistre = false;
        if (in_array($etatTraitement['EtatFiche']['etat_id'], EtatFiche::LISTE_ETAT_TRAITEMENT_REGISTRE)) {
            $showRegistre = true;
        }

        if ($showRegistre === false && $fiche['Fiche']['rt_externe'] === true) {
            $this->getOrganisationForSt();
        }

900
        // On récupère les responsables associés à l'entité
901 902
        $responsables = $this->_responsables();
        $this->set(compact('responsables'));
903 904

        // On récupère les coresponsables associés au traitement
905 906
        $this->_coresponsables($id);

907
        // On récupère les soustraitant associés à l'entité
908 909
        $soustraitants = $this->_soustraitants();
        $this->set(compact('soustraitants'));
910 911

        // On récupère la soustraitance associés au traitement
912 913 914 915
        $this->_soustraitances($id);

        // Récupére en BDD les options des champs défini lors de la création du formulaire
        $this->getOptionsFields($fiche['Fiche']['form_id']);
916

917 918 919
        $typages = $this->_typages();

        $this->set(compact('formulaireOLD', 'typages'));
920 921
        $this->set('formulaire_id', $fiche['Fiche']['form_id']);

922
        $this->view = 'add';
923 924 925
    }

    /**
926
     * Gère l'affichage d'une traitement
927 928 929 930
     *
     * @param int $id
     *
     * @access public
931
     *
932 933
     * @created 17/06/2015
     * @version V1.0.0
934
     *
935
     * @edit 26/02/2019
936
     * @version v1.0.2
937 938 939 940 941
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     *
     * @edit 26/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
942
     */
943
    public function show($id)
944
    {
945 946 947 948 949 950
        $findTraitement = $this->Fiche->find('count',[
           'conditions' => [
               'id' => $id
           ]
        ]);
        if (!$id || $findTraitement != 1) {
951 952 953 954
            $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

955 956 957 958 959 960 961
        $this->requestAction([
            'controller' => 'pannel',
            'action' => 'supprimerLaNotif',
            $id
        ]);

        $nameTraitement = $this->Valeur->find('first', [
962 963 964
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
965 966 967
            ],
            'fields' => [
                'valeur'
968 969
            ]
        ]);
970
        $this->set('title', __d('fiche', 'fiche.titreApercuFiche') . $nameTraitement['Valeur']['valeur']);
971

972 973 974
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
975 976 977
            ]
        ]);

978
        if (isset($fiche['Fiche']['norme_id'])) {
979
            $normeTraitement = $this->Norme->find('first', [
980
                'conditions' => [
981
                    'id' => $fiche['Fiche']['norme_id']
982 983 984 985
                ]
            ]);
            $this->set(compact('normeTraitement'));
        }
986

987
        // Récupère les valeurs des champs du traitement
988
        $this->getValueFields($id, $fiche['Fiche']['rt_externe']);
989

990
        $this->getFormulaireFields($fiche['Fiche']['form_id']);
991

992 993
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
994

995 996
        // On récupère les fichiers en annexe
        $this->getFilesSave($id);
997
        $typages = $this->_typages();
998

999 1000 1001 1002 1003
        $formulaireOLD = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $fiche['Fiche']['form_id']
            ],
            'fields' => [
1004
                'oldformulaire'
1005 1006
            ]
        ]);
1007

1008 1009
        $this->set('rt_externe', $fiche['Fiche']['rt_externe']);

1010 1011
        // Récupére en BDD les options des champs défini lors de la création du formulaire
        $this->getOptionsFields($fiche['Fiche']['form_id']);
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027

        $etatTraitement = $this->EtatFiche->find('first', [
            'conditions' => [
                'fiche_id' => $id,
                'actif' => true
            ],
            'fields' => [
                'etat_id'
            ]
        ]);

        $showRegistre = false;
        if (in_array($etatTraitement['EtatFiche']['etat_id'], EtatFiche::LISTE_ETAT_TRAITEMENT_REGISTRE)) {
            $showRegistre = true;
        }

1028 1029 1030 1031
        if ($showRegistre === false && $fiche['Fiche']['rt_externe'] === true) {
            $this->getOrganisationForSt();
        }

1032 1033
        $this->request->data['Fiche']['coresponsable'] = $fiche['Fiche']['coresponsable'];
        $this->request->data['Fiche']['soustraitance'] = $fiche['Fiche']['soustraitance'];
1034 1035 1036
        $this->request->data['Fiche']['obligation_pia'] = $fiche['Fiche']['obligation_pia'];
        $this->request->data['Fiche']['realisation_pia'] = $fiche['Fiche']['realisation_pia'];
        $this->request->data['Fiche']['depot_pia'] = $fiche['Fiche']['depot_pia'];
1037

1038 1039
        // On récupère les responsable
        $responsables = $this->_responsables();
1040
        $this->set(compact('responsables'));
1041 1042 1043

        // On récupère les soustraitant
        $soustraitants = $this->_soustraitants