<?php
namespace App\Controller\ModComercio\Ventas;
use App\Entity\Catalogos\{EntidadFinanciera, MedioPago, EstadoCuenta};
use App\Entity\Comercio\{Cuenta, DatosComercio, OrdenMenu, Reserva, ReservaOrdenMenu};
use App\Entity\Contabilidad\{DatosFacturaNoUsuarioSistema, Descuentos, DetallePagos, Pagos, PagoCuenta, PagoFidelizacion, PagoReserva};
use App\Entity\Documentos\DocumentosDetallePagos;
use App\Entity\Fidelizacion\{CategoriaCliente, CategoriaClientePersona, ParametrosFidelizacion, Fidelizacion};
use App\Entity\Karaoke\CancionesCuenta;
use App\Entity\Persona\Persona;
use App\Entity\Producto\Menu;
use App\Entity\Seguridades\Usuario;
use App\Service\{CacheService, DocumentsService};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\{Request, ResponseHeaderBag};
use Symfony\Component\Security\Core\User\UserInterface;
class CuentasController extends AbstractController {
private $em;
private $msgCreate;
private $msgUpdate;
private $msgDelete;
private $cache;
public function __construct(EntityManagerInterface $em, CacheService $cache) {
date_default_timezone_set('America/Guayaquil');
$this->em = $em;
$this->msgCreate = "Registro creado exitosamente.";
$this->msgUpdate = "Registro actualizado exitosamente.";
$this->msgDelete = "Registro eliminado exitosamente.";
$this->cache = $cache;
}
// * READ FUNCTIONS *
/*1-Apertura 2-Pendiente pago
3-Pagado 4-Reserva
5-Cancelado 6-Solicitud apertura cuenta
*/
/**
* @Route("/getInitialCuentas", name="getInitialCuentas")
*/
public function getInitialCuentas(Request $request) {
$this->cache->delete('excelListCuentas');
$filtro = $request->request->get('filtro');
$estadoCuentas = ($filtro == "12") ? [1, 2] : [4, 6];
$datosComercio = $this->em->getRepository(DatosComercio::class)->find(1);
$cuentas = $this->em->getRepository(Cuenta::class)->findBy(['idEstadoCuenta' => $estadoCuentas], ['id' => 'DESC']);
if ($cuentas) :
foreach ($cuentas as $indice => $cuenta) {
$persona = $cuenta->getIdUsuario()->getIdPersona();
$nombresApellidos = "{$persona->getNombres()} {$persona->getApellidos()}";
$spanColor = $this->getSpanColor($cuenta->getIdEstadoCuenta()->getNombre());
$valor = $this->getPagosValorEnCuenta($cuenta->getId(), $datosComercio);
$isReserva = (bool) $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $cuenta->getId()]);
$isPagosParciales = (bool) $this->em->getRepository(PagoCuenta::class)->findOneBy(['idCuenta' => $cuenta->getId()]);
$list[] = [
'indice' => $indice + 1,
'id' => $cuenta->getId(),
'idUsuario' => $cuenta->getIdUsuario()->getId(),
'codigoCuenta' => $cuenta->getCodigoCuenta(),
'nombresApellidos' => $nombresApellidos,
'numeroIdentificacion' => $persona->getNumeroIdentificacion(),
'mailPersonal' => $persona->getMailPersonal(),
'numeroMesa' => $cuenta->getNumeroMesa() ?? '',
'estadoCuenta' => $cuenta->getIdEstadoCuenta()->getNombre(),
'spanColor' => $spanColor,
'valor' => $valor,
'activa' => $cuenta->getActiva(),
'isReserva' => $isReserva,
'isPagosParciales' => $isPagosParciales,
'fechaApertura' => $cuenta->getFechaHoraAperturaString()
];
}
$this->cache->add('excelListCuentas', $list);
return $this->json(['data' => $list], 200);
endif;
return $this->json(['data' => []], 200);
}
/**
* @Route("/getHistorialCuentas", name="getHistorialCuentas")
*/
public function getHistorialCuentas(Request $request) {
$this->cache->delete('excelListCuentasHistorial');
$FI = $request->request->get('FI', '');
$FF = $request->request->get('FF', '');
$HI = $request->request->get('HI', '');
$HF = $request->request->get('HF', '');
if (empty($FI) && empty($FF) && empty($HI) && empty($HF)) :
$anio = date('Y'); $mes = date('m');
$dias = date("d", mktime(0, 0, 0, $mes + 1, 0, $anio));
$fechaInicio = "$anio-$mes-01";
$fechaFin = "$anio-$mes-$dias";
$inicio = new \DateTime("$fechaInicio 00:00:00");
$fin = new \DateTime("$fechaFin 23:59:59");
else:
$fechaInicio = $HI ? "$FI $HI:00" : "$FI 00:00:00";
$fechaFin = $HF ? "$FF $HF:00" : "$FF 23:59:59";
$inicio = new \DateTime("$fechaInicio");
$fin = new \DateTime("$fechaFin");
endif;
$datosComercio = $this->em->getRepository(DatosComercio::class)->find(1);
$cuentas = $this->dqlQueryCuentas($inicio, $fin, $datosComercio);
$pagos = $this->dqlQueryPagosCuentas($cuentas);
$descuentos = $this->dqlQueryDescuentos($cuentas);
$pagoFidelizacion = $this->dqlQueryPagoFidelizacion($cuentas);
$valCuentasPendientes = $this->dqlQueryCuentasPendientes($inicio, $fin, $datosComercio->getIdPorcentajeIva()->getPorcentaje());
$this->cache->add('excelListCuentasHistorial', $cuentas);
return $this->json([
'data' => $cuentas,
'cuentas' => count($cuentas),
'valCuentasPendientes' => $valCuentasPendientes,
'efectivo' => $pagos['efectivo'],
'transferencia' => $pagos['transferencia'],
'descuentos' => $descuentos + $pagoFidelizacion,
'total' => doubleval($pagos['efectivo'] + $pagos['transferencia'])
], 200);
}
private function dqlQueryCuentas($fechaInicio, $fechaFin, $datosComercio) {
$dql = "SELECT cuenta FROM App\Entity\Comercio\Cuenta cuenta WHERE cuenta.fechaHoraApertura BETWEEN :fechaIn AND :fechaFi";
$params = ['fechaIn' => $fechaInicio->format('Y-m-d H:i:s')];
if ($fechaFin) :
$params['fechaFi'] = $fechaFin->format('Y-m-d H:i:s');
endif;
$dql .= " ORDER BY cuenta.fechaHoraApertura ASC";
$query = $this->em->createQuery($dql)->setParameters($params);
$cuentas = [];
foreach ($query->getResult() as $cuenta) {
$cuentas = $this->setArrayCuentas($cuentas, $cuenta, $datosComercio);
}
return $cuentas;
}
private function dqlQueryCuentasPendientes($fechaInicio, $fechaFin, $iva) {
$dql = "SELECT cuenta FROM App\Entity\Comercio\Cuenta cuenta WHERE cuenta.idEstadoCuenta = :idEstadoCuenta AND cuenta.fechaHoraApertura BETWEEN :fechaIn AND :fechaFi";
$params = ['fechaIn' => $fechaInicio->format('Y-m-d H:i:s'), 'idEstadoCuenta' => 2];
if ($fechaFin) :
$params['fechaFi'] = $fechaFin->format('Y-m-d H:i:s');
endif;
$dql .= " ORDER BY cuenta.fechaHoraApertura ASC";
$query = $this->em->createQuery($dql)->setParameters($params);
$valCuenta = 0;
foreach ($query->getResult() as $cuenta) {
$ordenesMenu = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $cuenta->getId(), 'cortesia' => false]);
if ($ordenesMenu) :
foreach ($ordenesMenu as $pedido) {
$valIva = doubleval(($pedido->getPrecioUnitarioMenu() * $iva) / 100);
$total = doubleval($valIva + $pedido->getPrecioUnitarioMenu()) * $pedido->getCantidad();
$valCuenta = $valCuenta + $total;
}
endif;
}
return $valCuenta;
}
private function dqlQueryPagosCuentas($cuentas) {
$list = []; $efectivo = 0; $transferencia = 0;
foreach ($cuentas as $cuenta) {
$qb = $this->em->createQueryBuilder();
$qb
->from(PagoCuenta::class, 'pc')
->select('DISTINCT p.id AS idPago, p.valor')
->join('pc.idPagos', 'p')
->where('pc.idCuenta = :idCuenta')
;
$resultado = $qb->setParameter('idCuenta', $cuenta['id'])->getQuery()->getResult();
if ($resultado) :
foreach ($resultado as $item) {
$list[] = ['idPago' => $item['idPago']];
}
endif;
}
foreach ($list as $pago) {
$detallePago = $this->em->getRepository(DetallePagos::class)->findBy(['idPagos' => $pago['idPago']]);
foreach ($detallePago as $detalle) {
if ($detalle->getIdMedioPago()->getId() == 2) :
$efectivo = $efectivo + doubleval($detalle->getValor());
endif;
if ($detalle->getIdMedioPago()->getId() == 1) :
$transferencia = $transferencia + doubleval($detalle->getValor());
endif;
}
}
return ['efectivo' => $efectivo, 'transferencia' => $transferencia];
}
private function dqlQueryDescuentos($cuentas) {
$list = []; $valorDescuento = 0; $descuentos = [];
foreach ($cuentas as $cuenta) {
$qb = $this->em->createQueryBuilder();
$qb
->from(PagoCuenta::class, 'pc')
->select('DISTINCT p.id AS idPago, p.valor')
->join('pc.idPagos', 'p')
->where('pc.idCuenta = :idCuenta')
;
$resultado = $qb->setParameter('idCuenta', $cuenta['id'])->getQuery()->getResult();
if ($resultado) :
foreach ($resultado as $item) {
$list[] = ['idPago' => $item['idPago']];
}
endif;
}
foreach ($list as $pago) {
$descuento = $this->em->getRepository(Descuentos::class)->findOneBy(['idPagos' => $pago['idPago']]);
if ($descuento) :
$descuentos[] = ['valor' => doubleval($descuento->getValor())];
endif;
}
foreach ($descuentos as $item) {
$valorDescuento += $item['valor'];
}
return $valorDescuento;
}
private function dqlQueryPagoFidelizacion($cuentas) {
$list = []; $fidelizacion = 0;
foreach ($cuentas as $cuenta) {
$qb = $this->em->createQueryBuilder();
$qb
->from(PagoCuenta::class, 'pc')
->select('DISTINCT p.id AS idPago, p.valor')
->join('pc.idPagos', 'p')
->where('pc.idCuenta = :idCuenta')
;
$resultado = $qb->setParameter('idCuenta', $cuenta['id'])->getQuery()->getResult();
if ($resultado) :
foreach ($resultado as $item) {
$list[] = ['idPago' => $item['idPago']];
}
endif;
}
foreach ($list as $pago) {
$fidelizacionQ = $this->em->getRepository(PagoFidelizacion::class)->findOneBy(['idPagos' => $pago['idPago']]);
if ($fidelizacionQ) :
$fidelizacion = $fidelizacion + doubleval($fidelizacionQ->getValor());
endif;
}
return $fidelizacion;
}
private function setArrayCuentas($list, Cuenta $cuenta, $datosComercio) {
$persona = $cuenta->getIdUsuario()->getIdPersona();
$nombres = mb_convert_encoding($persona->getNombres(), 'UTF-8', 'auto');
$apellidos = mb_convert_encoding($persona->getApellidos(), 'UTF-8', 'auto');
$nombresApellidos = "{$nombres} {$apellidos}";
$str_substr = substr($this->quitarTildes($nombresApellidos), 0, 20);
$nombresApellidosFinales = "{$str_substr}...";
$spanColor = $this->getSpanColor($cuenta->getIdEstadoCuenta()->getNombre());
$valor = $this->getPagosValorEnCuenta($cuenta->getId(), $datosComercio);
$isReserva = (bool) $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $cuenta->getId()]);
$descuentos = $this->getDescuentosCuenta($cuenta->getId());
$list[] = [
'id' => $cuenta->getId(),
'idUsuario' => $cuenta->getIdUsuario()->getId(),
'codigoCuenta' => $cuenta->getCodigoCuenta(),
'nombresApellidos' => $nombresApellidos,
'str_substr' => $nombresApellidosFinales,
'numeroIdentificacion' => $persona->getNumeroIdentificacion(),
'mailPersonal' => $persona->getMailPersonal(),
'numeroMesa' => $cuenta->getNumeroMesa() ?? '',
'estadoCuenta' => $cuenta->getIdEstadoCuenta()->getNombre(),
'idEstadoCuenta' => $cuenta->getIdEstadoCuenta()->getId(),
'spanColor' => $spanColor,
'valor' => $valor,
'activa' => $cuenta->getActiva(),
'isReserva' => $isReserva,
'fechaApertura' => $cuenta->getFechaHoraAperturaString(),
'fechaCierre' => $cuenta->getFechaHoraCierreString(),
'descuentos' => $descuentos,
'total' => $valor - $descuentos
];
return $list;
}
private function quitarTildes($cadena) {
$acentos = array('á', 'é', 'í', 'ó', 'ú', 'Á', 'É', 'Í', 'Ó', 'Ú', 'ñ', 'Ñ');
$sinAcentos = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', 'n', 'N');
return str_replace($acentos, $sinAcentos, $cadena);
}
private function getSpanColor($estadoCuenta) {
$colors = [
'Solicitud cuenta' => 'bg-secondary',
'Apertura cuenta' => 'bg-primary',
'Pendiente pago' => 'bg-warning text-dark',
'Pagado' => 'bg-success',
'Reserva' => 'bg-info text-dark',
];
return $colors[$estadoCuenta] ?? 'bg-light text-dark';
}
public function getPagosValorEnCuenta($idCuenta, $datosComercio) {
$ordenesMenus = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $idCuenta]);
if (!$ordenesMenus) : return 0; endif;
$iva = $datosComercio->getIdPorcentajeIva()->getPorcentaje();
return array_reduce($ordenesMenus, function ($valor, $orden) use ($iva) {
if (!$orden->getCortesia() && $orden->getEstado() === 'Entregado') :
$pvp = $orden->getPrecioUnitarioMenu() * (1 + $iva / 100);
return $valor + ($orden->getCantidad() * $pvp);
endif;
return $valor;
}, 0);
}
private function getDescuentosCuenta($idCuenta) {
$list = [];
$qb = $this->em->createQueryBuilder();
$qb
->from(PagoCuenta::class, 'pc')
->select('DISTINCT p.id AS idPago, p.valor')
->join('pc.idPagos', 'p')
->where('pc.idCuenta = :idCuenta')
;
$resultado = $qb->setParameter('idCuenta', $idCuenta)->getQuery()->getResult();
if ($resultado) :
foreach ($resultado as $item) {
$list[] = ['idPago' => $item['idPago']];
}
endif;
return $this->calcularValoresFidelizacion($list);
}
private function calcularValoresFidelizacion($list) {
$valorDescuento = 0; $descuentos = [];
$valorFidelizacion = 0; $fidelizacions = [];
foreach ($list as $pago) {
$descuento = $this->em->getRepository(Descuentos::class)->findOneBy(['idPagos' => $pago['idPago']]);
if ($descuento) :
$descuentos[] = ['valor' => doubleval($descuento->getValor())];
endif;
}
foreach ($descuentos as $item) {
$valorDescuento += $item['valor'];
}
foreach ($list as $pago) {
$fidelizacion = $this->em->getRepository(PagoFidelizacion::class)->findOneBy(['idPagos' => $pago['idPago']]);
if ($fidelizacion) :
$fidelizacions[] = ['valor' => doubleval($fidelizacion->getValor())];
endif;
}
foreach ($fidelizacions as $item) {
$valorFidelizacion += $item['valor'];
}
return $valorDescuento + $valorFidelizacion;
}
/**
* @Route("/getInitialPagosCuenta", name="getInitialPagosCuenta")
*/
public function getInitialPagosCuenta(Request $request) {
$idCuenta = $request->request->get('id');
$reserva = $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $idCuenta]);
$isReserva = $reserva ? true : false;
$ordenesMenu = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $idCuenta, 'cortesia' => false, 'estado' => "Entregado"]);
$ordenesMenu = $this->agrupaOrdenesMenu($ordenesMenu);
$valoresOrden = $this->getValoresEnOrden($idCuenta);
$list = []; $valorPendiente = 0;
foreach ($ordenesMenu as $orden) {
$menu = $orden->getIdMenu();
$pu = doubleval($orden->getPrecioUnitarioMenu());
$pagosMenu = $this->getPagosEnMenu($valoresOrden['pagosCuenta'], $menu->getId(), $orden->getCantidad());
$valorPendiente += doubleval($orden->getPrecioUnitarioMenu() * $pagosMenu['cantidadPendiente']);
if ($pagosMenu['cantidadPendiente'] > 0) {
$list[] = [
'id' => $orden->getId(),
'nombre' => $menu->getNombre(),
'idMenu' => $menu->getId(),
'cantidad' => $orden->getCantidad(),
'pagado' => $pagosMenu['cantidadPagada'],
'pendiente' => $pagosMenu['cantidadPendiente'],
'pu' => $pu
];
}
}
$pagos = $this->getPagosCuenta($idCuenta, $isReserva);
$pagosReserva = $this->getPagosReserva($reserva, $isReserva);
if ($valorPendiente == 0) : $this->cerrarCuenta($idCuenta); endif;
return $this->json([
'list' => $list,
'porCobrar' => $valorPendiente,
'pagos' => $pagos,
'pagosReserva' => $pagosReserva,
'isReserva' => $isReserva
]);
}
private function agrupaOrdenesMenu($ordenesMenus) {
$ordenesAgrupadas = [];
foreach ($ordenesMenus as $orden) {
$menuId = $orden->getIdMenu()->getId();
if (!isset($ordenesAgrupadas[$menuId])) :
$ordenesAgrupadas[$menuId] = clone $orden;
else:
$ordenesAgrupadas[$menuId]->setCantidad($ordenesAgrupadas[$menuId]->getCantidad() + $orden->getCantidad());
endif;
}
return array_values($ordenesAgrupadas);
}
private function getValoresEnOrden($idCuenta) {
$cantidadPagada = 0;
$pagosCuenta = $this->em->getRepository(PagoCuenta::class)->findBy(['idCuenta' => $idCuenta]);
foreach ($pagosCuenta as $pagos) { $cantidadPagada += $pagos->getCantidadPagada(); }
return ['cantidadPagada' => $cantidadPagada, 'pagosCuenta' => $pagosCuenta];
}
private function getPagosEnMenu($pagosCuenta, $idMenu, $cantidad) {
$cantidadPagada = array_reduce($pagosCuenta, function ($total, $pagoCuenta) use ($idMenu) {
return $total + ($pagoCuenta->getIdMenu()->getId() === $idMenu ? $pagoCuenta->getCantidadPagada() : 0);
}, 0);
return [
'cantidadPagada' => $cantidadPagada,
'cantidadPendiente' => $cantidad - $cantidadPagada
];
}
private function getPagosCuenta($idCuenta, $isReserva) {
$pagos = [];
$pagoCuenta = $this->em->getRepository(PagoCuenta::class)->findBy(['idCuenta' => $idCuenta]);
$resultado = $this->unique_multidim_array($pagoCuenta);
foreach ($resultado as $pago) {
$persona = $pago->getIdPagos()->getIdUsuario()->getIdPersona();
$nombresApellidos = $persona->getNombres() . " " . $persona->getApellidos();
$transferencia = $this->getDetallePago($pago, 1);
$efectivo = $this->getDetallePago($pago, 2);
$pagos[] = [
'idPagos' => $pago->getIdPagos()->getId(),
'idCuenta' => $pago->getIdCuenta()->getId(),
'idUsuario' => $pago->getIdPagos()->getIdUsuario()->getId(),
'codigoCuenta' => $pago->getIdCuenta()->getCodigoCuenta(),
'nombresApellidos' => $nombresApellidos,
'efectivo' => $efectivo,
'transferencia' => $transferencia,
'isReserva' => $isReserva,
'documentos' => ""
];
}
return $pagos;
}
private function unique_multidim_array($array) {
$uniqueObjects = []; $seenIdPagos = [];
foreach ($array as $obj) {
$idPagos = $obj->getIdPagos()->getId();
if (!in_array($idPagos, $seenIdPagos)) :
$uniqueObjects[] = $obj;
$seenIdPagos[] = $idPagos;
endif;
}
return $uniqueObjects;
}
private function getDetallePago($pago, $medioPagoId) {
$detallePago = $this->em->getRepository(DetallePagos::class)->findOneBy(['idPagos' => $pago->getIdPagos()->getId(), 'idMedioPago' => $medioPagoId]);
return $detallePago ? $detallePago->getValor() : 0;
}
private function getPagosReserva($reserva, $isReserva) {
$pagosReserva = [];
if ($reserva) :
$documentos = [];
$pagoReserva = $this->em->getRepository(PagoReserva::class)->findBy(['idReserva' => $reserva->getId()]);
foreach ($pagoReserva as $pago) {
$transferencia = $this->getDetallePago($pago, 1);
$efectivo = $this->getDetallePago($pago, 2);
if ($transferencia) :
$documentosDetallesPagos = $this->em->getRepository(DocumentosDetallePagos::class)->findBy(['idDetallePagos' => $transferencia->getId()]);
foreach ($documentosDetallesPagos as $documento) {
$documentos[] = [ 'url' => $documento->getIdCargaDocumento()->getUrl() ];
}
endif;
$pagosReserva[] = [
'idPagos' => "",
'idCuenta' => "",
'idUsuario' => "",
'codigoCuenta' => "",
'nombresApellidos' => "Abono",
'efectivo' => $efectivo,
'transferencia' => $transferencia,
'isReserva' => $isReserva,
'documentos' => $documentos
];
}
endif;
return $pagosReserva;
}
private function cerrarCuenta($idCuenta) {
$cuenta = $this->em->getRepository(Cuenta::class)->find($idCuenta);
$estadoCuenta = $this->em->getRepository(EstadoCuenta::class)->find(3);
$cuenta->setActiva(false)
->setIdEstadoCuenta($estadoCuenta)
->setFechaHoraCierre(new \DateTime());
$this->em->persist($cuenta);
$this->em->flush();
}
/**
* @Route("/getFindUsuarioFacturacion", name="getFindUsuarioFacturacion")
*/
public function getFindUsuarioFacturacion(Request $request) {
$list = [];
$personas = $this->em->getRepository(Persona::class)->findBy([], ['apellidos' => 'ASC']);
foreach ($personas as $persona) {
$usuario = $this->em->getRepository(Usuario::class)->findOneBy(['idPersona' => $persona->getId()]);
array_push($list, [
'apellidos' => $persona->getApellidos(),
'correoElectronico' => $persona->getMailPersonal(),
'id' => $persona->getId(),
'idUsuario' => $usuario->getId(),
'nombres' => $persona->getNombres(),
'nombresApellidos' => $persona->getNombres().' '.$persona->getApellidos(),
'numeroIdentificacion' => $persona->getNumeroIdentificacion(),
'sectorDireccion' => $persona->getDireccionSector(),
'telefono' => $persona->getTelCelular(),
'tipoIdentificacion' => $persona->getTipoIdentificacion(),
'tipoPersona' => 'NATURAL'
]);
}
$personasOther = $this->em->getRepository(DatosFacturaNoUsuarioSistema::class)->findBy([], ['apellidos' => 'ASC']);
foreach ($personasOther as $personaOther) {
array_push($list, [
'apellidos' => $personaOther->getApellidos(),
'correoElectronico' => $personaOther->getCorreoElectronico(),
'id' => $personaOther->getId(),
'idUsuario' => 0,
'nombres' => $personaOther->getNombre(),
'nombresApellidos' => $personaOther->getNombres().' '.$personaOther->getApellidos(),
'numeroIdentificacion' => $personaOther->getNumeroIdentificacion(),
'sectorDireccion' => $personaOther->getSectorDireccion(),
'telefono' => $personaOther->getTelefono(),
'tipoIdentificacion' => $personaOther->getTipoIdentificacion(),
'tipoPersona' => $personaOther->getTipoPersona()
]);
}
return $this->json(['data' => $list], 200);
}
/**
* @Route("/getFindDetallePago", name="getFindDetallePago")
*/
public function getFindDetallePago(Request $request) {
$list = [];
$idPagos = $request->request->get('idPagos');
$datosComercio = $this->em->getRepository(DatosComercio::class)->find(1);
$iva = $datosComercio->getIdPorcentajeIva()->getPorcentaje();
$pagos = $this->em->getRepository(Pagos::class)->find($idPagos);
$pagoCuenta = $this->em->getRepository(PagoCuenta::class)->findBy(['idPagos' => $pagos->getId()]);
$count = 1;
foreach ($pagoCuenta as $pago) {
$ordenMenu = $this->em->getRepository(OrdenMenu::class)->findOneBy(['idCuenta' => $pago->getIdCuenta()->getId(), 'idMenu' => $pago->getIdMenu()->getId()]);
$vu = $ordenMenu->getPrecioUnitarioMenu();
$ivaVal = doubleval(($vu * $iva) / 100);
$pvp = doubleval($vu + $ivaVal);
array_push($list, [
'nro' => $count,
'descripcion' => $ordenMenu->getIdMenu()->getNombre(),
'cantidad' => $pago->getCantidadPagada(),
'pvp' => round($pvp, 2)
]);
$count++;
}
return $this->json($list, 200);
}
/**
* @Route("/getFindDetalleCuenta", name="getFindDetalleCuenta")
*/
public function getFindDetalleCuenta(Request $request) {
$list = [];
$id = $request->request->get('id');
$datosComercio = $this->em->getRepository(DatosComercio::class)->find(1);
$iva = $datosComercio->getIdPorcentajeIva()->getPorcentaje();
$ordenMenu = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $id]);
foreach ($ordenMenu as $indice => $orden) {
$vu = $orden->getPrecioUnitarioMenu();
$ivaVal = doubleval(($vu * $iva) / 100);
$pvp = doubleval($vu + $ivaVal);
array_push($list, [
'nro' => $indice + 1,
'fechaPedido' => $orden->getFechaHoraPedidoString(),
'descripcion' => $orden->getIdMenu()->getNombre(),
'cantidad' => $orden->getCantidad(),
'pvp' => round($pvp, 2)
]);
}
return $this->json($list, 200);
}
/**
* @Route("/getDisponibilidadMesa", name="getDisponibilidadMesa")
*/
public function getDisponibilidadMesa(Request $request) {
$valor = $request->request->get('valor');
$cuenta = $this->em->getRepository(Cuenta::class)->findOneBy(['numeroMesa' => $valor, 'activa' => true]);
if ($cuenta) {
return $this->json(['response' => false, 'message' => 'La mesa ya se encuentra en uso']);
} else {
return $this->json(['response' => true]);
}
}
/**
* @Route("/getPagosCuentaHistorial", name="getPagosCuentaHistorial")
*/
public function getPagosCuentaHistorial(Request $request) {
$idCuenta = $request->request->get('id');
$qb = $this->em->createQueryBuilder();
$qb->select('p')
->from(PagoCuenta::class, 'p')
->where('p.id IN (
SELECT MIN(p2.id)
FROM ' . PagoCuenta::class . ' p2
INNER JOIN p2.idCuenta c2
WHERE c2.id = :idCuenta
GROUP BY p2.idPagos
)')
->setParameter('idCuenta', $idCuenta);
$pagos = $qb->getQuery()->getResult();
// Formatear resultados a JSON
$data = [];
foreach ($pagos as $pago) {
$efectivo = 0; $transferencia = 0; $documento = "";
if ($pago->getIdPagos()) :
$detallePagos = $this->em->getRepository(DetallePagos::class)->findBy(['idPagos' => $pago->getIdPagos()->getId()]);
foreach ($detallePagos as $detalle) {
if ($detalle->getIdMedioPago()->getId() == 1) :
$transferencia = $detalle->getValor();
$documentosDetallePagos = $this->em->getRepository(DocumentosDetallePagos::class)->findOneBy(['idDetallePagos' => $detalle->getId()]);
$documento = $documentosDetallePagos->getIdCargaDocumento()->getUrl();
else:
$efectivo = $detalle->getValor();
endif;
}
endif;
$data[] = [
'idPagoCuenta' => $pago->getId(),
'cantidadPagada' => $pago->getCantidadPagada(),
'idPagos' => $pago->getIdPagos() ? $pago->getIdPagos()->getId() : null,
'idMenu' => $pago->getIdMenu() ? $pago->getIdMenu()->getId() : null,
'idCuenta' => $pago->getIdCuenta() ? $pago->getIdCuenta()->getId() : null,
'efectivo' => $efectivo,
'transferencia' => $transferencia,
'documento' => $documento
];
}
return $this->json($data, 200);
}
// * CREATE OR UPDATE FUNCTIONS *
/*1-Apertura 2-Pendiente pago
3-Pagado 4-Reserva
5-Cancelado 6-Solicitud apertura cuenta
*/
/**
* @Route("/addPagosCuenta", name="addPagosCuenta")
*/
public function addPagosCuenta(Request $request, UserInterface $user, DocumentsService $documentsService) {
try {
$data = $request->request->get('pagos_cuenta');
//return $this->json($data, 200);
$efectivo = doubleval($data['efectivo']); $transferencia = doubleval($data['transferencia']);
if ($data['pagosParcialesList'] == "[]") :
$ordersCuenta = $this->getOrdersCuenta($data['idCuenta']);
$verify = $this->em->getRepository(PagoCuenta::class)->findOneBy(['idCuenta' => $data['idCuenta']]);
$cuenta = $this->em->getRepository(Cuenta::class)->find($data['idCuenta']);
$pagos = $this->setDataPagos($efectivo, $transferencia, $cuenta->getIdUsuario(), $user, $verify ? false : true);
$this->em->persist($pagos);
foreach ($ordersCuenta as $orden) {
$pagoCuenta = $this->setDataPagoCuenta($orden['idMenu'], $orden['cantidad'], $pagos, $cuenta);
$this->em->persist($pagoCuenta);
}
if ($efectivo > 0) :
$detallePagos = $this->setDataDetallePagos(2, $efectivo, $pagos, $user);
$this->em->persist($detallePagos);
endif;
if ($transferencia > 0) :
$detallePagos = $this->setDataDetallePagos(1, $transferencia, $pagos, $user, $data['entidadFinanciera']);
$this->em->persist($detallePagos);
if ($_FILES['pagos_cuenta']['error']['comprobante'][0] != 4) :
$this->setComprobantesPago($detallePagos, $user, $documentsService);
endif;
endif;
else:
$cuenta = $this->em->getRepository(Cuenta::class)->find($data['idCuenta']);
if ($data['idUsuario'] == "" || $data['idUsuario'] == null) : return $this->json(['response' => false, 'message' => "Lo sentimos, debe ingresar un numero de identificación para el pago parcial"]); endif;
$usuario = $this->em->getRepository(Usuario::class)->find($data['idUsuario']);
$pagos = $this->setDataPagos($efectivo, $transferencia, $usuario, $user, false);
$this->em->persist($pagos);
$pagosParciales = json_decode($data['pagosParcialesList'], true);
foreach ($pagosParciales as $orden) {
$pagoCuenta = $this->setDataPagoCuenta($orden['idMenu'], $orden['cantidad'], $pagos, $cuenta);
$this->em->persist($pagoCuenta);
}
if ($efectivo > 0) :
$detallePagos = $this->setDataDetallePagos(2, $efectivo, $pagos, $user);
$this->em->persist($detallePagos);
endif;
if ($transferencia > 0) :
$detallePagos = $this->setDataDetallePagos(1, $transferencia, $pagos, $user, $data['entidadFinanciera']);
$this->em->persist($detallePagos);
if ($_FILES['pagos_cuenta']['error']['comprobante'][0] != 4) :
$this->setComprobantesPago($detallePagos, $user, $documentsService);
endif;
endif;
endif;
if ($data['descuento'] != "0.00" || $data['descuento'] != 0) :
$this->setDescuentos($data, $pagos, $user);
else:
$this->setFidelizacionUser($efectivo, $transferencia, $data, $user, $pagos);
endif;
$this->em->flush();
return $this->json(['response' => true, 'message' => $this->msgCreate]);
} catch (Exception $e) {
return $this->json(['response' => false, 'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>addPagosCuenta</i>"]);
}
}
private function getOrdersCuenta($id) {
$list = [];
$ordenMenu = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $id, 'cortesia' => false, 'estado' => "Entregado"]);
foreach ($ordenMenu as $orden) :
$idMenu = $orden->getIdMenu()->getId();
$pagosCuenta = $this->em->getRepository(PagoCuenta::class)->findOneBy(['idCuenta' => $id, 'idMenu' => $idMenu]);
if ($pagosCuenta) :
if ($pagosCuenta->getCantidadPagada() != $orden->getCantidad()) :
$cantidadPagar = $orden->getCantidad() - $pagosCuenta->getCantidadPagada();
array_push($list, [
'cantidad' => $cantidadPagar,
'id' => $orden->getId(),
'idCuenta' => $orden->getIdCuenta()->getId(),
'idMenu' => $orden->getIdMenu(),
]);
endif;
else:
array_push($list, [
'cantidad' => $orden->getCantidad(),
'id' => $orden->getId(),
'idCuenta' => $orden->getIdCuenta()->getId(),
'idMenu' => $orden->getIdMenu(),
]);
endif;
endforeach;
return $list;
}
private function setDataPagos($efectivo, $transferencia, $usuario, UserInterface $user, $total) {
$pagos = new Pagos;
$valor = round(doubleval($efectivo + $transferencia), 2);
$pagos
->setValor($valor)
->setFechaHoraPago(new \DateTime())
->setPagoTotal($total)
->setIdUsuario($usuario)
;
$pagos = $this->setGenericData($user, $pagos);
return $pagos;
}
private function setDataPagoCuenta($id, $cantidad, $pagos, $cuenta) {
$pagoCuenta = new PagoCuenta;
$idMenu = $this->em->getRepository(Menu::class)->find($id);
$pagoCuenta
->setCantidadPagada($cantidad)
->setIdPagos($pagos)
->setIdMenu($idMenu)
->setIdCuenta($cuenta)
;
return $pagoCuenta;
}
private function setDataDetallePagos($id, $valor, $pagos, UserInterface $user, $entidadFinanciera = "") {
$idMedioPago = $this->em->getRepository(MedioPago::class)->find($id);
$detallePagos = new DetallePagos;
$detallePagos
->setValor($valor)
->setIdMedioPago($idMedioPago)
->setIdPagos($pagos)
;
if ($entidadFinanciera != "") :
$idEntidadFinanciera = $this->em->getRepository(EntidadFinanciera::class)->find($entidadFinanciera);
$detallePagos->setIdEntidadFinanciera($idEntidadFinanciera);
endif;
$efectivoDetallePagos = $this->setGenericData($user, $detallePagos);
return $efectivoDetallePagos;
}
private function setComprobantesPago($transferencia_detallePagos, $user, $documentsService) {
$type = $_FILES['pagos_cuenta']['type'];
$size = $_FILES['pagos_cuenta']['size'];
$tmp_name = $_FILES['pagos_cuenta']['tmp_name'];
$name = $_FILES['pagos_cuenta']['name'];
$countComprobantes = count($_FILES['pagos_cuenta']['name']['comprobante']);
if ($countComprobantes > 0) :
for ($i = 0; $i < $countComprobantes; $i++) {
$comprobante = $documentsService->getEstructureDocument($name['comprobante'][$i], $size['comprobante'][$i], $tmp_name['comprobante'][$i], $type['comprobante'][$i]);
$documentName = $documentsService->flushDocument($comprobante, "COMP_PAGO", 'docs_directory');
$addDocument = $documentsService->addDocument($comprobante, $documentName, "images/documents/$documentName", true, $user, null);
$documentosDetallePagos = new DocumentosDetallePagos;
$documentosDetallePagos
->setIdCargaDocumento($addDocument)
->setIdDetallePagos($transferencia_detallePagos)
;
$documentosDetallePagos = $this->setGenericData($user, $documentosDetallePagos);
$this->em->persist($documentosDetallePagos);
}
endif;
}
private function setFidelizacionUser($efectivo, $transferencia, $data, $user, $pago) {
$valor = intval(doubleval($efectivo) + doubleval($transferencia));
$userId = ($data['pagosParcialesList'] === "[]")
? $this->em->getRepository(Cuenta::class)->find($data['idCuenta'])->getIdUsuario()
: $this->em->getRepository(Usuario::class)->find($data['idUsuario']);
$dql = "SELECT SUM(pagos.valor) FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.idUsuario = :userId";
$params = ['userId' => $userId->getId()];
$pagos = $this->em->createQuery($dql)->setParameters($params);
$valAllPagos = intval($pagos->getOneOrNullResult()[1]);
$newNivel = null;
$persona = $userId->getIdPersona();
$categoria_cliente_persona = $this->em->getRepository(CategoriaClientePersona::class)->findOneBy(['activo' => true, 'idPersona' => $persona->getId()]);
$parametrosFidelizacion = $categoria_cliente_persona->getIdCategoriaCliente()->getIdParametrosFidelizacion();
if ($categoria_cliente_persona->getIdCategoriaCliente()->getNivel() != 3) :
$baseSiguienteNivel = $this->em->getRepository(CategoriaCliente::class)->findOneBy(['idParametrosFidelizacion' => $parametrosFidelizacion->getId(), 'nivel' => $categoria_cliente_persona->getIdCategoriaCliente()->getNivel() + 1]);
$baseCategoria = intval($baseSiguienteNivel->getBase());
if ($valAllPagos > $baseCategoria) :
$newNivel = $categoria_cliente_persona->getIdCategoriaCliente()->getNivel() + 1;
$parametrosFidelizacionActivo = $this->em->getRepository(ParametrosFidelizacion::class)->findOneBy(['activo' => true]);
$categoriaCliente = $this->em->getRepository(CategoriaCliente::class)->findOneBy(['nivel' => $newNivel, 'idParametrosFidelizacion' => $parametrosFidelizacionActivo->getId()]);
$updateCategoria = $this->em->getRepository(Persona::class)->find($persona->getId());
$updateCategoria->setIdCategoriaCliente($categoriaCliente);
$updateCategoria = $this->setGenericData($user, $updateCategoria);
$this->em->persist($updateCategoria);
$updateCategoriaClientePersona = $this->em->getRepository(CategoriaClientePersona::class)->findOneBy(['idPersona' => $persona->getId()]);
$updateCategoriaClientePersona->setActivo(false);
$this->em->persist($updateCategoria);
$categoriaClientePersona = new CategoriaClientePersona;
$categoriaClientePersona = $this->setCategoriaClientePersona ($persona, $categoriaClientePersona, $user, $newNivel);
$this->em->persist($categoriaClientePersona);
endif;
endif;
$categoria_cliente = $categoria_cliente_persona->getIdCategoriaCliente();
$valor_fidelizacion = floor($valor) * $parametrosFidelizacion->getValorDinero() * $categoria_cliente->getPuntosPorDolar();
$puntos_asignados = $valor_fidelizacion / $parametrosFidelizacion->getValorDinero();
if ($valor_fidelizacion != 0) :
$fidelizacion = new Fidelizacion;
$fidelizacion
->setValor($valor_fidelizacion)
->setPuntosAsignados($puntos_asignados)
->setFechaRegistro(new \DateTime())
->setIdPagos($pago)
->setIdCategoriaCliente($categoria_cliente)
;
$fidelizacion = $this->setGenericData($user, $fidelizacion);
$this->em->persist($fidelizacion);
endif;
}
private function setCategoriaClientePersona($persona, $categoriaClientePersona, $user, $newNivel) {
$parametroFidelizacionActivo = $this->em->getRepository(ParametrosFidelizacion::class)->findOneBy(['activo' => true]);
$categoriaClientePersona
->setFechaAsignacionCategoria(new \DateTime())
->setActivo(true)
->setIdCategoriaCliente($this->em->getRepository(CategoriaCliente::class)->findOneBy(['idParametrosFidelizacion' => $parametroFidelizacionActivo->getId(), 'nivel' => $newNivel]))
->setIdPersona($persona)
;
$categoriaClientePersona = $this->setGenericData($user, $categoriaClientePersona);
return $categoriaClientePersona;
}
private function setDescuentos($data, $pago, $user) {
if ($data['tipo_descuento'] == "fidelizacion") :
$pagoFidelizacion = new PagoFidelizacion;
$pagoFidelizacion
->setValor($data['descuento'])
->setObservacion($data['observacion'])
->setIdPagos($pago)
;
$pagoFidelizacion = $this->setGenericData($user, $pagoFidelizacion);
$this->em->persist($pagoFidelizacion);
else:
$descuentos = new Descuentos;
$descuentos
->setPorcentaje($data['textDescuento'])
->setValor($data['descuento'])
->setObservacion($data['observacion'])
->setIdPagos($pago)
;
$descuentos = $this->setGenericData($user, $descuentos);
$this->em->persist($descuentos);
endif;
}
/**
* @Route("/setActivateCuentaUsuario", name="setActivateCuentaUsuario")
*/
public function setActivateCuentaUsuario(UserInterface $user, Request $request) {
try {
$data = $request->request->get('data');
$usuario = $this->em->getRepository(Usuario::class)->findOneBy(['id' => $data['idUsuario']]);
$cuenta = new Cuenta();
/*1-Apertura 2-Pendiente pago
3-Pagado 4-Reserva
5-Cancelado 6-Solicitud apertura cuenta
*/
$estadoCuenta = $this->em->getRepository(EstadoCuenta::class)->find(1);
$codigoCuenta = $this->generateCodigoCuenta($usuario);
$cuenta
->setActiva(true)
->setNumeroMesa($data['mesa'])
->setIdEstadoCuenta($estadoCuenta)
->setIdUsuario($usuario)
->setCodigoCuenta($codigoCuenta)
->setFechaHoraApertura(new \DateTime())
;
$cuenta = $this->setGenericData($user, $cuenta);
$this->em->persist($cuenta);
$this->em->flush();
return $this->json(['response' => true, 'message' => $this->msgCreate]);
} catch (Exception $e) {
return $this->json(['response' => false, 'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setActivateCuentaUsuario</i>"]);
}
}
/**
* @Route("/setActivacionCuenta", name="setActivacionCuenta")
*/
public function setActivacionCuenta(UserInterface $user, Request $request) {
try {
$data = $request->request->get('data');
$reserva = $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $data['id']]);
if ($reserva) :
$reservaOrdenMenu = $this->em->getRepository(ReservaOrdenMenu::class)->findOneBy(['idReserva' => $reserva->getId()]);
if (!$reservaOrdenMenu) :
return $this->json(['response' => false, 'message' => "Lo sentimos, no se puede activar por la reserva no cuenta con pedidos asignados."]);
endif;
$ordenMenu = $this->em->getRepository(OrdenMenu::class)->findBy(['idCuenta' => $data['id']]);
foreach ($ordenMenu as $orden) {
$orden->setEstado("Confirmado");
$orden = $this->setGenericData($user, $orden);
$this->em->persist($orden);
}
endif;
$cuenta = $this->em->getRepository(Cuenta::class)->find($data['id']);
$estadoCuenta = $this->em->getRepository(EstadoCuenta::class)->find(1);
$cuenta
->setActiva(true)
->setNumeroMesa($data['mesa'])
->setIdEstadoCuenta($estadoCuenta)
;
$cuenta = $this->setGenericData($user, $cuenta);
$this->em->persist($cuenta);
$this->em->flush();
return $this->json(['response' => true, 'message' => $this->msgUpdate]);
} catch (Exception $e) {
return $this->json(['response' => false, 'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setActivateCuentaUsuario</i>"]);
}
}
public function generateCodigoCuenta($user) {
$ci = $user->getIdPersona()->getNumeroIdentificacion();
$cuentasUser = $this->em->getRepository(Cuenta::class)->findBy(['idUsuario' => $user->getId()]);
$count = $cuentasUser ? count($cuentasUser) : 0;
$count++;
$codigo = "{$ci}_$count";
return $codigo;
}
private function setGenericData($user = null, $entity) {
$entity
->setIdUsuarioModificacion($user != null ? $user->getId() : '1')
->setFechaModificacion(new \DateTime())
->setIpModificacion($_SERVER['REMOTE_ADDR'])
;
return $entity;
}
// * DELETE FUNCTIONS *
/**
* @Route("/deleteCuenta", name="deleteCuenta")
*/
public function deleteCuenta(Request $request) {
try {
$id = $request->request->get('id');
$cuenta = $this->em->getRepository(Cuenta::class)->find($id);
// * VALIDACIONES
$pagoCuenta = $this->em->getRepository(PagoCuenta::class)->findOneBy(['idCuenta' => $id]);
if ($pagoCuenta) : return $this->json(['response' => false, 'exception' => false], 200); endif;
$reserva = $this->em->getRepository(Reserva::class)->findOneBy(['idCuenta' => $id]);
if ($reserva) : return $this->json(['response' => false, 'exception' => false], 200); endif;
$ordenMenu = $this->em->getRepository(OrdenMenu::class)->findOneBy(['idCuenta' => $id]);
if ($ordenMenu) : return $this->json(['response' => false, 'exception' => false], 200); endif;
$cancionesCuenta = $this->em->getRepository(CancionesCuenta::class)->findOneBy(['idCuenta' => $id]);
if ($cancionesCuenta) : return $this->json(['response' => false, 'exception' => false], 200); endif;
$this->em->remove($cuenta);
$this->em->flush();
return $this->json(['response' => true, 'message' => $this->msgDelete, 'exception' => false], 200);
} catch (Exception $e) {
return $this->json(['response' => false, 'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>deleteCuenta</i>", 'exception' => true]);
}
}
// * EXPORTS *
/**
* @Route("/getExcelCuentas", name="getExcelCuentas")
*/
public function getExcelCuentas(){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Cuentas");
$headers = ['id', 'cod. cuenta', 'nombres apellidos', 'nro. identificacion', 'correo', 'mesa', 'estado', 'valor', 'activa', 'reserva'];
$sheet->fromArray( $headers, NULL, 'A1' );
$lista = $this->cache->get('excelListCuentas');
$lista = !$lista ? [] : $lista;
if(count($lista) != 0):
$data = array_map(function ($cuenta) {
return [
$cuenta['id'],
$cuenta['codigoCuenta'],
$cuenta['nombresApellidos'],
$cuenta['numeroIdentificacion'],
$cuenta['mailPersonal'],
$cuenta['numeroMesa'],
$cuenta['estadoCuenta'],
round($cuenta['valor'], 2),
$cuenta['activa'] ? 'Sí' : 'No',
$cuenta['isReserva'] ? 'Sí' : 'No'
];
}, $lista);
endif;
$sheet->fromArray($data, null, 'A2');
$writer = new Xlsx($spreadsheet);
$fileName = 'cuentas.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/getExcelCuentasHistorial", name="getExcelCuentasHistorial")
*/
public function getExcelCuentasHistorial(){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Cuentas");
$headers = [
'id',
'cod',
'f. apertura',
'f. cierre',
'nombres apellidos',
'nro. identificacion',
'mesa',
'estado',
'vcta',
'dscto',
'total'
];
$sheet->fromArray( $headers, NULL, 'A1' );
$lista = $this->cache->get('excelListCuentasHistorial');
$lista = !$lista ? [] : $lista;
if(count($lista) != 0):
$data = array_map(function ($cuenta) {
return [
$cuenta['id'],
$cuenta['codigoCuenta'],
$cuenta['fechaApertura'],
$cuenta['fechaCierre'],
$cuenta['nombresApellidos'],
$cuenta['numeroIdentificacion'],
$cuenta['numeroMesa'],
$cuenta['estadoCuenta'],
round($cuenta['valor'], 2),
round($cuenta['descuentos'], 2),
round($cuenta['total'], 2)
];
}, $lista);
endif;
$sheet->fromArray($data, null, 'A2');
$writer = new Xlsx($spreadsheet);
$fileName = 'cuentas.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
}