FichesController.php 83.4 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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    /**
     * 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();

        $action = Inflector::underscore($this->request->params['action']);
        // Pour les autres que index et les download, aucune idée sur la façon de restreindre les droits
        //$anyone = ['index', 'delete_file', 'delete_recording_file', 'download', 'download_file_extrait', 'download_file_traitement'];

        if (in_array($action, ['add', 'archive']) === true) {
            $this->Droits->assertAuthorized([ListeDroit::REDIGER_TRAITEMENT]);
            $this->Droits->assertNotSu();
        } elseif ($action === 'delete') {
            $this->Droits->assertAuthorized([ListeDroit::REDIGER_TRAITEMENT]);
            $this->Droits->assertNotSu();
        } elseif ($action === 'dupliquer_traitement_in_organisations') {
            $this->Droits->assertDpo();
        } elseif ($action === 'edit') {
            $this->Droits->assertNotSu();
        } /*elseif (in_array($action, $anyone) === false) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }*/
    }

95 96 97 98 99 100 101
    /**
     * La page d'accueil des fiches est celle du pannel général
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
102 103
    public function index()
    {
104 105 106 107 108 109
        $this->redirect([
            'controller' => 'pannel',
            'action' => 'index'
        ]);
    }

110
    public function saveFileTmp($formulaire_id)
111
    {
112 113 114
        $this->autoRender = false;

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

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

122 123 124 125 126 127 128 129 130 131 132 133
            $allextentionFile = $this->Formulaire->find('first', [
               'conditions' => [
                   'id' => $formulaire_id
               ],
               'fields' => [
                   'useallextensionfiles'
               ]
            ]);

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

137 138
            $typages = $this->_typages();

139 140 141
            $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');
142

143 144 145
                if (!is_dir($dir)) {
                    mkdir($dir);
                }
146

147
                $filename = $this->request->params['form']['fichiers']['name'][$key];
148
                $path = $dir . DS . $filename;
149 150 151 152

                $mime = mime_content_type($tmpFile);

                if (in_array($mime, $accepted) === true) {
153 154
                    move_uploaded_file($tmpFile, $path);

155
                    $allTmpFiles = $files = $this->Fichier->scan_dir($dir);
156 157
                    $last_key_file = key(array_slice( $allTmpFiles, -1, 1, true ));

158 159
                    $selectType = '';
                    if (!empty($typages)) {
160
                        $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 typeAnnexeSelected">'
161
                            . '<option value="">Séléctionnez un type pour le fichier</option>';
162 163
                        foreach ($typages as $val => $typage) {
                            $selectType = $selectType . '<option value="' . $val . '">' . $typage . '</option>';
164 165 166 167
                        }
                        $selectType = $selectType . '</select></div></div>';
                    }

168 169
                    $json[] = [
                        'filename' => $filename,
170 171
                        'path' => $path,
                        'optionType' => $selectType,
172 173 174
                    ];
                }
            }
175

176 177 178 179
            header('Content-type: "application/json"');
            echo json_encode($json);
        }
    }
180

181 182
    public function deleteFile()
    {
183
        $this->autoRender = false;
184 185

        $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'));
186
        $file->delete();
187

188
    }
189

190 191
    /**
     * Suppression de l'enregistrement de la présente d'un fichier dans la table
192 193
     * "fichiers"
     *
194 195 196
     * @access public
     * @created 19/10/2018
     * @version V1.0.1²
197
     */
198 199
    public function deleteRecordingFile()
    {
200
        $this->autoRender = false;
201

202 203 204 205 206 207 208
        $success = true;
        $this->Fichier->begin();

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

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

210
            $this->_deleteFileDisk($this->request->data('urlFile'));
211 212 213 214 215
            $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
        } else {
            $this->Fiche->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
        }
216
    }
217

218 219
    /**
     * Supprimer physiquement le fichier sur le disque
220
     *
221
     * @param char $urlFile
222
     *
223 224 225 226
     * @access protected
     * @created 19/10/2018
     * @version V1.0.1
     */
227
    protected function _deleteFileDisk($urlFile)
228
    {
229
        $targetFileDelete = CHEMIN_PIECE_JOINT . $urlFile;
230

231 232
        if (file_exists($targetFileDelete) === true) {
            $mimeFile = mime_content_type($targetFileDelete);
233

234 235 236 237 238 239 240 241 242 243 244 245
            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();
        }
246
    }
247

248 249 250 251 252 253 254 255
    /**
     * Gère l'ajout de fiches
     *
     * @param int $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
256 257 258 259
     *
     * @modified 11/12/2019
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
260
     */
261
    public function add($formulaire_id, $initialisation = false)
262
    {
263
        if (empty($this->Session->read($this->Session->read('Auth.User.uuid')))) {
264
            $dir = CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid');
265
            $files = $this->Fichier->scan_dir($dir);
266

267 268
            $this->set('files', $files);
        }
269

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

274 275
        $this->Droits->assertRecordAuthorized('Formulaire', $formulaire_id);

276
        $this->set('title', __d('fiche', 'fiche.titreCrationFiche'));
277 278

        if ($this->request->is('POST')) {
279 280
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
281 282
                    $this->Session->delete('Auth.User.uuid');
                }
283

284 285
                $this->redirect($this->Referers->get());
            }
tguillon's avatar
tguillon committed
286

287 288 289
            $success = true;
            $this->Fiche->begin();

290 291
            $data = $this->request->data;
            $data['Fiche']['user_id'] = $this->Auth->user('id');
292
            $data['Fiche']['form_id'] = $formulaire_id;
293
            $data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
294

295
            $formulaireFields = $this->Champ->find('all', [
296 297 298 299
                'conditions' => [
                    'formulaire_id' => $formulaire_id
                ],
                'fields' => [
300
                    'type',
301 302 303
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
304 305
                ]
            ]);
tguillon's avatar
tguillon committed
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320

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

tguillon's avatar
tguillon committed
321 322 323 324
            if ($formulaireOptions['Formulaire']['usepia'] == true) {
                $data['Fiche']['obligation_pia'] = $this->deductValueFieldObligationPia($data);
            }

325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
            $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
340
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, false, true);
341

342 343
            if ($success == true) {
                $last = $this->Fiche->getLastInsertID();
344

345
                if ($success == true) {
346 347 348 349 350 351 352 353
                    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;
                    }

354 355
                    $this->Historique->create([
                        'Historique' => [
356
                            'content' => $commentaireHistorique . ' ' . $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom'),
357 358 359
                            'fiche_id' => $last
                        ]
                    ]);
360
                    $success = $success && false !== $this->Historique->save(null, ['atomic' => false]);
361 362 363 364

                    $this->EtatFiche->create([
                        'EtatFiche' => [
                            'fiche_id' => $last,
365
                            'etat_id' => $etat_id_traitement,
366 367 368 369
                            'previous_user_id' => $this->Auth->user('id'),
                            'user_id' => $this->Auth->user('id')
                        ]
                    ]);
370
                    $success = $success && false !== $this->EtatFiche->save(null, ['atomic' => false]);
371

372 373
                    if (!empty($this->Session->read('Auth.User.uuid'))) {
                        if ($success == true) {
374 375 376 377 378 379 380 381 382 383 384 385 386
                            $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'),
387 388
                                $this->Session->read('Auth.User.id'),
                                $data['Fichier']
389
                            );
390 391 392 393 394
                        }
                    }
                }
            }

395 396 397 398 399 400
            if ($success == true &&
                empty($this->Fiche->validationErrors) &&
                empty($this->WebdpoFiche->validationErrors) &&
                empty($this->WebdpoCoresponsable->validationErrors) &&
                empty($this->WebdpoSoustraitance->validationErrors)
            ) {
401 402 403 404
                $this->Fiche->commit();
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementEnregistrer'), 'flashsuccess');

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

406 407 408 409 410 411
                $this->redirect($this->Referers->get());
            } else {
                $this->Fiche->rollback();
                $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
            }
        }
412

413
        $useValueDefault = false;
414
        if (empty($this->request->data)) {
415 416
            $useValueDefault = true;

417 418 419 420 421 422 423 424 425 426 427 428
            // User
            $userLog = $this->User->find('first', [
                'conditions' => [
                    'User.id' => $this->Session->read("Auth.User.id")
                ],
                'fields' => [
                    'nom_complet_court',
                    'email',
                    'telephonefixe',
                    'telephoneportable'
                ]
            ]);
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
            $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());
448
        }
449

450 451 452 453 454 455 456 457 458 459 460 461 462 463
        $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();
        }

464
        $this->getFormulaireFields($formulaire_id, $useValueDefault);
465

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

469 470
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
471

472 473
        $typages = $this->_typages();

474 475 476
        // On récupère les responsable
        $responsables = $this->_responsables();

477 478 479 480
        // On récupère les soustraitant
        $soustraitants = $this->_soustraitants();

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

483 484 485 486 487
    /**
     * @return mixed
     */
    protected function _responsables()
    {
488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
        $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);
507

508 509 510
        $query['conditions'][] = "Responsable.id IN ( {$sql} )";

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

512 513
        return $responsables;
    }
514

515 516
    protected function _coresponsables($fiche_id)
    {
517 518 519 520 521 522 523 524
        $coresponsables = null;

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

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

528 529
            $this->request->data['Coresponsable']['coresponsables'] = $coresponsableSelected;
        }
530 531 532 533

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

534 535 536 537 538
    /**
     * @return array
     */
    protected function _soustraitants()
    {
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
        $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);
561

562 563
        return $soustraitants;
    }
564

565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
    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'));
    }

584 585 586 587 588 589 590 591 592
    /**
     * Gère la suppression de traitement
     *
     * @param int|null $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
593
    public function delete($id)
594
    {
595
        $this->Droits->assertRecordAuthorized('Fiche', $id);
596

597 598 599
        if ($this->Droits->isOwner($id) === false || $this->Droits->isDeletable($id) === false) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }
600

601 602 603 604 605 606 607 608
        $fichiers = $this->Fichier->find('all', [
            'conditions' => [
                'fiche_id' => $id
            ],
            'fields' => [
                'url'
            ]
        ]);
609

610 611
        $success = true;
        $this->Fiche->begin();
612

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

615 616
        if ($success == true) {
            $this->Fiche->commit();
617

618 619 620 621
            if (!empty($fichiers)) {
                foreach ($fichiers as $fichier) {
                    $this->_deleteFileDisk($fichier['Fichier']['url']);
                }
622
            }
623 624

            $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
625
        } else {
626
            $this->Fiche->rollback();
627 628 629 630 631 632 633
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorSupprimerTraitementImpossible'), 'flasherror');
        }

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

    /**
634
     * Modification d'un traitement
635 636 637 638
     *
     * @param int $id
     *
     * @access public
639
     *
640 641
     * @created 17/06/2015
     * @version V1.0.0
642 643 644 645
     *
     * @modified 27/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
646
     */
647
    public function edit($id)
648
    {
649 650 651 652 653 654
        if (!$id) {
            $id = $this->request->data['Fiche']['id'];
        }

        $this->Droits->assertRecordAuthorized('Fiche', $id);

655
        if (!$this->Droits->isEditable($id)) {
656
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
657 658 659
        }

        if (empty($this->Session->read($this->Session->read('Auth.User.uuid')))) {
660 661 662 663
            $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'));
664 665 666 667 668 669
        }

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

670 671 672 673 674 675 676 677 678 679 680 681
        if (!$id && !$this->request->data['Fiche']['id']) {
            $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

        $nameTraiment = $this->Valeur->find('first', [
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
            ]
        ]);
        $this->set('title', __d('fiche', 'fiche.titreEditionFiche') . $nameTraiment['Valeur']['valeur']);
682

683
        if ($this->request->is(['POST', 'PUT'])) {
684 685
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
686 687
                    $this->Session->delete('Auth.User.uuid');
                }
688

689 690
                $this->redirect($this->Referers->get());
            }
691

692 693
            $success = true;
            $this->Fiche->begin();
694 695

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

697
            unset($data['Trash']);
698
            $data['Fiche']['id'] = $id;
699

700 701 702 703 704 705 706 707 708
            $form_id = $this->Fiche->find('first', [
                'conditions' => [
                    'id' => $id
                ],
                'fields' => [
                    'form_id'
                ]
            ]);

709
            $formulaireFields = $this->Champ->find('all', [
710 711 712 713
                'conditions' => [
                    'formulaire_id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
714
                    'type',
715 716 717 718 719
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
                ]
            ]);
720

tguillon's avatar
tguillon committed
721 722 723 724 725 726 727 728 729 730 731 732 733 734
            $formulaireOptions = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'usesousfinalite',
                    'usebaselegale',
                    'usedecisionautomatisee',
                    'usetransferthorsue',
                    'usedonneessensible',
                    'usepia'
                ]
            ]);

735 736 737 738 739 740 741 742
            $formulaireOLD = $this->Formulaire->find('first', [
                'conditions' => [
                    'id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'oldformulaire'
                ]
            ]);
743

tguillon's avatar
tguillon committed
744 745 746 747 748 749
            if ($formulaireOLD['Formulaire']['oldformulaire'] === false) {
                if ($formulaireOptions['Formulaire']['usepia'] == true) {
                    $data['Fiche']['obligation_pia'] = $this->deductValueFieldObligationPia($data);
                }
            }

750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
            $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
765
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $formulaireFields, $formulaireOptions, $formulaireOLD['Formulaire']['oldformulaire']);
766

767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
            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'])) {
793
                    debug("lalal");die;
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818
                    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']
                        );
                    }
                }
819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835

                $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]);
                            }
                        }
                    }
                }
836 837
            }

838 839 840 841 842 843
            if ($success == true &&
                empty($this->Fiche->validationErrors) &&
                empty($this->WebdpoFiche->validationErrors) &&
                empty($this->WebdpoCoresponsable->validationErrors) &&
                empty($this->WebdpoSoustraitance->validationErrors)
            ) {
844
                $this->Fiche->commit();
845 846 847 848
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementModifier'), 'flashsuccess');

                $this->redirect($this->Referers->get());
            } else {
849
                $this->Fiche->rollback();
850 851
                $this->Session->setFlash(__d('fiche', 'Une erreur inattendue est survenue...'), 'flasherror');
            }
852
        }
853

854 855 856 857 858 859 860 861 862
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
            ],
            'fields' => [
                'form_id',
                'norme_id',
                'coresponsable',
                'soustraitance',
863 864 865
                'obligation_pia',
                'realisation_pia',
                'depot_pia',
866 867 868
                'rt_externe',
                'transfert_hors_ue',
                'donnees_sensibles',
869 870
            ]
        ]);
871

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

875 876
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
877

878
        if (empty($this->request->data)) {
879 880 881 882
            $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'];

883 884 885
            $this->request->data['Fiche']['transfert_hors_ue'] = $fiche['Fiche']['transfert_hors_ue'];
            $this->request->data['Fiche']['donnees_sensibles'] = $fiche['Fiche']['donnees_sensibles'];

886 887 888 889
            $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'];

890
            // Récupère les valeurs des champs du traitement
891
            $this->getValueFields($id, $fiche['Fiche']['rt_externe']);
892
        }
893

894 895
        $this->getFilesSave($id);

896 897 898 899 900 901 902 903 904 905
        $formulaireOLD = $this->Formulaire->find('first', [
            'conditions' => [
                'id' => $fiche['Fiche']['form_id']
            ],
            'fields' => [
                'oldformulaire',
                'soustraitant'
            ]
        ]);

906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
        $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();
        }

927
        // On récupère les responsables associés à l'entité
928 929
        $responsables = $this->_responsables();
        $this->set(compact('responsables'));
930 931

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

934
        // On récupère les soustraitant associés à l'entité
935 936
        $soustraitants = $this->_soustraitants();
        $this->set(compact('soustraitants'));
937 938

        // On récupère la soustraitance associés au traitement
939 940 941 942
        $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']);
943

944 945 946
        $typages = $this->_typages();

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

949
        $this->view = 'add';
950 951 952
    }

    /**
953
     * Gère l'affichage d'une traitement
954 955 956 957
     *
     * @param int $id
     *
     * @access public
958
     *
959 960
     * @created 17/06/2015
     * @version V1.0.0
961
     *
962
     * @edit 26/02/2019
963
     * @version v1.0.2
964 965 966 967 968
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     *
     * @edit 26/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
969
     */
970
    public function show($id)
971
    {
972 973 974 975 976 977
        $findTraitement = $this->Fiche->find('count',[
           'conditions' => [
               'id' => $id
           ]
        ]);
        if (!$id || $findTraitement != 1) {
978 979 980 981
            $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

982 983 984 985 986 987 988
        $this->requestAction([
            'controller' => 'pannel',
            'action' => 'supprimerLaNotif',
            $id
        ]);

        $nameTraitement = $this->Valeur->find('first', [
989 990 991
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
992 993 994
            ],
            'fields' => [
                'valeur'
995 996
            ]
        ]);
997
        $this->set('title', __d('fiche', 'fiche.titreApercuFiche') . $nameTraitement['Valeur']['valeur']);
998

999 1000 1001
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
1002 1003 1004
            ]
        ]);

1005
        if (isset($fiche['Fiche']['norme_id'])) {
1006
            $normeTraitement = $this->Norme->find('first', [
1007
                'conditions' => [
1008
                    'id' => $fiche['Fiche']['norme_id']
1009 1010 1011 1012
                ]
            ]);
            $this->set(compact('normeTraitement'));
        }
1013

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

1017
        $this->getFormulaireFields($fiche['Fiche']['form_id']);
1018

1019 1020
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
1021

1022 1023
        // On récupère les fichiers en annexe
        $this->getFilesSave($id);
1024
        $typages = $this->_typages();