Passed
Push — master ( bee307...3712bb )
by Marcel
08:35 queued 35s
created

addBulkForStudentsWithoutParent()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 33
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
cc 7
eloc 20
c 0
b 0
f 0
nc 5
nop 3
dl 0
loc 33
ccs 0
cts 5
cp 0
crap 56
rs 8.6666
1
<?php
2
3
namespace App\Controller;
4
5
use App\Entity\RegistrationCode;
6
use App\Entity\User;
7
use App\Form\RegistrationCodeBulkStudentsWithoutParentAccountType;
8
use App\Form\RegistrationCodeBulkType;
9
use App\Form\RegistrationCodeType;
10
use App\Repository\RegistrationCodeRepositoryInterface;
11
use App\Repository\UserRepositoryInterface;
12
use App\Security\Registration\CodeGenerator;
13
use League\Csv\Writer;
14
use SchulIT\CommonBundle\Form\ConfirmType;
15
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
16
use Symfony\Component\HttpFoundation\HeaderUtils;
17
use Symfony\Component\HttpFoundation\Request;
18
use Symfony\Component\HttpFoundation\Response;
19
use Symfony\Component\Routing\Annotation\Route;
20
use Symfony\Contracts\Translation\TranslatorInterface;
21
22
/**
23
 * @Route("/registration_codes")
24
 */
25
class RegistrationCodeController extends AbstractController {
26
27
    private const CodesPerPage = 25;
28
29
    private $repository;
30
31
    public function __construct(RegistrationCodeRepositoryInterface $repository) {
32
        $this->repository = $repository;
33
    }
34
35
    /**
36
     * @Route("", name="registration_codes")
37
     */
38
    public function index(Request $request, UserRepositoryInterface $userRepository) {
39
        $query = $request->query->get('q');
40
        $page = $request->query->getInt('page');
41
        $grade = $request->query->get('grade');
42
43
        $grades = $userRepository->findGrades();
44
45
        if(!in_array($grade, $grades)) {
46
            $grade = null;
47
        }
48
49
        $paginator = $this->repository->getPaginatedUsers(static::CodesPerPage, $page, $query, $grade);
50
        $pages = 1;
51
        if($paginator->count() > 0) {
52
            $pages = ceil((float)$paginator->count() / static::CodesPerPage);
53
        }
54
55
        return $this->render('codes/index.html.twig', [
56
            'codes' => $paginator->getIterator(),
57
            'page' => $page,
58
            'pages' => $pages,
59
            'query' => $query,
60
            'grade' => $grade,
61
            'grades' => $grades
62
        ]);
63
    }
64
65
    /**
66
     * @Route("/export", name="export_codes")
67
     */
68
    public function export(Request $request, UserRepositoryInterface $userRepository, TranslatorInterface $translator) {
69
        $grade = $request->query->get('grade');
70
71
        $grades = $userRepository->findGrades();
72
73
        if(!in_array($grade, $grades)) {
74
            $grade = null;
75
        }
76
77
        if($grade !== null) {
78
            $filename = sprintf('codes_%s.csv', $grade);
79
            $codes = $this->repository->findByGrade($grade);
80
        } else {
81
            $filename = 'codes.csv';
82
            $codes = $this->repository->findAll();
83
        }
84
85
        $csv = Writer::createFromString();
86
        $csv->setDelimiter(';');
87
        $csv->setOutputBOM(Writer::BOM_UTF8);
88
        $csv->insertOne([
89
            $translator->trans('label.firstname'),
90
            $translator->trans('label.lastname'),
91
            $translator->trans('label.code'),
92
            $translator->trans('label.grade'),
93
            $translator->trans('codes.redeemed')
94
        ]);
95
96
        foreach($codes as $code) {
97
            $csv->insertOne([
98
                $code->getStudent()->getFirstname(),
99
                $code->getStudent()->getLastname(),
100
                $code->getCode(),
101
                $code->getStudent()->getGrade(),
102
                $code->getRedeemingUser() !== null ? $translator->trans('yes') : $translator->trans('no')
103
            ]);
104
        }
105
106
        $response = new Response(
107
            $csv->toString(),
108
            Response::HTTP_OK,
109
            [
110
                'Content-Type' => 'application/csv'
111
            ]);
112
113
        $disposition = HeaderUtils::makeDisposition(
114
            HeaderUtils::DISPOSITION_ATTACHMENT,
115
            $filename
116
        );
117
118
        $response->headers->set('Content-Disposition', $disposition);
119
120
        return $response;
121
    }
122
123
    /**
124
     * @Route("/remove/redeemed", name="remove_redeemed_codes")
125
     */
126
    public function removeRedeemed(Request $request) {
127
        $form = $this->createForm(ConfirmType::class, null, [
128
            'message' => 'codes.remove_redeemed.confirm'
129
        ]);
130
        $form->handleRequest($request);
131
132
        if($form->isSubmitted() && $form->isValid()) {
133
            $this->repository->removeRedeemed();
134
            $this->addFlash('success', 'codes.remove_redeemed.success');
135
            return $this->redirectToRoute('registration_codes');
136
        }
137
138
        return $this->render('codes/remove_redeemed.html.twig', [
139
            'form' => $form->createView()
140
        ]);
141
    }
142
143
    /**
144
     * @Route("/add", name="add_registration_code")
145
     */
146
    public function add(Request $request, UserRepositoryInterface $userRepository) {
147
        $code = new RegistrationCode();
148
149
        if(($studentUuid = $request->query->get('student')) !== null) {
150
            $code->setStudent($userRepository->findOneByUuid($studentUuid));
151
        }
152
153
        $form = $this->createForm(RegistrationCodeType::class, $code);
154
        $form->handleRequest($request);
155
156
        if($form->isSubmitted() && $form->isValid()) {
157
            $this->repository->persist($code);
158
            $this->addFlash('success', 'codes.add.success');
159
160
            return $this->redirectToRoute('registration_codes');
161
        }
162
163
        return $this->render('codes/add.html.twig', [
164
            'form' => $form->createView()
165
        ]);
166
    }
167
168
    /**
169
     * @Route("/bulk", name="add_registration_code_bulk")
170
     */
171
    public function addBulk(Request $request, UserRepositoryInterface $userRepository, CodeGenerator $codeGenerator) {
172
        $form = $this->createForm(RegistrationCodeBulkType::class);
173
        $form->handleRequest($request);
174
175
        if($form->isSubmitted() && $form->isValid()) {
176
            $grade = $form->get('grade')->getData();
177
            $users = $userRepository->findStudentsByGrade($grade);
178
            $count = 0;
179
180
            foreach($users as $user) {
181
                $code = (new RegistrationCode())
182
                    ->setCode($codeGenerator->generateCode())
183
                    ->setValidFrom($form->get('validFrom')->getData())
184
                    ->setStudent($user);
185
186
                $this->repository->persist($code);
187
                $count++;
188
            }
189
190
            $this->addFlash('success', 'codes.bulk.success');
191
            return $this->redirectToRoute('registration_codes', [
192
                'grade' => $grade
193
            ]);
194
        }
195
196
        return $this->render('codes/bulk.html.twig', [
197
            'form' => $form->createView()
198
        ]);
199
    }
200
201
    /**
202
     * @Route("/bulk/students_without_parent", name="add_registration_code_bulk_for_students_without_parent")
203
     */
204
    public function addBulkForStudentsWithoutParent(Request $request, UserRepositoryInterface $userRepository, CodeGenerator $codeGenerator) {
0 ignored issues
show
Unused Code introduced by
The parameter $userRepository is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

204
    public function addBulkForStudentsWithoutParent(Request $request, /** @scrutinizer ignore-unused */ UserRepositoryInterface $userRepository, CodeGenerator $codeGenerator) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
205
        $form = $this->createForm(RegistrationCodeBulkStudentsWithoutParentAccountType::class);
206
        $form->handleRequest($request);
207
208
        if($form->isSubmitted() && $form->isValid()) {
209
            /** @var User[] $users */
210
            $users = $form->get('students')->getData();
211
            $count = 0;
212
213
            foreach($users as $user) {
214
                if($user->getType() === null || $user->getType()->getAlias() !== 'student') {
215
                    continue;
216
                }
217
218
                if($this->repository->codeForStudentExists($user)) {
219
                    continue;
220
                }
221
222
                $code = (new RegistrationCode())
223
                    ->setCode($codeGenerator->generateCode())
224
                    ->setValidFrom($form->get('validFrom')->getData())
225
                    ->setStudent($user);
226
227
                $this->repository->persist($code);
228
                $count++;
229
            }
230
231
            $this->addFlash('success', 'codes.bulk_noparents.success');
232
            return $this->redirectToRoute('registration_codes');
233
        }
234
235
        return $this->render('codes/bulk_students_without_parents.html.twig', [
236
            'form' => $form->createView()
237
        ]);
238
    }
239
240
    /**
241
     * @Route("/{uuid}/edit", name="edit_registration_code")
242
     */
243
    public function edit(RegistrationCode $code, Request $request) {
244
        if($code->getRedeemingUser() !== null) {
245
            $this->addFlash('error', 'codes.edit.error.already_redeemed.message');
246
            return $this->redirectToRoute('registration_codes');
247
        }
248
249
        $form = $this->createForm(RegistrationCodeType::class, $code);
250
        $form->handleRequest($request);
251
252
        if($form->isSubmitted() && $form->isValid()) {
253
            $this->repository->persist($code);
254
255
            $this->addFlash('success', 'codes.edit.success');
256
257
            return $this->redirectToRoute('registration_codes');
258
        }
259
260
        return $this->render('codes/edit.html.twig', [
261
            'form' => $form->createView(),
262
            'code' => $code
263
        ]);
264
    }
265
266
    /**
267
     * @Route("/{uuid}/remove", name="remove_registration_code")
268
     */
269
    public function remove(RegistrationCode $code, Request $request) {
270
        $form = $this->createForm(ConfirmType::class, [], [
271
            'message' => 'codes.remove.confirm',
272
            'message_parameters' => [
273
                '%code%' => $code->getCode()
274
            ]
275
        ]);
276
        $form->handleRequest($request);
277
278
        if($form->isSubmitted() && $form->isValid()) {
279
            $this->repository->remove($code);
280
281
            $this->addFlash('success', 'codes.remove.success');
282
            return $this->redirectToRoute('registration_codes');
283
        }
284
285
        return $this->render('codes/remove.html.twig', [
286
            'code' => $code,
287
            'form' => $form->createView()
288
        ]);
289
    }
290
291
}