GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — user-entity ( e0a2c2...8f70fe )
by Luis Ramón
03:27
created

GroupController::groupDetailIndexAction()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 26
rs 8.8571
cc 1
eloc 15
nc 1
nop 2
1
<?php
2
/*
3
  ÁTICA - Aplicación web para la gestión documental de centros educativos
4
5
  Copyright (C) 2015-2016: Luis Ramón López López
6
7
  This program is free software: you can redistribute it and/or modify
8
  it under the terms of the GNU Affero General Public License as published by
9
  the Free Software Foundation, either version 3 of the License, or
10
  (at your option) any later version.
11
12
  This program is distributed in the hope that it will be useful,
13
  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
  GNU Affero General Public License for more details.
16
17
  You should have received a copy of the GNU Affero General Public License
18
  along with this program.  If not, see [http://www.gnu.org/licenses/].
19
*/
20
21
namespace AppBundle\Controller;
22
23
use AppBundle\Entity\Agreement;
24
use AppBundle\Entity\Group;
25
use AppBundle\Entity\User;
26
use AppBundle\Entity\Workday;
27
use AppBundle\Form\Model\Calendar;
28
use Doctrine\Common\Collections\ArrayCollection;
29
use Doctrine\ORM\EntityManager;
30
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
31
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
32
use Symfony\Component\HttpFoundation\Request;
33
34
/**
35
 * @Route("/alumnado")
36
 * @Security("is_granted('ROLE_GROUP_TUTOR')")
37
 */
38
class GroupController extends BaseController
39
{
40
    /**
41
     * @Route("", name="admin_tutor_group", methods={"GET"})
42
     */
43
    public function groupIndexAction(Request $request)
44
    {
45
        /** @var EntityManager $em */
46
        $em = $this->getDoctrine()->getManager();
47
48
        /** @var User $user */
49
        $user = $this->getUser();
50
51
        $qb = $em->getRepository('AppBundle:Group')
52
            ->createQueryBuilder('g')
53
            ->innerJoin('g.training', 't')
54
            ->innerJoin('t.department', 'd')
55
            ->orderBy('d.name')
56
            ->addOrderBy('t.name')
57
            ->addOrderBy('g.name');
58
59
        if (!$user->isGlobalAdministrator()) {
60
            $qb = $qb
61
                ->where('g.id IN (:groups)')
62
                ->orWhere('d.head = :user')
63
                ->setParameter('groups', $user->getTutorizedGroups()->toArray())
64
                ->setParameter('user', $user);
65
        }
66
67
        $items = $qb->getQuery()->getResult();
68
69
        if (count($items) == 1) {
70
            return $this->groupDetailIndexAction($items[0], $request);
71
        }
72
73
        return $this->render('group/group_index.html.twig',
74
            [
75
                'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
76
                'title' => null,
77
                'elements' => $items
78
            ]);
79
    }
80
81
    /**
82
     * @Route("/grupo/{id}", name="admin_group_students", methods={"GET"})
83
     * @Security("is_granted('GROUP_MANAGE', group)")
84
     */
85
    public function groupDetailIndexAction(Group $group, Request $request)
86
    {
87
        /** @var EntityManager $em */
88
        $em = $this->getDoctrine()->getManager();
89
90
        $usersQuery = $em->createQuery('SELECT u FROM AppBundle:User u WHERE u.studentGroup = :group')
91
            ->setParameter('group', $group);
92
93
        $paginator = $this->get('knp_paginator');
94
        $pagination = $paginator->paginate(
95
            $usersQuery,
96
            $request->query->getInt('page', 1),
97
            $this->getParameter('page.size'),
98
            [
99
                'defaultSortFieldName' => 'u.lastName',
100
                'defaultSortDirection' => 'asc'
101
            ]
102
        );
103
104
        return $this->render('group/manage_students.html.twig', [
105
            'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
106
            'title' => $group->getName(),
107
            'pagination' => $pagination
108
        ]);
109
110
    }
111
112
    /**
113
     * @Route("/alumnado/estudiante/{id}", name="student_detail", methods={"GET", "POST"})
114
     * @Security("is_granted('GROUP_MANAGE', student.getStudentGroup())")
115
     */
116
    public function studentIndexAction(User $student, Request $request)
117
    {
118
        $form = $this->createForm('AppBundle\Form\Type\StudentUserType', $student, [
119
            'admin' => $this->isGranted('ROLE_ADMIN')
120
        ]);
121
122
        $form->handleRequest($request);
123
124
        if ($form->isSubmitted() && $form->isValid()) {
125
126
            // Guardar el usuario en la base de datos
127
128
            // Probar a guardar los cambios
129
            try {
130
                $this->getDoctrine()->getManager()->flush();
131
                $this->addFlash('success', $this->get('translator')->trans('alert.saved', [], 'student'));
132
                return $this->redirectToRoute('admin_group_students', ['id' => $student->getStudentGroup()->getId()]);
133
            } catch (\Exception $e) {
134
                $this->addFlash('error', $this->get('translator')->trans('alert.not_saved', [], 'student'));
135
            }
136
        }
137
        return $this->render('group/form_student.html.twig',
138
            [
139
                'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
140
                'breadcrumb' => [
141
                    ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
142
                    ['fixed' => (string) $student],
143
                ],
144
                'title' => (string) $student,
145
                'user' => $student,
146
                'form' => $form->createView()
147
            ]);
148
    }
149
150
    /**
151
     * @Route("/seguimiento/seleccion/{id}", name="admin_group_student_agreements", methods={"GET"})
152
     * @Security("is_granted('GROUP_MANAGE', student.getStudentGroup())")
153
     */
154
    public function studentAgreementIndexAction(User $student)
155
    {
156
        $agreements = $student->getStudentAgreements();
157
158
        return $this->render('group/calendar_agreement_select.html.twig',
159
            [
160
                'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
161
                'breadcrumb' => [
162
                    ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
163
                    ['fixed' => (string) $student],
164
                ],
165
                'student' => $student,
166
                'elements' => $agreements,
167
                'route_name' => 'admin_group_student_calendar'
168
            ]);
169
    }
170
171
    /**
172
     * @Route("/seguimiento/acuerdo/{id}", name="admin_group_student_calendar", methods={"GET"})
173
     * @Security("is_granted('AGREEMENT_ACCESS', agreement)")
174
     */
175
    public function studentCalendarAgreementIndexAction(Agreement $agreement)
176
    {
177
        $student = $agreement->getStudent();
178
179
        $calendar = $this->getDoctrine()->getManager()->getRepository('AppBundle:Workday')->getArrayCalendar($agreement->getWorkdays());
180
        $title = (string) $agreement->getWorkcenter();
181
182
        return $this->render('group/calendar_agreement.html.twig',
183
            [
184
                'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
185
                'breadcrumb' => [
186
                    ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
187
                    ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
188
                    ['fixed' => $title],
189
                ],
190
                'title' => $title,
191
                'user' => $this->getUser(),
192
                'calendar' => $calendar,
193
                'agreement' => $agreement,
194
                'route_name' => 'admin_group_student_tracking'
195
            ]);
196
    }
197
198
    public function deleteWorkdayAction(Agreement $agreement, Request $request)
199
    {
200
        $this->denyAccessUnlessGranted('AGREEMENT_MANAGE', $agreement);
201
202
        $em = $this->getDoctrine()->getManager();
203
204
        if ($request->request->has('ids')) {
205
            try {
206
                $ids = $request->request->get('ids');
207
208
                $dates = $em->getRepository('AppBundle:Workday')->createQueryBuilder('w')
209
                    ->where('w.id IN (:ids)')
210
                    ->andWhere('w.agreement = :agreement')
211
                    ->setParameter('ids', $ids)
212
                    ->setParameter('agreement', $agreement)
213
                    ->getQuery()
214
                    ->getResult();
215
216
                /** @var Workday $date */
217
                foreach ($dates as $date) {
218
                    if ($date->getTrackedHours() === 0) {
219
                        $em->remove($date);
220
                    }
221
                }
222
                $em->flush();
223
224
                $agreement->setFromDate($this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->getRealFromDate($agreement));
225
                $agreement->setToDate($this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->getRealToDate($agreement));
226
227
                $em->flush();
228
                $this->addFlash('success', $this->get('translator')->trans('alert.deleted', [], 'calendar'));
229
            } catch (\Exception $e) {
230
                $this->addFlash('error', $this->get('translator')->trans('alert.not_deleted', [], 'calendar'));
231
            }
232
        }
233
        return $this->redirectToRoute('admin_group_student_calendar', ['id' => $agreement->getId()]);
234
    }
235
236
    /**
237
     * @Route("/seguimiento/acuerdo/{id}/operacion", name="admin_group_student_workday_operation", methods={"POST"})
238
     * @Security("is_granted('AGREEMENT_ACCESS', agreement)")
239
     */
240
    public function operationWorkdayAction(Agreement $agreement, Request $request)
241
    {
242
        if ($request->request->has('delete')) {
243
            return $this->deleteWorkdayAction($agreement, $request);
244
        } elseif ($request->request->has('week_lock') || ($request->request->has('week_unlock'))) {
245
            return $this->lockWeekAction($agreement, $request, $request->request->has('week_lock'), 'admin_group_student_calendar');
246
        } else {
247
            return $this->lockWorkdayAction($agreement, $request, $request->request->has('lock'), 'admin_group_student_calendar');
248
        }
249
    }
250
251
    /**
252
     * @Route("/seguimiento/acuerdo/{id}/incorporar", name="admin_group_student_workday_add", methods={"GET", "POST"})
253
     * @Security("is_granted('AGREEMENT_MANAGE', agreement)")
254
     */
255
    public function addAgreementCalendarAction(Agreement $agreement, Request $request)
256
    {
257
        $totalHours = $agreement->getStudent()->getStudentGroup()->getTraining()->getProgramHours();
258
        $agreementHours = $this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->countHours($agreement);
259
        $studentHours = $this->getDoctrine()->getManager()->getRepository('AppBundle:User')->countAgreementHours($agreement->getStudent());
260
261
        $calendar = new Calendar(max(0, $totalHours - $studentHours));
262
263
        $form = $this->createForm('AppBundle\Form\Type\CalendarType', $calendar, [
264
            'program_hours' => $totalHours
265
        ]);
266
267
        $form->handleRequest($request);
268
269
        $workdays = new ArrayCollection();
270
271
        if ($form->isValid() && $form->isSubmitted()) {
272
            $workdays = $this->getDoctrine()->getManager()->getRepository('AppBundle:Workday')->createCalendar($calendar, $agreement);
273
274
            if ($request->request->has('submit')) {
275
                $this->getDoctrine()->getManager()->flush();
276
                $agreement->setFromDate($this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->getRealFromDate($agreement));
277
                $agreement->setToDate($this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->getRealToDate($agreement));
278
                $this->getDoctrine()->getManager()->flush();
279
                $this->addFlash('success', $this->get('translator')->trans('alert.saved', [], 'calendar'));
280
                return $this->redirectToRoute('admin_group_student_calendar', ['id' => $agreement->getId()]);
281
            }
282
        }
283
284
        $student = $agreement->getStudent();
285
286
        $calendar = $this->getDoctrine()->getManager()->getRepository('AppBundle:Workday')->getArrayCalendar($workdays);
287
288
        return $this->render('group/calendar_agreement_workday_add.html.twig', [
289
            'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
290
            'breadcrumb' => [
291
                ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
292
                ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
293
                ['fixed' => (string) $agreement->getWorkcenter()],
294
                ['fixed' => $this->get('translator')->trans('form.add', [], 'calendar')]
295
            ],
296
            'agreement' => $agreement,
297
            'total_hours' => $totalHours,
298
            'agreement_hours' => $agreementHours,
299
            'student_hours' => $studentHours,
300
            'form' => $form->createView(),
301
            'calendar' => $calendar
302
        ]);
303
    }
304
305
    /**
306
     * @Route("/seguimiento/acuerdo/jornada/{id}", name="admin_group_student_tracking", methods={"GET", "POST"})
307
     * @Security("is_granted('AGREEMENT_ACCESS', workday.getAgreement())")
308
     */
309
    public function studentWorkdayAction(Workday $workday, Request $request)
310
    {
311
        $student = $workday->getAgreement()->getStudent();
312
313
        return $this->baseWorkdayAction($workday, $request, [
314
            'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
315
            'breadcrumb' => [
316
                ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
317
                ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
318
                ['fixed' => (string) $workday->getAgreement()->getWorkcenter(), 'path' => 'admin_group_student_calendar', 'options' => ['id' => $workday->getAgreement()->getId()]],
319
                ['fixed' => $workday->getDate()->format('d/m/Y')]
320
            ],
321
            'back_route_name' => 'admin_group_student_calendar'
322
        ]);
323
    }
324
325
    /**
326
     * @Route("/seguimiento/acuerdo/jornada/modificar/{id}", name="admin_group_student_workday_form", methods={"GET", "POST"})
327
     * @Security("is_granted('AGREEMENT_MANAGE', workday.getAgreement())")
328
     */
329
    public function agreementCalendarFormAction(Workday $workday, Request $request)
330
    {
331
        $form = $this->createForm('AppBundle\Form\Type\WorkdayType', $workday);
332
        $form->handleRequest($request);
333
334
        if ($form->isValid() && $form->isSubmitted()) {
335
            $this->getDoctrine()->getManager()->flush();
336
            $this->addFlash('success', $this->get('translator')->trans('alert.saved', [], 'calendar'));
337
            return $this->redirectToRoute('admin_group_student_calendar', ['id' => $workday->getAgreement()->getId()]);
338
        }
339
        $student = $workday->getAgreement()->getStudent();
340
341
        $dow = ((6 + (int) $workday->getDate()->format('w')) % 7);
342
        $title = $this->get('translator')->trans('dow' . $dow, [], 'calendar') . ', ' . $workday->getDate()->format('d/m/Y');
343
344
        return $this->render('group/calendar_agreement_workday_form.html.twig', [
345
            'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
346
            'breadcrumb' => [
347
                ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
348
                ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
349
                ['fixed' => (string) $workday->getAgreement()->getWorkcenter(), 'path' => 'admin_group_student_calendar', 'options' => ['id' => $workday->getAgreement()->getId()]],
350
                ['fixed' => $title],
351
            ],
352
            'form' => $form->createView(),
353
            'workday' => $workday
354
        ]);
355
    }
356
357
    /**
358
     * @Route("/seguimiento/acuerdo/nuevo/{id}", name="admin_group_student_agreement_new", methods={"GET", "POST"})
359
     * @Security("is_granted('GROUP_CREATE_AGREEMENT', user.getStudentGroup())")
360
     */
361
    public function agreementNewFormAction(User $user, Request $request)
362
    {
363
        $agreement = new Agreement();
364
        $agreement->setStudent($user);
365
        $this->getDoctrine()->getManager()->persist($agreement);
366
367
        return $this->agreementFormAction($agreement, $request);
368
    }
369
370
    /**
371
     * @Route("/seguimiento/acuerdo/modificar/{id}", name="admin_group_student_agreement_form", methods={"GET", "POST"})
372
     * @Security("is_granted('AGREEMENT_MANAGE', agreement)")
373
     */
374
    public function agreementFormAction(Agreement $agreement, Request $request)
375
    {
376
        $form = $this->createForm('AppBundle\Form\Type\AgreementType', $agreement);
377
378
        $form->handleRequest($request);
379
380
        $student = $agreement->getStudent();
381
382
        if ($form->isValid() && $form->isSubmitted()) {
383
            // Probar a guardar los cambios
384
            try {
385
                $this->getDoctrine()->getManager()->flush();
386
                $this->addFlash('success', $this->get('translator')->trans('alert.saved', [], 'group'));
387
                return $this->redirectToRoute('admin_group_student_agreements', ['id' => $student->getId()]);
388
            } catch (\Exception $e) {
389
                $this->addFlash('error', $this->get('translator')->trans('alert.not_saved', [], 'group'));
390
            }
391
        }
392
393
        $title = (null === $agreement->getId())
394
            ? $this->get('translator')->trans('form.new_agreement', [], 'group')
395
            : (string) $agreement->getWorkcenter();
396
397
        return $this->render('group/form_agreement.html.twig',
398
            [
399
                'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
400
                'breadcrumb' => [
401
                    ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
402
                    ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
403
                    ['fixed' => $title]
404
                ],
405
                'form' => $form->createView(),
406
                'agreement' => $agreement
407
            ]);
408
    }
409
410
    /**
411
     * @Route("/seguimiento/acuerdo/eliminar/{id}", name="admin_group_student_agreement_delete", methods={"GET", "POST"})
412
     * @Security("is_granted('AGREEMENT_MANAGE', agreement)")
413
     */
414
415
    public function agreementDeleteAction(Agreement $agreement, Request $request)
416
    {
417
        $student = $agreement->getStudent();
418
419
        if ('POST' === $request->getMethod() && $request->request->has('delete')) {
420
421
            // Eliminar el acuerdo de la base de datos
422
            $this->getDoctrine()->getManager()->getRepository('AppBundle:Agreement')->delete($agreement);
423
            try {
424
                $this->getDoctrine()->getManager()->flush();
425
                $this->addFlash('success', $this->get('translator')->trans('alert.agreement_deleted', [], 'group'));
426
            } catch (\Exception $e) {
427
                $this->addFlash('error', $this->get('translator')->trans('alert.agreement_not_deleted', [], 'group'));
428
            }
429
            return $this->redirectToRoute('admin_group_student_agreements', ['id' => $student->getId()]);
430
        }
431
432
        $title = (string) $agreement->getWorkcenter();
433
434
        return $this->render('group/delete_agreement.html.twig', [
435
            'menu_item' => $this->get('app.menu_builders_chain')->getMenuItemByRouteName('admin_tutor_group'),
436
            'breadcrumb' => [
437
                ['fixed' => $student->getStudentGroup()->getName(), 'path' => 'admin_group_students', 'options' => ['id' => $student->getStudentGroup()->getId()]],
438
                ['fixed' => (string) $student, 'path' => 'admin_group_student_agreements', 'options' => ['id' => $student->getId()]],
439
                ['fixed' => $title]
440
            ],
441
            'title' => $title,
442
            'agreement' => $agreement
443
        ]);
444
    }
445
446
}
447