<?php
namespace App\EventSubscriber;
use App\Entity\Inventario;
use App\Entity\InventarioMateriaAcondicionamiento;
use App\Entity\InventarioMateriaPrima;
use App\Entity\MateriaAcondicionamiento;
use App\Entity\MateriaPrima;
use App\Entity\OrdenPedido;
use App\Entity\Pedido;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AbstractLifecycleEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class EasyAdminSubscriber implements EventSubscriberInterface
{
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function actualizarInventario(AbstractLifecycleEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Pedido) {
// Si es un pedido recibido, actualizar el inventario con uds cuarentena
$this->actualizarInventarioDePedido($entity);
} elseif ($entity instanceof OrdenPedido) {
// Si es una orden de producto, actualizar el inventario restando uds generales
$this->actualizarInventarioDeOrdenPedido($entity);
} elseif ($entity instanceof Inventario) {
$this->actualizarInventarioDeInventario($entity);
}
}
public function antesCrearEntity(AbstractLifecycleEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Pedido) {
// Productos de pedido con cantidad 0, se eliminan del pedido
foreach ($entity->getPedidoMateriasPrimas() as $pedidoMateriaPrima) {
if ($pedidoMateriaPrima->getCantidad() == 0) {
$entity->removePedidoMateriasPrima($pedidoMateriaPrima);
}
}
foreach ($entity->getPedidoMateriasAcondicionamiento() as $pedidoMateriaAcondicionamiento) {
if ($pedidoMateriaAcondicionamiento->getCantidad() == 0) {
$entity->removePedidoMateriasAcondicionamiento($pedidoMateriaAcondicionamiento);
}
}
}
}
public static function getSubscribedEvents()
{
return [
BeforeEntityPersistedEvent::class => ['antesCrearEntity'],
AfterEntityUpdatedEvent::class => ['actualizarInventario'],
AfterEntityPersistedEvent::class => ['actualizarInventario'],
];
}
public function actualizarInventarioDeInventario(Inventario $inventario)
{
if ($inventario->getGeneralTodo()) {
foreach ($inventario->getInventarioMateriasPrimas() as $inventarioMateriaPrima) {
$udsGenerales = $inventarioMateriaPrima->getUnidadesGenerales() + $inventarioMateriaPrima->getUnidadesCuarentena();
$inventarioMateriaPrima->setUnidadesGenerales($udsGenerales);
$inventarioMateriaPrima->setUnidadesCuarentena(0);
}
foreach ($inventario->getInventarioMateriasAcondicionamiento() as $inventarioMateriaAcondicionamiento) {
$udsGenerales = $inventarioMateriaAcondicionamiento->getUnidadesGenerales() + $inventarioMateriaAcondicionamiento->getUnidadesCuarentena();
$inventarioMateriaAcondicionamiento->setUnidadesGenerales($udsGenerales);
$inventarioMateriaAcondicionamiento->setUnidadesCuarentena(0);
}
}
$this->entityManager->persist($inventario);
$this->entityManager->flush();
}
public function actualizarInventarioDeOrdenPedido(OrdenPedido $ordenPedido)
{
if ($ordenPedido->getActualizarInventario()) {
// Obtengo ultimo inventario
$inventarioRepository = $this->entityManager->getRepository(Inventario::class);
$ultimoInventario = $inventarioRepository->findOneBy(array(), array('fechaCreacion' => 'DESC'), 1, 0);
if ($ultimoInventario->getFechaFinalizacion() == null) {
$ultimoInventario->setFechaFinalizacion(new DateTime('now'));
}
$inventario = new Inventario();
$inventario->setFechaCreacion(new DateTime('now'));
$inventario->setFechaFinalizacion(new DateTime('now'));
$inventario->setTipoInventario("Orden Producción " . $ordenPedido->getId());
foreach ($ultimoInventario->getInventarioMateriasPrimas() as $inventarioMateriaPrima) {
$nuevoInventarioMateriaPrima = new InventarioMateriaPrima();
$nuevoInventarioMateriaPrima->setMateriaPrima($inventarioMateriaPrima->getMateriaPrima());
$nuevoInventarioMateriaPrima->setUnidadesCuarentena($inventarioMateriaPrima->getUnidadesCuarentena());
$nuevoInventarioMateriaPrima->setUnidadesGenerales($inventarioMateriaPrima->getUnidadesGenerales());
$nuevoInventarioMateriaPrima->setUnidadesRechazadas($inventarioMateriaPrima->getUnidadesRechazadas());
$nuevoInventarioMateriaPrima->setLote($inventarioMateriaPrima->getLote());
$inventario->addInventarioMateriasPrima($nuevoInventarioMateriaPrima);
}
$lotesGastados = array();
$gastosPorMateriaPrima = $ordenPedido->gastoPorMateriaPrima();
$lotesGastados[] = "MATERIAS PRIMAS:<br/>";
foreach ($gastosPorMateriaPrima as $idMP => $gasto) {
foreach ($inventario->getInventarioMateriasPrimas() as $inventarioMateriaPrima) {
if ($inventarioMateriaPrima->getMateriaPrima()->getId() == $idMP) {
$unidadesGenerales = $inventarioMateriaPrima->getUnidadesGenerales();
$unidadesGenerales = $unidadesGenerales - $gasto;
$gastado = $gasto;
if ($unidadesGenerales < 0) {
// echo "uds generales menores que 0<br/>";
$gastado = $inventarioMateriaPrima->getUnidadesGenerales();
$gasto = abs($unidadesGenerales);
$unidadesGenerales = 0;
} else {
$gasto = 0;
}
$inventarioMateriaPrima->setUnidadesGenerales($unidadesGenerales);
$lotesGastados[] = $inventarioMateriaPrima->getMateriaPrima()->getNombre() . "(" .
$inventarioMateriaPrima->getLote() . "): " . $gastado;
if ($gasto <= 0) {
break;
}
}
}
if ($gasto > 0) {
// Si el resultado es negativo
$nuevoInventarioMateriaPrima = new InventarioMateriaPrima();
$nuevoInventarioMateriaPrima->setUnidadesGenerales($gasto * -1);
$nuevoInventarioMateriaPrima->setUnidadesCuarentena(0);
$nuevoInventarioMateriaPrima->setUnidadesRechazadas(0);
$materiaPrimaRep = $this->entityManager->getRepository(MateriaPrima::class);
$materiaPrima = $materiaPrimaRep->findOneBy(array("id" => $idMP));
$nuevoInventarioMateriaPrima->setMateriaPrima($materiaPrima);
$inventario->addInventarioMateriasPrima($nuevoInventarioMateriaPrima);
}
}
foreach ($ultimoInventario->getInventarioMateriasAcondicionamiento() as $inventarioMateriaAcondicionamiento) {
$nuevoInventarioMateriaAcondicionamiento = new InventarioMateriaAcondicionamiento();
// echo $inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getId() . " " .$inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getNombre() . " " .
// $inventarioMateriaAcondicionamiento->getUnidadesGenerales() . "<br/>";
$nuevoInventarioMateriaAcondicionamiento->setMateriaAcondicionamiento($inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesCuarentena($inventarioMateriaAcondicionamiento->getUnidadesCuarentena());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesGenerales($inventarioMateriaAcondicionamiento->getUnidadesGenerales());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesRechazadas($inventarioMateriaAcondicionamiento->getUnidadesRechazadas());
$nuevoInventarioMateriaAcondicionamiento->setLote($inventarioMateriaAcondicionamiento->getLote());
$inventario->addInventarioMateriasAcondicionamiento($nuevoInventarioMateriaAcondicionamiento);
}
$gastosPorMateriaAcondicionamiento = $ordenPedido->gastoPorMateriaAcondicionamiento();
var_dump($gastosPorMateriaAcondicionamiento);
$lotesGastados[] = "<br/>MATERIAS ACONDICIONAMIENTO:<br/>";
foreach ($gastosPorMateriaAcondicionamiento as $idMA => $gasto) {
foreach ($inventario->getInventarioMateriasAcondicionamiento() as $inventarioMateriaAcondicionamiento) {
if ($inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getId() == $idMA) {
$unidadesGenerales = $inventarioMateriaAcondicionamiento->getUnidadesGenerales();
// echo $inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getNombre();
$unidadesGenerales = $unidadesGenerales - $gasto;
$gastado = $gasto;
if ($unidadesGenerales < 0) {
$gastado = $inventarioMateriaAcondicionamiento->getUnidadesGenerales();
$gasto = abs($unidadesGenerales);
$unidadesGenerales = 0;
} else {
$gasto = 0;
}
$inventarioMateriaAcondicionamiento->setUnidadesGenerales($unidadesGenerales);
$lotesGastados[] = $inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getNombre() . "(" .
$inventarioMateriaAcondicionamiento->getLote() . "): " . $gastado;
if ($gasto <= 0) {
break;
}
}
}
if ($gasto > 0) {
// Si el resultado es negativo
$nuevoInventarioMateriaAcondicionamiento = new InventarioMateriaAcondicionamiento();
$nuevoInventarioMateriaAcondicionamiento->setUnidadesGenerales($gasto * -1);
$nuevoInventarioMateriaAcondicionamiento->setUnidadesRechazadas(0);
$nuevoInventarioMateriaAcondicionamiento->setUnidadesCuarentena(0);
$materiaAcondicionamientoRep = $this->entityManager->getRepository(MateriaAcondicionamiento::class);
$materiaAcondicionamiento = $materiaAcondicionamientoRep->findOneBy(array("id" => $idMA));
$nuevoInventarioMateriaAcondicionamiento->setMateriaAcondicionamiento($materiaAcondicionamiento);
$inventario->addInventarioMateriasAcondicionamiento($nuevoInventarioMateriaAcondicionamiento);
}
}
$stringLotesGastados = "";
foreach ($lotesGastados as $loteGastado) {
$stringLotesGastados .= $loteGastado . "<br/>";
}
$ordenPedido->setLotesGastados($stringLotesGastados);
$this->entityManager->persist($ordenPedido);
$this->entityManager->persist($inventario);
$this->entityManager->flush();
}
}
public function actualizarInventarioDePedido(Pedido $pedido)
{
if ($pedido->getActualizarInventario()) {
// Obtengo ultimo inventario
$inventarioRepository = $this->entityManager->getRepository(Inventario::class);
$ultimoInventario = $inventarioRepository->findOneBy(array(), array('fechaCreacion' => 'DESC'), 1, 0);
$inventario = new Inventario();
$inventario->setFechaCreacion(new DateTime('now'));
$inventario->setFechaFinalizacion(new DateTime('now'));
$inventario->setTipoInventario("Pedido " . $pedido->getId());
if ($ultimoInventario) {
if ($ultimoInventario->getFechaFinalizacion() == null) {
$ultimoInventario->setFechaFinalizacion(new DateTime('now'));
}
foreach ($ultimoInventario->getInventarioMateriasPrimas() as $inventarioMateriaPrima) {
$invMateriaPrimaId = $inventarioMateriaPrima->getMateriaPrima()->getId();
$nuevoInventarioMateriaPrima = new InventarioMateriaPrima();
$nuevoInventarioMateriaPrima->setLote($inventarioMateriaPrima->getLote());
$nuevoInventarioMateriaPrima->setMateriaPrima($inventarioMateriaPrima->getMateriaPrima());
$nuevoInventarioMateriaPrima->setUnidadesGenerales((float)$inventarioMateriaPrima->getUnidadesGenerales());
$nuevoInventarioMateriaPrima->setUnidadesRechazadas((float)$inventarioMateriaPrima->getUnidadesRechazadas());
$unidadesCuarentena = $inventarioMateriaPrima->getUnidadesCuarentena();
foreach ($pedido->getPedidoMateriasPrimas() as $pedidoMateriaPrima) {
if ($pedidoMateriaPrima->getMateriaPrima()->getId() == $invMateriaPrimaId && $inventarioMateriaPrima->getLote() == $pedidoMateriaPrima->getLote()) {
$unidadesCuarentena = $unidadesCuarentena + $pedidoMateriaPrima->getCantidad();
$pedido->removePedidoMateriasPrima($pedidoMateriaPrima);
}
}
$nuevoInventarioMateriaPrima->setUnidadesCuarentena((float)$unidadesCuarentena);
$inventario->addInventarioMateriasPrima($nuevoInventarioMateriaPrima);
}
foreach ($ultimoInventario->getInventarioMateriasAcondicionamiento() as $inventarioMateriaAcondicionamiento) {
$invMateriaAcondicionamientoId = $inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento()->getId();
$nuevoInventarioMateriaAcondicionamiento = new InventarioMateriaAcondicionamiento();
$nuevoInventarioMateriaAcondicionamiento->setLote($inventarioMateriaAcondicionamiento->getLote());
$nuevoInventarioMateriaAcondicionamiento->setMateriaAcondicionamiento($inventarioMateriaAcondicionamiento->getMateriaAcondicionamiento());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesGenerales((float)$inventarioMateriaAcondicionamiento->getUnidadesGenerales());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesRechazadas((float)$inventarioMateriaAcondicionamiento->getUnidadesRechazadas());
$unidadesCuarentena = $inventarioMateriaAcondicionamiento->getUnidadesCuarentena();
foreach ($pedido->getPedidoMateriasAcondicionamiento() as $pedidoMateriaAcondicionamiento) {
if (
$pedidoMateriaAcondicionamiento->getMateriaAcondicionamiento()->getId() == $invMateriaAcondicionamientoId &&
$inventarioMateriaAcondicionamiento->getLote() == $pedidoMateriaAcondicionamiento->getLote()
) {
$unidadesCuarentena = $unidadesCuarentena + $pedidoMateriaAcondicionamiento->getCantidad();
$pedido->removePedidoMateriasAcondicionamiento($pedidoMateriaAcondicionamiento);
}
}
$nuevoInventarioMateriaAcondicionamiento->setUnidadesCuarentena((float)$unidadesCuarentena);
$inventario->addInventarioMateriasAcondicionamiento($nuevoInventarioMateriaAcondicionamiento);
}
}
foreach ($pedido->getPedidoMateriasPrimas() as $pedidoMateriaPrima) {
$nuevoInventarioMateriaPrima = new InventarioMateriaPrima();
$nuevoInventarioMateriaPrima->setLote($pedidoMateriaPrima->getLote());
$nuevoInventarioMateriaPrima->setMateriaPrima($pedidoMateriaPrima->getMateriaPrima());
$nuevoInventarioMateriaPrima->setUnidadesCuarentena($pedidoMateriaPrima->getCantidad());
$nuevoInventarioMateriaPrima->setUnidadesGenerales(0);
$nuevoInventarioMateriaPrima->setUnidadesRechazadas(0);
$inventario->addInventarioMateriasPrima($nuevoInventarioMateriaPrima);
}
foreach ($pedido->getPedidoMateriasAcondicionamiento() as $pedidoMateriaAcondicionamiento) {
$nuevoInventarioMateriaAcondicionamiento = new InventarioMateriaAcondicionamiento();
$nuevoInventarioMateriaAcondicionamiento->setMateriaAcondicionamiento($pedidoMateriaAcondicionamiento->getMateriaAcondicionamiento());
$nuevoInventarioMateriaAcondicionamiento->setLote($pedidoMateriaAcondicionamiento->getLote());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesCuarentena($pedidoMateriaAcondicionamiento->getCantidad());
$nuevoInventarioMateriaAcondicionamiento->setUnidadesGenerales(0);
$nuevoInventarioMateriaAcondicionamiento->setUnidadesRechazadas(0);
$inventario->addInventarioMateriasAcondicionamiento($nuevoInventarioMateriaAcondicionamiento);
}
$this->entityManager->persist($inventario);
$this->entityManager->flush();
}
}
}