<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Form\FormError;
use Vich\UploaderBundle\Handler\DownloadHandler;
use App\Entity\Usuario;
use App\Entity\CambiarPass;
use App\Entity\ImageFile;
use App\Entity\RegistroHorario;
use App\Form\UsuarioType;
use App\Form\ImageFileType;
use App\Form\CambiarPassType;
use App\Form\OpcionesType;
use App\Repository\RegistroHorarioRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
class CoreController extends AbstractController
{
/**
* @Route("/", name="index")
*/
public function index()
{
return $this->render('index.html.twig',[]);
}
/**
* @IsGranted("ROLE_USER")
* @Route("/escritorio", name="escritorio")
*/
public function escritorio(RegistroHorarioRepository $registroHorarioRepository): Response
{
$today = new \DateTime();
$today_ini = clone $today;
$today_ini->setTime(0,0,0);
$registros_hoy = $registroHorarioRepository->findByUserAndDateBeforeTime($this->getUser(),$today);
$ultimo_registro = $registroHorarioRepository->findLastByUser($this->getUser());
$calendario = $this->getUser()->getCalendarioLaboral();
if($calendario!=null){
//Check dias festivos
foreach($calendario->getDiasFestivos() as $df){
if($today_ini == $df->getFecha()){
$this->addFlash('danger','Atención, hoy es festivo' ) ;
break;
}
}
//Dia semana
if($today->format('w')<$calendario->getDiaInicioSemana()){
$this->addFlash('danger','Atención, aún no empezó tu semana laborable' ) ;
}else if($calendario->getDiaFinSemana() != 0 && $today->format('w')>$calendario->getDiaFinSemana()){
$this->addFlash('danger','Atención, tu semana laboral ya terminó');
}
}
if(($ultimo_registro && $ultimo_registro->getFechaInicio() < $today_ini) && $ultimo_registro->getFechaFin()==null){
//Primero tenemos que cerrar el día de ayer
$this->addFlash("warning","Error, no se ha marcado una hora del último día (" . $ultimo_registro->getFechaInicio()->format('d/m/Y') . "). Tienes que cerrar el día antes registrar una nueva entrada.");
return $this->redirectToRoute('cierreManual',['id'=>$ultimo_registro->getId()]);
}else{
//Escritorio
return $this->render('core/escritorio.html.twig', [
'registros_hoy' => $registros_hoy,
'calendario'=>$calendario
]);
}
}
/**
* @IsGranted("ROLE_USER")
* @Route("/fichar", name="fichar")
*/
public function fichar(RegistroHorarioRepository $registroHorarioRepository): Response
{
$today = new \DateTime();
$today_ini = new \DateTime();
$today_ini->setTime(0,0,0);
//Ultimo registro
$ur = $registroHorarioRepository->findLastByUser($this->getUser());
//Si es de hoy comprobamos
if($ur>$today_ini){
if($ur->getFechaFin()==null){
//TODO: Error
die("Error, tienes que salir para volver a fichar hoy");
}
}
$registro = new RegistroHorario();
$registro->setFechaInicio($today);
$registro->setUsuario($this->getUser());
$em = $this->getDoctrine()->getManager();
$em->persist($registro);
$em->flush();
$this->addFlash('success','Se ha registrado el inicio del día');
return $this->redirectToRoute('escritorio');
}
/**
* @IsGranted("ROLE_USER")
* @Route("/desfichar", name="desfichar")
*/
public function desfichar(RegistroHorarioRepository $registroHorarioRepository): Response
{
$today = new \DateTime();
$today_ini = new \DateTime();
$today_ini->setTime(0,0,0);
//Ultimo registro
$registro = $registroHorarioRepository->findLastByUser($this->getUser());
//Si es de hoy comprobamos
if($registro>$today_ini){
if($registro->getFechaFin()!=null){
//TODO: Error
die("Error, tienes que fichar primero");
}
}
$registro->setFechaFin($today);
$em = $this->getDoctrine()->getManager();
$em->persist($registro);
$em->flush();
$this->addFlash('success','Se ha registrado el fin del día');
return $this->redirectToRoute('escritorio');
}
/**
* @IsGranted("ROLE_USER")
* @Route("/miperfil", name="miperfil")
*/
public function miPerfil(Request $request): Response
{
if(!$this->getUser())return $this->redirectToRoute('login');
$usuario = $this->getUser();
$form_user = $this->createForm(UsuarioType::class, $usuario,['can_edit'=>true]);
$form_user->handleRequest($request);
if ($form_user->isSubmitted() && $form_user->isValid()) {
$em = $this->getDoctrine()->getManager();
$usuario = $form_user->getData();
$em->persist($usuario);
$em->flush();
$this->addFlash('success','Datos actualizados correctamente!');
}
return $this->render('core/miperfil.html.twig', [
'form_user'=>$form_user->createView()
]);
}
/**
* @IsGranted("ROLE_USER")
* @Route("/cambiarpass", name="cambiarpass")
*/
public function cambiarPass(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
{
$cambiarPass = new CambiarPass();
$usuario = $this->getUser();
$form = $this->createForm(CambiarPassType::class, $cambiarPass);
$form->handleRequest($request);
//Validada pass antigua mediante Assert\UserPassword
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$cambiarPass = $form->getData();
$encodedPass = $passwordEncoder->encodePassword($usuario,$cambiarPass->getNewPassword());
$usuario->setPassword($encodedPass);
$em->persist($usuario);
$em->flush($usuario);
$this->addFlash('success','Contraseña cambiada correctamente!');
}
return $this->render('core/cambiarpass.html.twig',[
'form'=>$form->createView()
]);
}
/**
* @IsGranted("ROLE_USER")
* @Route("/opciones", name="opciones")
*/
public function opciones(Request $request): Response
{
$usuario = $this->getUser();
$form = $this->createForm(OpcionesType::class, $usuario);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($usuario);
$em->flush();
$this->addFlash('success','Cambios guardados correctamente');
}
return $this->render('core/opciones.html.twig', [
'form'=>$form->createView()
]);
}
/**
* @IsGranted("ROLE_USER")
* @Route("/img/{uniqueName}", name="imageHandler")
*/
public function imageHandler(string $uniqueName, DownloadHandler $downloadHandler)
{
$ifrepository = $this->getDoctrine()->getRepository(ImageFile::class);
$image = $ifrepository->findOneByImageName($uniqueName);
if($image==null){
throw $this->createNotFoundException('No se pudo encontrar la imagen');
}
return $this->downloadImageAction($image, $downloadHandler);
}
public function downloadImageAction(ImageFile $image, DownloadHandler $downloadHandler): Response
{
return $downloadHandler->downloadObject($image, $fileField = 'imageFile', $objectClass = null, $fileName = null, $forceDownload = false);
}
}