TypagesController.php 10.2 KB
Newer Older
1 2 3 4 5
<?php

/**
 * TypagesController
 *
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
 * Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
 *
11 12
 * Licensed under the GNU Affero General Public License version 3 License - AGPL v3
 * For full copyright and license information, please see the "LICENSE" file.
13
 * Redistributions of files must retain the above copyright notice.
14
 *
15
 * @copyright   Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
16
 * @link        https://www.libriciel.fr/web-dpo/
17
 * @since       web-DPO v1.0.0
18
 * @license     [GNU Affero General Public License version 3](http://www.gnu.org/licenses/agpl-3.0.html) - AGPL v3
19 20 21 22 23 24 25 26 27
 * @version     v1.0.0
 * @package     App.Controller
 */

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

class TypagesController extends AppController {

    public $uses = [
28
        'Typage'
29
    ];
30

31
    /**
32 33
     * 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.
34
     */
35 36
    public function beforeFilter() {
        parent::beforeFilter();
Théo GUILLON's avatar
Théo GUILLON committed
37

38 39
        $this->Droits->assertAuthorized([ListeDroit::GESTION_TYPAGE]);
    }
40

41 42 43 44 45 46 47 48
    /**
     * 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
     */
    protected function _getSearchResults() {
        $paginate = [
49 50
            'contain' => [
                'Organisation' => [
51
                    'id',
52 53 54 55
                    'raisonsociale',
                    'order' => ['raisonsociale']
                ]
            ],
56
            'conditions' => [],
57
            'order' => [
Théo GUILLON's avatar
Théo GUILLON committed
58
                'Typage.libelle ASC'
59 60 61
            ]
        ];

62 63 64 65 66 67 68 69 70 71
        // Applications des filtres
        if ($this->request->is('post') && $this->request->params['action'] === 'index') {
            // Filtrer par entité associée
            if (!empty($this->request->data['Filtre']['organisation'])) {
                $paginate['conditions'][] = $this->Typage->getConditionOrganisation($this->request->data['Filtre']['organisation']);
            }
            // Filtrer par entité créatrice
            $createdbyorganisation = (string)Hash::get($this->request->data, 'Filtre.createdbyorganisation');
            if ($createdbyorganisation !== '') {
                $paginate['conditions'][] = ['Typage.createdbyorganisation' => $createdbyorganisation];
72
            }
73
        }
74

75 76 77 78
        // Ajout de conditions suivant l'utilisateur connecté et l'action
        if ($this->request->params['action'] === 'entite') {
            $paginate['conditions'][] = $this->Typage->getConditionOrganisation($this->Session->read('Organisation.id'));
        }
79

80 81 82
        $this->paginate = $paginate;
        return $this->paginate($this->Typage);
    }
83

84 85 86 87
    protected function _optionsFiltre($organisation_id = null) {
        $options = [
            'organisations' => $this->Typage->Organisation->find('list', ['order' => ['Organisation.raisonsociale ASC']]),
        ];
88

89 90 91 92 93 94 95
        return $options;
    }

    /**
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 22/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
96
     * @version V2.0.0
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
     */
    public function index()
    {
        $this->set('title', __d('typage', 'typage.titreListeTypages'));

        if ($this->request->is('post')) {
            if (isset($this->request->data['TypageOrganisation']) && empty($this->request->data['TypageOrganisation']['organisation_id']) === false) {
                $success = true;
                $this->Typage->TypageOrganisation->begin();

                $organisations_ids = Hash::extract($this->request->data, 'TypageOrganisation.organisation_id');
                $typage_ids = Hash::extract($this->request->data, 'TypageOrganisation.typage_id');
                foreach ($organisations_ids as $organisation_id) {

                    $typageEntite = $this->Typage->TypageOrganisation->find('list', [
                        'conditions' => [
                            'organisation_id' => $organisation_id
                        ],
                        'fields' => [
                            'typage_id'
                        ]
                    ]);

                    $result = array_intersect($typageEntite, $typage_ids);
                    $typage_ids = array_diff($typage_ids, $result);

                    foreach ($typage_ids as $typage_id) {
                        $data = [
                            'TypageOrganisation' => [
                                'typage_id' => $typage_id,
                                'organisation_id' => $organisation_id,
                            ]
                        ];

                        $this->Typage->TypageOrganisation->create($data);
                        $success = $success && false !== $this->Typage->TypageOrganisation->save(null, ['atomic' => false]);
                    }
                }

                if ($success == true) {
                    $this->Typage->commit();
                    $this->Session->setFlash(__d('typage', 'typage.flashsuccessTypageAffecterEnregistrer'), 'flashsuccess');
                } else {
                    $this->Typage->rollback();
                    $this->Session->setFlash(__d('typage', 'typage.flasherrorErreurEnregistrementTypageAffecter'), 'flasherror');
                }
143 144

                unset($this->request->data['TypageOrganisation']);
145
            }
146 147
        }

148
        $this->set([
149
            'mesOrganisations' => $this->WebcilUsers->mesOrganisations('list'),
150 151 152
            'options' => $this->_optionsFiltre(),
            'typages' => $this->_getSearchResults(),
        ]);
153
    }
154 155 156 157 158

    /**
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 28/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
159
     * @version V2.0.0
160 161 162 163
     */
    public function entite() {
        $this->set('title', __d('typage', 'typage.titreGestionTypageEntitee'));

164 165 166
        $this->set([
            'typages' => $this->_getSearchResults(),
        ]);
167
    }
168

169 170
    /**
     * Fonction qui permet l'ajout d'une nouvelle norme
171
     *
172 173
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
Théo GUILLON's avatar
Théo GUILLON committed
174
     * @created 22/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
175
     * @version V2.0.0
176 177 178
     */
    public function add()
    {
179
        return $this->edit(null);
180
    }
181

182 183
    /**
     * Fonction qui permet la modification d'une norme
184
     *
185
     * @param int $id
186
     *
187 188
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
Théo GUILLON's avatar
Théo GUILLON committed
189
     * @created 22/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
190
     * @version V2.0.0
191
     */
192
    public function edit($id)
193
    {
Théo GUILLON's avatar
Théo GUILLON committed
194 195 196
        if ($this->request->params['action'] === 'add') {
            $this->set('title', __d('typage', 'typage.titreAddType'));
        } else {
197
            $typage = $this->Droits->getAndCheckLinkedOrganisationsRecord('Typage', $id, false);
Théo GUILLON's avatar
Théo GUILLON committed
198 199
            $this->set('title', __d('typage', 'typage.titreeditType'));
        }
200

201 202 203 204
        if ($this->request->is('post') || $this->request->is('put')) {
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                $this->redirect($this->Referers->get());
            }
Théo GUILLON's avatar
Théo GUILLON committed
205

206 207 208
            $success = true;
            $this->Typage->begin();

209
            if ($this->request->params['action'] === 'add') {
210
                $data = $this->request->data;
211
                $data['Typage']['createdbyorganisation'] = $this->Session->read('Organisation.id');
212 213 214 215
            } else {
                $data = $typage;
                $data['Typage']['libelle'] = Hash::get($this->request->data, 'Typage.libelle');
                unset($data['Typage']['created'], $data['Typage']['modified']);
216 217
            }

Théo GUILLON's avatar
Théo GUILLON committed
218
            $this->Typage->create($data);
219 220 221 222 223
            $success = $success && false !== $this->Typage->save(null, ['atomic' => false]);

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

Théo GUILLON's avatar
Théo GUILLON committed
224
                $this->Session->setFlash(__d('typage', 'typage.flashsuccesSaveTypage'), 'flashsuccess');
225 226
                $this->redirect($this->Referers->get());
            } else {
227 228
                $this->Typage->rollback();

Théo GUILLON's avatar
Théo GUILLON committed
229
                $this->Session->setFlash(__d('typage', 'typage.flasherrorSaveTypage'), 'flasherror');
230
            }
231 232
        } elseif ($this->request->params['action'] === 'edit') {
            $this->request->data = $typage;
233 234 235 236
        }

        $this->view = 'edit';
    }
Théo GUILLON's avatar
Théo GUILLON committed
237

238
    /**
239
     * Fonction qui permet de supprimer un type d'annexe liée à l'entité
Théo GUILLON's avatar
Théo GUILLON committed
240 241 242 243
     *
     * @param int $type_id
     * @throws ForbiddenException
     *
244 245
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
Théo GUILLON's avatar
Théo GUILLON committed
246
     * @created 22/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
247
     * @version V2.0.0
248
     */
Théo GUILLON's avatar
Théo GUILLON committed
249
    public function dissocier($type_id) {
250
        $this->Typage->TypageOrganisation->begin();
251

252
        $success = false !== $this->Typage->TypageOrganisation->deleteAll([
253 254 255
                'TypageOrganisation.organisation_id' => $this->Session->read('Organisation.id'),
                'TypageOrganisation.typage_id' => $type_id
            ]);
Théo GUILLON's avatar
Théo GUILLON committed
256 257

        if ($success == true) {
258
            $this->Typage->TypageOrganisation->commit();
Théo GUILLON's avatar
Théo GUILLON committed
259
            $this->Session->setFlash(__d('typage', 'typage.flashsuccessDissocier'), 'flashsuccess');
260
        } else {
261
            $this->Typage->TypageOrganisation->rollback();
Théo GUILLON's avatar
Théo GUILLON committed
262
            $this->Session->setFlash(__d('typage', 'typage.flasherrorErreurDissocier'), 'flasherror');
263
        }
Théo GUILLON's avatar
Théo GUILLON committed
264

265 266
        $this->redirect($this->Referers->get());
    }
Théo GUILLON's avatar
Théo GUILLON committed
267

268
    /**
269
     * Permet de supprimer un type d'annexe
Théo GUILLON's avatar
Théo GUILLON committed
270
     *
271
     * @param int $id | Id du type d'annexe
Théo GUILLON's avatar
Théo GUILLON committed
272
     *
273 274
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
Théo GUILLON's avatar
Théo GUILLON committed
275
     * @created 22/04/2020
Théo GUILLON's avatar
Théo GUILLON committed
276
     * @version V2.0.0
277
     */
Théo GUILLON's avatar
Théo GUILLON committed
278
    public function delete($id) {
279
        $this->Droits->getAndCheckLinkedOrganisationsRecord('Typage', $id, true);
280

281 282 283 284
        $this->Typage->begin();
        if ($this->Typage->delete($id) === true) {
            $this->Typage->commit();
            $this->Session->setFlash(__d('typage', 'typage.flashsuccessSuppressionTypage'), 'flashsuccess');
285
        } else {
286 287
            $this->Typage->rollback();
            $this->Session->setFlash(__d('typage', 'typage.flasherrorErreurSuppressionTypage'), 'flasherror');
288
        }
Théo GUILLON's avatar
Théo GUILLON committed
289 290

        $this->redirect(['action' => 'index']);
291 292
    }
}