<?php
namespace App\Controller\Movimientos;
use App\Entity\Movimientos\ItemMovimiento;
use App\Form\Movimientos\ItemMovimientoType;
use App\Repository\Movimientos\ItemMovimientoRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Movimientos\MovimientoStock;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\Almacen\Deposito;
use App\Entity\Almacen\ArticuloDeposito;
use Psr\Log\LoggerInterface;
/**
* @Route("/movimientos/item/movimiento")
*/
class ItemMovimientoController extends AbstractController
{
/**
* @Route("/", name="app_movimientos_item_movimiento_index", methods={"GET"})
*/
public function index(ItemMovimientoRepository $itemMovimientoRepository): Response
{
return $this->render('movimientos/item_movimiento/index.html.twig', [
'item_movimientos' => $itemMovimientoRepository->findAll(),
]);
}
/**
* @Route("/{id}/new", name="app_movimientos_item_movimiento_new", methods={"GET", "POST"})
*/
public function new(MovimientoStock $movimiento, Request $request, ItemMovimientoRepository $itemMovimientoRepository): Response
{
$type = $movimiento->getInstance();
$path = $pathsend = null;
switch ($type)
{
case "as":
$path = "app_movimientos_ajuste_stock_index";
$pathsend="app_movimientos_item_movimiento_procesar_ajuste";
break;
case "or":
$path = "app_movimientos_orden_reparacion_index";
$pathsend="app_movimientos_item_movimiento_procesar_orden_reparacion";
break;
case "tr":
$path = "app_movimientos_transferencia_index";
$pathsend="app_movimientos_item_movimiento_procesar_transferencia";
break;
case "oc":
$path = "app_movimientos_orden_compra_index";
$pathsend="app_movimientos_item_movimiento_procesar_oc";
break;
case "ph":
$path = "app_movimientos_prestamo_herramienta_index";
$pathsend="app_movimientos_item_movimiento_procesar_prestamo";
break;
case "ore":
$path = "app_movimientos_orden_reparacion_externa_index";
$pathsend="app_movimientos_item_movimiento_orden_reparacion_externa";
break;
}
$itemMovimiento = new ItemMovimiento();
$itemMovimiento->setMovimiento($movimiento);
$form = $this->createForm(ItemMovimientoType::class, $itemMovimiento, ['movimiento' => $movimiento, 'user' => $this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
if (!$movimiento->isModificable())
{
$this->addFlash(
'error',
'La accion no se puede llevar a cabo. El documento ya ha sido finalizado.'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
$itemMovimientoRepository->add($itemMovimiento, true);
//return $this->redirectToRoute('app_movimientos_item_movimiento_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('movimientos/item_movimiento/new.html.twig', [
'item_movimiento' => $itemMovimiento,
'movimiento' => $movimiento,
'form' => $form,
'path' => $path,
'pathsend' => $pathsend,
]);
}
/**
* @Route("/{id}/procesar/ingreso", name="app_movimientos_item_movimiento_procesar_ingreso", methods={"GET", "POST"})
*/
public function procesarIngreso(MovimientoStock $movimiento, Request $request, LoggerInterface $logger): Response
{
$flag = $movimiento->getInstance();
if ($movimiento->isYaProcesada())
{
if ($flag == 'oc')
{
return new JsonResponse(['ok' => false, 'msg' => 'La orden de compra ya ha sido procesada']);
}
else
{
if ($movimiento->getIsDevuelta())
{
return new JsonResponse(['ok' => false, 'msg' => 'La devolucion ya ha sido procesada']);
}
}
}
$fields = $request->request->all();
// return new JsonResponse($fields);
$em = $this->getDoctrine()->getManager();
$deposito = $movimiento->getDeposito(); //$em->find(Deposito::class, $fields['deposito']);
if (!$fields['recepcion'])
{
if ($flag == 'oc')
{
return new JsonResponse(['ok' => false, 'msg' => 'Debe seleccionar la fecha de recepcion de la mercaderia']);
}
else
{
return new JsonResponse(['ok' => false, 'msg' => 'Debe seleccionar la fecha de devolucion']);
}
}
$repository = $em->getRepository(ArticuloDeposito::class);
if (!$deposito)
{
return new JsonResponse(['ok' => false, 'msg' => 'No ha seleccionado un deposito desitno']);
}
$recepcion = \DateTime::createFromFormat('Y-m-d', $fields['recepcion']);
// $repository = $em->getRepository(ItemMovimiento::class);
$query = 'item';
$cacheArticulos = $observaciones = array();
foreach ($fields as $k => $v)
{
// $observaciones[$k] = $v;
$field = explode('-', $k);
if ($field[0] === $query)
{
$item = $em->find(ItemMovimiento::class, $field[1]);
if ($item)
{
$articulo = $item->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $deposito);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $deposito);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($deposito);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() + $v);
$item->setObservaciones($fields["obser-$field[1]"])
->setCantidadIngresada($v);
$cacheArticulos[uniqid()] = $artDepo;
}
}
}
$movimiento->setYaProcesada(true)
->setDeposito($deposito)
->setIsDevuelta(true, $recepcion);
$em->flush();
return new JsonResponse(['ok' => true]);
//throw new \Exception(print_r($fields));
}
/**
* @Route("/{id}/procesar/transferencia", name="app_movimientos_item_movimiento_procesar_transferencia", methods={"GET", "POST"})
*/
public function procesarTransferencia(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos a la tranferencia']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos a la tranferencia'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'La transferencia ya ha sido ejecutada']);
}
else
{
$this->addFlash(
'error',
'La transferencia ya ha sido ejecutada'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$query = 'item';
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$destino = $movimiento->getDestino();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() - $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $destino);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $destino);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($destino);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() + $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
}
$movimiento->setYaProcesada(true);
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Ajuste Stock procesado exitosamente'
);
return $this->redirectToRoute('app_movimientos_transferencia_index');
}
/**
* @Route("/{id}/procesar/prestamo", name="app_movimientos_item_movimiento_procesar_prestamo", methods={"GET", "POST"})
*/
public function procesarPrestamoHerrameintas(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos al prestamo']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos al prestamo'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'El prestamo ya ha sido ejecutada']);
}
else
{
$this->addFlash(
'error',
'El prestamo ya ha sido ejecutada'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() - $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
}
$movimiento->setYaProcesada(true);
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Transferencia procesada exitosamente'
);
return $this->redirectToRoute('app_movimientos_prestamo_herramienta_index');
}
/**
* @Route("/{id}/procesar/orden/re", name="app_movimientos_item_movimiento_orden_reparacion_externa", methods={"GET", "POST"})
*/
public function procesarOrdenReparacionExterna(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos a la orden']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos a la orden'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'La orden ya ha sido ejecutada']);
}
else
{
$this->addFlash(
'error',
'La orden ya ha sido ejecutada'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() - $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
}
$movimiento->setYaProcesada(true);
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Orden reparacion procesada exitosamente'
);
return $this->redirectToRoute('app_movimientos_orden_reparacion_externa_index');
}
/**
* @Route("/{id}/procesar/orden/reparacion", name="app_movimientos_item_movimiento_procesar_orden_reparacion", methods={"GET", "POST"})
*/
public function procesarOrdenReparacion(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos a la orden de reparacion']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos a la orden de reparacion'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'La orden de reparacion ya ha sido ejecutada']);
}
else
{
$this->addFlash(
'error',
'La orden de reparacion ya ha sido ejecutada'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
$artDepo->setStock($artDepo->getStock() - $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
}
$movimiento->setYaProcesada(true);
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Orden reparacion procesada exitosamente'
);
return $this->redirectToRoute('app_movimientos_orden_reparacion_index');
}
/**
* @Route("/{id}/procesar/oc", name="app_movimientos_item_movimiento_procesar_oc", methods={"GET", "POST"})
*/
public function procesarOrdenCompra(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos a la orden de compra']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos a la orden de compra'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'La ordende compra ya ha sido ejecutada']);
}
else
{
$this->addFlash(
'error',
'La orden de compra ya ha sido ejecutada'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
/* foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
// $artDepo->setStock($artDepo->getStock() + $v->getCantidad());
$cacheArticulos[uniqid()] = $artDepo;
}*/
//$movimiento->setYaProcesada(true);
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Orden compra procesada exitosamente'
);
return $this->redirectToRoute('app_movimientos_orden_compra_index');
}
/**
* @Route("/{id}/procesar/ajuste/stock", name="app_movimientos_item_movimiento_procesar_ajuste", methods={"GET", "POST"})
*/
public function procesarAjusteStock(MovimientoStock $movimiento, Request $request): Response
{
if (!$movimiento->getItems()->count())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'No se han ingresados articulos al ajuste']);
}
else
{
$this->addFlash(
'error',
'No se han ingresados articulos al ajuste'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($movimiento->isYaProcesada())
{
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => false, 'msg' => 'El ajuste ya ha sido ejecutado']);
}
else
{
$this->addFlash(
'error',
'El ajuste ya ha sido ejecutado'
);
return $this->redirectToRoute('app_movimientos_item_movimiento_new', ['id' => $movimiento->getId()], Response::HTTP_SEE_OTHER);
}
}
$cacheArticulos = array();
$origen = $movimiento->getDeposito();
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(ArticuloDeposito::class);
foreach ($movimiento->getItems() as $v)
{
$articulo = $v->getArticulo();
$finders = $this->findArticuloDepositoInCache($cacheArticulos, $articulo, $origen);
$cacheArticulos = $finders[1];
$artDepo = $finders[0];
if (!$artDepo)
{
$artDepo = $repository->findArticuloDeposito($articulo, $origen);
if (!$artDepo)
{
$artDepo = new ArticuloDeposito();
$artDepo->setArticulo($articulo)
->setDeposito($origen);
$em->persist($artDepo);
}
}
if ($movimiento->getTipo() == 'IN')
{
$artDepo->updateStock($v->getCantidad());
// throw new \LogicException("" . $artDepo->getArticulo());
}
else
{
$artDepo->updateStock(((-1)*$v->getCantidad()));
}
$cacheArticulos[uniqid()] = $artDepo;
}
$movimiento->setYaProcesada(true)
->setDeposito($origen)
->setIsDevuelta(true, new \DateTime());
$em->flush();
if ($request->isXmlHttpRequest())
{
return new JsonResponse(['ok' => true]);
}
$this->addFlash(
'success',
'Ajuste stock procesado exitosamente'
);
return $this->redirectToRoute('app_movimientos_ajuste_stock_index');
}
private function findArticuloDepositoInCache($array, $articulo, $deposito)
{
$element = $key = null;
foreach ($array as $k => $ad)
{
if (($ad->getDeposito() === $deposito) && ($ad->getArticulo() === $articulo))
{
$element = $ad;
$key = $k;
}
}
if ($key && $element)
{
unset($array[$key]);
}
return array($element, $array);
}
/**
* @Route("/{id}/ingresar", name="app_movimientos_item_movimiento_ingresar", methods={"GET", "POST"})
*/
public function ingresar(MovimientoStock $movimiento, Request $request): Response
{
$type = $movimiento->getInstance();
$path = $pathsend = $title = null;
switch ($type)
{
case "tr":
$path = "app_movimientos_transferencia_index";
$pathsend="app_movimientos_item_movimiento_procesar_transferencia";
break;
case "oc":
$path = "app_movimientos_orden_compra_index";
break;
case "ph":
$path = "app_movimientos_prestamo_herramienta_index";
$pathsend="app_movimientos_item_movimiento_procesar_prestamo";
break;
case "or":
$path = "app_movimientos_orden_reparacion_index";
break;
case "ore":
$path = "app_movimientos_orden_reparacion_externa_index";
$pathsend= "app_movimientos_item_movimiento_orden_reparacion_externa";
break;
}
$depositos = $this->getDoctrine()->getManager()->getRepository(Deposito::class)->findAll();
//return $this->redirectToRoute('app_movimientos_item_movimiento_index', [], Response::HTTP_SEE_OTHER);
return $this->renderForm('movimientos/item_movimiento/ingresar.html.twig', [
'movimiento' => $movimiento,
'depositos' => $depositos,
'path' => $path,
'tipo' => $type
]);
}
/**
* @Route("/{id}", name="app_movimientos_item_movimiento_show", methods={"GET"})
*/
public function show(ItemMovimiento $itemMovimiento): Response
{
return $this->render('movimientos/item_movimiento/show.html.twig', [
'item_movimiento' => $itemMovimiento,
]);
}
/**
* @Route("/{id}/edit", name="app_movimientos_item_movimiento_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, ItemMovimiento $itemMovimiento, ItemMovimientoRepository $itemMovimientoRepository): Response
{
$form = $this->createForm(ItemMovimientoType::class, $itemMovimiento, ['user' => $this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$itemMovimientoRepository->add($itemMovimiento, true);
return $this->redirectToRoute('app_movimientos_item_movimiento_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('movimientos/item_movimiento/edit.html.twig', [
'item_movimiento' => $itemMovimiento,
'form' => $form,
]);
}
/**
* @Route("/{id}/delete", name="app_movimientos_item_movimiento_delete", methods={"POST"})
*/
public function delete(Request $request, ItemMovimiento $itemMovimiento, ItemMovimientoRepository $itemMovimientoRepository): Response
{
try
{
$movimiento = $itemMovimiento->getMovimiento();
if (!$movimiento->isModificable())
{
return new JsonResponse(['ok' => false, 'msg' => 'No es posible modificar el documento']);
}
$itemMovimientoRepository->remove($itemMovimiento, true);
return new JsonResponse(['ok' => true]);
}
catch (\Exception $e)
{
return new JsonResponse(['ok' => false, 'msg' => $e->getMessage()]);
}
}
}