<?php
namespace App\Controller;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Response;
use App\Crud\Controller\crudPlainController;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\SeguridadUsuario;
use App\Entity\SeguridadRol;
use App\Entity\SeguridadCodigoActivacion;
use App\Entity\SeguridadConfiguracion;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Utiles\ValidarIdentificacion;
class UsuarioController extends crudPlainController
{
private $encoder;
public function __construct(TranslatorInterface $translator, LoggerInterface $logger, MailerInterface $mailer, RequestStack $requestStack, EntityManagerInterface $entityManager, UserPasswordHasherInterface $encoder)
{
parent::__construct($translator, $logger, $mailer, $requestStack, $entityManager);
$this->encoder = $encoder;
}
protected function indexParamsForTwig()
{
$params = parent::indexParamsForTwig();
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$params['configuracionSeguridad'] = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
return $params;
}
public function doSearchAction($numeroId, $routeClassName)
{
$this->setUtilProperties();
$this->setFilterData($routeClassName);
$data = array();
$usuario = $this->em->getRepository(SeguridadUsuario::class)
->findOneBy(array('username'=>$numeroId));
if ($usuario)
{
$data['resultado']='USER';
$data['id']=$usuario->getId();
$data['identificacion']=$usuario->getUsername();
$data['nombre']=$usuario->getNombreCompleto();
$data['foto']=$usuario->getFoto() ? $usuario->getFoto()->getUrl(): '';
$data['telefono']=$usuario->getTelefono();
$data['movil']=$usuario->getMovil();
$data['mail']=$usuario->getEmail();
$data['availabe'] = true;
switch ($routeClassName)
{
case 'admin':
if ($usuario->isRoleAssigned('ROLE_ADMINISTRADOR'))
{
$rol = $this->em->getRepository(SeguridadRol::class)
->getRolByName('ROLE_ADMINISTRADOR');
$data['availabe'] = false;
$data['rol'] = $this->translator->trans('usuario.inhabilitado.rolcomun',array(),'crud') . ': ('. $rol->getDescripcion() . ')';
}
break;
case 'operador':
if ($usuario->isRoleAssigned('ROLE_OPERADOR_PUNTO_IMPRESION'))
{
$rol = $this->em->getRepository(SeguridadRol::class)
->getRolByName('ROLE_OPERADOR_PUNTO_IMPRESION');
$data['availabe'] = false;
$data['rol'] = $this->translator->trans('usuario.inhabilitado.rolcomun',array(),'crud') . ': ('. $rol->getDescripcion() . ')';
}
if ($usuario->isRoleAssigned('ROLE_FINANCIERO'))
{
$rol = $this->em->getRepository(SeguridadRol::class)
->getRolByName('ROLE_FINANCIERO');
$data['availabe'] = false;
$data['rol'] = $this->translator->trans('usuario.inhabilitado.rolcomun',array(),'crud') . ': ('. $rol->getDescripcion() . ')';
}
break;
case 'financiero':
if ($usuario->isRoleAssigned('ROLE_FINANCIERO'))
{
$rol = $this->em->getRepository(SeguridadRol::class)
->getRolByName('ROLE_FINANCIERO');
$data['availabe'] = false;
$data['rol'] = $this->translator->trans('usuario.inhabilitado.rolcomun',array(),'crud') . ': ('. $rol->getDescripcion() . ')';
}
if ($usuario->isRoleAssigned('ROLE_OPERADOR_PUNTO_IMPRESION'))
{
$rol = $this->em->getRepository(SeguridadRol::class)
->getRolByName('ROLE_OPERADOR_PUNTO_IMPRESION');
$data['availabe'] = false;
$data['rol'] = $this->translator->trans('usuario.inhabilitado.rolcomun',array(),'crud') . ': ('. $rol->getDescripcion() . ')';
}
break;
}
}
else
{
$data['es_cliente'] = 0;
$data['resultado']='NO_USER';
}
$json = new \Symfony\Component\HttpFoundation\Response(json_encode($data));
$json->headers->set('Content-Type', 'application/json');
return $json;
}
protected function setFiltros()
{
$rol = $this->getRol();
if ($rol)
{
$this->filterData['assignedRoles']= $rol->getId();
}
}
public function fastCreateAction($rol, $routeClassName, $id)
{
$this->setClassMap($routeClassName);
$this->setUtilProperties();
$this->setFilterData($routeClassName);
$this->routeClassName = $routeClassName;
$this->rol = $rol;
$this->accion = 'UPDATE';
$entity = $this->em->getRepository(SeguridadUsuario::class)->find($id);
foreach ($entity->getAssignedRoles()->toArray() as $rolAssigned)
{
$entity->removeAssignedRoles($rolAssigned);
}
$this->setValuesAfterForm($entity);
$this->em->persist($entity);
$this->em->flush();
$this->afterSave($entity);
if ($this->routeClassName == 'contratado' )
{
$data = array('ok'=>true);
$data = new Response(json_encode($data));
$data->headers->set('Content-Type', 'application/json');
return $data;
}
return $this->redirect($this->generateUrl('crud_index', array('rol'=>$rol, 'routeClassName'=>$routeClassName)));
}
protected function setValuesAfterForm($entity)
{
parent::setValuesAfterForm($entity);
$this->logger->error('setValuesAfterForm');
if ($this->accion=='CREATE')
{
$entity->setActivo(false);
$entity->setFechaRegistro(new \DateTime());
$entity->setIntentosFallidos(0);
$entity->setEliminado(false);
$entity->setPrimerIngreso(TRUE);
}
$this->logger->error('routeClassName: '.$this->routeClassName);
$rol= $this->getRol();
if ($rol && !$entity->isRoleAssigned($rol->getNombre()))
{
$this->logger->error('rol: '.$rol->getNombre());
$entity->addAssignedRoles($rol);
}
}
protected function getRol()
{
$rol=null;
$rolRepo = $this->em->getRepository(SeguridadRol::class);
switch ($this->routeClassName)
{
case 'admin':
$rol = $rolRepo->getRolByName('ROLE_ADMINISTRADOR');
break;
case 'coordinadordireccion':
$rol = $rolRepo->getRolByName('ROLE_COORDINADOR_DIRECCION');
break;
case 'coordinadorbase':
$rol = $rolRepo->getRolByName('ROLE_COORDINADOR_BASE');
break;
case 'coordinadorcentro':
$rol = $rolRepo->getRolByName('ROLE_COORDINADOR_CENTRO');
break;
case 'operadorcentro':
$rol = $rolRepo->getRolByName('ROLE_OPERADOR_CENTRO');
break;
case 'operadorunidad':
$rol = $rolRepo->getRolByName('ROLE_OPERADOR_UNIDAD');
break;
case 'operadorinstruccion':
$rol = $rolRepo->getRolByName('ROLE_OPERADOR_INSTRUCCION');
break;
case 'medico':
$rol = $rolRepo->getRolByName('ROLE_MEDICO');
break;
case 'psicologo':
$rol = $rolRepo->getRolByName('ROLE_PSICOLOGO');
break;
case 'psicologojefe':
$rol = $rolRepo->getRolByName('ROLE_PSICOLOGO_JEFE');
break;
case 'laboratorista':
$rol = $rolRepo->getRolByName('ROLE_LABORATORISTA');
break;
case 'odontologo':
$rol = $rolRepo->getRolByName('ROLE_ODONTOLOGO');
break;
}
return $rol;
}
protected function afterSave($entity)
{
parent::afterSave($entity);
if ($this->accion=='CREATE')
{
$notAllowedActivation = ['medico', 'odontologo', 'laboratorista'];
if (isset($notAllowedActivation[$this->routeClassName]))
{
return;
}
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
if ($configuracionSeguridad)
{
if ($configuracionSeguridad->getCodigoActivacion())
{
$this->sendActivationCode($entity, $configuracionSeguridad);
$entity->setActivo(FALSE);
}
else
{
if (!$password = $configuracionSeguridad->getDefaultPassword())
{
$password = $entity->getUserName();
}
$password = $this->setSecurePassword($entity, $password);
$entity->setPassword($password);
$entity->setActivo(TRUE);
}
}
$this->em->persist($entity);
$this->em->flush();
}
}
public function deleteAction($rol, $id, $routeClassName)
{
$this->setInitialValues($rol, $routeClassName);
$entity = $this->em->getRepository($this->bundleName.'\\Entity\\'.$this->className)->find($id);
if (!$entity)
throw new \RuntimeException($this->translator->trans(
'error.instance_not_found',
array('%classname%' => $this->routeClassName.'/'.$this->className,
'%id%' => $id),
'crud'));
if (!$this->allowActionExecution('DELETE', $entity))
{
return $this->render('@crud/accesDenied.html.twig');
}
$repoRol = $this->em->getRepository(SeguridadRol::class);
$repoUser = $this->em->getRepository(SeguridadUsuario::class);
$ok = true;
switch ($this->routeClassName)
{
case 'admin':
$rolAdmin = $repoRol->findOneBy(array('nombre'=>'ROLE_ADMINISTRADOR'));
$admins = $repoUser->createQueryBuilder('u')
->innerJoin('u.assignedRoles','r')
->where('u.id <> '.$entity->getId())
->andWhere('r.id = '.$rolAdmin->getId())
->getQuery()->getResult();
if (count($admins) == 0)
{
$this->session->getFlashBag()
->set('danger',
$this->translator->trans($this->routeClassName.'.error.unicoadmin', array(), 'crud'));
$ok = false;
}
break;
}
if($ok)
{
$rolEliminar = $this->getRol();
if ($rolEliminar)
{
$entity->removeAssignedRoles($rolEliminar);
}
$this->em->persist($entity);
$this->em->flush();
return $this->deleteRedirectOnSuccess($entity);
}
else
{
return $this->deleteRedirectOnFail($entity);
}
}
public function showUsuarioPerfilAction()
{
$usuario = $this->getUser();
if (is_object($usuario))
{
return $this->forward('App\Controller\UsuarioController::showAction', array('rol'=>'all', 'id'=>$usuario->getId(), 'routeClassName'=>'usuarioperfil'));
}
else
{
return $this->redirect ($this->generateUrl ('app_login'));
}
}
protected function resendActivationLink($user)
{
$texto = $this->translator->trans('seguridad.activacion.reenvio');
if (!$user)
{
$texto = 'Usuario no encontrado';
}
else
{
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
if ($configuracionSeguridad &&$configuracionSeguridad->getCodigoActivacion())
{
if (!$this->sendActivationCode($user, $configuracionSeguridad))
{
$texto = $this->translator->trans('seguridad.activacion.error.no_reenvio');
}
}else{
$texto = 'No existe configuracion '.$this->getParameter('SECURITY_CONF');
}
}
return $texto;
}
public function resendActivationUsernameLinkAction($username)
{
$user = $this->em->getRepository(SeguridadUsuario::class)->findOneBy(['username'=>$username]);
$texto = $this->resendActivationLink($user);
return new \Symfony\Component\HttpFoundation\Response($texto);
}
public function resendActivationLinkAction($userId)
{
$user = $this->em->getRepository(SeguridadUsuario::class)->find($userId);
$texto = $this->resendActivationLink($user);
return new \Symfony\Component\HttpFoundation\Response($texto);
}
protected function sendActivationCode(SeguridadUsuario $user, $configuracionSeguridad)
{
$token = md5(uniqid());
$fecha = new \DateTime();
$codigo = new SeguridadCodigoActivacion();
$codigo->setCodigo($token);
$codigo->setUsuario($user);
$codigo->setFechaEnvio($fecha);
$vigenciaCodigo = $configuracionSeguridad->getVigenciaCodigo();
if ($vigenciaCodigo>0)
{
$fechaMaxActivacion = clone $fecha;
$fechaMaxActivacion->add(new \DateInterval('PT'.$vigenciaCodigo.'H'));
$codigo->setFechaVigencia($fechaMaxActivacion);
}
$this->em->persist($codigo);
$this->em->flush();
$url = $this->generateUrl('usuario_register_activation', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
try
{
$subject = $this->translator->trans('seguridad.mail.sender', array()).' - '.$this->translator->trans('seguridad.activacion.subject', array());
$email = new Email();
$email->from($this->getParameter('mailer_from'))
->to($user->getEmail())
//->cc('[email protected]')
//->bcc('[email protected]')
//->replyTo('[email protected]')
//->priority(Email::PRIORITY_HIGH)
->subject($subject)
->html($this->render('Security/email_create.html.twig',
array('usuario' => $user, 'url' => $url))->getContent());
$this->mailer->send($email);
} catch (\Exception $exc)
{
$texto = $this->translator->trans('seguridad.mail.error.conexion', array());
$this->logger->error('WWWemail error: '.$exc->getMessage());
$this->session->getFlashBag()->set('danger', $texto);
return false;
}
return true;
}
protected function setSecurePassword($user, $password)
{
return $this->encoder->hashPassword($user, $password);
}
protected function indexGetFields()
{
$indexFields = parent::indexGetFields();
unset($indexFields['nombres']);
unset($indexFields['apellidos']);
unset($indexFields['eliminado']);
unset($indexFields['fechaEliminacion']);
unset($indexFields['fechaRegistro']);
unset($indexFields['password']);
unset($indexFields['primerIngreso']);
unset($indexFields['causaBloqueo']);
unset($indexFields['fechaVigenciaPassword']);
unset($indexFields['intentosFallidos']);
unset($indexFields['direccion']);
unset($indexFields['conectado']);
unset($indexFields['fechaAcceso']);
unset($indexFields['foto']);
/* unset($indexFields['telefono']);
unset($indexFields['movil']);
unset($indexFields['email']);
unset($indexFields['email']);
*/
if ($this->routeClassName == 'admin' || $this->routeClassName == 'coordinadordireccion')
{
unset($indexFields['baseMovilizacion']);
unset($indexFields['centroMovilizacion']);
unset($indexFields['unidadMilitar']);
unset($indexFields['centroInstruccion']);
}
if ($this->routeClassName == 'coordinadorbase')
{
unset($indexFields['centroInstruccion']);
unset($indexFields['centroMovilizacion']);
unset($indexFields['unidadMilitar']);
}
if ($this->routeClassName == 'coordinadorcentro' || $this->routeClassName == 'operadorcentro' ||
$this->routeClassName == 'medico' || $this->routeClassName == 'odontologo' ||
$this->routeClassName == 'psicologojefe' || $this->routeClassName == 'psicologo' ||
$this->routeClassName == 'laboratorista' )
{
unset($indexFields['centroInstruccion']);
unset($indexFields['unidadMilitar']);
}
if ($this->routeClassName == 'operadorinstruccion')
{
unset($indexFields['baseMovilizacion']);
unset($indexFields['centroMovilizacion']);
unset($indexFields['unidadMilitar']);
}
$nombre = array('nombreCompleto'=>array('nombre'=>'nombreCompleto',
'type'=>'string',
'label'=>$this->translator->trans(
$this->translatorBase.'.fields.nombreCompleto',
array(),
'crud')));
return array_merge($nombre,$indexFields);
}
protected function showGetFields($entity = null)
{
$showFields = parent::showGetFields($entity);
unset($showFields['fechaVigenciaServicio']);
unset($showFields['configuracionSeguridad']);
unset($showFields['foto']);
unset($showFields['conectado']);
unset($showFields['fechaAcceso']);
//$security = $params['securityContext'];
if ($this->routeClassName=='usuario' || $this->routeClassName=='usuarioperfil')
{
unset($showFields['activo']);
unset($showFields['eliminado']);
unset($showFields['fechaEliminacion']);
unset($showFields['configuracionSeguridad']);
}
unset($showFields['password']);
unset($showFields['codigoInicio']);
unset($showFields['fechaMaxActivacion']);
// unset($showFields['intentosFallidos']);
unset($showFields['causaBloqueo']);
unset($showFields['primerIngreso']);
$showFields['username']['atributos']['attr']['containerclass']='full-row';
$showFields['imagen'] = array('nombre' => 'imagen',
'type' => 'string',
'label' => $this->translator->trans(
$this->translatorBase.'.fields.foto',
array(),
'crud'));
$showFields['nombreCompleto'] = array('nombre'=>'nombreCompleto',
'type'=>'string',
'label'=>$this->translator->trans(
$this->translatorBase.'.fields.nombreCompleto',
array(),
'crud'));
return $showFields;
}
protected function getFormFilter()
{
$formulario = parent::getFormFilter();
unset($formulario['password']);
unset($formulario['intentosFallidos']);
unset($formulario['primerIngreso']);
unset($formulario['notificaciones']);
unset($formulario['fechaRegistro_WWdesdeWW']);
unset($formulario['fechaRegistro_WWhastaWW']);
unset($formulario['fechaEliminacion_WWdesdeWW']);
unset($formulario['fechaEliminacion_WWhastaWW']);
unset($formulario['fechaVigenciaPassword_WWdesdeWW']);
unset($formulario['fechaVigenciaPassword_WWhastaWW']);
unset($formulario['apellidos']);
unset($formulario['eliminado']);
unset($formulario['causaBloqueo']);
unset($formulario['foto']);
unset($formulario['email']);
unset($formulario['telefono']);
unset($formulario['movil']);
unset($formulario['direccion']);
unset($formulario['conectado']);
unset($formulario['fechaAcceso']);
// private $baseMovilizacion;
// private $cargo;
// private $centroInstruccion;
// private $centroMovilizacion;
// private $grado;
// private $unidadMilitar;
if ($this->routeClassName == 'admin' || $this->routeClassName == 'coordinadordireccion')
{
unset($formulario['baseMovilizacion']);
unset($formulario['centroInstruccion']);
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
}
if ($this->routeClassName == 'coordinadorbase')
{
unset($formulario['centroInstruccion']);
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
}
if ($this->routeClassName == 'coordinadorcentro' || $this->routeClassName == 'operadorcentro' ||
$this->routeClassName == 'medico' || $this->routeClassName == 'odontologo' ||
$this->routeClassName == 'psicologojege' || $this->routeClassName == 'psicologo' ||
$this->routeClassName == 'laboratorista' )
{
unset($formulario['centroInstruccion']);
unset($formulario['unidadMilitar']);
}
if ($this->routeClassName == 'operadorinstruccion')
{
unset($formulario['baseMovilizacion']);
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
}
// unset($formulario['username']);
$formulario['assignedRoles']['atributos']['disabled']=true;
$formulario['nombres']['type']='custom';
return $formulario;
}
protected function getFormulario($entity)
{
$formulario = parent::getFormulario($entity);
unset($formulario['eliminado']);
unset($formulario['fechaEliminacion']);
unset($formulario['fechaVigenciaPassword']);
unset($formulario['fechaRegistro']);
unset($formulario['intentosFallidos']);
unset($formulario['activo']);
unset($formulario['causaBloqueo']);
unset($formulario['password']);
unset($formulario['primerIngreso']);
unset($formulario['assignedRoles']);
unset($formulario['conectado']);
unset($formulario['fechaAcceso']);
if ($this->accion=='UPDATE')
{
$formulario['username']['atributos']['attr']['readonly']='true';
}
$formulario['direccion']['atributos']['attr']['containerclass']='full-row';
if ($this->routeClassName == 'admin' || $this->routeClassName == 'coordinadordireccion')
{
unset($formulario['baseMovilizacion']);
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
unset($formulario['centroInstruccion']);
}
if ($this->routeClassName == 'coordinadorbase')
{
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
unset($formulario['centroInstruccion']);
}
if ($this->routeClassName == 'coordinadorcentro' || $this->routeClassName == 'operadorcentro' ||
$this->routeClassName == 'medico' || $this->routeClassName == 'odontologo' ||
$this->routeClassName == 'psicologojefe' || $this->routeClassName == 'psicologo' ||
$this->routeClassName == 'laboratorista' )
{
unset($formulario['unidadMilitar']);
unset($formulario['centroInstruccion']);
}
if ($this->routeClassName == 'operadorinstruccion')
{
unset($formulario['baseMovilizacion']);
unset($formulario['centroMovilizacion']);
unset($formulario['unidadMilitar']);
}
if ($this->routeClassName=='usuario_activacion')
{
unset($formulario['username']);
unset($formulario['activo']);
}
$formulario['email']['atributos']['attr']['class']='email';
return $formulario;
}
protected function checkNonUniqueConstrains($entity)
{
if (parent::checkNonUniqueConstrains($entity))
{
if ($entity->getAssignedRoles()->count()==0)
{
$this->session->getFlashBag()
->set('danger',
$this->translator->trans($this->translatorBase.'.error.sinrol', array(), 'crud'));
return false;
}
if (!$entity->getMovil() && !$entity->getTelefono())
{
$this->session->getFlashBag()
->set('danger',
$this->translator->trans( $this->translatorBase.'.error.telefono', array(), 'crud'));
return false;
}
if ($this->accion=='CREATE')
{
$validador = new ValidarIdentificacion();
if (!$validador->isValida($entity->getUserName(), '05'))
{
$this->session->getFlashBag()->set('danger', 'Identificación incorrecta: '.$validador->getError());
//return false;
}
}
return true;
}
return false;
}
public function togleActiveAction($userId)
{
$usuario = $this->em->getRepository(SeguridadUsuario::class)->find($userId);
$usuario->setActivo(!$usuario->getActivo());
$this->em->persist($usuario);
$this->em->flush();
$data = new Response(json_encode(array('ok'=>true)));
$data->headers->set('Content-Type', 'application/json');
return $data;
}
}