src/Controller/ModComercio/Ventas/PedidosController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller\ModComercio\Ventas;
  3. use App\Controller\ModComercio\GestionCarta\ComponentesController;
  4. use App\Entity\Catalogos\EstadoCuenta;
  5. use App\Entity\Comercio\{ConsumoInsumosOrdenMenuControlComponenteCuentaOrdenMenuDatosComercioOrdenMenuAcompanamientoReservaReservaOrdenMenu};
  6. use App\Entity\Producto\{AcompanamientoComponenteInsumoInsumosMenuMenuComponentesMenuPreciosHistorial};
  7. use App\Service\CacheService;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Exception;
  12. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  13. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  16. use Symfony\Component\Security\Core\User\UserInterface;
  17. class PedidosController extends AbstractController {
  18.   private $em;
  19.   private $msgCreate;
  20.   private $msgUpdate;
  21.   private $msgDelete;
  22.   private $msgNotCreate;
  23.   private $datosComercio;
  24.   private $cache;
  25.   public function __construct(EntityManagerInterface $emCacheService $cache) {
  26.     date_default_timezone_set('America/Guayaquil');
  27.     $this->em $em;
  28.     $this->msgCreate "Registro creado exitosamente.";
  29.     $this->msgUpdate "Registro actualizado exitosamente.";
  30.     $this->msgDelete "Registro eliminado exitosamente.";
  31.     $this->msgNotCreate "La cuenta seleccionada está inactiva o ha alcanzado el límite de pedidos permitidos.";
  32.     $this->datosComercio $em->getRepository(DatosComercio::class)->find(1);
  33.     $this->cache $cache;
  34.   }
  35.   // * READ FUNCTIONS *
  36.     /**
  37.      * @Route("/getInitialPedidos", name="getInitialPedidos")
  38.      */
  39.     public function getInitialPedidos(Request $request) {
  40.       $this->cache->delete('excelListPedidos');
  41.       $idCuenta $request->request->get('idCuenta');
  42.       $qb $this->em->createQueryBuilder();
  43.       $datosComercio $this->em->getRepository(DatosComercio::class)->find(1);
  44.       $iva $datosComercio->getIdPorcentajeIva()->getPorcentaje();
  45.       $qb->select('o')
  46.         ->from(OrdenMenu::class, 'o')
  47.         ->leftJoin('o.idMenu''m')
  48.         ->addSelect('m')
  49.         ->where('o.idCuenta = :idCuenta')
  50.         ->setParameter('idCuenta'$idCuenta)
  51.         ->orderBy('o.id''DESC');
  52.       $pedidos $qb->getQuery()->getResult();
  53.       $list $this->setArrayPedidos($pedidos$iva);
  54.       $this->cache->add('excelListPedidos'$list);
  55.       return $this->json(['data' => $list], 200);
  56.     }
  57.     private function setArrayPedidos($pedidos$iva) {
  58.       $list = [];
  59.       if ($pedidos) {
  60.         $actionEntregarCancelar false;
  61.         $actionEliminar false;
  62.         foreach ($pedidos as $indice => $pedido) {
  63.           $actionEntregarCancelar $pedido->getEstado() == "Entregado" || $pedido->getEstado() == "Cancelado" || $pedido->getEstado() == "Reservado" false true;
  64.           $actionEliminar $pedido->getEstado() == "Entregado" || $pedido->getEstado() == "Cancelado" false true;
  65.           $menu $pedido->getIdMenu();
  66.           $valIva doubleval(($pedido->getPrecioUnitarioMenu() * $iva) / 100);
  67.           $total doubleval($valIva $pedido->getPrecioUnitarioMenu()) * $pedido->getCantidad();
  68.           array_push($list, [
  69.             'indice' => $indice 1,
  70.             'id' => $pedido->getId(),
  71.             'cantidad' => $pedido->getCantidad(),
  72.             'cortesia' => $pedido->getCortesia(),
  73.             'fechaHoraPedido' => $pedido->getFechaHoraPedidoString(),
  74.             'fechaHoraEntrega' => $pedido->getFechaHoraEntregaString(),
  75.             'estado' => $pedido->getEstado(),
  76.             'nombre' => $menu->getNombre(),
  77.             'pu' => doubleval($valIva $pedido->getPrecioUnitarioMenu()),
  78.             'total' => $total,
  79.             'actionEntregarCancelar' => $actionEntregarCancelar,
  80.             'actionEliminar' => $actionEliminar
  81.           ]);
  82.         }
  83.       }
  84.       return $list;
  85.     }
  86.   // * CREATE OR UPDATE FUNCTIONS *
  87.     /**
  88.      * @Route("/setOrdenCuenta", name="setOrdenCuenta")
  89.      */
  90.     public function setOrdenCuenta(UserInterface $userRequest $request) {
  91.       try {
  92.         $data $request->request->get('data');
  93.         $jsonAcompanamiento json_decode($data['json'], true);
  94.         $cuenta $this->getCuenta($data['idCuenta']);
  95.         $isReserva $this->getReserva($data['idCuenta']);
  96.         if (!$cuenta || !$this->isCuentaActiva($cuenta$isReserva)) :
  97.           return $this->json(['response' => false'message' => $this->msgNotCreate]);
  98.         endif;
  99.         if ($isReserva) :
  100.           $reserva $this->handleReserva($data$user$cuenta$isReserva$this->datosComercio$jsonAcompanamiento);
  101.           return $this->json($reserva200);
  102.         endif;
  103.         $menu $this->em->getRepository(Menu::class)->find($data['idMenu']);
  104.         $menuComponentes $this->getMenuComponentes($data['idMenu']);
  105.         if ($menu->getAcompanamiento()) :
  106.           $acompanamiento $this->em->getRepository(Acompanamiento::class)->findBy(['idMenu' => $data['idMenu']]);
  107.           $resultado $this->filtrarComponentesNoUsados($acompanamiento$menuComponentes);
  108.           $ingredientesFaltantes $this->checkInsumosDisponibles($resultado$data['cantidad']);
  109.           if ($ingredientesFaltantes) :
  110.             return $this->json([
  111.               'response' => false,
  112.               'stock' => true,
  113.               'ingredientes' => $this->renderInsumosFaltantes($ingredientesFaltantes)
  114.             ]);
  115.           endif;
  116.           $jsonComponentes $this->jsonAcompanamientoFilter($jsonAcompanamiento);
  117.           $ingredientesFaltantesDos $this->checkInsumosDisponiblesAcompanamiento($jsonComponentes$data['cantidad'], count($jsonAcompanamiento));
  118.           if ($ingredientesFaltantesDos) :
  119.             return $this->json([
  120.               'response' => false,
  121.               'stock' => true,
  122.               'ingredientes' => $this->renderInsumosFaltantes($ingredientesFaltantes)
  123.             ]);
  124.           endif;
  125.           return $this->handleOrdenMenu($data$user$cuenta$this->datosComercio$menu->getAcompanamiento(), $jsonAcompanamiento);
  126.         else:
  127.           $ingredientesFaltantes $this->checkInsumosDisponibles($menuComponentes$data['cantidad']);
  128.           if ($ingredientesFaltantes) :
  129.             return $this->json([
  130.               'response' => false,
  131.               'stock' => true,
  132.               'ingredientes' => $this->renderInsumosFaltantes($ingredientesFaltantes)
  133.             ]);
  134.           endif;
  135.           return $this->handleOrdenMenu($data$user$cuenta$this->datosComercio$menu->getAcompanamiento());
  136.         endif;
  137.       } catch (Exception $e) {
  138.         return $this->json(['response' => false'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setOrdenCuenta</i>"'stock' => false]);
  139.       }
  140.     }
  141.     function filtrarComponentesNoUsados($primerArreglo$segundoArreglo) {
  142.       $idsUsados array_map(function ($item) {
  143.         return $item->getIdMenuComponentes()->getId();
  144.       }, $primerArreglo);
  145.       $resultado array_filter($segundoArreglo, function ($componente) use ($idsUsados) {
  146.         return !in_array($componente->getId(), $idsUsados);
  147.       });
  148.       return array_values($resultado);
  149.     }
  150.     function filtrarComponentesNoUsadosDos($primerArreglo$segundoArreglo$ordenMenuACompanamiento) {
  151.       $idsUsados array_map(function ($item) {
  152.         return $item->getIdMenuComponentes()->getId();
  153.       }, $primerArreglo);
  154.       $resultado array_filter($segundoArreglo, function ($componente) use ($idsUsados) {
  155.         return !in_array($componente->getId(), $idsUsados);
  156.       });
  157.       return array_values($resultado);
  158.     }
  159.     function jsonAcompanamientoFilter($jsonAcompanamiento) {
  160.       $resultado = [];
  161.       foreach ($jsonAcompanamiento as $item) {
  162.         $acompanamiento $this->em->getRepository(Acompanamiento::class)->find($item['id']);
  163.         $resultado[] = $acompanamiento->getIdMenuComponentes();
  164.       }
  165.       return array_values($resultado);
  166.     }
  167.     function jsonAcompanamientoFilterDos($ordenMenuACompanamiento) {
  168.       $resultado = [];
  169.       foreach ($ordenMenuACompanamiento as $item) {
  170.         $resultado[] = $item->getIdAcompanamiento()->getIdMenuComponentes();
  171.       }
  172.       return array_values($resultado);
  173.     }
  174.     private function getCuenta($idCuenta) {
  175.       return $this->em->getRepository(Cuenta::class)->find($idCuenta);
  176.     }
  177.     private function getReserva($idCuenta) {
  178.       return $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $idCuenta]);
  179.     }
  180.     private function isCuentaActiva($cuenta$isReserva) {
  181.       return ($cuenta && $cuenta->getActiva() && !$isReserva) || ($isReserva && !$cuenta->getActiva());
  182.     }
  183.     private function handleReserva($data$user$cuenta$isReserva$datosComercio$jsonAcompanamiento) {
  184.       $ordenMenu = new OrdenMenu;
  185.       $ordenMenu $this->setOrdenMenu($ordenMenu$data'Reservado'$cuenta$user$datosComercio);
  186.       $this->em->persist($ordenMenu);
  187.       $menu $this->em->getRepository(Menu::class)->find($data['idMenu']);
  188.       if ($menu->getAcompanamiento()) :
  189.         foreach ($jsonAcompanamiento as $acompanamiento) {
  190.           $ordenMenuACompanamiento = new OrdenMenuAcompanamiento;
  191.           $ordenMenuACompanamiento
  192.             ->setIdOrdenMenu($ordenMenu)
  193.             ->setIdAcompanamiento($this->em->getRepository(Acompanamiento::class)->find($acompanamiento['id']))
  194.           ;
  195.           $ordenMenuACompanamiento $this->setGenericData($user$ordenMenuACompanamiento);
  196.           $this->em->persist($ordenMenuACompanamiento);
  197.         }
  198.       endif;
  199.       $reservaOrdenMenu = new ReservaOrdenMenu;
  200.       $reservaOrdenMenu $this->setReservaOrdenMenu($reservaOrdenMenu$ordenMenu$isReserva$user);
  201.       $this->em->persist($reservaOrdenMenu);
  202.       $this->em->flush();
  203.       return ['response' => true'message' => $this->msgCreate'ordenMenuReserva' => $reservaOrdenMenu];
  204.     }
  205.     private function setOrdenMenu($ordenMenu$data$estadoReserva$cuenta$user$datosComercio) {
  206.       $menu $this->em->getRepository(Menu::class)->find($data['idMenu']);
  207.       $costo $this->getCostoMenu($menu);
  208.       $ordenMenu
  209.         ->setCantidad($data['cantidad'])
  210.         ->setCortesia(false)
  211.         ->setModificarStock(false)
  212.         ->setFechaHoraPedido(new \DateTime())
  213.         ->setEstado($estadoReserva)
  214.         ->setIdMenu($menu)
  215.         ->setIdCuenta($cuenta)
  216.         ->setPrecioUnitarioMenu($menu->getPrecio())
  217.         ->setPrecioCosto($costo)
  218.         ->setIdPorcentajeIva($datosComercio->getIdPorcentajeIva())
  219.       ;
  220.       $ordenMenu $this->setGenericData($user$ordenMenu);
  221.       return $ordenMenu;
  222.     }
  223.     private function setReservaOrdenMenu($reservaOrdenMenu$ordenMenu$isReserva$user) {
  224.       $reservaOrdenMenu
  225.         ->setIdOrdenMenu($ordenMenu)
  226.         ->setIdReserva($isReserva)
  227.       ;
  228.       $reservaOrdenMenu $this->setGenericData($user$reservaOrdenMenu);
  229.       return $reservaOrdenMenu;
  230.     }
  231.     private function getCostoMenu($menu) {
  232.       $menuComponentes $this->em->getRepository(MenuComponentes::class)->findBy(['idMenu' => $menu->getId()]);
  233.       return array_reduce($menuComponentes, function ($costo$menuComponente) {
  234.         return $costo + (new ComponentesController($this->em$this->cache))->getCostoComponente($menuComponente);
  235.       }, 0.0);
  236.     }
  237.     private function getMenuComponentes($idMenu) {
  238.       return $this->em->getRepository(MenuComponentes::class)->findBy(['idMenu' => $idMenu]);
  239.     }
  240.     private function checkInsumosDisponiblesAcompanamiento($menuComponentes$cantidad$nro_acompanamiento) {
  241.       $ingredientesFaltantes = [];
  242.       foreach ($menuComponentes as $menuComponente) {
  243.         $menu_componente_cantidad floatval($menuComponente->getCantidad());
  244.         $componenteInsumos $this->em->getRepository(ComponenteInsumo::class)->findBy(['idComponentes' => $menuComponente->getIdComponentes()->getId()]);
  245.         foreach ($componenteInsumos as $componenteInsumo) {
  246.           $componente_insumo_cantidad floatval($componenteInsumo->getCantidad());
  247.           $cantidad_requerida = (($componente_insumo_cantidad intval($nro_acompanamiento)) * $menu_componente_cantidad) * intval($cantidad);
  248.           if (floatval($cantidad_requerida) > $componenteInsumo->getIdInsumos()->getStock()) :
  249.             $cantidadFaltante floatval($cantidad_requerida) - floatval($componenteInsumo->getIdInsumos()->getStock());
  250.             $abreviaturaUnidad $this->getAbreviaturaUnidad($componenteInsumo->getIdInsumos()->getIdUnidadesInsumos()->getNombre());
  251.             $ingredientesFaltantes[] = [
  252.               'insumo' => $componenteInsumo->getIdInsumos()->getNombre(),
  253.               'cantidadFaltante' => $cantidadFaltante,
  254.               'abreviaturaUnidad' => $abreviaturaUnidad
  255.             ];
  256.           endif;
  257.         }
  258.       }
  259.       return $ingredientesFaltantes;
  260.     }
  261.     private function checkInsumosDisponibles($menuComponentes$cantidad) {
  262.       $ingredientesFaltantes = [];
  263.       foreach ($menuComponentes as $menuComponente) {
  264.         $cantidadComponente floatval($menuComponente->getCantidad());
  265.         $componenteInsumos $this->em->getRepository(ComponenteInsumo::class)->findBy(['idComponentes' => $menuComponente->getIdComponentes()->getId()]);
  266.         foreach ($componenteInsumos as $componenteInsumo) {
  267.           $cantidadInsumoComponente floatval($componenteInsumo->getCantidad());
  268.           $cantidadRequeridaOrden $cantidadComponente floatval($cantidadInsumoComponente $cantidad);
  269.           if (floatval($cantidadRequeridaOrden) > $componenteInsumo->getIdInsumos()->getStock()) :
  270.             $cantidadFaltante floatval($cantidadRequeridaOrden) - floatval($componenteInsumo->getIdInsumos()->getStock());
  271.             $abreviaturaUnidad $this->getAbreviaturaUnidad($componenteInsumo->getIdInsumos()->getIdUnidadesInsumos()->getNombre());
  272.             $ingredientesFaltantes[] = [
  273.               'insumo' => $componenteInsumo->getIdInsumos()->getNombre(),
  274.               'cantidadFaltante' => $cantidadFaltante,
  275.               'abreviaturaUnidad' => $abreviaturaUnidad
  276.             ];
  277.           endif;
  278.         }
  279.       }
  280.       return $ingredientesFaltantes;
  281.     }
  282.     private function getAbreviaturaUnidad($nombre) {
  283.       $abreviaturas = [
  284.         'LIBRAS' => 'lbs',
  285.         'UNIDADES' => 'uds',
  286.         'LITROS' => 'l',
  287.         'MILILITROS' => 'ml',
  288.         'FUNDAS' => 'f',
  289.       ];
  290.       return $abreviaturas[$nombre] ?? 'gr';
  291.     }
  292.     private function renderInsumosFaltantes($ingredientesFaltantes) {
  293.       $html '<ul class="list-group">';
  294.       foreach ($ingredientesFaltantes as $ingrediente) {
  295.         $html .= '<li class="list-group-item d-flex justify-content-between align-items-center" style="padding: .15rem 1.25rem;">';
  296.         $html .= $ingrediente['insumo'];
  297.         $html .= '<span class="badge bg-primary rounded-pill">';
  298.         $html .= $ingrediente['cantidadFaltante'] . $ingrediente['abreviaturaUnidad'];
  299.         $html .= '</span>';
  300.         $html .= '</li>';
  301.       }
  302.       $html .= '</ul>';
  303.       return $html;
  304.     }
  305.     private function handleOrdenMenu($data$user$cuenta$datosComercio$acompanamiento$jsonAcompanamiento = []) {
  306.       $ordenMenu = new OrdenMenu();
  307.       $ordenMenu $this->setOrdenMenu($ordenMenu$data'Confirmado'$cuenta$user$datosComercio);
  308.       $this->em->persist($ordenMenu);
  309.       if ($acompanamiento) :
  310.         foreach ($jsonAcompanamiento as $item) {
  311.           $ordenMenuACompanamiento = new OrdenMenuAcompanamiento;
  312.           $ordenMenuACompanamiento
  313.             ->setIdOrdenMenu($ordenMenu)
  314.             ->setIdAcompanamiento($this->em->getRepository(Acompanamiento::class)->find($item['id']))
  315.           ;
  316.           $ordenMenuACompanamiento $this->setGenericData($user$ordenMenuACompanamiento);
  317.           $this->em->persist($ordenMenuACompanamiento);
  318.         }
  319.       endif;
  320.       $veryMenuPrecio $this->em->getRepository(MenuPreciosHistorial::class)->findOneBy(['idMenu' => $ordenMenu->getIdMenu()->getId()], ['fecha' => 'DESC']);
  321.       if (!$veryMenuPrecio || $this->isPrecioDiferente($ordenMenu$veryMenuPrecio)) :
  322.         $menuPreciosHistorial $this->setMenuPrecioHistorial(new MenuPreciosHistorial(), $ordenMenu$user);
  323.         $this->em->persist($menuPreciosHistorial);
  324.       endif;
  325.       $this->em->flush();
  326.       return $this->json(['response' => true'message' => $this->msgCreate]);
  327.     }
  328.     private function isPrecioDiferente($ordenMenu$veryMenuPrecio) {
  329.       return round($ordenMenu->getPrecioCosto(), 4) != round($veryMenuPrecio->getPrecioCosto(), 4);
  330.     }
  331.     private function setMenuPrecioHistorial($menuPreciosHistorial$ordenMenu$user) {
  332.       $iva $ordenMenu->getIdPorcentajeIva()->getPorcentaje();
  333.       $precio floatval(($iva $ordenMenu->getIdMenu()->getPrecio()) / 100) + floatval($ordenMenu->getIdMenu()->getPrecio());
  334.       $menuPreciosHistorial
  335.         ->setFecha(new \DateTime())
  336.         ->setPrecioCosto($ordenMenu->getPrecioCosto())
  337.         ->setPrecioPvp($precio)
  338.         ->setIdMenu($ordenMenu->getIdMenu())
  339.         ->setIdPorcentajeIva($ordenMenu->getIdPorcentajeIva())
  340.       ;
  341.       $menuPreciosHistorial $this->setGenericData($user$menuPreciosHistorial);
  342.       return $menuPreciosHistorial;
  343.     }
  344.     /**
  345.      * @Route("/setPedidoEstado", name="setPedidoEstado")
  346.      */
  347.     public function setPedidoEstado(UserInterface $userRequest $request) {
  348.       try {
  349.         $data $request->request->get('data');
  350.         $ordenMenu $this->em->getRepository(OrdenMenu::class)->find($data['id']);
  351.         $cuenta $ordenMenu->getIdCuenta();
  352.         switch ($data['estado']) {
  353.           case 'entregado':
  354.             $this->setEstadoEntregado($ordenMenu$user$cuenta);
  355.             break;
  356.           case 'cancelado':
  357.             $this->setEstadoCancelado($ordenMenu$user);
  358.             break;
  359.           default:
  360.             return $this->json(['response' => false'message' => "Estado desconocido"]);
  361.         }
  362.         $this->updateStock($ordenMenu$user);
  363.         $this->em->flush();
  364.         return $this->json(['response' => true'message' => $this->msgUpdate]);
  365.       } catch (Exception $e) {
  366.         return $this->json(['response' => false'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setPedidoEstado</i>"]);
  367.       }
  368.     }
  369.     private function setEstadoEntregado(OrdenMenu $ordenMenuUserInterface $userCuenta $cuenta)  {
  370.       $ordenMenu
  371.         ->setEstado('Entregado')
  372.         ->setModificarStock(true)
  373.         ->setFechaHoraEntrega(new \DateTime());
  374.       $this->setGenericData($user$ordenMenu);
  375.       $this->em->persist($ordenMenu);
  376.       if ($cuenta->getIdEstadoCuenta()->getId() == 1) :
  377.         $estadoCuenta $this->em->getRepository(EstadoCuenta::class)->find(2);
  378.         $cuenta->setIdEstadoCuenta($estadoCuenta);
  379.         $this->em->persist($cuenta);
  380.       endif;
  381.     }
  382.     private function setEstadoCancelado(OrdenMenu $ordenMenuUserInterface $user)  {
  383.       $ordenMenu
  384.         ->setEstado('Cancelado')
  385.         ->setModificarStock(true);
  386.       $this->setGenericData($user$ordenMenu);
  387.       $this->em->persist($ordenMenu);
  388.     }
  389.     private function updateStock($ordenMenu$user) {
  390.       $list = [];
  391.       $cantidadOrden $ordenMenu->getCantidad();
  392.       $menuComponentes $this->em->getRepository(MenuComponentes::class)->findBy(['idMenu' => $ordenMenu->getIdMenu()->getId()]);
  393.       if ($ordenMenu->getIdMenu()->getAcompanamiento()) :
  394.         $acompanamiento $this->em->getRepository(Acompanamiento::class)->findBy(['idMenu' => $ordenMenu->getIdMenu()->getId()]);
  395.         $resultado $this->filtrarComponentesNoUsados($acompanamiento$menuComponentes);
  396.         foreach ($resultado as $menuComponente) {
  397.           $cantidadComponente = (float)$menuComponente->getCantidad();
  398.           $componenteInsumo $this->em->getRepository(ComponenteInsumo::class)->findBy(['idComponentes' => $menuComponente->getIdComponentes()->getId()]);
  399.           foreach ($componenteInsumo as $componente) {
  400.             $cantidadInsumo = (float)$componente->getCantidad();
  401.             $cantidadDescontar $cantidadInsumo $cantidadComponente;
  402.             $insumo $componente->getIdInsumos();
  403.             $list[] = [
  404.               'id' => $insumo->getId(),
  405.               'cantidad' => $cantidadDescontar
  406.             ];
  407.           }
  408.         }
  409.         $ordenMenuACompanamiento $this->em->getRepository(OrdenMenuAcompanamiento::class)->findBy(['idOrdenMenu' => $ordenMenu->getId()]);
  410.         $jsonComponentes $this->jsonAcompanamientoFilterDos($ordenMenuACompanamiento);
  411.         foreach ($jsonComponentes as $menuComponente) {
  412.           $menu_componente_cantidad floatval($menuComponente->getCantidad());
  413.           $componenteInsumos $this->em->getRepository(ComponenteInsumo::class)->findBy(['idComponentes' => $menuComponente->getIdComponentes()->getId()]);
  414.           foreach ($componenteInsumos as $componenteInsumo) {
  415.             $componente_insumo_cantidad floatval($componenteInsumo->getCantidad());
  416.             $cantidad_requerida = (($componente_insumo_cantidad count($ordenMenuACompanamiento)) * $menu_componente_cantidad);
  417.             $insumo $componenteInsumo->getIdInsumos();
  418.             $list[] = [
  419.               'id' => $insumo->getId(),
  420.               'cantidad' => $cantidad_requerida
  421.             ];
  422.           }
  423.         }
  424.       else:
  425.         foreach ($menuComponentes as $menuComponente) {
  426.           $cantidadComponente = (float)$menuComponente->getCantidad();
  427.           $componenteInsumo $this->em->getRepository(ComponenteInsumo::class)->findBy(['idComponentes' => $menuComponente->getIdComponentes()->getId()]);
  428.           foreach ($componenteInsumo as $componente) {
  429.             $cantidadInsumo = (float)$componente->getCantidad();
  430.             $cantidadDescontar $cantidadInsumo $cantidadComponente;
  431.             $insumo $componente->getIdInsumos();
  432.             $list[] = [
  433.               'id' => $insumo->getId(),
  434.               'cantidad' => $cantidadDescontar
  435.             ];
  436.           }
  437.         }
  438.       endif;
  439.       foreach ($list as $item) {
  440.         $insumo $this->em->getRepository(Insumos::class)->find($item['id']);
  441.         $consumoInsumosOrdenMenu = new ConsumoInsumosOrdenMenu;
  442.         $consumoInsumosOrdenMenu
  443.           ->setConsumo(floor(($item['cantidad'] * $cantidadOrden)))
  444.           ->setIdInsumos($insumo)
  445.           ->setIdOrdenMenu($ordenMenu)
  446.         ;
  447.         $this->em->persist($consumoInsumosOrdenMenu);
  448.         $stock $insumo->getStock();
  449.         $nuevoStock $stock floor(($item['cantidad'] * $cantidadOrden));
  450.         $insumo->setStock($nuevoStock);
  451.         $insumo $this->setGenericData($user$insumo);
  452.         $this->em->persist($insumo);
  453.       }
  454.     }
  455.     /**
  456.      * @Route("/setCheckCortesia", name="setCheckCortesia")
  457.      */
  458.     public function setCheckCortesia(Request $requestUserInterface $user){
  459.       try {
  460.         ['id' => $id'val'=> $val'observacion' => $observacion] = $request->request->get('data');
  461.         $ordenMenu $this->em->getRepository(OrdenMenu::class)->find($id);
  462.         $ordenMenu
  463.           ->setCortesia($val == 'true' true false)
  464.           ->setObservacionCortesia($observacion)
  465.         ;
  466.         $ordenMenu $this->setGenericData($user$ordenMenu);
  467.         $this->em->persist($ordenMenu);
  468.         $this->em->flush();
  469.         return $this->json(['response' => true'message' => $this->msgUpdate]);
  470.       } catch (Exception $e) {
  471.         return $this->json(['response' => false'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setCheckCortesia</i>"]);
  472.       }
  473.     }
  474.     private function setGenericData($user null$entity) {
  475.       $entity
  476.         ->setIdUsuarioModificacion($user != null $user->getId() : '1')
  477.         ->setFechaModificacion(new \DateTime())
  478.         ->setIpModificacion($_SERVER['REMOTE_ADDR'])
  479.       ;
  480.       return $entity;
  481.     }
  482.   // * DELETE FUNCTIONS *
  483.     /**
  484.      * @Route("/deleteOrdenCuenta", name="deleteOrdenCuenta")
  485.      */
  486.     public function deleteOrdenCuenta(Request $request) {
  487.       try {
  488.         $id $request->request->get('id');
  489.         $ordenMenu $this->em->getRepository(OrdenMenu::class)->find($id);
  490.         // * VALIDACIONES
  491.           $controlComponente $this->em->getRepository(ControlComponente::class)->findOneBy(['idOrdenMenu' => $id]);
  492.           if ($controlComponente) : $this->em->remove($controlComponente); endif;
  493.           $reservaOrdenMenu $this->em->getRepository(ReservaOrdenMenu::class)->findOneBy(['idOrdenMenu' => $id]);
  494.           if ($reservaOrdenMenu) : $this->em->remove($reservaOrdenMenu); endif;
  495.           
  496.         $this->em->remove($ordenMenu);
  497.         $this->em->flush();
  498.         return $this->json(['response' => true'message' => $this->msgDelete'exception' => false], 200);
  499.       } catch (Exception $e) {
  500.         return $this->json(['response' => false'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>deleteOrdenCuenta</i>"'exception' => true]);
  501.       }
  502.     }
  503.   // * EXPORTS *
  504.     /**
  505.      * @Route("/getExcelPedidos", name="getExcelPedidos")
  506.      */
  507.     public function getExcelPedidos(){
  508.       $spreadsheet = new Spreadsheet();
  509.       $sheet $spreadsheet->getActiveSheet();
  510.       $sheet->setTitle("Pedidos");
  511.       $headers = ['id''producto''cantidad''vu''total''fecha solicitud''fecha entrega''estado''cortesia'];
  512.       $sheet->fromArray$headersNULL'A1' );
  513.       $lista $this->cache->get('excelListPedidos');
  514.       $lista = !$lista ? [] : $lista;
  515.       if(count($lista) != 0):
  516.         $data array_map(function ($menu) {
  517.           return [
  518.             $menu['id'],
  519.             $menu['nombre'],
  520.             $menu['cantidad'],
  521.             round($menu['pu'], 4),
  522.             round($menu['total'], 2),
  523.             $menu['fechaHoraPedido'],
  524.             $menu['fechaHoraEntrega'],
  525.             $menu['estado'],
  526.             $menu['cortesia'] ? 'Sí' 'No',
  527.           ];
  528.         }, $lista);
  529.       endif;
  530.       $sheet->fromArray($datanull'A2');
  531.       $writer = new Xlsx($spreadsheet);
  532.       $fileName 'pedidos.xlsx';
  533.       $temp_file tempnam(sys_get_temp_dir(), $fileName);
  534.       $writer->save($temp_file);
  535.       return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  536.     }
  537. }