FichesController.php 64.9 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 41
        'Responsable',
        'ResponsableOrganisation',
42 43 44 45 46
        'EtatFiche',
        'Extrait',
        'ExtraitRegistre',
        'Fiche',
        'Fichier',
47
        'Formulaire',
48 49 50
        'Historique',
        'Modele',
        'ModeleExtraitRegistre',
51
        'ModelePresentation',
52 53 54
        'Norme',
        'Organisation',
        'Service',
55 56
        'Soustraitant',
        'SoustraitantOrganisation',
57 58
        'TraitementRegistre',
        'User',
59
        'Valeur',
60
        'WebdpoFiche'
61 62 63 64 65 66 67 68 69
    ];

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

78
    public function saveFileTmp($formulaire_id)
79
//    public function saveFileTmp()
80
    {
81 82 83
        $this->autoRender = false;

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

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

91 92 93 94 95 96 97 98 99 100 101 102
            $allextentionFile = $this->Formulaire->find('first', [
               'conditions' => [
                   'id' => $formulaire_id
               ],
               'fields' => [
                   'useallextensionfiles'
               ]
            ]);

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

106 107 108
            $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');
109

110 111 112
                if (!is_dir($dir)) {
                    mkdir($dir);
                }
113

114
                $filename = $this->request->params['form']['fichiers']['name'][$key];
115
                $path = $dir . DS . $filename;
116 117 118 119

                $mime = mime_content_type($tmpFile);

                if (in_array($mime, $accepted) === true) {
120 121 122 123 124 125 126 127
                    move_uploaded_file($tmpFile, $path);

                    $json[] = [
                        'filename' => $filename,
                        'path' => $path
                    ];
                }
            }
128

129 130 131 132
            header('Content-type: "application/json"');
            echo json_encode($json);
        }
    }
133

134 135
    public function deleteFile()
    {
136
        $this->autoRender = false;
137 138

        $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'));
139
        $file->delete();
140

141
    }
142

143 144
    /**
     * Suppression de l'enregistrement de la présente d'un fichier dans la table
145 146
     * "fichiers"
     *
147 148 149
     * @access public
     * @created 19/10/2018
     * @version V1.0.1²
150
     */
151 152
    public function deleteRecordingFile()
    {
153
        $this->autoRender = false;
154

155 156 157 158 159 160 161
        $success = true;
        $this->Fichier->begin();

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

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

163
            $this->deleteFileDisk($this->request->data('urlFile'));
164 165 166 167 168
            $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementSupprimer'), 'flashsuccess');
        } else {
            $this->Fiche->rollback();
            $this->Session->setFlash(__d('default', 'default.flasherrorPasDroitPage'), 'flasherror');
        }
169
    }
170

171 172
    /**
     * Supprimer physiquement le fichier sur le disque
173
     *
174
     * @param char $urlFile
175
     *
176 177 178 179
     * @access protected
     * @created 19/10/2018
     * @version V1.0.1
     */
180 181
    protected function deleteFileDisk($urlFile)
    {
182
        $targetFileDelete = CHEMIN_PIECE_JOINT . $urlFile;
183

184 185
        if (file_exists($targetFileDelete) === true) {
            $mimeFile = mime_content_type($targetFileDelete);
186

187 188 189 190 191 192 193 194 195 196 197 198
            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();
        }
199
    }
200

201 202 203 204 205 206 207 208
    /**
     * Gère l'ajout de fiches
     *
     * @param int $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
209 210 211 212
     *
     * @modified 11/12/2019
     * @version V1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
213
     */
214
    public function add($formulaire_id, $initialisation = false)
215
    {
216 217 218 219 220 221 222 223
        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')))) {
            $files = array_diff(scandir(CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid')), array('..', '.'));
            $this->set('files', $files);
        }
224

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

229
        $this->set('title', __d('fiche', 'fiche.titreCrationFiche'));
230 231

        if ($this->request->is('POST')) {
232 233
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
234 235
                    $this->Session->delete('Auth.User.uuid');
                }
236

237 238
                $this->redirect($this->Referers->get());
            }
tguillon's avatar
tguillon committed
239

240 241 242
            $success = true;
            $this->Fiche->begin();

243 244
            $data = $this->request->data;
            $data['Fiche']['user_id'] = $this->Auth->user('id');
245
            $data['Fiche']['form_id'] = $formulaire_id;
246 247 248
            $data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
            $data['Fiche']['norme_id'] = $this->request->data['Fiche']['norme'];
            unset($data['Fiche']['norme'], $data['Fiche']['descriptionNorme']);
249

250 251 252 253 254
            $champs = $this->Champ->find('all', [
                'conditions' => [
                    'formulaire_id' => $formulaire_id
                ],
                'fields' => [
255 256 257
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
258 259
                ]
            ]);
260
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
261

262 263
            if ($success == true) {
                $last = $this->Fiche->getLastInsertID();
264

265
                if ($success == true) {
266 267 268 269 270 271 272 273
                    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;
                    }

274 275
                    $this->Historique->create([
                        'Historique' => [
276
                            'content' => $commentaireHistorique . ' ' . $this->Auth->user('prenom') . ' ' . $this->Auth->user('nom'),
277 278 279 280 281 282 283 284
                            'fiche_id' => $last
                        ]
                    ]);
                    $success = $success && false !== $this->Historique->save();

                    $this->EtatFiche->create([
                        'EtatFiche' => [
                            'fiche_id' => $last,
285
                            'etat_id' => $etat_id_traitement,
286 287 288 289 290
                            'previous_user_id' => $this->Auth->user('id'),
                            'user_id' => $this->Auth->user('id')
                        ]
                    ]);
                    $success = $success && false !== $this->EtatFiche->save();
291

292 293
                    if (!empty($this->Session->read('Auth.User.uuid'))) {
                        if ($success == true) {
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
                            $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'),
                                $this->Session->read('Auth.User.id')
                            );
309 310 311 312 313 314 315 316 317 318
                        }
                    }
                }
            }

            if ($success == true) {
                $this->Fiche->commit();
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementEnregistrer'), 'flashsuccess');

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

320 321 322 323 324 325
                $this->redirect($this->Referers->get());
            } else {
                $this->Fiche->rollback();
                $this->Session->setFlash(__d('default', 'default.flasherrorEnregistrementErreur'), 'flasherror');
            }
        }
326

327
        $useValueDefault = false;
328
        if (empty($this->request->data)) {
329 330
            $useValueDefault = true;

331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
            // User
            $userLog = $this->User->find('first', [
                'conditions' => [
                    'User.id' => $this->Session->read("Auth.User.id")
                ],
                'fields' => [
                    'nom_complet_court',
                    'email',
                    'telephonefixe',
                    'telephoneportable'
                ]
            ]);
            $this->request->data['Fiche']['declarantpersonnenom'] = $userLog['User']['nom_complet_court'];
            $this->request->data['Fiche']['declarantpersonneemail'] = $userLog['User']['email'];
            $this->request->data['Fiche']['declarantpersonnefix'] = $userLog['User']['telephonefixe'];
            $this->request->data['Fiche']['declarantpersonneportable'] = $userLog['User']['telephoneportable'];
347
        }
348

349
        $this->getFormulaireFields($formulaire_id, $useValueDefault);
350

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

354 355
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
356 357

        $this->set(compact('formulaire_id'));
358 359
    }

360 361 362 363 364
    /**
     * @return mixed
     */
    protected function _responsables()
    {
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
        $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);
384

385 386 387
        $query['conditions'][] = "Responsable.id IN ( {$sql} )";

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

389 390
        return $responsables;
    }
391 392 393 394 395 396

    /**
     * @return array
     */
    protected function _soustraitants()
    {
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
        $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);
419

420 421
        return $soustraitants;
    }
422

423 424 425 426 427 428 429 430 431
    /**
     * Gère la suppression de traitement
     *
     * @param int|null $id
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
432 433
    public function delete($id = null)
    {
434 435 436 437 438 439
        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());
            }

440 441 442 443 444 445 446 447
            $fichiers = $this->Fichier->find('all', [
                'conditions' => [
                    'fiche_id' => $id
                ],
                'fields' => [
                    'url'
                ]
            ]);
448

449 450 451 452 453 454 455
            $success = true;
            $this->Fiche->begin();

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

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

457 458 459 460 461
                if (!empty($fichiers)) {
                    foreach ($fichiers as $fichier) {
                        $this->deleteFileDisk($fichier['Fichier']['url']);
                    }
                }
462

463 464 465 466 467 468 469 470 471 472 473 474 475
                $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());
    }

    /**
476
     * Modification d'un traitement
477 478 479 480
     *
     * @param int $id
     *
     * @access public
481
     *
482 483
     * @created 17/06/2015
     * @version V1.0.0
484 485 486 487
     *
     * @modified 27/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
488
     */
489
    public function edit($id)
490
    {
491 492 493 494 495 496 497 498 499 500 501 502 503 504
        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')))) {
            $files = array_diff(scandir(CHEMIN_PIECE_JOINT_TMP . $this->Session->read('Auth.User.id') . DS . $this->Session->read('Auth.User.uuid')), array('..', '.'));
            $this->set('files', $files);
        }

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

505 506 507 508 509 510 511 512
        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'];
        }
513

514 515 516 517 518 519 520
        $nameTraiment = $this->Valeur->find('first', [
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
            ]
        ]);
        $this->set('title', __d('fiche', 'fiche.titreEditionFiche') . $nameTraiment['Valeur']['valeur']);
521

522
        if ($this->request->is(['POST', 'PUT'])) {
523 524
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                if (!empty($this->Session->read('Auth.User.uuid'))) {
525 526
                    $this->Session->delete('Auth.User.uuid');
                }
527

528 529
                $this->redirect($this->Referers->get());
            }
530

531 532 533 534
            $success = true;
            $this->Valeur->begin();

            $this->Fiche->id = $id;
535 536

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

538 539 540 541 542 543
            unset($data['Fiche']['declarantpersonnenom'],
                $data['Fiche']['declarantservice'],
                $data['Fiche']['declarantpersonneportable'],
                $data['Fiche']['declarantpersonneemail'],
                $data['Fiche']['declarantpersonnefix']
            );
544

545 546
            if (Hash::check($this->request->data, 'Fiche.formulaire_id')) {
                $data['Fiche']['form_id'] = Hash::get($this->request->data, 'Fiche.formulaire_id');
547
            }
548
            $data['Fiche']['id'] = $id;
549 550 551 552
            $data['Fiche']['organisation_id'] = $this->Session->read('Organisation.id');
            $data['Fiche']['norme_id'] = $this->request->data['Fiche']['norme'];
            unset($data['Fiche']['norme'], $data['Fiche']['descriptionNorme']);

553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
            $form_id = $this->Fiche->find('first', [
                'conditions' => [
                    'id' => $id
                ],
                'fields' => [
                    'form_id'
                ]
            ]);

            $champs = $this->Champ->find('all', [
                'conditions' => [
                    'formulaire_id' => $form_id['Fiche']['form_id']
                ],
                'fields' => [
                    'details',
                    'champ_coresponsable',
                    'champ_soustraitant'
                ]
            ]);
572
            $success = $this->WebdpoFiche->saveWithVirtualFields($data, $champs);
573

574 575 576 577
            if ($success == true) {
                if ($success == true) {
                    $etatTraitement = $this->EtatFiche->find('first', [
                        'conditions' => [
578
                            'fiche_id' => $data['Fiche']['id'],
579 580 581 582 583 584 585
                            'actif' => true
                        ],
                        'fields' => [
                            'etat_id'
                        ]
                    ]);

586
                    if ($etatTraitement['EtatFiche']['etat_id'] === EtatFiche::MODIFICATION_TRAITEMENT_REGISTRE) {
587 588 589 590 591 592 593 594 595 596 597
                        $texteHistorique = __d('historique', 'historique.modifierTraitementRegistre');
                    } else {
                        $texteHistorique = __d('historique', 'historique.modifierTraitement');
                    }

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

                    if (isset($this->request->data['delfiles']) && !empty($this->request->data['delfiles'])) {
                        foreach (array_unique($this->request->data['delfiles']) as $val) {
602
                            $success = $success && $this->Fichier->deleteFichier($val);
603 604
                        }
                    }
605

606 607
                    if (!empty($this->Session->read('Auth.User.uuid'))) {
                        if ($success == true) {
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
                            $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')
                            );
623 624 625 626
                        }
                    }
                }
            }
627

628 629 630 631 632 633 634 635 636
            if ($success == true) {
                $this->Valeur->commit();
                $this->Session->setFlash(__d('fiche', 'fiche.flashsuccessTraitementModifier'), 'flashsuccess');

                $this->redirect($this->Referers->get());
            } else {
                $this->Valeur->rollback();
                $this->Session->setFlash(__d('fiche', 'Une erreur inattendue est survenue...'), 'flasherror');
            }
637
        }
638

639 640 641 642 643 644 645 646 647 648 649
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
            ],
            'fields' => [
                'form_id',
                'norme_id',
                'coresponsable',
                'soustraitance',
            ]
        ]);
650

651 652
        // On récupère en BDD les champs tous les champs du formulaire
        $this->getFormulaireFields($fiche['Fiche']['form_id']);
653

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

657 658
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
659

660 661
        // Récupère les valeurs des champs du traitement
        $this->getValueFields($id);
662

663 664 665 666 667 668
        $this->getFilesSave($id);

        $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'];

669 670
        $this->set('formulaire_id', $fiche['Fiche']['form_id']);

671
        $this->view = 'add';
672 673 674
    }

    /**
675
     * Gère l'affichage d'une traitement
676 677 678 679
     *
     * @param int $id
     *
     * @access public
680
     *
681 682
     * @created 17/06/2015
     * @version V1.0.0
683
     *
684
     * @edit 26/02/2019
685
     * @version v1.0.2
686 687 688 689 690
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     *
     * @edit 26/02/2020
     * @version v1.2.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
691
     */
692
    public function show($id, $showRegistre = false)
693
    {
694 695 696 697 698 699
        $findTraitement = $this->Fiche->find('count',[
           'conditions' => [
               'id' => $id
           ]
        ]);
        if (!$id || $findTraitement != 1) {
700 701 702 703
            $this->Session->setFlash(__d('default', 'default.flasherrorTraitementInexistant'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

704 705 706 707 708 709 710
        $this->requestAction([
            'controller' => 'pannel',
            'action' => 'supprimerLaNotif',
            $id
        ]);

        $nameTraitement = $this->Valeur->find('first', [
711 712 713
            'conditions' => [
                'fiche_id' => $id,
                'champ_name' => 'outilnom'
714 715 716
            ],
            'fields' => [
                'valeur'
717 718
            ]
        ]);
719
        $this->set('title', __d('fiche', 'fiche.titreApercuFiche') . $nameTraitement['Valeur']['valeur']);
720

721 722 723
        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
724 725 726
            ]
        ]);

727
        if (isset($fiche['Fiche']['norme_id'])) {
728
            $normeTraitement = $this->Norme->find('first', [
729
                'conditions' => [
730
                    'id' => $fiche['Fiche']['norme_id']
731 732 733 734
                ]
            ]);
            $this->set(compact('normeTraitement'));
        }
735

736 737
        // Récupère les valeurs des champs du traitement
        $this->getValueFields($id);
738

739
        $this->getFormulaireFields($fiche['Fiche']['form_id']);
740

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

744 745
        // Récupère en BDD les normes. Renvoie les normes et les descriptions
        $this->getNormes();
746

747 748
        // On récupère les fichiers en annexe
        $this->getFilesSave($id);
749

750 751
        $this->request->data['Fiche']['coresponsable'] = $fiche['Fiche']['coresponsable'];
        $this->request->data['Fiche']['soustraitance'] = $fiche['Fiche']['soustraitance'];
752

753

754 755 756 757 758 759 760 761 762 763 764 765
//        $etatTraitement = $this->EtatFiche->find('first', [
//            'conditions' => [
//                'fiche_id' => $id
//            ],
//            'fields' => [
//                'etat_id'
//            ]
//        ]);
//
//        if (in_array($etatTraitement['EtatFiche']['etat_id'], [EtatFiche::VALIDER_DPO, EtatFiche::ARCHIVER, EtatFiche::MODIFICATION_TRAITEMENT_REGISTRE])) {
//            $showRegistre = true;
//        }
766

767
        $this->set(compact('valeurs', 'showRegistre'));
768 769 770 771 772 773 774 775 776 777 778
    }

    /**
     * Gère le téléchargement des pieces jointes d'une fiche
     *
     * @param int|null $url
     *
     * @access public
     * @created 17/06/2015
     * @version V1.0.0
     */
779 780
    public function download($url = null, $nomFile = 'file.odt')
    {
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
        $this->response->file(CHEMIN_PIECE_JOINT . $url, [
            'download' => true,
            'name' => $nomFile
        ]);

        return $this->response;
    }

    /**
     * Téléchargement du traitement verrouiller
     *
     * @param int $fiche_id
     * @param type $numeroRegistre
     *
     * @access public
     * @created 04/01/2016
     * @version V1.0.0
798 799 800 801
     *
     * @modified 08/01/2020
     * @version V1.2.0
     * @deprecated
802
     */
803 804
    public function downloadFileTraitement($fiche_id)
    {
805
        $fiche = $this->Fiche->find('first', [
806
            'conditions' => ['id' => $fiche_id]
807 808 809 810 811 812 813 814 815 816 817 818 819 820 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
        ]);

        $nameTraiment = $this->Valeur->find('first', [
            'conditions' => [
                'fiche_id' => $fiche_id,
                'champ_name' => 'outilnom'
            ]
        ]);

        $pdf = $this->TraitementRegistre->find('first', [
            'conditions' => ['fiche_id' => $fiche_id],
            'fields' => ['data']
        ]);

        if (empty($pdf)) {
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorErreurPDF'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

        header("content-type: application/pdf");
        header('Content-Disposition: attachment; filename="Traitement_' . $nameTraiment['Valeur']['valeur'] . '_' . $fiche['Fiche']['numero'] . '.pdf"');

        echo($pdf['TraitementRegistre']['data']);
    }

    /**
     * Téléchargement de l'extrait de registre verrouiller
     *
     * Si aucun fiche_id n'est passé en paramètre, un message d'erreur est
     * stocké en session et on est redirigé vers l'écran de visualisation
     * des registres.
     *
     * @param type $fiche_id
     * @param type $numeroRegistre
     *
     * @access public
     * @created 09/01/2017
     * @version V1.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
847 848
    public function downloadFileExtrait($fiche_id)
    {
849 850 851 852 853 854 855 856
        // On vérifie que $fiche_id n'est pas vide
        if (empty($fiche_id)) {
            $this->Session->setFlash(__d('registre', 'registre.flasherrorAucunTraitementSelectionner'), 'flasherror');

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

        $fiche = $this->Fiche->find('first', [
857
            'conditions' => ['id' => $fiche_id]
858 859 860 861 862 863 864 865 866 867 868 869 870
        ]);

        $nameTraiment = $this->Valeur->find('first', [
            'conditions' => [
                'fiche_id' => $fiche_id,
                'champ_name' => 'outilnom'
            ]
        ]);

        $pdf = $this->ExtraitRegistre->find('first', [
            'conditions' => ['fiche_id' => $fiche_id],
            'fields' => ['data']
        ]);
871

872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
        if (empty($pdf)) {
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorErreurPDF'), 'flasherror');
            $this->redirect($this->Referers->get());
        }

        header("content-type: application/pdf");
        header('Content-Disposition: attachment; filename="Extrait_' . $nameTraiment['Valeur']['valeur'] . '_' . $fiche['Fiche']['numero'] . '.pdf"');
        echo($pdf['ExtraitRegistre']['data']);
    }

    /**
     * Retourne le PDF du traitement dont l'id est passé en paramètres.
     *
     * Si aucun id n'est passé en paramètre, un message d'erreur est stocké en
     * session et on est redirigé vers l'écran de visualisation des registres.
     *
     * On supprime également la notification concernant le traitement.
     *
     * @param json $tabId
     * @return string
     *
     * @access public
     * @created 07/04/2017
     * @version V1.0.0
     * @author Christian BUFFIN <christian.buffin@libriciel.coop>
     */
898
    protected function _genereTraitement($tabId, $outputFormat = 'pdf')
899
    {
900 901 902 903 904 905 906 907 908 909 910 911 912 913
        $id = json_decode($tabId);

        // On vérifie que $tadId n'est pas vide
        if (empty($id)) {
            $this->Session->setFlash(__d('registre', 'registre.flasherrorAucunTraitementSelectionner'), 'flasherror');

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

        $fiche = $this->Fiche->find('first', [
            'conditions' => [
                'id' => $id
            ]
        ]);
914

915
        $annexefiles = $this->Fichier->find('all', [
916
            'conditions' => [
917 918 919 920
                'fiche_id' => $fiche['Fiche']['id']
            ],
            'fields' => [
                'url'
921 922
            ]
        ]);
923

924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949
        $filesConversion = true;
        foreach ($annexefiles as $annexefile) {
            if (mime_content_type(CHEMIN_PIECE_JOINT . $annexefile['Fichier']['url']) === 'application/pdf') {
                if (file_exists(CHEMIN_PIECE_JOINT_CONVERSION . preg_replace('/\.pdf$/i', '.odt', $annexefile['Fichier']['url'])) === false) {
                    $filesConversion = false;
                }
            }
        }

        if ($filesConversion === true) {
            // On récupére le modèle de l'extrait de registre
            $modele = ClassRegistry::init('Modele')->find('first', [
                'conditions' => [
                    'formulaires_id' => $fiche['Fiche']['form_id']
                ]
            ]);

            // On vérifie que les infos du modèle existe bien
            if (!empty($modele) && file_exists(CHEMIN_MODELES.$modele['Modele']['fichier'])) {
                $file = $modele['Modele']['fichier'];

                $pdf = $this->Fiche->preparationGeneration(
                    $tabId,
                    $file,
                    CHEMIN_MODELES,
                    $this->Session->read('Organisation.id'),
950 951
                    true,
                    $outputFormat
952 953 954 955 956 957 958 959 960 961 962 963 964
                );

                $this->requestAction(array(
                    'controller' => 'pannel',
                    'action' => 'supprimerLaNotif',
                    (int) $id
                ));

                return $pdf;
            } else {
                $this->Session->setFlash(__d('fiche', 'fiche.flasherrorRecuperationModele'), 'flasherror');
                $this->redirect($this->Referers->get());
            }
965
        } else {
966
            $this->Session->setFlash(__d('fiche', 'fiche.flashwarningAnnexeNonConvertie'), 'flashwarning');
967
            $this->redirect($this->Referers->get());
968 969 970
        }
    }

971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
    protected function _genereRegistre($urlTraitementODT)
    {
        $organisation_id = $this->Session->read('Organisation.id');

        // On récupére le modèle de présentation
        $modele = ClassRegistry::init('ModelePresentation')->find('first', [
            'conditions' => [
                'organisations_id' => $organisation_id
            ]
        ]);

        // On vérifie que les infos du modèle existe bien
        if (!empty($modele) && file_exists(CHEMIN_MODELES_PRESENTATIONS.$modele['ModelePresentation']['fichier'])) {
            $file = $modele['ModelePresentation']['fichier'];

            $pdf = $this->Fiche->preparationGenerationRegistre(
                $urlTraitementODT,
                $file,
                CHEMIN_MODELES_PRESENTATIONS,
                $organisation_id
            );

            return $pdf;
        } else {
            $this->Session->setFlash(__d('fiche', 'fiche.flasherrorRecuperationModele'), 'flasherror');
            $this->redirect($this->Referers->get());
        }
    }

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
    /**
     * Genere le traitement de registre
     *
     * @param type $tabId
     * @return data
     *
     * @access public
     * @created 09/01/2017
     * @version V1.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
1011 1012
    public function genereTraitement($tabId)
    {
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
        if (true !== $this->Droits->authorized(ListeDroit::TELECHARGER_TRAITEMENT_REGISTRE)) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }

        $pdf = $this->_genereTraitement($tabId);

        $this->response->disableCache();
        $this->response->body($pdf);
        $this->response->type('application/pdf');
        $this->response->download('Traitement.pdf');

        return $this->response;
    }
1026

1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
    /**
     * Genere le traitement de registre en mode non verrouiller
     *
     * @param type $tabId
     * @return data
     *
     * @access public
     * @created 09/01/2017
     * @version V1.0.0
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     */
1038 1039
    public function genereTraitementNonVerrouiller($tabId)
    {
1040 1041 1042
        if (true !== $this->Droits->authorized(ListeDroit::TELECHARGER_TRAITEMENT_REGISTRE)) {
            throw new ForbiddenException(__d('default', 'default.flasherrorPasDroitPage'));
        }
1043

1044
        if ($tabId != null) {
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
            $modelePresentationOrganisation = $this->Organisation->find('first', [
                'conditions' => [
                    'id' => $this->Session->read('Organisation.id')
                ],
                'fields' => [
                    'usemodelepresentation'
                ]
            ]);
            $useModelPresentation = $modelePresentationOrganisation['Organisation']['usemodelepresentation'];

1055
            // On verifie si le dossier file existe. Si c'est pas le cas on le cree
1056
            create_arborescence_files();
1057

1058 1059
            $folder = TMP . "imprimerRegistreNonVerrouiller";
            $date = date('d-m-Y_H-i');
1060

1061 1062 1063 1064 1065 1066 1067
            //on verifie si le dossier existe. Si c'est pas le cas on le cree
            if (!file_exists($folder)) {
                mkdir($folder, 0777, true);
            }

            $files_concat = '';
            foreach (json_decode($tabId) as $ficheID) {
1068 1069 1070 1071 1072 1073
                if ($useModelPresentation === false) {
                    $pdf = $this->_genereTraitement($ficheID);

                    $monPDF = fopen($folder . DS . $ficheID . '.pdf', 'a');
                    fputs($monPDF, $pdf);
                    fclose($monPDF);
1074

1075 1076 1077 1078
                    //On concatene le chemin du fichier .pdf
                    $files_concat .= $folder . DS . $ficheID . '.pdf ';
                } else {
                    $odt = $this->_genereTraitement($ficheID, 'odt');
1079

1080 1081 1082
                    $monODT = fopen($folder . DS . $ficheID . '.odt', 'a');
                    fputs($monODT, $odt);
                    fclose($monODT);
1083

1084 1085 1086
                    //On concatene le chemin du fichier .pdf
                    $chemintraitementGenereODT[] = $folder . DS . $ficheID . '.odt';
                }
1087 1088
            }

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
            if ($useModelPresentation === true) {
                $pdf = $this->_genereRegistre($chemintraitementGenereODT);

                $this->response->disableCache();
                $this->response->body($pdf);
                $this->response->type('application/pdf');
                $this->response->download('Registre_' . $date . '.pdf');

                $monRegistrePDF = fopen(CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf', 'a');
                fputs($monRegistrePDF, $this->response);
                fclose($monRegistrePDF);
            } else {
                /**
                 * On concatene tout les PDFs qu'on a cree et on enregistre
                 * la concatenation dans /var/www/webdpo/app/files/registre
                 */
                shell_exec('pdftk' . ' ' . $files_concat . 'cat output ' . CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf');

                //On propose le telechargement
                $this->response->file(CHEMIN_REGISTRE . 'Registre_' . $date . '.pdf', [
                    'download' => true,
                    'name' => 'Registre_' . $date . '.pdf'
                ]);
            }
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129