SoustraitantsController.php 16.5 KB
Newer Older
tguillon's avatar
tguillon committed
1
2
3
4
5
<?php

/**
 * SoustraitantsController
 *
6
 * web-DPO : Outil de gestion de vos traitements dans le cadre de la
tguillon's avatar
tguillon committed
7
 * réglementation relative à la protection des données personnelles (RGPD)
8
 *
tguillon's avatar
tguillon committed
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
 *
tguillon's avatar
tguillon committed
15
 * @copyright   Copyright (c) Libriciel SCOP (https://www.libriciel.fr/)
16
 * @link        https://www.libriciel.fr/web-dpo/
tguillon's avatar
tguillon committed
17
18
19
20
21
22
23
24
25
26
27
28
 * @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 SoustraitantsController extends AppController {

    public $uses = [
        'Soustraitant',
29
        'Soustraitance',
tguillon's avatar
tguillon committed
30
    ];
31

tguillon's avatar
tguillon committed
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.
tguillon's avatar
tguillon committed
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_SOUSTRAITANT_TRAITEMENT]);
        } else {
            $this->Droits->assertAuthorized([ListeDroit::GESTION_SOUSTRAITANT]);
        }
46
47
48
49
50
51
52
53
54
55
    }

    /**
     * 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 = [
56
57
            'contain' => [
                'Organisation' => [
58
                    'id',
59
60
                    'raisonsociale',
                    'order' => ['raisonsociale']
61
62
63
64
                ],
                'Fiche'=> [
                    'id'
                ],
65
            ],
66
            'conditions' => [],
67
            'order' => [
68
                'Soustraitant.raisonsocialestructure ASC'
69
            ]
70
        ];
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

        // Applications des filtres
        if ($this->request->is('post')) {
            if ($this->request->params['action'] === 'index') {
                // Filtrer par entité associée
                if (!empty($this->request->data['Filtre']['organisation'])) {
                    $paginate['conditions'][] = $this->Soustraitant->getConditionOrganisation($this->request->data['Filtre']['organisation']);
                }
                // Filtrer par entité créatrice
                $createdbyorganisation = (string)Hash::get($this->request->data, 'Filtre.createdbyorganisation');
                if ($createdbyorganisation !== '') {
                    $paginate['conditions'][] = ['Soustraitant.createdbyorganisation' => $createdbyorganisation];
                }
            }

            $filters = [
                // Filtrer par raison sociale (du sous-traitant)
88
                'Filtre.raisonsociale' => 'Soustraitant.raisonsocialestructure',
89
                // Filtrer par numéro SIRET (du sous-traitant)
90
                'Filtre.siret' => 'Soustraitant.siretstructure',
91
                // Filtrer par code APE (du sous-traitant)
92
                'Filtre.ape' => 'Soustraitant.apestructure',
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
            ];
            foreach ($filters as $filter => $path) {
                $value = (string)Hash::get($this->request->data, $filter);
                if ($value !== '') {
                    $paginate['conditions'][$path] = $value;
                }
            }
        }

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

        $this->paginate = $paginate;
        return $this->paginate($this->Soustraitant);
    }

    /**
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
    public function index() {
        $this->set('title', __d('soustraitant', 'soustraitant.titreGestionSoustraitantApplication'));

tguillon's avatar
tguillon committed
120
121
        if ($this->request->is('post')) {
            // Affectation
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
            if (!empty($this->request->data['SoustraitantOrganisation']['organisation_id']) && isset($this->request->data['SoustraitantOrganisation']) === true) {
                $success = true;
                $this->Soustraitant->SoustraitantOrganisation->Organisation->begin();

                $organisations_ids = Hash::extract($this->request->data, 'SoustraitantOrganisation.organisation_id');
                $soustraitants_ids = Hash::extract($this->request->data, 'SoustraitantOrganisation.soustraitant_id');
                foreach ($organisations_ids as $organisation_id) {
                    $soustraitantEntite = $this->Soustraitant->SoustraitantOrganisation->find('list', [
                        'conditions' => [
                            'organisation_id' => $organisation_id
                        ],
                        'fields' => [
                            'soustraitant_id'
                        ]
                    ]);
137

138
                    $diff = array_diff($soustraitantEntite, $soustraitants_ids);
139

140
141
                    if (!empty($diff)) {
                        $resultSoustraitant = array_merge($soustraitants_ids, $soustraitantEntite);
142
                    } else {
143
                        $resultSoustraitant = $soustraitants_ids;
144
                    }
tguillon's avatar
tguillon committed
145

146
147
148
149
150
151
                    $data = [
                       'Organisation' => [
                           'id' => $organisation_id,
                       ],
                        'Soustraitant' => [
                            'Soustraitant' => $resultSoustraitant
tguillon's avatar
tguillon committed
152
153
                        ]
                    ];
154
155
156
157
158
159
160
161
162
                    $success = $success && false !== $this->Soustraitant->SoustraitantOrganisation->Organisation->save($data, ['atomic' => false]);
                }

                if ($success === true) {
                    $this->Soustraitant->SoustraitantOrganisation->Organisation->commit();
                    $this->Session->setFlash(__d('soustraitant', 'soustraitant.flashsuccessSousTraitantAffecterEnregistrer'), 'flashsuccess');
                } else {
                    $this->Soustraitant->SoustraitantOrganisation->Organisation->rollback();
                    $this->Session->setFlash(__d('soustraitant', 'soustraitant.flasherrorErreurEnregistrementSousTraitantAffecter'), 'flasherror');
tguillon's avatar
tguillon committed
163
                }
164
165

                unset($this->request->data['SoustraitantOrganisation']);
tguillon's avatar
tguillon committed
166
            }
167
        }
168

169
        $this->set([
170
            'mesOrganisations' => $this->WebcilUsers->mesOrganisations('list'),
171
172
173
            'options' => $this->_optionsFiltre(),
            'soustraitants' => $this->_getSearchResults(),
        ]);
174
    }
175
176
177
178
179
180
181
182

    /**
     * Retourne les options à utiliser dans les formulaires de recherche.
     *
     * @param int|null $organisation_id
     * @return array
     */
    protected function _optionsFiltre($organisation_id = null) {
tguillon's avatar
tguillon committed
183
        $options = [
184
            'apestructure' => $this->Soustraitant->getStringOptionList('apestructure', $organisation_id),
185
            'organisations' => $this->Soustraitant->Organisation->find('list', ['order' => ['Organisation.raisonsociale ASC']]),
186
187
            'raisonsocialestructure' => $this->Soustraitant->getStringOptionList('raisonsocialestructure', $organisation_id),
            'siretstructure' => $this->Soustraitant->getStringOptionList('siretstructure', $organisation_id),
tguillon's avatar
tguillon committed
188
189
        ];

190
        return $options;
tguillon's avatar
tguillon committed
191
    }
192

tguillon's avatar
tguillon committed
193
    /**
194
     *
tguillon's avatar
tguillon committed
195
196
197
198
199
200
201
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
    public function entite() {
        $this->set('title', __d('soustraitant', 'soustraitant.titreGestionSoustraitantEntitee'));
202

203
204
205
206
        $this->set([
            'options' => $this->_optionsFiltre($this->Session->read('Organisation.id')),
            'soustraitants' => $this->_getSearchResults(),
        ]);
tguillon's avatar
tguillon committed
207
208
209
    }

    /**
210
211
     * Fonction qui permet l'ajout d'un nouveau sous-traitant
     *
tguillon's avatar
tguillon committed
212
213
214
215
216
217
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 20/12/2017
     * @version V1.0.0
     */
    public function add() {
218
        $this->edit(null);
tguillon's avatar
tguillon committed
219
    }
220

tguillon's avatar
tguillon committed
221
    /**
222
223
     * Fonction qui permet la modification d'un sous-traitant
     *
tguillon's avatar
tguillon committed
224
225
226
227
228
229
     * @param int $id
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 20/12/2017
     * @version V1.0.0
     */
230
    public function edit($id) {
231
        if (in_array($this->request->params['action'], ['add', 'ajax_add'])) {
232
233
234
235
            $this->set('title', __d('soustraitant', 'soustraitant.titreAjouterSoustraitant'));
        } else {
            $soustraitant = $this->Droits->getAndCheckLinkedOrganisationsRecord('Soustraitant', $id, false);
            $this->set('title', __d('soustraitant', 'soustraitant.titreModificationSoustraitant'));
tguillon's avatar
tguillon committed
236
        }
237

238
239
        $cannotModified = false;

tguillon's avatar
tguillon committed
240
241
242
243
        if ($this->request->is('post') || $this->request->is('put')) {
            if ('Cancel' === Hash::get($this->request->data, 'submit')) {
                $this->redirect($this->Referers->get());
            }
244

245
            if (in_array($this->request->params['action'], ['add', 'ajax_add'])) {
246
247
248
249
                $data = $this->request->data;
                $data['Soustraitant']['createdbyorganisation'] = $this->Droits->isSu() ? null : $this->Session->read('Organisation.id');
            } else {
                $data = $this->request->data;
250
251
252
253
254
255
256
257
258
259
260
261

                $soustraitantUseInFiche = $this->Soustraitance->find('all', [
                    'conditions' => [
                        'soustraitant_id' => $id
                    ]
                ]);

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

262
263
                foreach (['id', 'createdbyorganisation'] as $fieldName) {
                    $data['Soustraitant'][$fieldName] = $soustraitant['Soustraitant'][$fieldName];
tguillon's avatar
tguillon committed
264
265
                }
            }
266

267
268
269
            $success = true;
            $this->Soustraitant->begin();

270
            $this->Soustraitant->create($data);
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
            $success = $success && false !== $this->Soustraitant->save(null, ['atomic' => true]);

            if ($success == true) {
                $this->Soustraitant->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->Soustraitant->getLastInsertID()]));
                    return $this->response->statusCode(201);
                } else {
                    $this->Session->setFlash(__d('soustraitant', 'soustraitant.flashsuccessSaveSoustraitant'), 'flashsuccess');
                    $this->redirect($this->Referers->get());
                }
tguillon's avatar
tguillon committed
287
            } else {
288
                $this->Soustraitant->rollback();
289
                $this->Session->setFlash(__d('soustraitant', 'soustraitant.flasherrorSaveSoustraitant'), 'flasherror');
tguillon's avatar
tguillon committed
290
            }
291
292
293
294
        } elseif ($this->request->params['action'] === 'add') {
            $this->request->data['Organisation']['Organisation'] = $this->Droits->isSu() ? null : $this->Session->read('Organisation.id');
        } else {
            $this->request->data = $soustraitant;
295
296
297
298
299
300
301
302
303
304

            $soustraitantUseInFiche = $this->Soustraitance->find('all', [
                'conditions' => [
                    'soustraitant_id' => $id
                ]
            ]);

            if (!empty($soustraitantUseInFiche)) {
                $cannotModified = true;
            }
tguillon's avatar
tguillon committed
305
        }
306

307
        $mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
308
        $this->set(compact('mesOrganisations', 'cannotModified'));
309

310
311
312
313
314
        if ($this->request->params['action'] === 'ajax_add') {
            $this->view = 'ajax_add';
        } else  {
            $this->view = 'edit';
        }
tguillon's avatar
tguillon committed
315
    }
316

tguillon's avatar
tguillon committed
317
318
    /**
     * Permet la visualisation des informations d'un sous-traitant
319
320
321
     *
     * @param int $id | Id du sous-traitant
     *
tguillon's avatar
tguillon committed
322
323
324
325
326
327
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
    public function show($id) {
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
        $this->set('title', __d('soustraitant', 'soustraitant.titreVisualisationSoustraitant'));

        $query = [
            'fields' => $this->Soustraitant->fields(),
            'contain' => [
                'Organisation' => [
                    'fields' => [
                        'id'
                    ]
                ]
            ],
            'conditions' => [
                'Soustraitant.id' => $id
            ]
        ];
        $record = $this->Soustraitant->find('first', $query);

        if (empty($record) === true) {
            throw new NotFoundException();
tguillon's avatar
tguillon committed
347
348
        }

349
350
351
        if ('Back' === Hash::get($this->request->data, 'submit')) {
            $this->redirect($this->Referers->get());
        }
352
353
354
355
356

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

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

357
        $mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
tguillon's avatar
tguillon committed
358
        $this->set(compact('mesOrganisations'));
359
        $this->set('cannotModified', false);
360
361

        $this->view = 'edit';
tguillon's avatar
tguillon committed
362
    }
363

tguillon's avatar
tguillon committed
364
365
    /**
     * Permet de supprimer un sous-traitant
366
367
368
     *
     * @param int $id | Id du sous-traitant
     *
tguillon's avatar
tguillon committed
369
370
371
372
373
374
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
    public function delete($id) {
375
376
        $this->Droits->getAndCheckLinkedOrganisationsRecord('Soustraitant', $id, true);

377
378
379
380
381
        $soustraitantUseInFiche = $this->Soustraitance->find('all', [
            'conditions' => [
                'soustraitant_id' => $id
            ]
        ]);
382

383
384
385
386
387
388
389
390
391
392
        if (empty($responsableUseInFiche)) {
            $this->Soustraitant->begin();

            if (false !== $this->Soustraitant->delete($id)) {
                $this->Soustraitant->commit();
                $this->Session->setFlash(__d('soustraitant', 'soustraitant.flashsuccessSuppressionSoustraitantEntite'), 'flashsuccess');
            } else {
                $this->Soustraitant->rollback();
                $this->Session->setFlash(__d('soustraitant', 'soustraitant.flasherrorErreurSuppressionSoustraitantEntite'), 'flasherror');
            }
tguillon's avatar
tguillon committed
393
        } else {
394
            $this->Session->setFlash(__d('soustraitant', 'soustraitant.flasherrorErreurCannotDeleteSoustraitantUseFiche'), 'flasherror');
tguillon's avatar
tguillon committed
395
        }
396

tguillon's avatar
tguillon committed
397
398
        $this->redirect($this->Referers->get());
    }
399

tguillon's avatar
tguillon committed
400
    /**
401
402
403
     * Fonction qui permet de supprimer un sous-traitant liée à l'entité
     *
     * @param int $id
tguillon's avatar
tguillon committed
404
405
406
407
408
     * @author Théo GUILLON <theo.guillon@libriciel.coop>
     * @access public
     * @created 12/04/2018
     * @version v1.0.0
     */
409
410
    public function dissocierSoustraitant($id) {
        $this->Droits->assertRecordAuthorized('Soustraitant', $id, ['superadmin' => true]);
tguillon's avatar
tguillon committed
411

412
413
414
        $this->Soustraitant->begin();

        $success = false !== $this->Soustraitant->SoustraitantOrganisation->deleteAll([
415
            'SoustraitantOrganisation.organisation_id' => $this->Session->read('Organisation.id'),
416
            'SoustraitantOrganisation.soustraitant_id' => $id
tguillon's avatar
tguillon committed
417
418
419
        ]);

        if ($success == true) {
420
            $this->Soustraitant->commit();
tguillon's avatar
tguillon committed
421
422
            $this->Session->setFlash(__d('soustraitant', 'soustraitant.flashsuccessDissocierSoustraitantEntite'), 'flashsuccess');
        } else {
423
            $this->Soustraitant->rollback();
tguillon's avatar
tguillon committed
424
425
            $this->Session->setFlash(__d('soustraitant', 'soustraitant.flasherrorErreurDissocierSoustraitantEntite'), 'flasherror');
        }
426

tguillon's avatar
tguillon committed
427
428
        $this->redirect($this->Referers->get());
    }
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448

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

            $this->layout  = 'ajax';
            $this->request->data = $data;
            $this->add();
        }
    }
tguillon's avatar
tguillon committed
449
}