UsuarioController::nuevoAction()   B
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 41
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 41
ccs 0
cts 24
cp 0
rs 8.8571
c 1
b 0
f 0
cc 3
eloc 24
nc 2
nop 1
crap 12
1
<?php
2
/*
3
  GESTCONV - Aplicación web para la gestión de la convivencia en centros educativos
4
5
  Copyright (C) 2015: 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\Usuario;
24
use AppBundle\Form\Model\Importar;
25
use AppBundle\Form\Type\ImportarType;
26
use AppBundle\Form\Type\RangoFechasType;
27
use AppBundle\Form\Type\UsuarioType;
28
use AppBundle\Utils\CsvImporter;
29
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
30
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
31
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
32
use Symfony\Component\Form\SubmitButton;
33
use Symfony\Component\HttpFoundation\RedirectResponse;
34
use Symfony\Component\HttpFoundation\Request;
35
36
/**
37
 * @Route("/usuario")
38
 */
39
class UsuarioController extends Controller
40
{
41
    /**
42
     * @Route("/modificar", name="usuario_modificar",methods={"GET", "POST"})
43
     */
44
    public function modificarPropioAction()
45
    {
46
        $usuario = $this->getUser();
47
        return $this->forward('AppBundle:Usuario:modificar', array('usuario' => $usuario->getId()));
48
    }
49
50
    /**
51
     * @Route("/modificar/{usuario}", name="usuario_modificar_otro",methods={"GET", "POST"})
52
     */
53
    public function modificarAction(Usuario $usuario, Request $peticion)
54
    {
55
        $usuarioActivo = $this->getUser();
56
        if ($usuario->getId() !== $usuarioActivo->getId() && !$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_DIRECTIVO')) {
57
            return $this->createAccessDeniedException();
58
        }
59
        $formulario = $this->createForm(new UsuarioType(), $usuario, array(
60
            'admin' => $this->isGranted('ROLE_ADMIN'),
61
            'directivo' => $this->isGranted('ROLE_DIRECTIVO'),
62
            'propio' => ($usuarioActivo->getId() === $usuario->getId())
63
        ));
64
65
        $formulario->handleRequest($peticion);
66
67
        if ($formulario->isSubmitted() && $formulario->isValid()) {
68
69
            // Guardar el usuario en la base de datos
70
71
            // Si es solicitado, cambiar la contraseña
72
            $passwordSubmit = $formulario->get('cambiarPassword');
73
            if (($passwordSubmit instanceof SubmitButton) && $passwordSubmit->isClicked()) {
74
                $password = $this->container->get('security.password_encoder')
75
                    ->encodePassword($usuario, $formulario->get('newPassword')->get('first')->getData());
76
                $usuario->setPassword($password);
77
                $this->addFlash('success', 'Datos guardados correctamente y contraseña cambiada');
78
            }
79
            else {
80
                $this->addFlash('success', 'Datos guardados correctamente');
81
            }
82
            $this->getDoctrine()->getManager()->flush();
83
84
            return new RedirectResponse(
85
                $this->generateUrl($this->isGranted('ROLE_ADMIN') ? 'usuario_listar' : 'portada')
86
            );
87
        }
88
89
        return $this->render('AppBundle:Usuario:modificar.html.twig',
90
            array(
91
                'usuario' => $usuario,
92
                'formulario' => $formulario->createView()
93
            ));
94
    }
95
96
    /**
97
     * @Route("/nuevo", name="usuario_nuevo",methods={"GET", "POST"})
98
     * @Security("has_role('ROLE_ADMIN')")
99
     */
100
    public function nuevoAction(Request $peticion)
101
    {
102
        $usuario = new Usuario();
103
        $usuario
104
            ->setEstaActivo(true)
105
            ->setEstaBloqueado(false);
106
107
        $formulario = $this->createForm(new UsuarioType(), $usuario, array(
108
            'admin' => true,
109
            'propio' => false,
110
            'nuevo' => true
111
        ));
112
113
        $formulario->handleRequest($peticion);
114
115
        if ($formulario->isSubmitted() && $formulario->isValid()) {
116
117
            // Guardar el usuario en la base de datos
118
            $em = $this->getDoctrine()->getManager();
119
120
            $encoder = $this->container->get('security.password_encoder');
121
            $password = $encoder->encodePassword($usuario, $formulario->get('newPassword')->get('first')->getData());
122
            $usuario->setPassword($password);
123
124
            $em->persist($usuario);
125
            $em->flush();
126
127
            $this->addFlash('success', 'Usuario creado correctamente');
128
129
            // redireccionar a la portada
130
            return new RedirectResponse(
131
                $this->generateUrl('usuario_listar')
132
            );
133
        }
134
135
        return $this->render('AppBundle:Usuario:modificar.html.twig',
136
            array(
137
                'usuario' => $usuario,
138
                'formulario' => $formulario->createView()
139
            ));
140
    }
141
142
    /**
143
     * @Route("/listar", name="usuario_listar",methods={"GET"})
144
     * @Security("has_role('ROLE_REVISOR')")
145
     */
146
    public function listarAction(Request $request)
147
    {
148
        $usuario = $this->getUser();
149
        $em = $this->getDoctrine()->getManager();
150
151
        $fechasPorDefecto = array('desde' => null, 'hasta' => null);
152
153
        $form = $this->createForm(new RangoFechasType(), $fechasPorDefecto);
154
        $form->handleRequest($request);
155
156
        $usuarios = $em->getRepository('AppBundle:Usuario')->getResumenConvivencia($form->isValid() ? $form->getData() : $fechasPorDefecto);
157
158
        return $this->render('AppBundle:Usuario:listar.html.twig',
159
            array(
160
                'formulario_fechas' => $form->createView(),
161
                'items' => $usuarios,
162
                'usuario' => $usuario
163
            ));
164
    }
165
166
    protected function importarUsuariosDesdeCsv($fichero)
167
    {
168
        $em = $this->getDoctrine()->getManager();
169
170
        $importer = new CsvImporter($fichero, true);
171
        $encoder = $this->container->get('security.password_encoder');
172
173
        while($data = $importer->get(100)) {
174
            foreach($data as $usuarioData) {
175
                $ahora = new \Datetime();
176
                if ((\DateTime::createFromFormat('d/m/Y', $usuarioData['Fecha de toma de posesión']) <= $ahora)
177
                    && (!$usuarioData['Fecha de cese'])
178
                    || ($usuarioData['Fecha de cese'] && (\DateTime::createFromFormat('d/m/Y',
179
                                $usuarioData['Fecha de cese']) > $ahora))
180
                ) {
181
182
                    $usuario = $em->getRepository('AppBundle:Usuario')
183
                        ->findOneByNombreUsuario($usuarioData['Usuario IdEA']);
184
                    if (!$usuario) {
185
186
                        $usuario = new Usuario();
187
188
                        $completo = explode(', ', $usuarioData['Empleado/a']);
189
190
                        $usuario->setNombreUsuario($usuarioData['Usuario IdEA'])
191
                            ->setApellidos($completo[0])
192
                            ->setNombre($completo[1])
193
                            ->setPassword($encoder->encodePassword($usuario, $usuarioData['Usuario IdEA']))
194
                            ->setNotificaciones(false)
195
                            ->setEsAdministrador(false)
196
                            ->setEsRevisor(false)
197
                            ->setEsDirectivo(false)
198
                            ->setEsOrientador(false)
199
                            ->setEstaBloqueado(false)
200
                            ->setEstaActivo(true)
201
                            ->setEsExterno(true);
202
203
                        $em->persist($usuario);
204
                    }
205
                }
206
            }
207
        }
208
        $em->flush();
209
        return true;
210
    }
211
212
    /**
213
     * @Route("/importar", name="usuario_importar",methods={"GET", "POST"})
214
     * @Security("has_role('ROLE_DIRECTIVO')")
215
     */
216 View Code Duplication
    public function importarAction(Request $request)
217
    {
218
        $datos = new Importar();
219
        $form = $this->createForm(new ImportarType(), $datos);
220
        $form->handleRequest($request);
221
222
        if ($form->isSubmitted() && $form->isValid()) {
223
224
            if ($this->importarUsuariosDesdeCsv($datos->getFichero()->getPathname())) {
225
                $this->addFlash('success', 'Los datos se han importado correctamente');
226
            }
227
            else {
228
                $this->addFlash('error', 'Ha ocurrido un error en la importación');
229
            }
230
231
            return new RedirectResponse(
232
                $this->generateUrl('usuario_listar')
233
            );
234
        }
235
236
        return $this->render('AppBundle:Usuario:importar.html.twig',
237
            array(
238
                'formulario' => $form->createView()
239
            ));
240
    }
241
}
242