<?php
namespace App\Controller\Almacen;
use App\Entity\Almacen\AplicacionArticulo;
use App\Entity\Almacen\Articulo;
use App\Entity\Almacen\ArticuloDeposito;
use App\Form\Almacen\ArticuloType;
use App\Repository\Almacen\ArticuloRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use App\Entity\Almacen\Deposito;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use App\Repository\Almacen\UnidadMedidaRepository;
use App\Entity\Almacen\UnidadMedida;
use Doctrine\ORM\EntityManagerInterface;
/**
* @Route("/almacen/articulo")
*/
class ArticuloController extends AbstractController
{
/**
* @Route("/", name="app_almacen_articulo_index", methods={"GET"})
*/
public function index(ArticuloRepository $articuloRepository, EntityManagerInterface $em): Response
{
$aplicaciones = $em->getRepository(AplicacionArticulo::class)->findAll();
return $this->render('almacen/articulo/index.html.twig', [
'articulos' => $articuloRepository->findBy(['activo' => true], ['descripcion' => 'ASC']),
// 'articulos' => $articuloRepository->findAll(),
'aplicaciones' => $aplicaciones,
]);
}
/**
* @Route("/add/{id}/aplicacion", name="app_almacen_articulo_add_aplicacion", methods={"POST"})
*/
public function addAplicacion(Articulo $articulo, Request $request, EntityManagerInterface $em): Response
{
try
{
$aplicacion = $request->request->get('aplicacion');
if ($aplicacion)
{
$aplicacion = $em->getRepository(AplicacionArticulo::class)->find($aplicacion);
if ($aplicacion)
{
$articulo->addAplicacione($aplicacion);
$em->flush();
}
return new JsonResponse(['ok' => true, 'aplicacion' => $articulo->getListaAplicaciones()]) ;
}
}
catch(\Exception $e){
return new JsonResponse(['ok' => false]);
}
}
/**
* @Route("/change/{id}/status", name="app_almacen_articulo_change_status", methods={"POST"})
*/
public function changeStatus(Articulo $articulo): Response
{
$em = $this->getDoctrine()->getManager();
$articulo->setActivo(!$articulo->isActivo());
$em->flush();
return new JsonResponse(['ok' => true]);
return $this->render('almacen/articulo/index.html.twig', [
'articulos' => $articuloRepository->findAll(),
]);
}
private function getSelectDeposito()
{
return $this->createFormBuilder()
->add('deposito', EntityType::class,
[
'class' => Deposito::class,
]
)
->add('cargar', SubmitType::class)
->getForm();
}
/**
* @Route("/importar", name="app_almacen_articulo_importar_index", methods={"GET", "POST"})
*/
public function importarArticulos(Request $request, UnidadMedidaRepository $unidadMedidaRepository): Response
{
$form2 = $this->createFormBuilder()
->add('archivo', FileType::class)
->add('cargar', SubmitType::class)
->add('aplicacion', EntityType::class,
[
'class' => AplicacionArticulo::class,
'required' => false,
]
)
->getForm();
$form2->handleRequest($request);
$aux = array();
if ($form2->isSubmitted() && $form2->isValid())
{
$aplicacion = $form2->get('aplicacion')->getData();
$em = $this->getDoctrine()->getManager();
$file = $form2->get('archivo')->getData();
if (($handle = fopen($file->getPathname(), "r")) !== false)
{
while (($data = fgetcsv($handle, 1000, ';')) !== false)
{
$um = null;
if (isset($data[2]) && ($data[2]))
{
$nameum = strtoupper(utf8_encode($data[2]));
$um = $unidadMedidaRepository->findWithName($nameum);
}
$codigo = isset($data[0]) ? utf8_encode($data[0]) : null;
$art = null;
if ($codigo)
{
$art = $em->getRepository(Articulo::class)->findOneBy(['codigo' => $codigo]);
}
if (!$art)
{
$art = new Articulo();
$art->setDescripcion(utf8_encode($data[1]))
->setUnidaMedida($um)
->setCodigo(utf8_encode($data[0]));
if ($aplicacion)
{
$art->addAplicacione($aplicacion);
}
$em->persist($art);
}
else
{
if ($aplicacion)
{
$art->addAplicacione($aplicacion);
}
}
}
$em->flush();
fclose($handle);
}
}
return $this->render('almacen/articulo/import.html.twig', [
'form' => $form2->createView(),
]);
}
/**
* @Route("/{art}/{depo}/config", name="app_almacen_articulo_config_stocks", methods={"POST"})
*/
public function procesarLimitesStocks(Articulo $art, Deposito $depo, Request $request): Response
{
try
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
$artDepo = $repository->findArticuloDeposito($art, $depo);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($art)
->setDeposito($depo);
$em->persist($artDepo);
}
$fields = $request->request->all();
$artDepo->setStockMinimo($fields['smin'] ? $fields['smin'] : null)
->setStockMaximo($fields['smax'] ? $fields['smax'] : null);
$em->flush();
return new JsonResponse(['ok' => true]);
}
catch(\Exception $e){
return new JsonResponse(['ok' => false, 'msg' => 'No se pudo actuliazr la informacion.']);
}
}
/**
* @Route("/configurar", name="app_almacen_articulo_configurar", methods={"GET", "POST"})
*/
public function configurar(ArticuloRepository $articuloRepository, Request $request): Response
{
$form = $this->getSelectDeposito();
$articulos = array();
if ($request->isMethod('POST'))
{
$form->handleRequest($request);
if ($form->isValid())
{
$data = $form->getData();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
$config = $repository->articulosPorDeposito($data['deposito']);
$aux = array();
foreach ($config as $d)
{
$aux[$d['idArt']] = $d;
}
$articulos = $em->getRepository(Articulo::class)->articulosActivos();
//throw new \Exception(print_r($config, true));
foreach($articulos as $k => $v)
{
$smin = $smax = $stock = null;
// $key = array_search($v['idArt'], array_column($config, 'idArt'));
if (array_key_exists($v['idArt'], $aux))
{
$a = $aux[$v['idArt']];
$smin = $a['minimo'];
$smax = $a['maximo'];
$stock = $a['stock'];
}
else
{
// throw new \Exception(print_r(array_column($config, 'idArt'), true));
}
$articulos[$k]['minimo'] = $smin;
$articulos[$k]['maximo'] = $smax;
$articulos[$k]['stock'] = $stock;
}
return $this->render('almacen/articulo/config.html.twig', [
'articulos' => $articulos,
'form' =>$form->createView(),
'deposito' => $data['deposito']
]);
}
}
return $this->render('almacen/articulo/config.html.twig', [
'form' =>$form->createView(),
]);
}
/**
* @Route("/new", name="app_almacen_articulo_new", methods={"GET", "POST"})
*/
public function new(Request $request, ArticuloRepository $articuloRepository): Response
{
$articulo = new Articulo();
$form = $this->createForm(ArticuloType::class, $articulo);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$articuloRepository->add($articulo, true);
return $this->redirectToRoute('app_almacen_articulo_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('almacen/articulo/new.html.twig', [
'articulo' => $articulo,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_almacen_articulo_show", methods={"GET"})
*/
public function show(Articulo $articulo): Response
{
return $this->render('almacen/articulo/show.html.twig', [
'articulo' => $articulo,
]);
}
/**
* @Route("/{id}/edit", name="app_almacen_articulo_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, Articulo $articulo, ArticuloRepository $articuloRepository): Response
{
$form = $this->createForm(ArticuloType::class, $articulo);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$articuloRepository->add($articulo, true);
return $this->redirectToRoute('app_almacen_articulo_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('almacen/articulo/edit.html.twig', [
'articulo' => $articulo,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_almacen_articulo_delete", methods={"POST"})
*/
public function delete(Request $request, Articulo $articulo, ArticuloRepository $articuloRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$articulo->getId(), $request->request->get('_token'))) {
$articuloRepository->remove($articulo, true);
}
return $this->redirectToRoute('app_almacen_articulo_index', [], Response::HTTP_SEE_OTHER);
}
}