ResponsablesController.php 16.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
<?php

/**
 * ResponsablesController
 *
 * web-DPO : Outil de gestion de vos traitements dans le cadre de la 
 * réglementation relative à la protection des données personnelles (RGPD)
 * 
 * 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.
 * 
 * @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');

class ResponsablesController extends AppController {

    public $uses = [
        'Responsable',
29
        'Coresponsable',
30
    ];
31

32
    /**
33 34
     * 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.
35
     */
36 37
    public function beforeFilter() {
        parent::beforeFilter();
38

39 40 41 42 43 44 45
        $action = Inflector::underscore($this->request->params['action']);

        if ($action === 'ajax_add') {
            $this->Droits->assertAuthorized([ListeDroit::GESTION_CORESPONSABLE_TRAITEMENT]);
        } else {
            $this->Droits->assertAuthorized([ListeDroit::GESTION_CORESPONSABLE]);
        }
46 47 48 49 50 51 52 53
    }

    /**
     * Retourne les résultats du moteur de recherche, que ce soit pour la liste complète ou pour la liste de ceux
     * présents dans l'entité.
     *
     * @return array
     */
54 55
    protected function _getSearchResults()
    {
56
        $paginate = [
57 58
            'contain' => [
                'Organisation' => [
59
                    'id',
60 61
                    'raisonsociale',
                    'order' => ['raisonsociale']
62 63 64 65
                ],
                'Fiche'=> [
                    'id'
                ],
66
            ],
67
            'conditions' => [],
68 69
            'order' => [
                'Responsable.raisonsocialestructure ASC'
70
            ]
71 72
        ];

73
        // Applications des filtres
74
        if ($this->request->is('post')) {
75 76 77 78 79 80 81 82 83 84 85
            if ($this->request->params['action'] === 'index') {
                // Filtrer par entité associée
                if (!empty($this->request->data['Filtre']['organisation'])) {
                    $paginate['conditions'][] = $this->Responsable->getConditionOrganisation($this->request->data['Filtre']['organisation']);
                }
                // Filtrer par entité créatrice
                $createdbyorganisation = (string)Hash::get($this->request->data, 'Filtre.createdbyorganisation');
                if ($createdbyorganisation !== '') {
                    $paginate['conditions'][] = ['Responsable.createdbyorganisation' => $createdbyorganisation];
                }
            }
86

87 88 89 90 91 92 93 94 95 96 97 98
            $filters = [
                // Filtrer par raison sociale (du responsable)
                'Filtre.raisonsocialestructure' => 'Responsable.raisonsocialestructure',
                // Filtrer par numéro SIRET (du responsable)
                'Filtre.siretstructure' => 'Responsable.siretstructure',
                // Filtrer par code APE (du responsable)
                'Filtre.apestructure' => 'Responsable.apestructure',
            ];
            foreach ($filters as $filter => $path) {
                $value = (string)Hash::get($this->request->data, $filter);
                if ($value !== '') {
                    $paginate['conditions'][$path] = $value;
99 100
                }
            }
101
        }
102

103 104 105 106
        // Ajout de conditions suivant l'utilisateur connecté et l'action
        if ($this->request->params['action'] === 'entite') {
            $paginate['conditions'][] = $this->Responsable->getConditionOrganisation($this->Session->read('Organisation.id'));
        }
107

108 109 110
        $this->paginate = $paginate;
        return $this->paginate($this->Responsable);
    }
111

112 113 114 115 116 117 118 119
    /**
     * @throws ForbiddenException
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
120 121
    public function index()
    {
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
        $this->set('title', __d('responsable', 'responsable.titreGestionResponsableApplication'));

        if ($this->request->is('post')) {
            // Affectation
            if (!empty($this->request->data['ResponsableOrganisation']['organisation_id']) && isset($this->request->data['ResponsableOrganisation']) === true) {
                $success = true;
                $this->Responsable->ResponsableOrganisation->Organisation->begin();

                $organisations_ids = Hash::extract($this->request->data, 'ResponsableOrganisation.organisation_id');
                $responsables_ids = Hash::extract($this->request->data, 'ResponsableOrganisation.responsable_id');
                foreach ($organisations_ids as $organisation_id) {
                    $responsableEntite = $this->Responsable->ResponsableOrganisation->find('list', [
                        'conditions' => [
                            'organisation_id' => $organisation_id
                        ],
137
                        'fields' => [
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
                            'responsable_id'
                        ]
                    ]);

                    $diff = array_diff($responsableEntite, $responsables_ids);

                    if (!empty($diff)) {
                        $resultResponsable = array_merge($responsables_ids, $responsableEntite);
                    } else {
                        $resultResponsable = $responsables_ids;
                    }

                    $data = [
                        'Organisation' => [
                            'id' => $organisation_id,
153
                        ],
154 155
                        'Responsable' => [
                            'Responsable' => $resultResponsable
156 157
                        ]
                    ];
158 159 160 161 162 163 164 165 166
                    $success = $success && false !== $this->Responsable->ResponsableOrganisation->Organisation->save($data, ['atomic' => false]);
                }

                if ($success === true) {
                    $this->Responsable->ResponsableOrganisation->Organisation->commit();
                    $this->Session->setFlash(__d('responsable', 'responsable.flashsuccessSousTraitantAffecterEnregistrer'), 'flashsuccess');
                } else {
                    $this->Responsable->ResponsableOrganisation->Organisation->rollback();
                    $this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurEnregistrementSousTraitantAffecter'), 'flasherror');
167
                }
168 169

                unset($this->request->data['ResponsableOrganisation']);
170
            }
171
        }
172

173
        $this->set([
174
            'mesOrganisations' => $this->WebcilUsers->mesOrganisations('list'),
175 176 177 178 179
            'options' => $this->_optionsFiltre(),
            'responsables' => $this->_getSearchResults(),
        ]);
    }

180 181
    protected function _optionsFiltre($organisation_id = null)
    {
182
        $options = [
183 184 185 186
            'apestructure' => $this->Responsable->getStringOptionList('apestructure', $organisation_id),
            'organisations' => $this->Responsable->Organisation->find('list', ['order' => ['Organisation.raisonsociale ASC']]),
            'raisonsocialestructure' => $this->Responsable->getStringOptionList('raisonsocialestructure', $organisation_id),
            'siretstructure' => $this->Responsable->getStringOptionList('siretstructure', $organisation_id),
187 188
        ];

189
        return $options;
190
    }
191

192 193 194 195 196 197 198 199 200
    /**
     * 
     * @throws ForbiddenException
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
201 202
    public function entite()
    {
203 204
        $this->set('title', __d('responsable', 'responsable.titreGestionResponsableEntitee'));

205 206 207 208
        $this->set([
            'options' => $this->_optionsFiltre($this->Session->read('Organisation.id')),
            'responsables' => $this->_getSearchResults(),
        ]);
209 210 211 212 213 214 215 216 217 218 219 220
    }

    /**
     * Fonction qui permet l'ajout d'une nouvelle norme
     * 
     * @throws ForbiddenException
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 20/12/2017
     * @version V1.0.0
     */
221 222
    public function add()
    {
223
        $this->edit(null);
224 225 226 227 228 229 230 231 232 233 234 235 236
    }
    
    /**
     * Fonction qui permet la modification d'une norme
     * 
     * @param int $id
     * @throws ForbiddenException
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 20/12/2017
     * @version V1.0.0
     */
237 238 239
    public function edit($id)
    {
        if (in_array($this->request->params['action'], ['add', 'ajax_add'])) {
240 241 242 243
            $this->set('title', __d('responsable', 'responsable.titreAjouterResponsable'));
        } else {
            $responsable = $this->Droits->getAndCheckLinkedOrganisationsRecord('Responsable', $id, false);
            $this->set('title', __d('responsable', 'responsable.titreModifierResponsable'));
244
        }
245

246 247
        $cannotModified = false;

248 249 250 251
        if ($this->request->is('post') || $this->request->is('put')) {
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                $this->redirect($this->Referers->get());
            }
252

253
            if (in_array($this->request->params['action'], ['add', 'ajax_add'])) {
254 255 256 257
                $data = $this->request->data;
                $data['Responsable']['createdbyorganisation'] = $this->Droits->isSu() ? null : $this->Session->read('Organisation.id');
            } else {
                $data = $this->request->data;
258 259 260 261 262 263 264 265 266 267 268 269

                $responsableUseInFiche = $this->Coresponsable->find('all', [
                    'conditions' => [
                        'responsable_id' => $id
                    ]
                ]);

                if (!empty($responsableUseInFiche)) {
                    unset($data['Responsable']['raisonsocialestructure']);
                    unset($data['Responsable']['siretstructure']);
                }

270 271
                foreach (['id', 'createdbyorganisation'] as $fieldName) {
                    $data['Responsable'][$fieldName] = $responsable['Responsable'][$fieldName];
272 273
                }
            }
274

275 276 277
            $success = true;
            $this->Responsable->begin();

278
            $this->Responsable->create($data);
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
            $success = $success && false !== $this->Responsable->save(null, ['atomic' => true]);

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

                if ($this->request->params['action'] === 'ajax_add') {
                    $this->layout = null;
                    $this->autoRender = false;

                    $this->response->type('application/json');
                    $this->response->body(json_encode(['id' => $this->Responsable->getLastInsertID()]));
                    return $this->response->statusCode(201);
                } else {
                    $this->Session->setFlash(__d('responsable', 'responsable.flashsuccessSaveResponsable'), 'flashsuccess');
                    $this->redirect($this->Referers->get());
                }
295
            } else {
296
                $this->Responsable->rollback();
297
                $this->Session->setFlash(__d('responsable', 'responsable.flasherrorSaveResponsable'), 'flasherror');
298
            }
299 300 301 302
        } elseif ($this->request->params['action'] === 'add') {
            $this->request->data['Organisation']['Organisation'] = $this->Droits->isSu() ? null : $this->Session->read('Organisation.id');
        } else {
            $this->request->data = $responsable;
303 304 305 306 307 308 309 310 311 312

            $responsableUseInFiche = $this->Coresponsable->find('all', [
               'conditions' => [
                   'responsable_id' => $id
               ]
            ]);

            if (!empty($responsableUseInFiche)) {
                $cannotModified = true;
            }
313
        }
314

315
        $mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
316
        $this->set(compact('mesOrganisations', 'cannotModified'));
317

318 319 320 321 322
        if ($this->request->params['action'] === 'ajax_add') {
            $this->view = 'ajax_add';
        } else  {
            $this->view = 'edit';
        }
323 324 325
    }
    
    /**
326
     * Permet la visualisation des informations d'un responsable
327
     * 
328
     * @param int $id | Id du responsable
329 330 331 332 333 334
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
335 336
    public function show($id)
    {
337
        $this->set('title', __d('responsable', 'responsable.titreVisualiserResponsable'));
338 339 340 341 342 343 344 345 346 347

        $query = [
            'fields' => $this->Responsable->fields(),
            'contain' => [
                'Organisation' => [
                    'fields' => [
                        'id'
                    ]
                ]
            ],
348
            'conditions' => [
349
                'Responsable.id' => $id
350 351
            ]
        ];
352 353 354 355 356 357 358 359 360 361 362 363 364 365
        $record = $this->Responsable->find('first', $query);

        if (empty($record) === true) {
            throw new NotFoundException();
        }

        if ('Back' === Hash::get($this->request->data, 'submit')) {
            $this->redirect($this->Referers->get());
        }

        $record['Organisation'] = ['Organisation' => Hash::extract($record, 'Organisation.{n}.id')];

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

366
        $mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
367
        $this->set(compact('mesOrganisations'));
368
        $this->set('cannotModified', false);
369 370

        $this->view = 'edit';
371 372 373
    }
    
    /**
374
     * Permet de supprimer un responsable
375
     * 
376
     * @param int $id | Id du responsable
377 378 379 380 381 382
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
383 384
    public function delete($id)
    {
385
        $this->Droits->getAndCheckLinkedOrganisationsRecord('Responsable', $id, true);
386

387 388 389 390 391
        $responsableUseInFiche = $this->Coresponsable->find('all', [
            'conditions' => [
                'responsable_id' => $id
            ]
        ]);
392

393 394 395 396 397 398 399 400 401 402
        if (empty($responsableUseInFiche)) {
            $this->Responsable->begin();

            if (false !== $this->Responsable->delete($id)) {
                $this->Responsable->commit();
                $this->Session->setFlash(__d('responsable', 'responsable.flashsuccessSuppressionResponsableEntite'), 'flashsuccess');
            } else {
                $this->Responsable->rollback();
                $this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurSuppressionResponsableEntite'), 'flasherror');
            }
403
        } else {
404
            $this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurCannotDeleteResponsableUseFiche'), 'flasherror');
405
        }
406

407 408 409 410 411 412
        $this->redirect($this->Referers->get());
    }
    
    /**
     * Fonction qui permet de supprimer un responsable liée à l'entité
     * 
413
     * @param int $id
414 415 416 417 418 419 420
     * @throws ForbiddenException
     * 
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
421 422
    public function dissocierResponsable($id)
    {
423 424 425 426 427 428 429 430
        $this->Droits->assertRecordAuthorized('Responsable', $id, ['superadmin' => true]);

        $this->Responsable->begin();

        $success = false !== $this->Responsable->ResponsableOrganisation->deleteAll([
                'ResponsableOrganisation.organisation_id' => $this->Session->read('Organisation.id'),
                'ResponsableOrganisation.responsable_id' => $id
            ]);
431 432

        if ($success == true) {
433
            $this->Responsable->commit();
434 435
            $this->Session->setFlash(__d('responsable', 'responsable.flashsuccessDissocierResponsableEntite'), 'flashsuccess');
        } else {
436
            $this->Responsable->rollback();
437 438
            $this->Session->setFlash(__d('responsable', 'responsable.flasherrorErreurDissocierResponsableEntite'), 'flasherror');
        }
439

440 441
        $this->redirect($this->Referers->get());
    }
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

    /**
     *
     * @access public
     *
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @created 01/07/2020
     * @version v2.0.0
     */
    public function ajax_add()
    {
        if ($this->request->is('post')) {
            $data['Responsable'] = $this->request->data;
            $data['Organisation']['Organisation'] = [$this->Session->read('Organisation.id')];

            $this->layout  = 'ajax';
            $this->request->data = $data;
            $this->add();
        }
    }
462
}