<?php
namespace App\Controller;
use App\Entity\Solicitacao;
use App\Form\SolicitacaoType;
use App\Entity\User;
use App\Repository\SolicitacaoRepository;
use App\Repository\UserRepository;
use App\Utils\FormSolicitacaoUtil;
use App\Utils\VerificaRole;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Knp\Component\Pager\PaginatorInterface;
use App\Service\FileUploader;
use App\Service\Watermark;
use App\Service\Mailer;
use Symfony\Component\HttpFoundation\RedirectResponse;
use App\Service\SpreadsheetGenerator;
#[Route('/solicitacao')]
class SolicitacaoController extends AbstractController
{
#[Route('/pendentes', name: 'app_solicitacao_pendentes', methods: ['GET'])]
public function solicitacaoPendentes(SolicitacaoRepository $solicitacaoRepository, Request $request, PaginatorInterface $paginator): Response
{
$solicitacoes = $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_PENDENTE);
$pagination = $paginator->paginate($solicitacoes, $request->query->getInt('page', 1), 10);
return $this->render('solicitacao/index.html.twig', [
'solicitacoes' => $pagination,
'nav_active' => "Solicitação"
]);
}
#[Route('/pre-aprovados', name: 'app_solicitacao_pre_aprovados', methods: ['GET'])]
public function solicitacaoPreAprovadas(SolicitacaoRepository $solicitacaoRepository, Request $request, PaginatorInterface $paginator): Response
{
$solicitacoes = $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_APROVADOR_OK);
$pagination = $paginator->paginate($solicitacoes, $request->query->getInt('page', 1), 10);
return $this->render('solicitacao/index.html.twig', [
'solicitacoes' => $pagination,
'nav_active' => "Solicitação"
]);
}
#[Route('/aprovados', name: 'app_solicitacao_aprovados', methods: ['GET'])]
public function solicitacaoAprovadas(SolicitacaoRepository $solicitacaoRepository, Request $request, PaginatorInterface $paginator): Response
{
$solicitacoes = $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_ADMINISTRADOR_OK);
$pagination = $paginator->paginate($solicitacoes, $request->query->getInt('page', 1), 10);
return $this->render('solicitacao/index.html.twig', [
'solicitacoes' => $pagination,
'nav_active' => "Solicitação"
]);
}
#[Route('/todos', name: 'app_solicitacao_todos', methods: ['GET'])]
public function solicitacaoTodas(SolicitacaoRepository $solicitacaoRepository, Request $request, PaginatorInterface $paginator): Response
{
$solicitacoes = $solicitacaoRepository->findSolicitacaoByUser($this->getUser());
$pagination = $paginator->paginate($solicitacoes, $request->query->getInt('page', 1), 10);
return $this->render('solicitacao/index.html.twig', [
'solicitacoes' => $pagination,
'nav_active' => "Solicitação"
]);
}
#[Route('/recusados', name: 'app_solicitacao_recusados', methods: ['GET'])]
public function solicitacaoRecusados(SolicitacaoRepository $solicitacaoRepository, Request $request, PaginatorInterface $paginator): Response
{
$solicitacoes = $solicitacaoRepository->getRecusados($this->getUser());
$pagination = $paginator->paginate($solicitacoes, $request->query->getInt('page', 1), 10);
return $this->render('solicitacao/index.html.twig', [
'solicitacoes' => $pagination,
'nav_active' => "Solicitação"
]);
}
#[Route('/new', name: 'app_solicitacao_new', methods: ['GET', 'POST'])]
public function new(Request $request, FormSolicitacaoUtil $formSolicitacaoUtil, VerificaRole $verificiaRole, SolicitacaoRepository $solicitacaoRepository, FileUploader $fileUploader, Watermark $watermark, Mailer $mailer): Response
{
$solicitacao = new Solicitacao();
$form = $this->createForm(SolicitacaoType::class, $solicitacao);
$form->handleRequest($request);
$user = $this->getUser();
$isSuperUser = $this->isGranted('ROLE_SUPER');
$empresasUsuario = $user->getEmpresas();
if(!$empresasUsuario){
throw new \Exception('Usuário sem empresa vinculada.');
}
if ($form->isSubmitted() && $form->isValid()) {
$solicitacao = $formSolicitacaoUtil->formatter($solicitacao);
if ($form->getClickedButton() && 'salvar' === $form->getClickedButton()->getName()) {
$solicitacaoRepository->add($solicitacao, true, $this->getuser());
if($isSuperUser){
$watermark->addWatermark($solicitacao, $this->getParameter('kernel.project_dir'), $this->getUser());
}
$mailer->sendMail($solicitacao);
$this->addFlash(
'success',
'Solicitação adicionada com sucesso.'
);
return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
}
if ($form->getClickedButton() && 'recorrente' === $form->getClickedButton()->getName()) {
$solicitacaoRepository->add($solicitacao, true, $this->getuser());
if ($isSuperUser) {
$watermark->addWatermark($solicitacao, $this->getParameter('kernel.project_dir'), $this->getUser());
} else {
$solicitacao->setAprovador($this->getUser());
$mailer->sendMail($solicitacao);
}
$this->addFlash(
'success',
'Solicitação adicionada com sucesso.'
);
}
}
return $this->renderForm('solicitacao/new.html.twig', ['solicitacao' => $solicitacao,
'form' => $form,
'nav_active' => 'Solicitação']);
}
#[Route('/checker', name: 'app_solicitacao_recorrente', methods: ['POST'])]
public function checker(Request $request, SolicitacaoRepository $solicitacaoRepository): Response
{
$post_data = $request->getContent();
$post_data = json_decode($post_data, true);
$numeroLancamento = $post_data['numeroLancamento'];
$isChecked = $solicitacaoRepository->findBy(
[ 'numeroLancamento' => $numeroLancamento,
]);
if (count($isChecked) > 0) {
return $this->json(true);
}
return $this->json(false);
}
#[Route('/empresa/{empresaId}/subempresa/{subEmpresaId}/solicitacao/{id}', name: 'app_solicitacao_show', methods: ['GET'])]
public function show(SolicitacaoRepository $solicitacaoRepository, Solicitacao $solicitacao, $empresaId, $subEmpresaId): Response
{
$user = $this->getUser();
$hasAccess = false;
if ($this->isGranted('ROLE_SUPER')) {
$hasAccess = true;
} else {
$subEmpresasUser = $user->getSubEmpresas();
foreach ($subEmpresasUser as $subEmpresa) {
if ($subEmpresa->getId() == $subEmpresaId) {
$hasAccess = true;
break;
}
}
}
if($solicitacao->getUsuario() == $user) {
$hasAccess = true;
}
if (!$hasAccess) {
throw $this->createAccessDeniedException('Você não tem permissão para acessar as solicitações desta empresa.');
}
$duplicidade = $solicitacaoRepository->findBy([
'numeroLancamento'=> $solicitacao->getNumeroLancamento()
]);
if(count($duplicidade) > 1)
{
$duplicidade = true;
} else{
$duplicidade = false;
}
return $this->render('solicitacao/show.html.twig', [
'solicitacao' => $solicitacao,
'nav_active' => 'Solicitação',
'duplicidade' => $duplicidade
]);
}
#[Route('/{id}/edit', name: 'app_solicitacao_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Solicitacao $solicitacao, SolicitacaoRepository $solicitacaoRepository): Response
{
if ($solicitacao->getStatus() != Solicitacao::STATUS_PENDENTE || $solicitacao->getUsuario() !== $this->getUser()) {
return $this->redirectToRoute('app_solicitacao_redirect');
}
$form = $this->createForm(SolicitacaoType::class, $solicitacao);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$solicitacaoRepository->add($solicitacao, true, $this->getUser());
return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('solicitacao/edit.html.twig', [
'solicitacao' => $solicitacao,
'form' => $form,
'nav_active' => 'Solicitação'
]);
}
#[Route('/aprovar/{id}', name: 'app_solicitacao_aprovar', methods: ['POST'])]
public function aprovar(Request $request, Solicitacao $solicitacao, SolicitacaoRepository $solicitacaoRepository, Watermark $watermark, Mailer $mailer): Response
{
$isSuperUser = $this->isGranted('ROLE_SUPER');
$status = $isSuperUser ? Solicitacao::STATUS_ADMINISTRADOR_OK : Solicitacao::STATUS_APROVADOR_OK;
if ($this->isCsrfTokenValid('aprovar' . $solicitacao->getId(), $request->request->get('_token'))) {
$solicitacao->setStatus($status);
$solicitacao->setUpdatedAt(new \DateTimeImmutable('now'));
$solicitacao->setApprovedAt(new \DateTimeImmutable('now'));
$isSuperUser ? $this->addFlash('success', 'Solicitação Aprovada com sucesso.') : $this->addFlash('success', 'Solicitação Pré-Aprovada com sucesso.');
if($isSuperUser){
$watermark->addWatermark($solicitacao, $this->getParameter('kernel.project_dir'), $this->getUser());
$solicitacao->setAdministrador($this->getUser());
}else{
$solicitacao->setAprovador($this->getUser());
}
$solicitacaoRepository->update($solicitacao, true);
$mailer->sendMail($solicitacao);
}
return $isSuperUser ? $this->redirectToRoute('app_aprovador_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId()], Response::HTTP_SEE_OTHER)
: $this->redirectToRoute('app_aprovador_subempresa_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId(), 'subEmpresaId' => $solicitacao->getSubEmpresa()->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/recusar/{id}', name: 'app_solicitacao_recusar', methods: ['POST'])]
public function recusar(Request $request, Solicitacao $solicitacao, SolicitacaoRepository $solicitacaoRepository): Response
{
$isSuperUser = $this->isGranted('ROLE_SUPER');
if ($this->isCsrfTokenValid('recusar' . $solicitacao->getId(), $request->request->get('_token'))) {
$solicitacao->setUpdatedAt(new \DateTimeImmutable('now'));
$solicitacao->setRecusedAt(new \DateTimeImmutable('now'));
$solicitacao->setRecusador($this->getUser());
$solicitacao->setStatus($isSuperUser ? Solicitacao::STATUS_ADMINISTRADOR_RECUSADO : Solicitacao::STATUS_APROVADOR_RECUSADO);
$solicitacao->setRecusa($request->request->get('recusa'));
$solicitacaoRepository->update($solicitacao, true);
$this->addFlash(
'success',
'Solicitação recusada com sucesso.'
);
}
return $isSuperUser ? $this->redirectToRoute('app_aprovador_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId()], Response::HTTP_SEE_OTHER)
: $this->redirectToRoute('app_aprovador_subempresa_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId(), 'subEmpresaId' => $solicitacao->getSubEmpresa()->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/{id}', name: 'app_solicitacao_delete', methods: ['POST'])]
public function delete(Request $request, Solicitacao $solicitacao, SolicitacaoRepository $solicitacaoRepository): Response
{
if ($this->isCsrfTokenValid('delete' . $solicitacao->getId(), $request->request->get('_token'))) {
$solicitacaoRepository->remove($solicitacao, true);
}
return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
}
#[Route('/pendentes-count/{empresa}/{status}/{tipo}', methods: ['GET'], defaults: ["empresa" => "any", "tipo" => "any"])]
public function pendentsCount(Request $request, SolicitacaoRepository $solicitacaoRepository, $empresa, $status, $tipo): Response
{
if ($empresa != "any" && $status != 'any' && $tipo != 'any') {
return $this->json($solicitacaoRepository->count(['empresa' => $empresa, 'status' => $status, 'tipo' => $tipo]));
}
if ($empresa != "any" && $status != 'any') {
return $this->json($solicitacaoRepository->count(['empresa' => $empresa, 'status' => $status]));
}
if ($empresa == 'any' & $tipo != "any") {
return $this->json($solicitacaoRepository->count(['status' => $status, 'tipo' => $tipo]));
}
return false;
}
/**
* @Route("/report/spreadsheet", name="app_solicitacao_report", methods={"GET"})
*/
public function report(Request $request, SpreadsheetGenerator $spreadsheetGenerator): Response
{
// Obter os parâmetros do formulário
$startDate = $request->query->get('start_date');
$endDate = $request->query->get('end_date');
$reportType = $request->query->get('report_type');
// Chamar o método generateExcel() passando os parâmetros necessários
try {
$response = $spreadsheetGenerator->generateExcel($startDate, $endDate, $reportType);
} catch (\Exception $e) {
// Lidar com a exceção
$this->addFlash('error', 'Ocorreu um erro ao gerar o relatório: ' . $e->getMessage());
return new RedirectResponse($request->headers->get('referer'));
}
return $response;
}
}