<?php
namespace App\Controller\Karaoke;
use App\Controller\Documents\DocumentsController;
use App\Controller\InformacionGeneralController;
use App\Controller\Seguridades\PermisosPaginasController;
use App\Entity\Karaoke\{CancionesCuenta, ParametrosKaraoke, FavoritoCanciones, ListaCanciones, MisCanciones};
use App\Entity\Comercio\Cuenta;
use App\Entity\Persona\CargoRolPersona;
use App\Entity\Seguridades\GrupoCargo;
use App\Form\Karaoke\{ParametersType, SongBookType};
use App\Repository\Seguridades\PermisosGrupoRepository;
use App\Repository\Seguridades\PermisosUsuarioRepository;
use App\Service\{AdminService, CacheService};
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class AdminController extends AbstractController {
private $em;
private $adminSer;
private $permisosGrupoRepository;
private $permisosUsuarioRepository;
public function __construct(EntityManagerInterface $em, AdminService $adminSer, PermisosGrupoRepository $permisosGrupoRepository, PermisosUsuarioRepository $permisosUsuarioRepository) {
date_default_timezone_set('America/Guayaquil');
$this->em = $em;
$this->adminSer = $adminSer;
$this->permisosGrupoRepository = $permisosGrupoRepository;
$this->permisosUsuarioRepository = $permisosUsuarioRepository;
}
/**
* @Route("/karaokeAdministration", name="karaokeAdministration")
*/
public function administration(AdminService $adminService, UserInterface $user) {
$informacionGeneral = new InformacionGeneralController($this->em);
$sideBar = $this->sidebarPaginas($user);
$permissions = $this->getPermissionsKaraokeAdministration($sideBar);
$formParameters = $this->createForm(ParametersType::class, new ParametrosKaraoke);
$formSongBook = $this->createForm(SongBookType::class, new ListaCanciones);
if ($permissions == null) :
return $this->redirectToRoute('paginaRestringida');
endif;
return $this->render('Karaoke/administration/index.html.twig', [
'informacionGeneral' => $informacionGeneral->getData(),
'permisos' => $permissions,
'sidebarMenu' => $sideBar[0],
'topbarMenu' => null,
'parametersForm' => $formParameters->createView(),
'songBookForm' => $formSongBook->createView(),
'permisos' => $permissions,
'parameters' => $permissions[0]['see'],
'songBook' => $permissions[1]['see'],
'request' => $permissions[2]['see']
]);
}
private function getPermissionsKaraokeAdministration($sidebar) {
$permissions = $this->adminSer->getPermissionsSec('karaokeAdministration', $sidebar[3], $sidebar[4]);
if ($permissions) :
$sections = [
'Parámetros Gestión' => false,
'Cancionero' => false,
'Solicitudes' => false
];
foreach ($permissions as $per) {
if (array_key_exists($per['section'], $sections)) :
$sections[$per['section']] = $per;
endif;
}
return array_values($sections);
endif;
return null;
}
private function sidebarPaginas ($user) {
$cargoRolPersona = $this->em->getRepository(CargoRolPersona::class)->findOneBy(['idPersona' => $user->getIdPersona()->getId()]);
$grupoCg = $this->em->getRepository(GrupoCargo::class)->findOneBy(['idCargosRol' => $cargoRolPersona->getIdCargosRol()->getId()]);
$idUsuario = $user->getId();
$idGrupo = $grupoCg->getIdGrupo()->getId();
$permisosGrupo = $this->permisosGrupoRepository->findPermisosGrupo($idGrupo);
$permisosUsuario = $this->permisosUsuarioRepository->findPermisosGrupo($idUsuario);
if ($cargoRolPersona->getIdCargosRol()->getId() == 3) :
$sideBar = null;
else:
$listPermisos = new PermisosPaginasController();
$sideBar = $listPermisos->getPermissionsPages($this->adminSer, $this->em, $idUsuario, $idGrupo, $permisosGrupo, $permisosUsuario);
endif;
return [$sideBar, $idUsuario, $idGrupo, $permisosGrupo, $permisosUsuario ,$cargoRolPersona];
}
/**
* @Route("/cancionero", name="cancionero")
*/
public function cancionero()
{
return $this->render('Karaoke/cliente/index.html.twig');
}
/**
* @Route("/cancionesCancionero", name="cancionesCancionero")
*/
public function cancionesCancionero(Request $request)
{
$list = [];
$listaCanciones = $this->em->getRepository(ListaCanciones::class)->findAll();
foreach ($listaCanciones as $cancion) {
array_push($list, [
'id' => $cancion->getId(),
'codigo' => $cancion->getCodigo(),
'nombreCancion' => $cancion->getNombreCancion(),
'genero' => $cancion->getIdGenero()->getNombre(),
'autor' => $cancion->getIdAutor()->getNombre()
]);
}
return $this->json($list, 200);
}
/**
* @Route("/karaoke", name="karaoke")
*/
public function karaoke(AdminService $adminService, UserInterface $user, CacheService $cacheService)
{
//$cacheService->delete('karaokeListMiCuenta');
$cacheService->delete('karaokeListMiCuenta');
$cacheService->delete('karaokeListSolicitadas');
$cacheService->delete('karaokeListMisCanciones');
$cacheService->delete('karaokeListTop');
$informacionGeneralController = new InformacionGeneralController($this->em);
$permissions = $adminService->getPermissionsSec($user, $this->em, 'karaoke');
$permissions = $this->getPermissionsKaraoke($user, $adminService, $this->em);
return $this->render('Karaoke/songList/index.html.twig', [
'informacionGeneral' => $informacionGeneralController->getData(),
'permisos' => $permissions,
'karaoke' => $permissions[0]['see'],
]);
}
private function getPermissionsKaraoke(UserInterface $user, AdminService $adminSer, EntityManagerInterface $em)
{
$permissions = $adminSer->getPermissionsSec($user, $em, 'karaoke');
if (count($permissions) == 0): return $this->redirectToRoute('paginaRestringida');
endif;
$parameters = ['see' => false, 'read' => false, 'edit' => false];
foreach ($permissions as $per) {
switch ($per['section']) {
case 'Karaoke':
$parameters = $per;
break;
}
}
return [$parameters];
}
/**
* @Route("/getKaraokeList", name="getKaraokeList")
*/
public function getKaraokeList(CacheService $cache)
{
$karaokeList = $cache->get('karaokeList');
if (!$karaokeList) {
$list = $this->getListAll();
$list = $this->setArrayListKaraoke($list);
$cache->add('karaokeList', $list);
}
return $this->json($list);
}
/**
* @Route("/getKaraokeListMiCuenta", name="generaGetKaraokeListMiCuenta")
*/
public function generaGetKaraokeListMiCuenta(CacheService $cache, UserInterface $user)
{
$karaokeList = $cache->get('karaokeListMiCuenta');
if (!$karaokeList) {
$cuenta = $this->em->getRepository(Cuenta::class)->findOneBy(['idUsuario' => $user->getId(), 'activa' => true]);
$allList = $this->getListAll();
$lista = [];
$cancionesCuenta = false;
if ($cuenta) {
$cancionesCuenta = $this->em->getRepository(CancionesCuenta::class)->findBy(['idCuenta' => $cuenta->getId()]);
}
foreach ($allList as $song) {
$solicitada = false;
$favorito = $this->em->getRepository(FavoritoCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
$existMisCanciones = $this->em->getRepository(MisCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
if ($cancionesCuenta) {
foreach ($cancionesCuenta as $cancion) {
if ($cancion->getIdListaCanciones()->getId() == $song->getId()) {
$solicitada = true;
break;
}
}
}
$lista = $this->setArrayAllList($song, $lista, $solicitada, $favorito->getCalificacion(), $existMisCanciones ? true : false);
}
$cache->add('karaokeListMiCuenta', $lista);
$karaokeList = $lista;
}
return $this->json($karaokeList);
}
/**
* @Route("/getKaraokeListSolicitadas", name="getKaraokeListSolicitadas")
*/
public function getKaraokeListSolicitadas(CacheService $cache, UserInterface $user)
{
$karaokeList = $cache->get('karaokeListSolicitadas');
if (!$karaokeList) {
$lista = [];
$cuenta = $this->em->getRepository(Cuenta::class)->findOneBy(['idUsuario' => $user->getId(), 'activa' => true]);
if (!$cuenta) {
return $this->json([]);
}
$cancionesCuenta = $this->em->getRepository(CancionesCuenta::class)->findBy(['idCuenta' => $cuenta->getId()]);
if (!$cancionesCuenta) {
return $this->json([]);
}
foreach ($cancionesCuenta as $cancion) {
$song = $cancion->getIdListaCanciones();
$favorito = $this->em->getRepository(FavoritoCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
$existMisCanciones = $this->em->getRepository(MisCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
$lista = $this->setArrayAllList($song, $lista, true, $favorito->getCalificacion(), $existMisCanciones ? true : false);
}
$cache->add('karaokeListSolicitadas', $lista);
$karaokeList = $lista;
}
return $this->json($karaokeList);
}
/**
* @Route("/getKaraokeListMisCanciones", name="getKaraokeListMisCanciones")
*/
public function getKaraokeListMisCanciones(CacheService $cache, UserInterface $user)
{
$karaokeList = $cache->get('karaokeListMisCanciones');
if (!$karaokeList) {
$cancionesCuenta = false;
$cuenta = $this->em->getRepository(Cuenta::class)->findOneBy(['idUsuario' => $user->getId(), 'activa' => true]);
if ($cuenta) {
$cancionesCuenta = $this->em->getRepository(CancionesCuenta::class)->findBy(['idCuenta' => $cuenta->getId()]);
}
$lista = [];
$misCanciones = $this->em->getRepository(MisCanciones::class)->findBy(['idUsuario' => $user->getId()]);
foreach ($misCanciones as $cancion) {
$solicitada = false;
$song = $cancion->getIdListaCanciones();
if ($cancionesCuenta) {
foreach ($cancionesCuenta as $cancion) {
if ($cancion->getIdListaCanciones()->getId() == $song->getId()) {
$solicitada = true;
break;
}
}
}
$favorito = $this->em->getRepository(FavoritoCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
$lista = $this->setArrayAllList($song, $lista, $solicitada, $favorito->getCalificacion(), true);
}
$cache->add('karaokeListMisCanciones', $lista);
$karaokeList = $lista;
}
return $this->json($karaokeList);
}
/**
* @Route("/getKaraokeListTop", name="getKaraokeListTop")
*/
public function getKaraokeListTop(CacheService $cache, UserInterface $user)
{
$karaokeList = $cache->get('karaokeListTop');
if (!$karaokeList) {
$cancionesCuenta = false;
$cuenta = $this->em->getRepository(Cuenta::class)->findOneBy(['idUsuario' => $user->getId(), 'activa' => true]);
if ($cuenta) {
$cancionesCuenta = $this->em->getRepository(CancionesCuenta::class)->findBy(['idCuenta' => $cuenta->getId()]);
}
$parametros = $this->em->getRepository(ParametrosKaraoke::class)->findOneBy([], []);
$top = $parametros->getTop();
$contador = 0;
$lista = [];
$allList = $this->getListAll();
foreach ($allList as $song) {
if ($contador == $top) {
break;
}
$solicitada = false;
if ($cancionesCuenta) {
foreach ($cancionesCuenta as $cancion) {
if ($cancion->getIdListaCanciones()->getId() == $song->getId()) {
$solicitada = true;
break;
}
}
}
$favorito = $this->em->getRepository(FavoritoCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
if ($favorito->getCalificacion() == 5) {
$existMisCanciones = $this->em->getRepository(MisCanciones::class)->findOneBy(['idListaCanciones' => $song->getId()]);
$lista = $this->setArrayAllList($song, $lista, $solicitada, 5, $existMisCanciones ? true : false);
$contador++;
}
}
$cache->add('karaokeListTop', $lista);
$karaokeList = $lista;
}
return $this->json($karaokeList);
}
private function setArrayListKaraoke($lista)
{
$listaFinal = [];
foreach ($lista as $song) {
$listaFinal[] = [
'id' => $song->getId(),
'codigo' => $song->getCodigo(),
'nombreCancion' => $song->getNombreCancion(),
'nombreAutor' => $song->getIdAutor()->getNombre(),
'nombreGenero' => $song->getIdGenero()->getNombre(),
];
}
return $listaFinal;
}
private function setArrayAllList($song, $list, $solicitada, $calificacion, $favorito = false)
{
$list[] = [
'id' => $song->getId(),
'codigo' => $song->getCodigo(),
'nombreCancion' => $song->getNombreCancion(),
'nombreAutor' => $song->getIdAutor()->getNombre(),
'nombreGenero' => $song->getIdGenero()->getNombre(),
'solicitada' => $solicitada,
'calificacion' => $calificacion,
'favorito' => $favorito,
];
return $list;
}
/**
* @Route("/getExcelKaraoke", name="getExcelKaraoke")
*/
public function getExcelKaraoke(EntityManagerInterface $em)
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Tabla de Banners");
$arrayTitle = ['Título', 'Descripción', 'Fecha Inicio', 'Fecha Fin', 'Activo'];
$spreadsheet->getActiveSheet()->fromArray($arrayTitle, NULL, 'A2');
$lista = $this->getListAll();
if (count($lista) != 0):
$a = 3;
foreach ($lista as $item) {
$sheet->setCellValue("A$a", $item->getTitulo());
$sheet->setCellValue("B$a", $item->getDescripcion());
$sheet->setCellValue("C$a", $item->getFechaInicioString());
$sheet->setCellValue("D$a", $item->getFechaFinString());
$sheet->setCellValue("E$a", ($item->getActivo()) ? 'Activo' : 'Inactivo');
$a++;
}
else:
$sheet->setCellValue("A3", 'No hay datos para Mostrar');
endif;
$writer = new Xlsx($spreadsheet);
// In this case, we want to write the file in the public directory
$publicDirectory = $this->getParameter('docs_directory');
$fileName = 'bannersList.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/getPdfKaraoke", name="getPdfKaraoke")
*/
public function getPdfKaraoke(UserInterface $user)
{
// $informacionGeneral = new InformacionGeneralController($this->em);
$documents = new DocumentsController();
$lista = $this->getListAll();
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/banners.html.twig', [
'title' => 'PDF',
'lista' => $lista,
'logo' => '',
'nombreInstitucion' => '',
'siglas' => '',
'codigoIes' => '',
/* 'logo' => $logo, 'nombreInstitucion'=> $info['nombreInstitucion'],
'siglas' => $info['siglas'], 'codigoIes'=> $info['codigoIes'], */
'fecha' => $fecha,
'hora' => $hora,
'enable_remote' => true
]);
$documents->getPdfDocument($lista, 'Modulos', $html);
}
private function getListAll()
{
$listAll = $this->em->getRepository(ListaCanciones::class)->findBy([], ['nombreCancion' => 'ASC']);
return $listAll;
}
}