<?php
namespace App\Controller\ModComercio\GestionCarta;
use App\Entity\Catalogos\CategoriaProducto;
use App\Entity\Producto\{PromocionalSlide};
use App\Service\{DocumentsService, CacheService};
use DateTime;
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;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Security\Core\User\UserInterface;
class BannerController 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 *
/**
* @Route("/getInitialBanner", name="getInitialBanner")
*/
public function getInitialBanner(Request $request) {
$this->cache->delete('excelListBanners');
$list = [];
$promocionalSlide = $this->em->getRepository(PromocionalSlide::class)->findBy([], ['titulo' => 'ASC']);
if ($promocionalSlide) :
foreach ($promocionalSlide as $banner) {
$list = $this->setArrayBanner($list, $banner);
}
endif;
$this->cache->add('excelListBanners', $list);
return $this->json(['data' => $list], 200);
}
/**
* @Route("/getFindBanner", name="getFindBanner")
*/
public function getFindBanner(Request $request) {
$list = [];
$id = $request->request->get('id');
$promocionalSlide = $this->em->getRepository(PromocionalSlide::class)->find($id);
$list = $this->setArrayBanner($list, $promocionalSlide);
return $this->json($list[0], 200);
}
public function setArrayBanner($list, $item) {
array_push($list, [
'id' => $item->getId(),
'titulo' => $item->getTitulo(),
'descripcion' => $item->getDescripcion(),
'idCategoriaProducto' => $item->getIdCategoriaProducto(),
'activo' => $item->getActivo(),
'encabezado' => $item->getEncabezado(),
'imagen' => $item->getImagen(),
'fechaInicio' => $item->getFechaInicioString(),
'fechaFin' => $item->getFechaFinString()
]);
return $list;
}
// * CREATE OR UPDATE FUNCTIONS *
/**
* @Route("/addBanner", name="addBanner")
*/
public function addBanner(Request $request, UserInterface $user, DocumentsService $documentsService) {
try {
$data = $request->request->get('banner');
$id = $data['id'] ?? null;
if (!$id && empty($_FILES['banner']['name']['foto'])) :
return $this->json(['response' => false, 'message' => "Lo sentimos, debe ingresar la imagen"]);
endif;
$imagen = $this->processImage($data, $documentsService);
$promocionalSlide = $id ? $this->em->getRepository(PromocionalSlide::class)->find($id) : new PromocionalSlide();
$this->setData($data, $promocionalSlide, $user, $imagen);
$this->em->persist($promocionalSlide);
$this->em->flush();
return $this->json(['response' => true, 'message' => $id ? $this->msgUpdate : $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>addBanner</i>"]);
}
}
private function processImage($data, DocumentsService $documentsService) {
$id = $data['id'] ?? null; $imagen = '';
if ($id) :
$promocionalSlide = $this->em->getRepository(PromocionalSlide::class)->find($id);
if ($promocionalSlide && $promocionalSlide->getImagen() && empty($_FILES['banner']['name']['foto'])) :
$imagen = $promocionalSlide->getImagen();
endif;
endif;
if (empty($imagen)) :
$foto = $documentsService->getEstructureDocument(
$_FILES['banner']['name']['foto'],
$_FILES['banner']['size']['foto'],
$_FILES['banner']['tmp_name']['foto'],
$_FILES['banner']['type']['foto']
);
$imagen = $documentsService->setEncodeImg($foto);
endif;
return $imagen;
}
private function setData($data, PromocionalSlide $promocionalSlide, UserInterface $user, $imagen) {
$fechaInicio = DateTime::createFromFormat('Y-m-d', $data['fechaInicio']);
$idCategoriaProducto = $this->em->getRepository(CategoriaProducto::class)->find($data['idCategoriaProducto']);
if ($data['fechaFin'] != "") :
$fechaFin = DateTime::createFromFormat('Y-m-d', $data['fechaFin']);
$promocionalSlide->setFechaFin($fechaFin);
endif;
$promocionalSlide
->setTitulo($data['titulo'])
->setDescripcion($data['descripcion'])
->setActivo(false)
->setEncabezado(false)
->setImagen($imagen)
->setIdCategoriaProducto($idCategoriaProducto)
->setFechaInicio($fechaInicio)
;
$this->setGenericData($user, $promocionalSlide);
}
/**
* @Route("/setActivarBanner", name="setActivarBanner")
*/
public function setActivarBanner(Request $request, UserInterface $user) {
try {
$idBanner = $request->request->get('id');
$val = $request->request->get('val');
$promocionalSlide = $this->em->getRepository(PromocionalSlide::class)->find($idBanner);
$isActive = $val === "true";
$promocionalSlide->setActivo($isActive);
$this->setGenericData($user, $promocionalSlide);
$this->em->persist($promocionalSlide);
$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>setActivarBanner</i>"]);
}
}
/**
* @Route("/setEncabezadoBanner", name="setEncabezadoBanner")
*/
public function setEncabezadoBanner(Request $request, UserInterface $user) {
try {
$idBanner = $request->request->get('id');
$val = $request->request->get('val');
$promocionalSlide = $this->em->getRepository(PromocionalSlide::class)->find($idBanner);
$categoriaProductoId = $promocionalSlide->getIdCategoriaProducto()->getId();
$existingEncabezado = $this->em->getRepository(PromocionalSlide::class)->findOneBy(['idCategoriaProducto' => $categoriaProductoId, 'encabezado' => true, 'activo' => true,]);
if ($existingEncabezado && $val === "true") :
return $this->json(['response' => false, 'message' => "Lo sentimos, ya existe un registro para el encabezado"]);
endif;
$isEncabezado = $val === "true";
$promocionalSlide->setEncabezado($isEncabezado);
$this->setGenericData($user, $promocionalSlide);
$this->em->persist($promocionalSlide);
$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>setEncabezadoBanner</i>"]);
}
}
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("/deleteBanner", name="deleteBanner")
*/
public function deleteBanner(Request $request) {
try {
$id = $request->request->get('id');
$banner = $this->em->getRepository(PromocionalSlide::class)->find($id);
$this->em->remove($banner);
$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>deleteBanner</i>", 'exception' => true]);
}
}
// * EXPORTS *
/**
* @Route("/getExcelBanners", name="getExcelBanners")
*/
public function getExcelBanners(){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Banners");
$headers = ['id', 'titulo', 'categoria', 'fecha inicio', 'fecha fin', 'descripcion', 'activo', 'encabezado'];
$sheet->fromArray( $headers, NULL, 'A1' );
$lista = $this->cache->get('excelListBanners');
$lista = !$lista ? [] : $lista;
if(count($lista) != 0):
$data = array_map(function ($menu) {
return [
$menu['id'],
$menu['titulo'],
$menu['idCategoriaProducto']['nombre'],
$menu['fechaInicio'],
$menu['fechaFin'],
$menu['descripcion'],
$menu['activo'] ? 'Sí' : 'No',
$menu['encabezado'] ? 'Sí' : 'No'
];
}, $lista);
endif;
$sheet->fromArray($data, null, 'A2');
$writer = new Xlsx($spreadsheet);
$fileName = 'banners.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
}