<?php
namespace App\Controller\publico\Orden;
use App\Entity\CentroTrabajo;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\Orden\OrdenIniciarType;
use App\Form\Orden\OrdenFinalizarType;
use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
use App\Repository\UsuarioRepository;
use App\Repository\ProcesoBloqFasesRepository;
use App\Repository\OrdenRepository;
use App\Entity\Orden;
use App\Entity\Usuario;
use App\Entity\ProcesoBloqFases;
use DateInterval;
/**
* @Route("/taller/orden", name="orden_")
*/
class OrdenController extends AbstractController
{
private $br;
private $em;
private $procesoBloqFasesRepository;
private $usuarioRepository;
private $ordenRepository;
public function __construct(Breadcrumbs $br, EntityManagerInterface $em, ProcesoBloqFasesRepository $procesoBloqFasesRepository, UsuarioRepository $usuarioRepository, OrdenRepository $ordenRepository)
{
$this->bread = $br;
$this->em = $em;
$this->procesoBloqFasesRepository = $procesoBloqFasesRepository;
$this->usuarioRepository = $usuarioRepository;
$this->ordenRepository = $ordenRepository;
}
/**
* @Route("/nuevo",
* name="new",
* options={"expose"=true},
* methods = {"GET", "POST"},
* )
*/
public function new(Request $request): Response
{
$orden = new Orden();
$form = $this->createForm(OrdenIniciarType::class, $orden);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$operario = $this->usuarioRepository->getUserByCodigo($form->get("operario")->getData());
$fase = $this->procesoBloqFasesRepository->getFaseByCodigo($form->get("fase")->getData());
if (!$operario) {
$this->addFlash('danger', 'No se encontro al operario.');
return $this->redirectToRoute('publico_orden_new');
}
if (!$fase) {
$this->addFlash('danger', 'No se encontro el fichaje.');
return $this->redirectToRoute('publico_orden_new');
}
$encontrada = $this->ordenRepository->getOrdenByUsuarioFase($operario->getId(), $fase->getId());
if ($encontrada) {
return $this->redirectToRoute('publico_orden_edit', ['id' => $encontrada->getId()]);
}
$orden->setOrdenOperario($operario);
$orden->setOrdenFase($fase);
$orden->setOrdenIniciada(new \DateTime());
$centro = $orden->getOrdenCentro();
if ($centro && !$centro->getEstado()) {
$centro->setEstado(CentroTrabajo::ESTADOS['EN MARCHA']);
}
$this->em->persist($orden);
$this->em->flush();
$this->addFlash('success', 'Fichaje iniciado con éxito');
return $this->redirectToRoute('publico_orden_menu');
} else {
$this->addFlash('danger', 'Se han encontrado errores en el formulario enviado.');
}
}
return $this->render(Orden::TallerDir . '/new_edit.html.twig', [
'text' => 'Fichajes',
'form' => $form->createView()
]);
}
/**
* @Route("/{id}/editar",
* name="edit",
* options={"expose"=true},
* methods = {"GET", "POST"},
* requirements={"id"="\d+"}
* )
*/
public function edit(Request $request, Orden $orden): Response
{
if ($orden->getOrdenFinalizada()) {
$this->addFlash('danger', 'EL fichaje ya esta finalizado.');
return $this->redirectToRoute('publico_orden_new');
}
$form = $this->createForm(OrdenFinalizarType::class, $orden);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$pararCentro = $form->get('pararCentroTrabajo')->getData();
$orden->setOrdenFinalizada(new \DateTime());
$diff = date_diff($orden->getOrdenIniciada(), $orden->getOrdenFinalizada());
$minutosUtilizadas = (((int)$orden->getOrdenFase()->getProcesoHorasUtilizadas()) * 60) + ($orden->getOrdenFase()->getProcesoHorasUtilizadas() - (int)$orden->getOrdenFase()->getProcesoHorasUtilizadas()) * 100;
$minutosFinalizada = ($diff->h * 60) + $diff->i;
$this->em->persist($orden);
$orden->getOrdenFase()->setProcesoHorasUtilizadas($this->convertToHoursMins($minutosUtilizadas + $minutosFinalizada));
$centro = $orden->getOrdenCentro();
if ($centro && $centro->getEstado() && $pararCentro) {
$centro->setEstado(CentroTrabajo::ESTADOS['PARADO']);
}
$this->em->flush();
$this->addFlash('success', 'Fichaje finalizado correctamente');
return $this->redirectToRoute('publico_orden_menu');
} else {
$this->addFlash('danger', 'Se han encontrado errores en el formulario enviado.');
}
}
$this->bread->addRouteItem("Finalizar fichaje", 'publico_orden_edit', ['id' => $orden->getId()]);
return $this->render(Orden::TallerDir . '/finalizar.html.twig', [
'text' => 'Finalizar fichaje',
'form' => $form->createView(),
'orden' => $orden
]);
}
/**
* @Route("/menu", name="menu", options={"expose"=true})
*/
public function menu(Request $request): Response
{
$this->bread->addRouteItem("Menu", 'publico_orden_menu');
return $this->render(Orden::TallerDir . '/menu.html.twig', [
'text' => 'Fichajes',
]);
}
function convertToHoursMins($time)
{
if ($time < 1) {
return;
}
$hours = floor($time / 60);
$minutes = ($time % 60) / 100;
return $hours + $minutes;
}
}