<?php
namespace App\Controller\Movimientos;
use App\Entity\Movimientos\OrdenCompra;
use App\Entity\Almacen\Deposito;
use App\Form\Movimientos\OrdenCompraType;
use App\Repository\Movimientos\OrdenCompraRepository;
use Knp\Snappy\Pdf;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Twig\Environment;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManagerInterface;
/**
* @Route("/movimientos/orden/compra")
*/
class OrdenCompraController extends AbstractController
{
private $twig;
private $pdf;
public function __construct(Environment $twig, Pdf $pdf)
{
$this->twig = $twig;
$this->pdf = $pdf;
}
/**
* @Route("/{id}/pdf", name="app_movimientos_orden_compra_pdf", methods={"GET"})
*/
public function pdf(OrdenCompra $ordenCompra)
{
$html = $this->twig->render('movimientos/orden_compra/pdf.html.twig', [ 'orden_compra' => $ordenCompra ]);
$this->pdf->setTimeout(600);
return new PdfResponse(
$this->pdf->getOutputFromHtml($html),
'orden_compra_' . $ordenCompra->getNumero() . '.pdf'
);
}
/**
* @Route("/", name="app_movimientos_orden_compra_index", methods={"GET"})
*/
public function index(OrdenCompraRepository $ordenCompraRepository): Response
{
return $this->render('movimientos/orden_compra/index.html.twig', [
'orden_compras' => $ordenCompraRepository->findAll(),
]);
}
/**
* @Route("/informe", name="app_movimientos_orden_compra_informe", methods={"GET", "POST"})
*/
public function informe(Request $request, OrdenCompraRepository $ordenCompraRepository): Response
{
$depositoUsuario = $this->getUser() ? $this->getUser()->getDefault() : null;
$form = $this->createFormBuilder()
->add('fechaDesde',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->add('fechaHasta',
DateType::class,
[
'widget' => 'single_text',
'required' => false,
'attr' => ['class' => 'form-control'],
])
->add('deposito',
EntityType::class,
[
'class' => Deposito::class,
'required' => true,
'data' => $depositoUsuario,
// solo se puede elegir entre los depositos asignados al usuario logeado
'query_builder' => function (EntityRepository $er) use ($depositoUsuario) {
$qb = $er->createQueryBuilder('d')
->andWhere('d.activo = true')
->orderBy('d.nombre', 'ASC');
return $qb;
},
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$data = $form->getData();
$articulos = $ordenCompraRepository->informeFiltrado([
'desde' => $data['fechaDesde'],
'hasta' => $data['fechaHasta'],
'deposito' => $data['deposito'],
]);
$urlExcel = $this->generateUrl('app_movimientos_orden_compra_informe_excel', [
'desde' => $data['fechaDesde'] ? $data['fechaDesde']->format('Y-m-d') : 0,
'hasta' => $data['fechaHasta'] ? $data['fechaHasta']->format('Y-m-d') : 0,
'deposito' => $data['deposito'] ? $data['deposito']->getId() : 0,
]);
return $this->render('movimientos/orden_compra/informe.html.twig', [
'form' => $form->createView(),
'articulos' => $articulos,
'fechaDesde' => $data['fechaDesde'],
'fechaHasta' => $data['fechaHasta'],
'deposito' => $data['deposito'],
'fechaGeneracion' => new \DateTime(),
'urlExcel' => $urlExcel,
]);
}
return $this->render('movimientos/orden_compra/informe.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/informe/excel/desde/{desde}/hasta/{hasta}/deposito/{deposito}", name="app_movimientos_orden_compra_informe_excel", methods={"GET"})
*/
public function informeExcel($desde, $hasta, $deposito, OrdenCompraRepository $ordenCompraRepository, EntityManagerInterface $em): Response
{
$fechaDesde = $desde != 0 ? new \DateTime($desde) : null;
$fechaHasta = $hasta != 0 ? new \DateTime($hasta) : null;
$depositoEntity = $deposito != 0 ? $em->getRepository(Deposito::class)->find($deposito) : null;
$articulos = $ordenCompraRepository->informeFiltrado([
'desde' => $fechaDesde,
'hasta' => $fechaHasta,
'deposito' => $depositoEntity,
]);
$html = $this->twig->render('movimientos/orden_compra/informe_excel.html.twig', [
'articulos' => $articulos,
'fechaDesde' => $fechaDesde,
'fechaHasta' => $fechaHasta,
'deposito' => $depositoEntity,
'fechaGeneracion' => new \DateTime(),
]);
$response = new Response($html);
$response->headers->set('Content-Type', 'application/vnd.ms-excel; charset=UTF-8');
$response->headers->set('Content-Disposition', 'attachment; filename="informe_ordenes_compra_' . date('Y-m-d_His') . '.xls"');
return $response;
}
/**
* @Route("/new", name="app_movimientos_orden_compra_new", methods={"GET", "POST"})
*/
public function new(Request $request, OrdenCompraRepository $ordenCompraRepository): Response
{
$ordenCompra = new OrdenCompra();
$proximo = $ordenCompraRepository->proximoNumero();
if (!$proximo)
{
$proximo = 1;
}
$ordenCompra->setNumero($proximo);
$form = $this->createForm(OrdenCompraType::class, $ordenCompra, [ 'user' => $this->getUser() ] );
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$ordenCompraRepository->add($ordenCompra, true);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $ordenCompra->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('movimientos/orden_compra/new.html.twig', [
'orden_compra' => $ordenCompra,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_movimientos_orden_compra_show", methods={"GET"})
*/
public function show(OrdenCompra $ordenCompra): Response
{
return $this->render('movimientos/orden_compra/show.html.twig', [
'orden_compra' => $ordenCompra,
]);
}
/**
* @Route("/{id}/edit", name="app_movimientos_orden_compra_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, OrdenCompra $ordenCompra, OrdenCompraRepository $ordenCompraRepository): Response
{
$form = $this->createForm(OrdenCompraType::class, $ordenCompra, [ 'user' => $this->getUser() ]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$ordenCompraRepository->add($ordenCompra, true);
return $this->redirectToRoute('app_movimientos_orden_compra_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('movimientos/orden_compra/edit.html.twig', [
'orden_compra' => $ordenCompra,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_movimientos_orden_compra_delete", methods={"POST"})
*/
public function delete(Request $request, OrdenCompra $ordenCompra, OrdenCompraRepository $ordenCompraRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$ordenCompra->getId(), $request->request->get('_token'))) {
$ordenCompraRepository->remove($ordenCompra, true);
}
return $this->redirectToRoute('app_movimientos_orden_compra_index', [], Response::HTTP_SEE_OTHER);
}
}