<?php
namespace App\Controller;
use App\Service\CursoService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use App\Entity\User;
use App\Entity\Curso;
use App\Entity\Clase;
use App\Entity\Venta;
use App\Entity\Estadoventa;
use App\Entity\Imagen;
use App\Entity\Video;
use App\Entity\Archivo;
use App\Entity\Categoria;
use App\Entity\Parametro;
use App\Entity\TipoVenta;
use App\Form\CursoType;
use App\Form\CursoCategoriaType;
use App\Form\ClaseType;
use App\Form\ClaseEditarType;
class CursoController extends AbstractController
{
private $entityManager;
private $cursoService;
private $cursoRepository;
private $archivoRepository;
private $imagenRepository;
private $categoriaRepository;
private $parametroRepository;
private $userRepository;
private $ventaRepository;
private $estadoVentaRepository;
private $urlImagenesPublicaciones;
private $urlArchivosPublicaciones;
private $urlImagenesCurso;
private $urlArchivosCurso;
private $tipoVentaRepository;
public function __construct(EntityManagerInterface $entityManager, ParameterBagInterface $parameterBag,CursoService $cursoService)
{
//Doctrine
$this->entityManager = $entityManager;
$this->cursoService = $cursoService;
$this->cursoRepository = $this->entityManager->getRepository(Curso::class);
$this->archivoRepository = $this->entityManager->getRepository(Archivo::class);
$this->imagenRepository = $this->entityManager->getRepository(Imagen::class);
$this->categoriaRepository = $this->entityManager->getRepository(Categoria::class);
$this->parametroRepository = $this->entityManager->getRepository(Parametro::class);
$this->userRepository = $this->entityManager->getRepository(User::class);
$this->ventaRepository = $this->entityManager->getRepository(Venta::class);
$this->estadoVentaRepository = $this->entityManager->getRepository(Estadoventa::class);
$this->tipoVentaRepository = $this->entityManager->getRepository(TipoVenta::class);
//Parametros
$this->urlImagenesPublicaciones = $parameterBag->get('imagenes_publicaciones');
$this->urlArchivosPublicaciones = $parameterBag->get('archivos_publicaciones_directory');
$this->urlImagenesCurso = $parameterBag->get('imagenes_curso_directory');
$this->urlArchivosCurso = $parameterBag->get('archivos_cursos_directory');
}
/**
* @Route("/curso", name="cursos")
*/
public function index(): Response
{
//Obtengo todas las entidades
$cursos = $this->cursoRepository->findByCursosPagos();
//Obtengo todas las categorias existentes
$categorias = $this->categoriaRepository->findByCategoriasCursos();
//Retorno la vista
return $this->render(
'Curso/index.html.twig',
[
'cursos' => $cursos,
'categorias' => $categorias,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/cursos/", name="curso_abm")
*
* @IsGranted("ROLE_ADMIN")
*/
public function indexABM(): Response
{
//Obtengo todas las entidades
$cursos = $this->cursoRepository->findBy([], ['id' => 'DESC']);
//Retorno la vista
return $this->render(
'Curso/indexAbm.html.twig',
[
'cursos' => $cursos,
]
);
}
/**
* @Route("/cursos/ver/{idCurso}", name="curso_ver")
*/
//Funcion para visualizar
public function verCurso($idCurso): Response
{
//Obtengo la entidad
$curso = $this->cursoRepository->find($idCurso);
//Obtengo la configuracion de ventas
$flagVentas = $this->parametroRepository->find(1);
//Retorno a la vista
return $this->render(
'Curso/ver.html.twig',
[
'curso' => $curso,
'flagVentas' => $flagVentas,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/cursos/nuevo", name="curso_nuevo")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para crear
public function nuevoCurso(Request $request, SluggerInterface $slugger): Response
{
//Creo
$curso = new Curso();
//Defino el Formulario
$form = $this->createForm(CursoType::class, $curso);
//Si se envia el formulario , existe un request
$form->handleRequest($request);
//Si se disparo el formulario y es valido
if ($form->isSubmitted() && $form->isValid()) {
//Obtengo del formulario
$curso = $form->getData();
//Le doy persistencia a
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Obtengo los archivos que subi
$archivosSubidos = $form->get('archivos')->getData();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('imagen')->getData();
//Cargo las Imagenes
foreach ($imagenesSubidas as $imagenSubida) {
$this->cursoService->CursoAdjuntarImagen($curso, $imagenSubida, $slugger);
}
//Cargo los archivos
foreach ($archivosSubidos as $archivoSubido) {
$this->cursoService->CursoAdjuntarArchivo($curso, $archivoSubido, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El curso se creo correctamente');
//Redirecciono
return $this->redirectToRoute('curso_ver', array('idCurso' => $curso->getId()));
}
//Retorno la vista
return $this->render(
'Curso/nuevo.html.twig',
[
'form' => $form->createView(),
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/cursos/editar/{idCurso}", name="curso_editar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function editarCurso($idCurso, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$curso = $this->cursoRepository->find($idCurso);
//Defino el Formulario
$form = $this->createForm(CursoType::class, $curso);
//Si se envia el formulario , existe un request
$form->handleRequest($request);
//Si se disparo el formulario y es valido
if ($form->isSubmitted() && $form->isValid()) {
//Obtengo la entidad del formulario
$curso = $form->getData();
//Obtengo los archivos que subi
$archivosSubidos = $form->get('archivos')->getData();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('imagen')->getData();
//Cargo las Imagenes
foreach ($imagenesSubidas as $imagenSubida) {
$this->cursoService->CursoAdjuntarImagen($curso, $imagenSubida, $slugger);
}
//Cargo los archivos
foreach ($archivosSubidos as $archivoSubido) {
$this->cursoService->CursoAdjuntarArchivo($curso, $archivoSubido, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El Curso se edito exitosamente');
//Redirecciono
return $this->redirectToRoute('curso_ver', array('idCurso' => $curso->getId()));
}
//Retorno la vista
return $this->render(
'Curso/editar.html.twig',
[
'form' => $form->createView(),
'curso' => $curso,
]
);
}
/**
* @Route("/cursos/categoria/{idCategoria}", name="cursos_de_categoria")
*/
public function listarProductosCategorias($idCategoria): Response
{
//Obtengo la categoria del producto
$categoria = $this->categoriaRepository->find($idCategoria);
//Obtengo todos los productos de una categoria
$cursos = $categoria->getCursos();
//Obtengo todas las categorias existentes
$categorias = $this->categoriaRepository->findByCategoriasCursos();
//Retorno a la vista
return $this->render(
'Curso/index.html.twig',
[
'cursos' => $cursos,
'categorias' => $categorias,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/cursos/categorizar/{idCurso}", name="curso_categoria", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar categorias
public function categorizarCurso($idCurso, Request $request, SluggerInterface $slugger): Response
{
//Obtengo el elemento
$curso = $this->cursoRepository->find($idCurso);
//Obtengo las categorias
$categorias = $this->categoriaRepository->findAll();
//Defino el Formulario
$form = $this->createForm(CursoCategoriaType::class, $curso);
//Si se envia el formulario , existe un request
$form->handleRequest($request);
//Si se disparo el formulario y es valido
if ($form->isSubmitted() && $form->isValid()) {
//Obtengo el elemento
$curso = $form->getData();
//Le doy persistencia
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('aviso', 'Se actualizaron las categorias del Curso ' . $curso->getNombre());
//Redirecciono
return $this->redirectToRoute('curso_ver', array('idCurso' => $curso->getId()));
}
//Redirecciono a la vista
return $this->render(
'Curso/categorizar.html.twig',
[
'form' => $form->createView(),
'curso' => $curso,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/cursos/eliminar/{idCurso}", name="curso_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function eliminarCurso($idCurso, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$curso = $this->cursoRepository->find($idCurso);
//Elimino las imagenes
$this->cursoService->eliminarImagenesCurso($curso);
//Elimino los archivos
$this->cursoService->eliminarArchivosCurso($curso);
//Elimino las clases
$this->cursoService->eliminarClasesCurso($curso);
//Le doy persistencia
$this->entityManager->remove($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El Curso se elimino exitosamente');
//Redirecciono
return $this->redirectToRoute('curso_abm');
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/cursos/eliminarImagen/{idImagen}", name="curso_imagen_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para eliminar una imagen de una publicacion
public function eliminarImagenCurso($idImagen)
{
//Obtengo la entidad
$imagen = $this->imagenRepository->find($idImagen);
//Obtengo
$curso = $imagen->getCurso();
//Elimino fisicamente el archivo
$urlImagen = $imagen->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagen);
//Elimino logicamente la imagen de la entidad
$curso->removeImagen($imagen);
//Le doy persistencia
$this->entityManager->remove($imagen);
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se elimino la imagen del Curso');
//Redirecciono
return $this->redirectToRoute('curso_ver', array('idCurso' => $curso->getId()));
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("app/curso/eliminarArchivo/{idArchivo}", name="app_curso_archivo_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para eliminar un archivo de un curso
public function eliminarArchivoCurso($idArchivo)
{
//Obtengo la entidad
$archivo = $this->archivoRepository->find($idArchivo);
//Obtengo
$curso = $archivo->getCurso();
//Elimino fisicamente el archivo
$urlArchivo = $archivo->getUrl();
//Elimino Fisicamente en el FileSistem
unlink($urlArchivo);
//Elimino logicamente
$curso->removeArchivo($archivo);
//Le doy persistencia
$this->entityManager->remove($archivo);
$this->entityManager->persist($curso);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se elimino el archivo del curso');
//Redirecciono
return $this->redirectToRoute('curso_ver', array('idCurso' => $curso->getId()));
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("app/curso/comprar/{idCurso}/", name="curso_comprar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_USER")
*/
public function comprarCurso($idCurso)
{
//Obtengo la entidad
$curso = $this->cursoRepository->find($idCurso);
//Obtengo el usuario logueado
$usuarioLogueado = $this->get('security.token_storage')->getToken()->getUser();
//Obtengo mi usuario de la BD
$usuario = $this->userRepository->find($usuarioLogueado->getId());
//Debo crear una venta para asociarla al curso....
$nuevaVenta = new Venta();
$nuevaVenta->setUsuario($usuarioLogueado);
$nuevaVenta->setFecha(new \DateTime());
//Seteo la venta como una venta aula virtual
$tipoVenta= $this->tipoVentaRepository->find(1);
$nuevaVenta->setTipoVenta($tipoVenta);
//Obtengo el estado Inicial de la Venta
$estadoInicial = $this->estadoVentaRepository->find(1);
$nuevaVenta->setEstado($estadoInicial);
$estadoInicial->addVenta($nuevaVenta);
//Agrego el curso a la venta
$nuevaVenta->setArticulos($curso);
$nuevaVenta->setPrecio($curso->getPrecio());
$nuevaVenta->setPrecioUsd($curso->getPrecioUsd());
//Le doy persistencia
$this->entityManager->persist($nuevaVenta);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se agrego el Curso como Compra');
//Retorno la vista
return $this->render(
'Curso/comprarCurso.html.twig',
[
'curso' => $curso,
'venta' => $nuevaVenta
]
);
}
}