<?php
namespace App\Controller;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as EasyAdminController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use CodeItNow\BarcodeBundle\Utils\BarcodeGenerator;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\User;
use App\Entity\Promocao;
use App\Entity\Banner;
use App\Entity\Associado;
use App\Entity\Avaliacao;
use App\Entity\Textos;
use App\Entity\Categoria;
/**
* @Route("/api")
*/
class ApiController extends EasyAdminController
{
/**
* @Route("/info", methods={"GET"})
*/
public function infoAction(Request $request)
{
$hoje = new \DateTime();
$response = [];
$queryBuilder = $this->getDoctrine()
->getManagerForClass(User::class)
->createQueryBuilder()
->select('partial entity.{id, username, nome, extraFields, logo, capa, dataInicio, notaAvaliacao}, categoria, avaliacoes')
->from(User::class, 'entity')
->leftJoin('entity.categoria','categoria')
->leftJoin('entity.avaliacoes','avaliacoes')
->andWhere('entity.enabled = 1')
->andWhere("entity.roles like '%ROLE_CONVENIADO%'")
->andWhere('entity.dataFim is null or entity.dataFim <= :hoje')
->setParameter('hoje', $hoje)
->addOrderBy('entity.notaAvaliacao', 'DESC')
;
$response['conveniados'] = $queryBuilder->getQuery()->getArrayResult();
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Promocao::class)
->createQueryBuilder()
->select('entity, partial conveniado.{id, username, nome}, avaliacoes, associado')
->from(Promocao::class, 'entity')
->leftJoin('entity.conveniado','conveniado')
->leftJoin('entity.avaliacoes','avaliacoes')
->leftJoin('avaliacoes.associado','associado')
->andWhere('entity.enabled = 1')
;
$response['promocoes'] = $queryBuilder->getQuery()->getArrayResult();
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Banner::class)
->createQueryBuilder()
->select('entity')
->from(Banner::class, 'entity')
->andWhere('entity.enabled = 1')
;
$response['banners'] = $queryBuilder->getQuery()->getArrayResult();
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Categoria::class)
->createQueryBuilder()
->select('entity')
->from(Categoria::class, 'entity')
->addOrderBy('entity.nome', 'ASC')
;
$response['categorias'] = $queryBuilder->getQuery()->getArrayResult();
/* textos */
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Textos::class)
->createQueryBuilder()
->select('entity')
->from(Textos::class, 'entity')
->addOrderBy('entity.ordem', 'ASC')
;
$response['textos'] = $queryBuilder->getQuery()->getArrayResult();
return new JsonResponse($response);
}
/**
* @Route("/login", methods={"POST"})
*/
public function loginAction(Request $request)
{
$loginData = [
'cpf' => $request->request->get('cpf', '0'),
'matricula' => $request->request->get('matricula', '0'),
];
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Associado::class)
->createQueryBuilder();
$queryBuilder
->select('entity')
->from(Associado::class, 'entity')
->andWhere('entity.enabled = 1')
->andWhere('entity.cpf = :cpf')->setParameter('cpf', $loginData['cpf'])
->andWhere('entity.matricula = :matricula')->setParameter('matricula', $loginData['matricula'])
;
$login = $queryBuilder->getQuery()->getArrayResult();
if ($login) {
return new JsonResponse($login[0]);
}
return new JsonResponse(['message' => 'Login não encontrado'], 404);
}
/**
* @Route("/resgate/{promocao}/{associado}", methods={"POST"})
*/
public function resgateAction(Request $request, Promocao $promocao, Associado $associado )
{
$avaliacaoRepo = $this->getDoctrine()->getRepository(Avaliacao::class);
$avaliacoes = $avaliacaoRepo->findBy([
'associado' => $associado,
'promocao' => $promocao
]);
if (count($avaliacoes) > 0) {
return new JsonResponse(['message' => 'Você já resgatou essa promoção'], 404);
}
$em = $this->getDoctrine()->getManagerForClass(Avaliacao::class);
$avaliacao = new Avaliacao();
$avaliacao->setAssociado($associado);
$avaliacao->setPromocao($promocao);
$avaliacao->setConveniado($promocao->getConveniado());
$em->persist($avaliacao);
$em->flush();
return new JsonResponse(['message' => 'Promoção resgatada com sucesso!'], 200);
}
/**
* @Route("/avaliacao/{avaliacao}", methods={"POST"})
*/
public function avaliacaoAction(Request $request, Avaliacao $avaliacao )
{
$avaliacaoData = [
'nota' => $request->request->get('nota', 0),
'comentario' => $request->request->get('comentario', null),
];
if ($avaliacao->getEnabled() === false) {
$hoje = new \DateTime();
$avaliacao->setNota($avaliacaoData['nota']);
$avaliacao->setComentario($avaliacaoData['comentario']);
$avaliacao->setEnabled(true);
$avaliacao->setAvaliadoEm($hoje);
$em = $this->getDoctrine()->getManagerForClass(Avaliacao::class);
$em->merge($avaliacao);
$em->flush();
$conveniado = $avaliacao->getConveniado();
$avaliacaoRepo = $this->getDoctrine()->getRepository(Avaliacao::class);
$avaliacoes = $avaliacaoRepo->findBy([
'conveniado' => $conveniado,
'enabled' => true
]);
$notaConveniado = $notaAvaliacao = 0;
if (count($avaliacoes) > 0 ) {
foreach($avaliacoes as $avaliacao) {
$notaConveniado += $avaliacao->getNota();
}
$notaAvaliacao = $notaConveniado / count($avaliacoes);
}
$conveniado->setNotaAvaliacao($notaAvaliacao);
$em = $this->getDoctrine()->getManagerForClass(User::class);
$em->merge($conveniado);
$em->flush();
return new JsonResponse(['message' => 'Promoção avaliada com sucesso!'], 200);
}
return new JsonResponse(['message' => 'Promoção já avaliada!'], 404);
}
/**
* @Route("/avaliacoes/{associado}", methods={"GET"})
*/
public function avaliacoesAction(Request $request, Associado $associado )
{
$queryBuilder = $this->getDoctrine()
->getManagerForClass(Avaliacao::class)
->createQueryBuilder();
$queryBuilder
->select('entity, promocao, partial conveniado.{id, username, nome}')
->from(Avaliacao::class, 'entity')
->leftJoin('entity.associado','associado')
->leftJoin('entity.promocao','promocao')
->leftJoin('entity.conveniado','conveniado')
->andWhere('associado.id = :associado')->setParameter('associado', $associado->getId())
;
$avaliacoes = $queryBuilder->getQuery()->getArrayResult();
return new JsonResponse($avaliacoes, 200);
}
}