<?php
namespace App\Controller\ModFidelizacion;
use App\Controller\Documents\DocumentsController;
use App\Controller\InformacionGeneralController;
use App\Entity\Comercio\Cuenta;
use App\Entity\Contabilidad\{Descuentos, Pagos, PagoFidelizacion};
use App\Entity\Fidelizacion\{Fidelizacion, UsoCupones};
use App\Entity\Seguridades\Usuario;
use App\Service\CacheService;
use App\Service\EmailService;
use DateInterval;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\{Request, ResponseHeaderBag};
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class ClientsController extends AbstractController {
private $em;
private $cache;
public function __construct(EntityManagerInterface $em, CacheService $cache) {
$this->em = $em;
$this->cache = $cache;
}
/**
* @Route("/getClientsList", name="getClientsList")
*/
public function getClientsList() {
/*
FUNCION OBTIENE VALORES DE FIDELIZACION DEL AÑO ACTUAL
*/
$this->cache->delete('excelListClientesFidelizacion');
$usuariosList = $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
$list = $this->getFilterFidelizacionClientsPagos($usuariosList);
$this->cache->add('excelListClientesFidelizacion', $list);
//return $this->json($list, 200);
return $this->json(['data' => $list]);
}
/**
* @Route("/getClienteFidelizacion", name="getClienteFidelizacion")
*/
public function getClienteFidelizacion(Request $request) {
$id = $request->request->get('id');
$tipo = $request->request->get('tipo');
$anio = date('Y');
$dias = date("d", mktime(0, 0, 0, '01' + 1, 0, $anio));
$fechaInicio = "$anio-01-01";
$fechaFin = "$anio-12-$dias";
$inicio = new \DateTime("$fechaInicio 00:00:00");
$fin = new \DateTime("$fechaFin 23:59:59");
if ($tipo == 'usuario') :
$dql = "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
$params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $id];
$pagos = $this->em->createQuery($dql)->setParameters($params);
$resultados = $this->calcularValoresFidelizacion($pagos->getResult());
else:
$cuenta = $this->em->getRepository(Cuenta::class)->find($id);
$dql = "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
$params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $cuenta->getIdUsuario()->getId()];
$pagos = $this->em->createQuery($dql)->setParameters($params);
$resultados = $this->calcularValoresFidelizacion($pagos->getResult());
endif;
return $this->json($resultados['valorDisponible'], 200);
}
/**
* @Route("/getHistorialFidelizacion", name="getHistorialFidelizacion")
*/
public function getHistorialFidelizacion(Request $request) {
$this->cache->delete('excelListClientesFidelizacionHistorial');
$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;
$usuarios = $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
$list = $this->getFidelizacionHistorial($usuarios, $inicio, $fin);
$this->cache->add('excelListClientesFidelizacionHistorial', $list);
return $this->json([
'inicio' => $inicio,
'fin' => $fin,
'data' => $list
], 200);
}
private function getFidelizacionHistorial($usuarios, $inicio, $fin) {
if (empty($usuarios)) : return []; endif;
$lista = [];
foreach ($usuarios as $usuario) {
$persona = $usuario->getIdPersona();
if ($persona->getId() === 78 || $usuario->getId() === 1) : continue; endif;
$dql = "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
$params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $usuario->getId()];
$pagos = $this->em->createQuery($dql)->setParameters($params);
$resultados = $this->calcularValoresFidelizacion($pagos->getResult());
$lista[] = [
'id' => $usuario->getId(),
'nombres' => $persona->getNombres() . ' ' . $persona->getApellidos(),
'nombreCategoriaCliente' => $persona->getIdCategoriaCliente()->getNombre(),
'valorAcumulado' => round($resultados['valorAcumulado'], 2),
'valorCanjeado' => round($resultados['valorCanjeado'], 2),
'valorDisponible' => round($resultados['valorDisponible'], 2),
'valorDescuentos' => round($resultados['valorDescuentos'], 2),
'nroCupones' => $resultados['nroCupones'],
];
}
return $lista;
}
private function getFilterFidelizacionClientsPagos($usuarios) {
if (empty($usuarios)) : return []; endif;
$lista = [];
$anio = date('Y');
$dias = date("d", mktime(0, 0, 0, '01' + 1, 0, $anio));
$fechaInicio = "$anio-01-01";
$fechaFin = "$anio-12-$dias";
$inicio = new \DateTime("$fechaInicio 00:00:00");
$fin = new \DateTime("$fechaFin 23:59:59");
foreach ($usuarios as $usuario) {
$persona = $usuario->getIdPersona();
if ($persona->getId() === 78 || $usuario->getId() === 1) : continue; endif;
$dql = "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.idUsuario = :userId";
$params = ['userId' => $usuario->getId()];
//$params = ['fechaIn' => $inicio, 'fechaFi' => $fin, 'userId' => $usuario->getId()];
/** COMENTADA ESTA PARTA PARA CONTABILIZAR UN AÑO A PARTIR DE LA FECHA_HORA_PAGO */
$pagos = $this->em->createQuery($dql)->setParameters($params);
$resultados = $this->calcularValoresFidelizacion($pagos->getResult());
$lista[] = [
'id' => $usuario->getId(),
'nombres' => $persona->getNombres() . ' ' . $persona->getApellidos(),
'nombreCategoriaCliente' => $persona->getIdCategoriaCliente()->getNombre(),
'valorAcumulado' => round($resultados['valorAcumulado'], 2),
'valorCanjeado' => round($resultados['valorCanjeado'], 2),
'valorDisponible' => round($resultados['valorDisponible'], 2),
'valorDescuentos' => round($resultados['valorDescuentos'], 2),
'nroCupones' => $resultados['nroCupones'],
'valorPuntos' => $resultados['valorPuntos'],
'mail' => $usuario->getUsuario(),
'pagos' => $pagos->getResult()
];
}
return $lista;
}
private function calcularValoresFidelizacion($pagos) {
$valorAcumulado = $valorCanjeado = $valorDescuentos = 0;
$nroCupones = 0;
$valorPuntos = 0;
foreach ($pagos as $pago) {
$pagoId = $pago->getId();
$fechaModificacion = $pago->getFechaHoraPago();
$fechaAnyo = (clone $fechaModificacion)->add(new DateInterval('P1Y'));
$intervalo = $fechaAnyo->diff(new DateTime());
if ($intervalo->days > 0) :
$fidelizacion = $this->em->getRepository(Fidelizacion::class)->findBy(['idPagos' => $pagoId]);
foreach ($fidelizacion as $valor) { $valorAcumulado = $valorAcumulado + $valor->getValor(); }
$pagoFidelizacion = $this->em->getRepository(PagoFidelizacion::class)->findBy(['idPagos' => $pagoId]);
foreach ($pagoFidelizacion as $valor) { $valorCanjeado = $valorCanjeado + $valor->getValor(); }
$descuentos = $this->em->getRepository(Descuentos::class)->findBy(['idPagos' => $pagoId]);
foreach ($descuentos as $valor) { $valorDescuentos = $valorDescuentos + $valor->getValor(); }
$nroCupones += count($this->em->getRepository(UsoCupones::class)->findBy(['idPagos' => $pagoId]));
$valorPuntos = $valorPuntos + floor($pago->getValor());
endif;
}
return [
'valorAcumulado' => $valorAcumulado,
'valorCanjeado' => $valorCanjeado,
'valorDisponible' => $valorAcumulado - $valorCanjeado,
'valorDescuentos' => $valorDescuentos,
'nroCupones' => $nroCupones,
'valorPuntos' => $valorPuntos
];
}
/**
* @Route("/findDetails", name="findDetails")
*/
public function findDetails(Request $request) {
$idUsuario = $request->request->get('id');
$lista = [];
$fidelizacion = [];
$cupones = [];
$descuentos = [];
$pagos = $this->em->getRepository(Pagos::class)->findBy(['idUsuario' => $idUsuario]);
if ($pagos) {
foreach ($pagos as $pago) {
$pagoCupones = $this->em->getRepository(UsoCupones::class)->findBy(['idPagos' => $pago->getId()]);
if ($pagoCupones) {
foreach ($pagoCupones as $cupon) {
$cupones[] = [
'nroCupon' => $cupon->getIdCupones()->getCodigo(),
'fecha' => $cupon->getFechaModificacion()->format('Y-m-d'),
'valor' => $cupon->getValor()
];
}
}
$pagoFidelizacion = $this->em->getRepository(PagoFidelizacion::class)->findBy(['idPagos' => $pago->getId()]);
if ($pagoFidelizacion) {
foreach ($pagoFidelizacion as $fideli) {
$fidelizacion[] = [
'fecha' => $fideli->getFechaModificacion()->format('Y-m-d'),
'valor' => $fideli->getValor()
];
}
}
$pagoDescuentos = $this->em->getRepository(Descuentos::class)->findBy(['idPagos' => $pago->getId()]);
if ($pagoDescuentos) {
foreach ($pagoDescuentos as $descuent) {
$descuentos[] = [
'fecha' => $descuent->getFechaModificacion()->format('Y-m-d'),
'valor' => $descuent->getValor(),
'observacion' => $descuent->getObservacion()
];
}
}
}
}
$lista = [
'fidelizacion' => $fidelizacion,
'descuentos' => $descuentos,
'cupones' => $cupones
];
return $this->json($lista);
}
/**
* @Route("/setEnviarMail", name="setEnviarMail")
*/
public function setEnviarMail(Request $request, EmailService $emailService) {
try {
$data = $request->request->get('data');
$emailService->SendEmailFidelizacion($data, $this->em);
return $this->json(['response' => true, 'message' => "Correo enviado exitosamente."]);
} catch (Exception $e) {
return $this->json(['response' => false, 'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setOrdenCuenta</i>"]);
}
}
/**
* @Route("/getExcelClientesFidelizacion", name="getExcelClientesFidelizacion")
*/
public function getExcelClientesFidelizacion() {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Fidelización");
$headers = ['id', 'nombres apellidos', 'categoria', 'acumulado', 'canjeado', 'disponible', 'descuentos', 'nro cupones'];
$sheet->fromArray($headers, NULL, 'A1');
$lista = $this->cache->get('excelListClientesFidelizacion');
$lista = !$lista ? [] : $lista;
if (count($lista) != 0):
$data = array_map(function ($cuenta) {
return [
$cuenta['id'],
$cuenta['nombres'],
$cuenta['nombreCategoriaCliente'],
$cuenta['valorAcumulado'],
$cuenta['valorCanjeado'],
$cuenta['valorDisponible'],
$cuenta['valorDescuentos'],
$cuenta['nroCupones']
];
}, $lista);
endif;
$sheet->fromArray($data, null, 'A2');
$writer = new Xlsx($spreadsheet);
$fileName = 'fidelizacion_clientes.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/getExcelFidelizacionHistorial", name="getExcelFidelizacionHistorial")
*/
public function getExcelFidelizacionHistorial() {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Fidelización");
$headers = ['id', 'nombres apellidos', 'categoria', 'acumulado', 'canjeado', 'disponible', 'descuentos', 'nro cupones'];
$sheet->fromArray($headers, NULL, 'A1');
$lista = $this->cache->get('excelListClientesFidelizacionHistorial');
$lista = !$lista ? [] : $lista;
if (count($lista) != 0):
$data = array_map(function ($cuenta) {
return [
$cuenta['id'],
$cuenta['nombres'],
$cuenta['nombreCategoriaCliente'],
$cuenta['valorAcumulado'],
$cuenta['valorCanjeado'],
$cuenta['valorDisponible'],
$cuenta['valorDescuentos'],
$cuenta['nroCupones']
];
}, $lista);
endif;
$sheet->fromArray($data, null, 'A2');
$writer = new Xlsx($spreadsheet);
$fileName = 'fidelizacion_clientes_historial.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/getPdfClientesFidelizacion", name="getPdfClientesFidelizacion")
*/
public function getPdfClientesFidelizacion(UserInterface $user, EntityManagerInterface $em)
{
$informacionGeneral = new InformacionGeneralController($em);
$documents = new DocumentsController();
$listUsuarios = $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
$list = $this->getFilterFidelizacionClientsPagos($listUsuarios);
date_default_timezone_set('America/Guayaquil');
$fecha = date('Y-m-d');
$hora = date('h:i:s');
/* $info = $informacionGeneral->getData($user); $info = $info[0];
$logo = $documents->getLogo($info['logoUrl']); */
$html = $this->renderView('Administration/pdf/fidelizacion/clientes.html.twig', [
'title' => 'PDF',
'lista' => $list,
'logo' => '',
'nombreInstitucion' => '',
'siglas' => '',
'codigoIes' => '',
/* 'logo' => $logo, 'nombreInstitucion'=> $info['nombreInstitucion'],
'siglas' => $info['siglas'], 'codigoIes'=> $info['codigoIes'], */
'fecha' => $fecha,
'hora' => $hora,
'enable_remote' => true
]);
$documents->getPdfDocument($list, 'Fidelizacion', $html);
}
}