src/Controller/ModFidelizacion/ClientsController.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Controller\ModFidelizacion;
  3. use App\Controller\Documents\DocumentsController;
  4. use App\Controller\InformacionGeneralController;
  5. use App\Entity\Comercio\Cuenta;
  6. use App\Entity\Contabilidad\{DescuentosPagosPagoFidelizacion};
  7. use App\Entity\Fidelizacion\{FidelizacionUsoCupones};
  8. use App\Entity\Seguridades\Usuario;
  9. use App\Service\CacheService;
  10. use App\Service\EmailService;
  11. use DateInterval;
  12. use DateTime;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Security\Core\User\UserInterface;
  16. use Symfony\Component\HttpFoundation\{RequestResponseHeaderBag};
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Exception;
  19. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  20. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  21. class ClientsController extends AbstractController {
  22.   private $em;
  23.   private $cache;
  24.   public function __construct(EntityManagerInterface $emCacheService $cache) {
  25.     $this->em $em;
  26.     $this->cache $cache;
  27.   }
  28.   /**
  29.    * @Route("/getClientsList", name="getClientsList")
  30.    */
  31.   public function getClientsList() {
  32.     /*
  33.     FUNCION OBTIENE VALORES DE FIDELIZACION DEL AÑO ACTUAL
  34.     */
  35.     $this->cache->delete('excelListClientesFidelizacion');
  36.     $usuariosList $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
  37.     $list $this->getFilterFidelizacionClientsPagos($usuariosList);
  38.     $this->cache->add('excelListClientesFidelizacion'$list);
  39.     //return $this->json($list, 200);
  40.     return $this->json(['data' => $list]);
  41.   }
  42.   /**
  43.    * @Route("/getClienteFidelizacion", name="getClienteFidelizacion")
  44.    */
  45.   public function getClienteFidelizacion(Request $request) {
  46.     $id $request->request->get('id');
  47.     $tipo $request->request->get('tipo');
  48.     $anio date('Y');
  49.     $dias date("d"mktime(000'01' 10$anio));
  50.     $fechaInicio "$anio-01-01";
  51.     $fechaFin "$anio-12-$dias";
  52.     $inicio = new \DateTime("$fechaInicio 00:00:00");
  53.     $fin = new \DateTime("$fechaFin 23:59:59");
  54.     if ($tipo == 'usuario') :
  55.       $dql "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
  56.       $params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $id];
  57.       $pagos $this->em->createQuery($dql)->setParameters($params);
  58.       $resultados $this->calcularValoresFidelizacion($pagos->getResult());
  59.     else:
  60.       $cuenta $this->em->getRepository(Cuenta::class)->find($id);
  61.       $dql "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
  62.       $params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $cuenta->getIdUsuario()->getId()];
  63.       $pagos $this->em->createQuery($dql)->setParameters($params);
  64.       $resultados $this->calcularValoresFidelizacion($pagos->getResult());
  65.     endif;
  66.     return $this->json($resultados['valorDisponible'], 200);
  67.   }
  68.   /**
  69.    * @Route("/getHistorialFidelizacion", name="getHistorialFidelizacion")
  70.    */
  71.   public function getHistorialFidelizacion(Request $request) {
  72.     $this->cache->delete('excelListClientesFidelizacionHistorial');
  73.     $FI $request->request->get('FI''');
  74.     $FF $request->request->get('FF''');
  75.     $HI $request->request->get('HI''');
  76.     $HF $request->request->get('HF''');
  77.     if (empty($FI) && empty($FF) && empty($HI) && empty($HF)) :
  78.       $anio date('Y');
  79.       $mes date('m');
  80.       $dias date("d"mktime(000$mes 10$anio));
  81.       $fechaInicio "$anio-$mes-01";
  82.       $fechaFin "$anio-$mes-$dias";
  83.       $inicio = new \DateTime("$fechaInicio 00:00:00");
  84.       $fin = new \DateTime("$fechaFin 23:59:59");
  85.     else:
  86.       $fechaInicio $HI "$FI $HI:00" "$FI 00:00:00";
  87.       $fechaFin $HF "$FF $HF:00" "$FF 23:59:59";
  88.       $inicio = new \DateTime("$fechaInicio");
  89.       $fin = new \DateTime("$fechaFin");
  90.     endif;
  91.     $usuarios $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
  92.     $list $this->getFidelizacionHistorial($usuarios$inicio$fin);
  93.     $this->cache->add('excelListClientesFidelizacionHistorial'$list);
  94.     return $this->json([
  95.       'inicio' => $inicio,
  96.       'fin' => $fin,
  97.       'data' => $list
  98.     ], 200);
  99.   }
  100.   private function getFidelizacionHistorial($usuarios$inicio$fin) {
  101.     if (empty($usuarios)) : return []; endif;
  102.     $lista = [];
  103.     foreach ($usuarios as $usuario) {
  104.       $persona $usuario->getIdPersona();
  105.       if ($persona->getId() === 78 || $usuario->getId() === 1) : continue; endif;
  106.       $dql "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.fechaHoraPago >= :fechaIn AND pagos.fechaHoraPago <= :fechaFi AND pagos.idUsuario = :userId";
  107.       $params = ['fechaIn' => $inicio->format('Y-m-d H:i:s'), 'fechaFi' => $fin->format('Y-m-d H:i:s'), 'userId' => $usuario->getId()];
  108.       $pagos $this->em->createQuery($dql)->setParameters($params);
  109.       $resultados $this->calcularValoresFidelizacion($pagos->getResult());
  110.       $lista[] = [
  111.         'id' => $usuario->getId(),
  112.         'nombres' => $persona->getNombres() . ' ' $persona->getApellidos(),
  113.         'nombreCategoriaCliente' => $persona->getIdCategoriaCliente()->getNombre(),
  114.         'valorAcumulado' => round($resultados['valorAcumulado'], 2),
  115.         'valorCanjeado' => round($resultados['valorCanjeado'], 2),
  116.         'valorDisponible' => round($resultados['valorDisponible'], 2),
  117.         'valorDescuentos' => round($resultados['valorDescuentos'], 2),
  118.         'nroCupones' => $resultados['nroCupones'],
  119.       ];
  120.     }
  121.     return $lista;
  122.   }
  123.   private function getFilterFidelizacionClientsPagos($usuarios) {
  124.     if (empty($usuarios)) : return []; endif;
  125.     $lista = [];
  126.     $anio date('Y');
  127.     $dias date("d"mktime(000'01' 10$anio));
  128.     $fechaInicio "$anio-01-01";
  129.     $fechaFin "$anio-12-$dias";
  130.     $inicio = new \DateTime("$fechaInicio 00:00:00");
  131.     $fin = new \DateTime("$fechaFin 23:59:59");
  132.     foreach ($usuarios as $usuario) {
  133.       $persona $usuario->getIdPersona();
  134.       if ($persona->getId() === 78 || $usuario->getId() === 1) : continue; endif;
  135.       $dql "SELECT pagos FROM App\Entity\Contabilidad\Pagos pagos WHERE pagos.idUsuario = :userId";
  136.       $params = ['userId' => $usuario->getId()];
  137.       //$params = ['fechaIn' => $inicio, 'fechaFi' => $fin, 'userId' => $usuario->getId()];
  138.       /** COMENTADA ESTA PARTA PARA CONTABILIZAR UN AÑO A PARTIR DE LA FECHA_HORA_PAGO */
  139.       $pagos $this->em->createQuery($dql)->setParameters($params);
  140.       $resultados $this->calcularValoresFidelizacion($pagos->getResult());
  141.       $lista[] = [
  142.         'id' => $usuario->getId(),
  143.         'nombres' => $persona->getNombres() . ' ' $persona->getApellidos(),
  144.         'nombreCategoriaCliente' => $persona->getIdCategoriaCliente()->getNombre(),
  145.         'valorAcumulado' => round($resultados['valorAcumulado'], 2),
  146.         'valorCanjeado' => round($resultados['valorCanjeado'], 2),
  147.         'valorDisponible' => round($resultados['valorDisponible'], 2),
  148.         'valorDescuentos' => round($resultados['valorDescuentos'], 2),
  149.         'nroCupones' => $resultados['nroCupones'],
  150.         'valorPuntos' => $resultados['valorPuntos'],
  151.         'mail' => $usuario->getUsuario(),
  152.         'pagos' => $pagos->getResult()
  153.       ];
  154.     }
  155.     return $lista;
  156.   }
  157.   private function calcularValoresFidelizacion($pagos) {
  158.     $valorAcumulado $valorCanjeado $valorDescuentos 0;
  159.     $nroCupones 0;
  160.     $valorPuntos 0;
  161.     foreach ($pagos as $pago) {
  162.       $pagoId $pago->getId();
  163.       $fechaModificacion $pago->getFechaHoraPago();
  164.       $fechaAnyo = (clone $fechaModificacion)->add(new DateInterval('P1Y'));
  165.       $intervalo $fechaAnyo->diff(new DateTime());
  166.       if ($intervalo->days 0) :
  167.         $fidelizacion $this->em->getRepository(Fidelizacion::class)->findBy(['idPagos' => $pagoId]);
  168.         foreach ($fidelizacion as $valor) { $valorAcumulado $valorAcumulado $valor->getValor(); }
  169.         $pagoFidelizacion $this->em->getRepository(PagoFidelizacion::class)->findBy(['idPagos' => $pagoId]);
  170.         foreach ($pagoFidelizacion as $valor) { $valorCanjeado $valorCanjeado $valor->getValor(); }
  171.         $descuentos $this->em->getRepository(Descuentos::class)->findBy(['idPagos' => $pagoId]);
  172.         foreach ($descuentos as $valor) { $valorDescuentos $valorDescuentos $valor->getValor(); }
  173.         $nroCupones += count($this->em->getRepository(UsoCupones::class)->findBy(['idPagos' => $pagoId]));
  174.         $valorPuntos $valorPuntos floor($pago->getValor());
  175.       endif;
  176.     }
  177.     return [
  178.       'valorAcumulado' => $valorAcumulado,
  179.       'valorCanjeado' => $valorCanjeado,
  180.       'valorDisponible' => $valorAcumulado $valorCanjeado,
  181.       'valorDescuentos' => $valorDescuentos,
  182.       'nroCupones' => $nroCupones,
  183.       'valorPuntos' => $valorPuntos
  184.     ];
  185.   }
  186.   /**
  187.    * @Route("/findDetails", name="findDetails")
  188.    */
  189.   public function findDetails(Request $request) {
  190.     $idUsuario $request->request->get('id');
  191.     $lista = [];
  192.     $fidelizacion = [];
  193.     $cupones = [];
  194.     $descuentos = [];
  195.     $pagos $this->em->getRepository(Pagos::class)->findBy(['idUsuario' => $idUsuario]);
  196.     if ($pagos) {
  197.       foreach ($pagos as $pago) {
  198.         $pagoCupones $this->em->getRepository(UsoCupones::class)->findBy(['idPagos' => $pago->getId()]);
  199.         if ($pagoCupones) {
  200.           foreach ($pagoCupones as $cupon) {
  201.             $cupones[] = [
  202.               'nroCupon' => $cupon->getIdCupones()->getCodigo(),
  203.               'fecha' => $cupon->getFechaModificacion()->format('Y-m-d'),
  204.               'valor' => $cupon->getValor()
  205.             ];
  206.           }
  207.         }
  208.         $pagoFidelizacion $this->em->getRepository(PagoFidelizacion::class)->findBy(['idPagos' => $pago->getId()]);
  209.         if ($pagoFidelizacion) {
  210.           foreach ($pagoFidelizacion as $fideli) {
  211.             $fidelizacion[] = [
  212.               'fecha' => $fideli->getFechaModificacion()->format('Y-m-d'),
  213.               'valor' => $fideli->getValor()
  214.             ];
  215.           }
  216.         }
  217.         $pagoDescuentos $this->em->getRepository(Descuentos::class)->findBy(['idPagos' => $pago->getId()]);
  218.         if ($pagoDescuentos) {
  219.           foreach ($pagoDescuentos as $descuent) {
  220.             $descuentos[] = [
  221.               'fecha' => $descuent->getFechaModificacion()->format('Y-m-d'),
  222.               'valor' => $descuent->getValor(),
  223.               'observacion' => $descuent->getObservacion()
  224.             ];
  225.           }
  226.         }
  227.       }
  228.     }
  229.     $lista = [
  230.       'fidelizacion' => $fidelizacion,
  231.       'descuentos' => $descuentos,
  232.       'cupones' => $cupones
  233.     ];
  234.     return $this->json($lista);
  235.   }
  236.   /**
  237.    * @Route("/setEnviarMail", name="setEnviarMail")
  238.    */
  239.   public function setEnviarMail(Request $requestEmailService $emailService) {
  240.     try {
  241.       $data $request->request->get('data');
  242.       $emailService->SendEmailFidelizacion($data$this->em);
  243.       return $this->json(['response' => true'message' => "Correo enviado exitosamente."]);
  244.     } catch (Exception $e) {
  245.       return $this->json(['response' => false'message' => "<b>{$e->getMessage()}</b> error al realizar el registro dentro de la petición <i>setOrdenCuenta</i>"]);
  246.     }
  247.   }
  248.   /**
  249.    * @Route("/getExcelClientesFidelizacion", name="getExcelClientesFidelizacion")
  250.    */
  251.   public function getExcelClientesFidelizacion() {
  252.     $spreadsheet = new Spreadsheet();
  253.     $sheet $spreadsheet->getActiveSheet();
  254.     $sheet->setTitle("Fidelización");
  255.     $headers = ['id''nombres apellidos''categoria''acumulado''canjeado''disponible''descuentos''nro cupones'];
  256.     $sheet->fromArray($headersNULL'A1');
  257.     $lista $this->cache->get('excelListClientesFidelizacion');
  258.     $lista = !$lista ? [] : $lista;
  259.     if (count($lista) != 0):
  260.       $data array_map(function ($cuenta) {
  261.         return [
  262.           $cuenta['id'],
  263.           $cuenta['nombres'],
  264.           $cuenta['nombreCategoriaCliente'],
  265.           $cuenta['valorAcumulado'],
  266.           $cuenta['valorCanjeado'],
  267.           $cuenta['valorDisponible'],
  268.           $cuenta['valorDescuentos'],
  269.           $cuenta['nroCupones']
  270.         ];
  271.       }, $lista);
  272.     endif;
  273.     $sheet->fromArray($datanull'A2');
  274.     $writer = new Xlsx($spreadsheet);
  275.     $fileName 'fidelizacion_clientes.xlsx';
  276.     $temp_file tempnam(sys_get_temp_dir(), $fileName);
  277.     $writer->save($temp_file);
  278.     return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  279.   }
  280.   /**
  281.    * @Route("/getExcelFidelizacionHistorial", name="getExcelFidelizacionHistorial")
  282.    */
  283.   public function getExcelFidelizacionHistorial() {
  284.     $spreadsheet = new Spreadsheet();
  285.     $sheet $spreadsheet->getActiveSheet();
  286.     $sheet->setTitle("Fidelización");
  287.     $headers = ['id''nombres apellidos''categoria''acumulado''canjeado''disponible''descuentos''nro cupones'];
  288.     $sheet->fromArray($headersNULL'A1');
  289.     $lista $this->cache->get('excelListClientesFidelizacionHistorial');
  290.     $lista = !$lista ? [] : $lista;
  291.     if (count($lista) != 0):
  292.       $data array_map(function ($cuenta) {
  293.         return [
  294.           $cuenta['id'],
  295.           $cuenta['nombres'],
  296.           $cuenta['nombreCategoriaCliente'],
  297.           $cuenta['valorAcumulado'],
  298.           $cuenta['valorCanjeado'],
  299.           $cuenta['valorDisponible'],
  300.           $cuenta['valorDescuentos'],
  301.           $cuenta['nroCupones']
  302.         ];
  303.       }, $lista);
  304.     endif;
  305.     $sheet->fromArray($datanull'A2');
  306.     $writer = new Xlsx($spreadsheet);
  307.     $fileName 'fidelizacion_clientes_historial.xlsx';
  308.     $temp_file tempnam(sys_get_temp_dir(), $fileName);
  309.     $writer->save($temp_file);
  310.     return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  311.   }
  312.   /**
  313.    * @Route("/getPdfClientesFidelizacion", name="getPdfClientesFidelizacion")
  314.    */
  315.   public function getPdfClientesFidelizacion(UserInterface $userEntityManagerInterface $em)
  316.   {
  317.     $informacionGeneral = new InformacionGeneralController($em);
  318.     $documents = new DocumentsController();
  319.     $listUsuarios $this->em->getRepository(Usuario::class)->findBy([], ['id' => 'ASC']);
  320.     $list $this->getFilterFidelizacionClientsPagos($listUsuarios);
  321.     date_default_timezone_set('America/Guayaquil');
  322.     $fecha date('Y-m-d');
  323.     $hora date('h:i:s');
  324.     /* $info = $informacionGeneral->getData($user); $info = $info[0];
  325.       $logo = $documents->getLogo($info['logoUrl']); */
  326.     $html $this->renderView('Administration/pdf/fidelizacion/clientes.html.twig', [
  327.       'title' => 'PDF',
  328.       'lista' => $list,
  329.       'logo' => '',
  330.       'nombreInstitucion' => '',
  331.       'siglas' => '',
  332.       'codigoIes' => '',
  333.       /* 'logo' => $logo, 'nombreInstitucion'=> $info['nombreInstitucion'], 
  334.           'siglas' => $info['siglas'], 'codigoIes'=> $info['codigoIes'],  */
  335.       'fecha' => $fecha,
  336.       'hora' => $hora,
  337.       'enable_remote' => true
  338.     ]);
  339.     $documents->getPdfDocument($list'Fidelizacion'$html);
  340.   }
  341. }