InscriptionAction.php 15.4 KB
Newer Older
François Agneray's avatar
François Agneray committed
1
<?php
2
3
4
5
6
7
8
9
10
11

/*
 * This file is part of JDEV-BOARDING
 *
 * (c) François Agneray <francois.agneray@lam.fr>
 * (c) Chrystel Moreau <chrystel.moreau@lam.fr>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
François Agneray's avatar
François Agneray committed
12
13
14
15
16
17
18
19
20
21
namespace App\Action;

use Slim\Views\Twig;
use Psr\Log\LoggerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

final class InscriptionAction
{
François Agneray's avatar
François Agneray committed
22
23
    private $view;
    private $logger;
François Agneray's avatar
François Agneray committed
24
    private $em;
25
    private $mailer;
26
    private $settings;
François Agneray's avatar
François Agneray committed
27
28
29
30
31

    public function __construct(Twig $view, LoggerInterface $logger, EntityManagerInterface $em, $mailer, $settings)
    {
        $this->view = $view;
        $this->logger = $logger;
François Agneray's avatar
François Agneray committed
32
        $this->em = $em;
33
        $this->mailer = $mailer;
34
        $this->settings = $settings;
François Agneray's avatar
François Agneray committed
35
36
37
    }

    public function __invoke(Request $request, Response $response, $args)
François Agneray's avatar
François Agneray committed
38
39
40
    {
        $this->logger->info("Inscription action dispatched");
        
François Agneray's avatar
François Agneray committed
41
        if ($request->isGet()) {
42
            $organismesRepository = $this->em->getRepository('App\Entity\Organisme');
43
44
            //$organismes = $organismesRepository->findAll(array('order'=>'label ASC'));
            $organismes = $organismesRepository->findBy(array(), array('label' => 'ASC'));
45
46
47
48
49
50
51
52
53
54

            $reseauxRepository = $this->em->getRepository('App\Entity\Reseau');
            $reseaux1 = $reseauxRepository->findBy(array('display' => 1));
            $reseaux2 = $reseauxRepository->findBy(array('display' => 2));
            $reseaux3 = $reseauxRepository->findBy(array('display' => 3));

            $communauteRepository = $this->em->getRepository('App\Entity\Communaute');
            $communaute1 = $communauteRepository->findBy(array('display' => 1));
            $communaute2 = $communauteRepository->findBy(array('display' => 2));
            $communaute3 = $communauteRepository->findBy(array('display' => 3));
55
56
57
58
            
            $contributionsRepository = $this->em->getRepository('App\Entity\Contribution');
            $contributions = $contributionsRepository->findAll();

59

François Agneray's avatar
François Agneray committed
60
            $this->view->render($response, 'inscription.twig', [
61
                'page' => 'inscription',
62
63
64
65
66
67
                'organismes' => $organismes,
                'reseaux1' => $reseaux1,
                'reseaux2' => $reseaux2,
                'reseaux3' => $reseaux3,
                'communaute1' => $communaute1,
                'communaute2' => $communaute2,
68
                'communaute3' => $communaute3,
69
                'contributions' => $contributions,
70
                'jdev' => $this->settings['jdev']
François Agneray's avatar
François Agneray committed
71
72
73
            ]);
        }
        
François Agneray's avatar
François Agneray committed
74
        if ($request->isPost()) {
75
            $parsedBody = $request->getParsedBody();
76

77
78
79
            $error = false;
            $code = 200;
            $messages = array();
François Agneray's avatar
François Agneray committed
80
            
81
            $mandatoryFields = array(
François Agneray's avatar
François Agneray committed
82
83
84
85
86
87
88
89
90
91
                'nom',
                'prenom',
                'email',
                'password',
                'statut',
                'emploi',
                'organisme',
                'unite',
                'role',
                'region',
92
93
94
                'type_inscription'
            );

François Agneray's avatar
François Agneray committed
95
            foreach ($mandatoryFields as $a) {
96
                if ($this->isEmptyField($a, $parsedBody)) {
97
98
99
100
101
                    $error = true;
                    $code = 400;
                    $messages[] = 'Champ ' . $a . ' vide';
                }
            }
102
103

            if (!$this->verifEmail($parsedBody)) {
104
105
                $error = true;
                $code = 400;
106
                $messages[] = 'L\'adresse email renseignée est incorrecte';
107
            }
108
109

            if (!$this->verifExistParticipant($parsedBody)) {
110
111
                $error = true;
                $code = 400;
112
                $messages[] = 'L\'adresse email . ' . $parsedBody['email'] . ' est déjà utilisée';
113
            }
114

François Agneray's avatar
François Agneray committed
115
            if (!$this->verifStatut($parsedBody)) {
116
117
                $error = true;
                $code = 400;
118
                $messages[] = 'Le statut ' . $parsedBody['statut'] . ' sélectionné n\'est pas valide';
119
120
            }

121
122
123
            if (!$this->verifEmploi($parsedBody)) {
                $error = true;
                $code = 400;
124
                $messages[] = 'L\'emploi ' . $parsedBody['emploi'] . ' sélectionné n\'est pas valide';
125
126
127
128
129
            }

            if (!($organisme = $this->verifOrganisme($parsedBody))) {
                $error = true;
                $code = 400;
130
                $messages[] = 'L\'identifiant de l\'organiisme ' . $parsedBody['organisme'] . ' sélectionné n\'est pas valide';
131
132
133
134
135
            }

            if (!$this->verifRole($parsedBody)) {
                $error = true;
                $code = 400;
136
                $messages[] = 'Le rôle ' . $parsedBody['role'] . ' sélectionné n\'est pas valide';
137
138
139
140
141
            }

            if (!$this->verifRegion($parsedBody)) {
                $error = true;
                $code = 400;
142
                $messages[] = 'La région ' . $parsedBody['region'] . ' sélectionnée n\'est pas valide';
143
144
145
146
147
            }

            if (!$this->verifTypeInscription($parsedBody)) {
                $error = true;
                $code = 400;
148
                $messages[] = 'Le type d\'inscription ' . $parsedBody['type_inscription'] . ' sélectionné n\'est pas valide';
149
150
151
            }

            if ($error) {
152
153
                $response = $response->write(implode(PHP_EOL, $messages))->withStatus($code);
            } else {
154
                $participant = $this->createParticipant($parsedBody, $organisme);
François Agneray's avatar
François Agneray committed
155
                $this->sendEmail($request, $participant);
156
157
                $response = $response->write('Nouvel utilisateur enregistré')->withStatus(201);
            }
François Agneray's avatar
François Agneray committed
158
159
160
161
        }
        
        return $response;
    }
162
163
164
    
    private function isEmptyField($field, $parsedBody)
    {
François Agneray's avatar
François Agneray committed
165
        if (!isset($parsedBody[$field]) || empty($parsedBody[$field])) {
166
167
168
169
170
            return true;
        } else {
            return false;
        }
    }
171
172

    private function verifEmail($parsedBody)
173
    {
François Agneray's avatar
François Agneray committed
174
        if ($this->isEmptyField('email', $parsedBody)) {
175
            return true;
176
177
        }
        
178
        if (filter_var($parsedBody['email'], FILTER_VALIDATE_EMAIL)) {
179
180
181
182
183
            return true;
        } else {
            return false;
        }
    }
184
185

    private function verifExistParticipant($parsedBody)
186
    {
François Agneray's avatar
François Agneray committed
187
        if ($this->isEmptyField('email', $parsedBody)) {
188
            return false;
189
190
        }
        
François Agneray's avatar
François Agneray committed
191
        $participant = $this->em->getRepository('App\Entity\Participant')->findOneBy(array('email' => strtolower($parsedBody['email'])));
François Agneray's avatar
François Agneray committed
192
        if (isset($participant)) {
193
194
195
196
197
            return false;
        } else {
            return true;
        }
    }
198
199

    private function verifStatut($parsedBody)
200
    {
François Agneray's avatar
François Agneray committed
201
        switch ($parsedBody['statut']) {
202
203
204
205
206
207
208
            case 'ETUDIANT':
            case 'ACADEMIQUE':
            case 'INDUSTRIEL':
                $bool = true;
                break;
            default:
                $bool = false;
209
        }
210
211
212
213
214
        return $bool;
    }

    private function verifEmploi($parsedBody)
    {
François Agneray's avatar
François Agneray committed
215
        switch ($parsedBody['emploi']) {
François Agneray's avatar
François Agneray committed
216
            case 'Doctorant':
217
218
219
220
221
222
223
224
225
226
227
            case 'Technicien':
            case 'Ingénieur':
            case 'Chercheur':
            case 'Enseignant-Chercheur':
            case 'Post-Doctorant':
            case 'Stagiaire':
            case 'Autre':
                $bool = true;
                break;
            default:
                $bool = false;
228
        }
229
        return $bool;
230
    }
231
232

    private function verifOrganisme($parsedBody)
233
    {
François Agneray's avatar
François Agneray committed
234
        if ($this->isEmptyField('organisme', $parsedBody)) {
235
236
237
            return false;
        }

238
        $organisme = $this->em->find('App\Entity\Organisme', $parsedBody['organisme']);
François Agneray's avatar
François Agneray committed
239
        if (!isset($organisme)) {
240
241
242
243
244
245
246
247
            return false;
        } else {
            return $organisme;
        }
    }

    private function verifRole($parsedBody)
    {
François Agneray's avatar
François Agneray committed
248
        switch ($parsedBody['role']) {
249
250
251
252
253
254
255
256
257
258
259
260
261
            case 'Participant':
            case 'Accompagnant':
            case 'Organisateur':
            case 'Invité':
            case 'Exposant':
            case 'Sponsor':
                $bool = true;
                break;
            default:
                $bool = false;
        }
        return $bool;
    }
262

263
264
    private function verifRegion($parsedBody)
    {
François Agneray's avatar
François Agneray committed
265
        switch ($parsedBody['region']) {
266
267
268
            case 'Auvergne-Rhône-Alpes':
            case 'Bourgogne-Franche-Comté':
            case 'Bretagne':
François Agneray's avatar
François Agneray committed
269
            case 'Centre-Val-de-Loire':
270
            case 'Corse':
271
            case 'Grand-Est':
François Agneray's avatar
François Agneray committed
272
            case 'Hauts-de-France':
273
            case 'Ile-de-France':
François Agneray's avatar
François Agneray committed
274
            case 'Nouvelle-Aquitaine':
275
            case 'Normandie':
276
277
278
            case 'Occitanie':
            case 'Outre-Mer':
            case 'Pays-de-la-Loire':
François Agneray's avatar
François Agneray committed
279
            case 'Provence-Alpes-Côte d\'Azur':
280
281
282
283
284
285
286
287
288
289
                $bool = true;
                break;
            default:
                $bool = false;
        }
        return $bool;
    }

    private function verifTypeInscription($parsedBody)
    {
François Agneray's avatar
François Agneray committed
290
        switch ($parsedBody['type_inscription']) {
291
            case 'PASS COMPLET':
292
            case 'PASS SOUTIEN':
293
294
            case 'PASS LIBRE':
            case 'PASS ACCOMPAGNANT':
295
            case 'PASS ORGA':
296
297
            case 'PASS INVITE':
            case 'PASS SPONSOR':
François Agneray's avatar
François Agneray committed
298
            case 'PASS EXPOSANT':
299
300
301
302
303
304
305
306
307
308
                $bool = true;
                break;
            default:
                $bool = false;
        }
        return $bool;
    }
    
    private function createParticipant($parsedBody, $organisme)
    {
309
        $participant = new \App\Entity\Participant();
310

311
        $participant->setNom($parsedBody['nom']);
312
        $participant->setPrenom($parsedBody['prenom']);
François Agneray's avatar
François Agneray committed
313
        $participant->setEmail(strtolower($parsedBody['email']));
314
        $participant->setPassword(password_hash($parsedBody['password'], PASSWORD_DEFAULT));
315
316
        $participant->setStatut($parsedBody['statut']);
        $participant->setEmploi($parsedBody['emploi']);
317
318
        $participant->setOrganisme($organisme);
        $participant->setUnite($parsedBody['unite']);
319
        $participant->setRole($parsedBody['role']);
320
321
        $participant->setRegion($parsedBody['region']);
        $participant->setTypeInscription($parsedBody['type_inscription']);
322
323
324
325
326
327
328
329
330
331
332
333
334
        $participant->setRegimeAlimentaire($parsedBody['regime_alimentaire']);
        // Si le participant est une personne à mobilité reduite
        if (isset($parsedBody['mobilite_reduite']) && $parsedBody['mobilite_reduite'] == 'on') {
            $participant->setMobiliteReduite(true);
        } else {
            $participant->setMobiliteReduite(false);
        }
        // Si le participant demande un code wi-fi
        if (isset($parsedBody['acces_wifi']) && $parsedBody['acces_wifi'] == 'on') {
            $participant->setCodeWifi(true);
        } else {
            $participant->setCodeWifi(false);
        }
335
336
337
338
339
340
341
342
343
344
345
346
        // Si le participant veut être inscrit à la mailing list
        if (isset($parsedBody['mailing_list']) && $parsedBody['mailing_list'] == 'on') {
            $participant->setMailingList(true);
        } else {
            $participant->setMailingList(false);
        }
        // Si le participant veut se rendre à l'événement social
        if (isset($parsedBody['evenement_social']) && $parsedBody['evenement_social'] == 'on') {
            $participant->setEvenementSocial(true);
        } else {
            $participant->setEvenementSocial(false);
        }
347
        $participant->setDateInscription(new \DateTime("now"));
348
        $participant->setCleEmail(uniqid('', true)); // Clé activation pour verification email
François Agneray's avatar
François Agneray committed
349
        $participant->setEmailValide(false); // Attente URL activation
350
351
352
353
354
        if ($parsedBody['role'] == 'Participant' || $parsedBody['role'] == 'Accompagnant') {
            $participant->setCloValide(true); // True si participant ou accompagnant
        } else {
            $participant->setCloValide(false); // False sinon; Besoin d'une activation d'un admin
        }
355
356
        $participant->setAccesValide(false); // Nécessite le paiement AC des droits d'inscription ou place pré-payé (voir ValidEmailAction)
        $participant->setPassPrepaye(false); // Le participant n'est pas pris en charge par son organisme
357
        
358
        $this->em->persist($participant);
359
360
361
        $this->createContributions($parsedBody, $participant);
        $this->createReseaux($parsedBody, $participant);
        $this->createCommunautes($parsedBody, $participant);
362
        $this->em->flush();
363

364
365
        return $participant;
    }
366
367
368

    private function createContributions($parsedBody, $participant)
    {
369
        for ($i = 1; $i <= 7; $i++) {
370
            if (isset($parsedBody['contribution_' . $i]) && $parsedBody['contribution_' . $i] == 'on') {
371
372
373
374
375
376
377
378
                $contribution = $this->em->find('App\Entity\Contribution', $i);
                $participantContribution = new \App\Entity\ParticipantContribution();
                $participantContribution->setParticipant($participant);
                $participantContribution->setContribution($contribution);
                $this->em->persist($participantContribution);
            }
        }
    }
379
    
380
381
    private function createReseaux($parsedBody, $participant)
    {
382
        for ($i = 1; $i <= 39; $i++) {
383
384
385
386
387
388
389
390
391
392
393
394
            if (isset($parsedBody['reseau_' . $i]) && $parsedBody['reseau_' . $i] == 'on') {
                $reseau = $this->em->find('App\Entity\Reseau', $i);
                $participantReseau = new \App\Entity\ParticipantReseau();
                $participantReseau->setParticipant($participant);
                $participantReseau->setReseau($reseau);
                $this->em->persist($participantReseau);
            }
        }
    }

    private function createCommunautes($parsedBody, $participant)
    {
395
        for ($i = 1; $i <= 16; $i++) {
396
397
            if (isset($parsedBody['communaute_' . $i]) && $parsedBody['communaute_' . $i] == 'on') {
                $communaute = $this->em->find('App\Entity\Communaute', $i);
398
399
400
401
                $participantCommunaute = new \App\Entity\ParticipantCommunaute();
                $participantCommunaute->setParticipant($participant);
                $participantCommunaute->setCommunaute($communaute);
                $this->em->persist($participantCommunaute);
402
403
404
405
            }
        }
    }

François Agneray's avatar
François Agneray committed
406
    private function sendEmail($request, $participant)
407
    {
François Agneray's avatar
François Agneray committed
408
409
410
411
        $url  = $request->getUri()->getScheme() . '://' . $request->getUri()->getHost();
        if ($request->getUri()->getPort() != 80) {
            $url .= ':' . $request->getUri()->getPort();
        }
François Agneray's avatar
François Agneray committed
412
        $url .= '/valid-email?email=' . $participant->getEmail() . '&key=' . $participant->getCleEmail();
François Agneray's avatar
François Agneray committed
413

François Agneray's avatar
François Agneray committed
414
415
416
417
418
419
420
        $body  = 'Bonjour ' . $participant->getPrenom() . ' ' . $participant->getNom() . PHP_EOL;
        $body .= PHP_EOL;
        $body .= 'Afin d\'activer votre compte, veuillez cliquer sur le lien ';
        $body .= 'ci-dessous pour vérifier votre adresse e-mail : ' . PHP_EOL;
        $body .= $url . PHP_EOL;
        $body .= PHP_EOL;
        $body .= 'Bien cordialement' . PHP_EOL;
421
        $body .= 'Le comité d\'organisation des ' . $this->settings['jdev']['label'];
François Agneray's avatar
François Agneray committed
422

François Agneray's avatar
François Agneray committed
423
        $message = \Swift_Message::newInstance('Confirmation inscription aux ' . $this->settings['jdev']['label'])
424
            ->setFrom(['noreply@' . $this->settings['jdev']['url'] => $this->settings['jdev']['url']])
François Agneray's avatar
François Agneray committed
425
            ->setTo([$participant->getEmail()])
François Agneray's avatar
François Agneray committed
426
            ->setBody($body);
427
428
            
        $this->mailer->send($message);
429
    }
François Agneray's avatar
François Agneray committed
430
}