<?php
namespace App\Application\Internit\ApiBundle\Controller;
use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
use App\Application\Internit\ClienteBundle\Entity\Cliente;
use App\Application\Internit\DiaIndisponivelAgendamentoBundle\Entity\DiaIndisponivelAgendamento;
use App\Application\Internit\DiaSemanaBundle\Entity\DiaSemana;
use App\Application\Internit\PeriodoAgendamentoBundle\Entity\PeriodoAgendamento;
use App\Application\Internit\PeriodoDisponivelAgendamentoBundle\Entity\PeriodoDisponivelAgendamento;
use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
use App\Application\Internit\RespostaSolicitacaoBundle\Entity\RespostaSolicitacao;
use App\Application\Internit\SolicitacaoBundle\Entity\Solicitacao;
use App\Application\Internit\SolicitacaoBundle\Repository\SolicitacaoRepository;
use App\Application\Internit\StatusSolicitacaoBundle\Entity\StatusSolicitacao;
use App\Application\Internit\TipoSolicitacaoBundle\Entity\TipoSolicitacao;
use App\Application\Internit\UnidadeBundle\Entity\Unidade;
use App\Application\Internit\UnidadeClienteBundle\Entity\UnidadeCliente;
use App\Application\Project\ContentBundle\Attributes\Acl as ACL;
use App\Application\Project\ContentBundle\Controller\Base\BaseApiController;
use Doctrine\ORM\Query\QueryException;
use Doctrine\Persistence\ObjectRepository;
use OpenApi\Attributes as OA;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use function Symfony\Component\Translation\t;
use Normalizer;
#[Route('/api/assistencia', name: 'api_assistencia_')]
#[OA\Tag(name: 'Assistência técnica')]
#[ACL\Api(enable: true, title: 'Solicitacao', description: 'Permissões do modulo Solicitacao')]
class SolicitacaoApiController extends BaseApiController
{
public function getClass(): string
{
return Solicitacao::class;
}
public function getRepository(): SolicitacaoRepository
{
return new SolicitacaoRepository($this->doctrine);
}
/** ****************************************************************************************** */
/**
* Recupera a coleção de recursos — Solicitacao.
* Recupera a coleção de recursos — Solicitacao.
* @throws QueryException
*/
#[OA\Parameter( name: 'pagina', description: 'O número da página da coleção', in: 'query', required: false, allowEmptyValue: true, example: 1)]
#[OA\Parameter( name: 'paginaTamanho', description: 'O tamanho da página da coleção', in: 'query', required: false, example: 10)]
#[OA\Response(
response: 200,
description: 'Retorna Coleção de recursos Solicitacao',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'assunto', type: 'string'),
new OA\Property(property: 'mensagem', type: 'string'),
new OA\Property(property: 'data', type: 'string'),
new OA\Property(property: 'tipoSolicitacao', type: 'integer' ),
new OA\Property(property: 'periodoAgendamento', type: 'integer' ),
new OA\Property(property: 'unidade', type: 'integer' ),
new OA\Property(property: 'cliente', type: 'integer' ),
new OA\Property(property: 'anexos', type: 'integer' ),
],
type: 'object'
)
)]
#[Route('/solicitacao', name: 'solicitacao_list', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Listar Solicitacao')]
public function listarSolcitacaoAction(Request $request): Response
{
/** @var $cliente Cliente */
$cliente = $this->getUser();
if(!$cliente)
return $this->json(['status'=> false, 'message' => 'Não autenticado no sistema!'], 400);
$this->validateAccess(actionName: "listarSolcitacaoAction");
$em = $this->doctrine->getManager();
/** @var $cliente Cliente */
$cliente = $this->getUser();
$empreendimentoId = $request->get('empreendimento');
$statusId = $request->get('status');
$solicitacoes = $this->doctrine->getRepository(Solicitacao::class)->findBy([ 'cliente' => $cliente->getId() ], ['createdAt' => 'DESC']);
/** @var $unidadeCliente UnidadeCliente */
foreach ($cliente->getUnidades() as $unidadeCliente) {
if($unidadeCliente->getTipoCliente()->getId() !== 1)
continue;
$solicitacoesUnidades = $this->doctrine->getRepository(Solicitacao::class)->findBy([ 'unidade' => $unidadeCliente->getUnidade()->getId() ]);
$solicitacoes = array_merge($solicitacoes, $solicitacoesUnidades);
}
$solicitacoes = array_unique($solicitacoes, SORT_REGULAR);
$solicitacoes = $this->doctrine->getRepository(Solicitacao::class)->orderSolicitacao($solicitacoes);
$solicitacoes = array_reverse($solicitacoes);
$response = [];
/** @var $solicitacao Solicitacao */
foreach ($solicitacoes as $solicitacao){
if($empreendimentoId && $solicitacao->getUnidade())
if($solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId() !== intval($empreendimentoId))
continue;
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao, 'visivel' => true], ['createdAt' => 'ASC']);
/** @var $ultimoAndamento AndamentoSolicitacao */
$ultimoAndamento = end($andamentos);
if($ultimoAndamento && $statusId)
if($ultimoAndamento->getStatusSolicitacao()->getId() !== intval($statusId))
continue;
$response[] = [
'id' => $solicitacao->getId(),
'codigoSolicitacao' => $solicitacao->getCodigo(),
'mensagem' => $solicitacao->getMensagem(),
'dataAgendamento' => $this->formatDate($solicitacao->getData()),
'criadoEm' => $this->formatDateTime($solicitacao->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($solicitacao->getUpdatedAt()),
'pesquisaSatisfacao' => $this->getRepository()->getPesquisaSatisfacaoJson($solicitacao),
'empreendimento' => (!$solicitacao->getUnidade()->getBloco()->getEmpreendimento())? null: [
'id' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(),
'nome' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
],
'bloco' => (!$solicitacao->getUnidade()->getBloco())? null: [
'id' => $solicitacao->getUnidade()->getBloco()->getId(),
'nome' => $solicitacao->getUnidade()->getBloco()->getBloco(),
],
'unidade' => (!$solicitacao->getUnidade())? null: [
'id' => $solicitacao->getUnidade()->getId(),
'nome' => $solicitacao->getUnidade()->getUnidade(),
],
'tipoSolicitacao' => (!$solicitacao->getTipoSolicitacao())? null: [
'id' =>$solicitacao->getTipoSolicitacao()->getId(),
'tipo' =>$solicitacao->getTipoSolicitacao()->getTipo(),
],
'assunto' => (!$solicitacao->getAssunto())? null: [
'id' =>$solicitacao->getAssunto()->getId(),
'assunto' =>$solicitacao->getAssunto()->getAssunto(),
],
'periodoAgendamento' => (!$solicitacao->getPeriodoAgendamento())? null: [
'id' => $solicitacao->getPeriodoAgendamento()->getId(),
'periodo' => $solicitacao->getPeriodoAgendamento()->getPeriodo(),
],
'cliente' => (!$solicitacao->getCliente())? null: [
'id' => $solicitacao->getCliente()->getId(),
'nomeCompleto' => $solicitacao->getCliente()->getNomeCompleto(),
],
'responsavelAtendimento' => (!$solicitacao->getResponsavelAtendimento())? null: [
'id' => $solicitacao->getResponsavelAtendimento()->getId(),
'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
'email' => $solicitacao->getResponsavelAtendimento()->getEmail(),
],
'ultimoAndamento' => (!$ultimoAndamento)? null: [
'id' => $ultimoAndamento->getId(),
'status' => [
'id' => $ultimoAndamento->getStatusSolicitacao()->getId(),
'status' => $ultimoAndamento->getStatusSolicitacao()->getStatus(),
],
'assunto' => $ultimoAndamento->getAssunto(),
'mensagem' => $ultimoAndamento->getMensagem(),
'agendamento' => $this->getRepository()->getAgendamento($ultimoAndamento, $this->mediaService),
'criadoEm' => $this->formatDateTime($ultimoAndamento->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($ultimoAndamento->getUpdatedAt()),
],
'anexos' => $this->mediaService->getGalleryJson($solicitacao->getAnexos()),
];
}
return $this->json($response);
}
/** ****************************************************************************************** */
/**
* Recupera uma — Solicitacao.
* Recupera uma — Solicitacao.
* @throws QueryException
*/
#[OA\Response(
response: 200,
description: 'Retorna Coleção de recursos Solicitacao',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'assunto', type: 'string'),
new OA\Property(property: 'mensagem', type: 'string'),
new OA\Property(property: 'data', type: 'string'),
new OA\Property(property: 'tipoSolicitacao', type: 'integer' ),
new OA\Property(property: 'periodoAgendamento', type: 'integer' ),
new OA\Property(property: 'unidade', type: 'integer' ),
new OA\Property(property: 'cliente', type: 'integer' ),
new OA\Property(property: 'anexos', type: 'integer' ),
],
type: 'object'
)
)]
#[Route('/solicitacao/{id}', name: 'solicitacao_show', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Exibir', description: 'Exibir Solicitacão')]
public function exibirSolcitacaoAction(Request $request, int $id): Response
{
/** @var $cliente Cliente */
$cliente = $this->getUser();
if(!$cliente)
return $this->json(['status'=> false, 'message' => 'Não autenticado no sistema!'], 400);
$this->validateAccess(actionName: "listarSolcitacaoAction");
/** @var $cliente Cliente */
$cliente = $this->getUser();
$em = $this->doctrine->getManager();
/** @var $solicitacao Solicitacao */
$solicitacao = $em->getRepository(Solicitacao::class)->find($id);
if(!$solicitacao)
return $this->json(['status' => false, 'mensagem' => "Solicitação não encontrada!"], 400);
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao, 'visivel' => true], ['createdAt' => 'ASC']);
/** @var $ultimoAndamento AndamentoSolicitacao */
$ultimoAndamento = end($andamentos);
$response = [
'id' => $solicitacao->getId(),
'codigoSolicitacao' => $solicitacao->getCodigo(),
'mensagem' => $solicitacao->getMensagem(),
'dataAgendamento' => $this->formatDate($solicitacao->getData()),
'criadoEm' => $this->formatDateTime($solicitacao->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($solicitacao->getUpdatedAt()),
'pesquisaSatisfacao' => $this->getRepository()->getPesquisaSatisfacaoJson($solicitacao),
'empreendimento' => (!$solicitacao->getUnidade()->getBloco()->getEmpreendimento())? null: [
'id' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(),
'nome' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
],
'bloco' => (!$solicitacao->getUnidade()->getBloco())? null: [
'id' => $solicitacao->getUnidade()->getBloco()->getId(),
'nome' => $solicitacao->getUnidade()->getBloco()->getBloco(),
],
'unidade' => (!$solicitacao->getUnidade())? null: [
'id' => $solicitacao->getUnidade()->getId(),
'nome' => $solicitacao->getUnidade()->getUnidade(),
],
'tipoSolicitacao' => (!$solicitacao->getTipoSolicitacao())? null: [
'id' =>$solicitacao->getTipoSolicitacao()->getId(),
'tipo' =>$solicitacao->getTipoSolicitacao()->getTipo(),
],
'assunto' => (!$solicitacao->getAssunto())? null: [
'id' =>$solicitacao->getAssunto()->getId(),
'assunto' =>$solicitacao->getAssunto()->getAssunto(),
],
'periodoAgendamento' => (!$solicitacao->getPeriodoAgendamento())? null: [
'id' => $solicitacao->getPeriodoAgendamento()->getId(),
'periodo' => $solicitacao->getPeriodoAgendamento()->getPeriodo(),
],
'cliente' => (!$solicitacao->getCliente())? null: [
'id' => $solicitacao->getCliente()->getId(),
'nomeCompleto' => $solicitacao->getCliente()->getNomeCompleto(),
],
'responsavelAtendimento' => (!$solicitacao->getResponsavelAtendimento())? null: [
'id' => $solicitacao->getResponsavelAtendimento()->getId(),
'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
'email' => $solicitacao->getResponsavelAtendimento()->getEmail(),
],
'ultimoAndamento' => (!$ultimoAndamento)? null: [
'id' => $ultimoAndamento->getId(),
'status' => [
'id' => $ultimoAndamento->getStatusSolicitacao()->getId(),
'status' => $ultimoAndamento->getStatusSolicitacao()->getStatus(),
],
'criadoPor' => (!$ultimoAndamento->getCriadoPor())? null: [
'id' => $ultimoAndamento->getCriadoPor()->getId(),
'nome' => $ultimoAndamento->getCriadoPor()->getName(),
'foto' => $this->mediaService->getMediaJson($ultimoAndamento->getCriadoPor()->getLogo()),
],
/*'alteradoPor' => (!$ultimoAndamento->getAlteradoPor())? null: [
'id' => $ultimoAndamento->getAlteradoPor()->getId(),
'name' => $ultimoAndamento->getAlteradoPor()->getName(),
'foto' => $this->mediaService->getMediaJson($ultimoAndamento->getAlteradoPor()->getLogo()),
],*/
'assunto' => $ultimoAndamento->getAssunto(),
'mensagem' => $ultimoAndamento->getMensagem(),
'criadoEm' => $this->formatDateTime($ultimoAndamento->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($ultimoAndamento->getUpdatedAt()),
'agendamento' => $this->getRepository()->getAgendamento($ultimoAndamento, $this->mediaService),
],
'anexos' => $this->mediaService->getGalleryJson($solicitacao->getAnexos()),
];
return $this->json($response);
}
/** ****************************************************************************************** */
/**
* Cria o Recurso — Solicitacao.
* Cria o Recurso — Solicitacao.
* @throws \Exception
*/
#[OA\Response(
response: 201,
description: 'Retorna novo recurso Solicitacao',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'assunto', type: 'string'),
new OA\Property(property: 'mensagem', type: 'string'),
new OA\Property(property: 'data', type: 'string'),
new OA\Property(property: 'tipoSolicitacao', type: 'integer' ),
new OA\Property(property: 'periodoAgendamento', type: 'integer' ),
new OA\Property(property: 'unidade', type: 'integer' ),
new OA\Property(property: 'cliente', type: 'integer' ),
new OA\Property(property: 'anexos', type: 'integer' ),
],
type: 'object'
)
)]
#[OA\Response(response: 400, description: 'Dados inválidos!')]
#[OA\RequestBody(
description: 'Json Payload',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'assunto', type: 'string'),
new OA\Property(property: 'mensagem', type: 'string'),
new OA\Property(property: 'data', type: 'string'),
new OA\Property(property: 'tipoSolicitacao', type: 'integer' ),
new OA\Property(property: 'periodoAgendamento', type: 'integer' ),
new OA\Property(property: 'unidade', type: 'integer' ),
new OA\Property(property: 'cliente', type: 'integer' ),
new OA\Property(property: 'anexos', type: 'integer' ),
],
type: 'object'
)
)]
#[Route('/solicitacao', name: 'create_solicitacao', methods: ['POST'])]
#[ACL\Api(enable: true, title: 'Criar', description: 'Criar Solicitacao')]
public function createSolicitacaoAction(Request $request): Response
{
/** @var $cliente Cliente */
$cliente = $this->getUser();
if(!$cliente)
return $this->json(['status'=> false, 'message' => 'Não autenticado no sistema!'], 400);
$this->validateAccess("createSolicitacaoAction");
//$assunto = $request->request->get('assunto');
$mensagem = $request->request->get('mensagem');
$unidade = $request->request->get('unidade');
$dataAgendamento = $request->request->get('dataAgendamento');
$periodoAgendamento = $request->request->get('periodoAgendamento');
$anexos = $request->files->get('anexos');
$solicitacao = new Solicitacao();
$solicitacao->setCliente($this->getUser());
$solicitacao->setUltimaInteracao('Cliente');
// if($assunto)
// $solicitacao->setAssunto($assunto);
if($mensagem)
$solicitacao->setMensagem($mensagem);
if($dataAgendamento)
$solicitacao->setData(new \DateTime($dataAgendamento));
$unidade = $this->doctrine->getRepository(Unidade::class)->findOneBy(['id' => $unidade]);
if($unidade)
$solicitacao->setUnidade($unidade);
$periodoAgendamento = $this->doctrine->getRepository(PeriodoAgendamento::class)->findOneBy(['id' => $periodoAgendamento]);
if($periodoAgendamento)
$solicitacao->setPeriodoAgendamento($periodoAgendamento);
if($anexos){
/** Cria Galeria caso não exista */
$solicitacao->setAnexos($this->mediaService->createGallery());
/** Cria as Medias e retorna array */
$medias = $this->mediaService->createMultipleMedia($anexos);
/** Adicionar medias em galeria */
$this->mediaService->addMediaInGallery($medias, $solicitacao->getAnexos());
/** Atualiza a galeria de Media conforme a request*/
//$this->mediaService->mediaUpdateRequest($sac->getAnexo(), $request);
}
/** Valida Restrições do objeto */
$errors = $this->validateConstraintErros($solicitacao);
if($errors)
return $this->json($errors, 400);
/** Valida Regra de negócio */
$errors = $this->getRepository()->preCadastroSolicitacao($solicitacao);
if($errors)
return $this->json($errors, 400);
$em = $this->doctrine->getManager();
$em->persist($solicitacao);
$em->flush();
if($solicitacao->getCliente()){
$nome = $solicitacao->getCliente()->getNomeCompleto();
if($nome){
if(class_exists('Normalizer')){
$nome = Normalizer::normalize($nome, Normalizer::FORM_D);
$nome = preg_replace('/\p{M}/u', '', $nome);
}
$nome = strtoupper($nome);
$flagName = substr(preg_replace('/[^A-Z0-9]/', '', $nome), 0, 3);
}else{
$flagName = strtoupper(substr($solicitacao->getCliente()->getCnpj(), 0, 3));
}
$solicitacao->setCodigo($flagName."000".$solicitacao->getCliente()->getId().".".$solicitacao->getId());
$em->persist($solicitacao);
$em->flush();
}
$this->getRepository()->primeiroAndamentoSolicitacao($solicitacao);
$this->getRepository()->notificarEmpresaCriacaoSolicitacao($solicitacao, $this->serviceEmail, $this);
$response = [
'status' => true,
'mensagem' => "Solicitação Cadastrada com Sucesso!"
];
return $this->json($response, 201);
}
/** ****************************************************************************************** */
/**
* Recupera a coleção de recursos — PeriodoAgendamento.
* Recupera a coleção de recursos — PeriodoAgendamento.
* @throws QueryException
*/
#[OA\Parameter( name: 'pagina', description: 'O número da página da coleção', in: 'query', required: false, allowEmptyValue: true, example: 1)]
#[OA\Parameter( name: 'paginaTamanho', description: 'O tamanho da página da coleção', in: 'query', required: false, example: 10)]
#[OA\Response(
response: 200,
description: 'Retorna Coleção de recursos PeriodoAgendamento',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'periodo', type: 'string'),
new OA\Property(property: 'visivel', type: 'boolean'),
],
type: 'object'
)
)]
#[Route('/periodoAgendamento', name: 'periodoagendamento', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Listar PeriodoAgendamento')]
public function listAction(Request $request): Response
{
$this->validateAccess(actionName: "listAction");
$periodosAgendamento = $this->doctrine->getRepository(PeriodoAgendamento::class)
->findBy(['visivel' => true]);
$response = [];
/** @var $periodo PeriodoAgendamento */
foreach ($periodosAgendamento as $periodo) {
$response[] = [
'id' => $periodo->getId(),
'periodo' => $periodo->getPeriodo(),
];
}
return $this->json($response);
}
#[Route('/diaDisponivelAgendamento', name: 'diaDisponivelAgendamento', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Listar Dia Disponivel para Agendamento')]
public function diaDisponivelAgendamentoAction(Request $request): Response
{
$this->validateAccess(actionName: "diaDisponivelAgendamentoAction");
$peridoDisponivelAgendamento = $this->doctrine->getRepository(PeriodoDisponivelAgendamento::class)
->findAll();
$response = [];
/** @var $periodo PeriodoDisponivelAgendamento */
foreach ($peridoDisponivelAgendamento as $periodo){
$response[$periodo->getDiaSemana()->getDia()]['dia'] = $periodo->getDiaSemana()->getDia();
$response[$periodo->getDiaSemana()->getDia()]['diaSemana'] = $periodo->getDiaSemana()->getDiasemana();
$response[$periodo->getDiaSemana()->getDia()]['diaSemana'] = $periodo->getDiaSemana()->getDiasemana();
$response[$periodo->getDiaSemana()->getDia()]['disponivel'] = $periodo->getDisponivel();
$response[$periodo->getDiaSemana()->getDia()]['periodo'][] = [
'id' => $periodo->getPeriodoAgendamento()->getId(),
'periodo' => $periodo->getPeriodoAgendamento()->getPeriodo(),
'disponivel' => $periodo->getQuatidadeagendamentos() > 0,
];
}
return $this->json(array_values($response));
}
#[Route('/diaIndisponivelAgendamento', name: 'diaIndisponivelAgendamento', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Listar Dia Indiponivel para Agendamento')]
public function diaIndisponivelAgendamentoAction(Request $request): Response
{
$this->validateAccess(actionName: "diaIndisponivelAgendamentoAction");
$diasIndisponiveis = $this->doctrine->getRepository(DiaIndisponivelAgendamento::class)->findAll();
$response = [];
/** @var $dia DiaIndisponivelAgendamento */
foreach ($diasIndisponiveis as $dia){
if(!$dia->getIndisponivel() && !$dia->getFeriado())
continue;
$response[] = [
'data' => $this->formatDate($dia->getData()),
'descricao' => $dia->getDescricao(),
'todosAnos' => $dia->getFeriado(),
'anoAtual' => ($dia->getFeriado()) ? false : $dia->getIndisponivel(),
];
}
return $this->json(array_values($response));
}
#[Route('/verificarDisponibilidadeAgendamento', name: 'verificarDisponibilidadeAgendamento', methods: ['POST'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Verificar Disponibilidade Agendamento')]
public function verificarDisponibilidadeAgendamentoAction(Request $request): Response
{
$this->validateAccess(actionName: "verificarDisponibilidadeAgendamentoAction");
$em = $this->doctrine->getManager();
$requestBody = json_decode($request->getContent());
$periodo = (isset($requestBody->periodo)) ? $requestBody->periodo : null;
$data = ( isset($requestBody->data)) ? new \DateTime($requestBody->data) : null;
if(!$data)
return $this->json([
'status' => false,
'message' => 'Data não preenchida!',
], 400);
$periodo = $em->getRepository(PeriodoAgendamento::class)->findOneBy(['id' => $periodo]);
if(!$periodo)
return $this->json([
'status' => false,
'message' => 'Período de Agendamento não Encontrado!',
], 400);
$solicitacao = new Solicitacao();
$solicitacao->setPeriodoAgendamento($periodo);
$solicitacao->setData($data);
$solRepo = new SolicitacaoRepository($this->doctrine);
$resposta = $solRepo->validarDataSolicitacao($solicitacao);
if($resposta){
return $this->json($resposta, 400);
}else{
return $this->json([
'status' => true,
'message' => 'Dia e Período disponível para agendamento!',
], 200);
}
// $diasIndisponiveis = $em->getRepository(DiaIndisponivelAgendamento::class)->findAll();
//
// /** @var $dia DiaIndisponivelAgendamento */
// foreach ($diasIndisponiveis as $dia) {
// if(date_format($dia->getData(), "d-m") === date_format($data, "d-m")){
// if($dia->getIndisponivel()){
// return $this->json([
// 'disponivel' => false,
// 'message' => 'Está data nesse período está indisponível para agendamento!',
// ], 200);
// }else if($dia->getFeriado()) {
// if(date_format($dia->getData(), "d-m-Y") === date_format($data, "d-m-Y")){
// return $this->json([
// 'disponivel' => false,
// 'message' => 'Está data nesse período está indisponível para agendamento!',
// ], 200);
// }
// }
// }
// }
//
// $solicitacoes = $em->getRepository(Solicitacao::class)->findBy(['data' => $data]);
//
// $diasemana_numero = date('w', strtotime(date_format($data,'Y-m-d')));
// $diaSemana = $em->getRepository(DiaSemana::class)->findOneBy(['id' => $diasemana_numero+1]);
// /** @var $diaAgendamento PeriodoDisponivelAgendamento */
// $diaAgendamento = $em->getRepository(PeriodoDisponivelAgendamento::class)->findOneBy(['diaSemana' => $diaSemana, 'periodoAgendamento' => $periodo]);
//
//
// if(!$diaAgendamento->getDisponivel())
// return $this->json([
// 'status' => false,
// 'message' => 'Dia e Período indisponível para agendamento!',
// ], 400);
//
// if(count($solicitacoes) >= $diaAgendamento->getQuatidadeagendamentos()) {
// return $this->json([
// 'status' => false,
// 'message' => 'Dia e Período indisponível para agendamento!',
// ], 400);
// }else{
// return $this->json([
// 'status' => true,
// 'message' => 'Dia e Período disponível para agendamento!',
// ], 200);
// }
}
/** ****************************************************************************************** */
/**
* Recupera o recurso — AndamentoSolicitacao.
* Recupera o recurso — AndamentoSolicitacao.
*/
#[OA\Parameter( name: 'solicitacao', description: 'Identificador do recurso', in: 'path')]
#[OA\Response(
response: 200,
description: 'Retorna recurso AndamentoSolicitacao',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'assunto', type: 'string'),
new OA\Property(property: 'mensagem', type: 'string'),
new OA\Property(property: 'status', type: 'integer' ),
new OA\Property(property: 'solicitacao', type: 'integer' ),
],
type: 'object'
)
)]
#[OA\Response(response: 404, description: 'Recurso não encontrado')]
#[Route('/andamentoSolicitacao/{solicitacao}', name: 'showAndamento', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Visualizar', description: 'Visualizar AndamentoSolicitacao')]
public function showAndamentoAction(Request $request, mixed $solicitacao): Response
{
/** @var $cliente Cliente */
$cliente = $this->getUser();
if(!$cliente)
return $this->json(['status'=> false, 'message' => 'Não autenticado no sistema!'], 400);
$this->validateAccess("showAndamentoAction");
$em = $this->doctrine->getManager();
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao, 'visivel' => true], ['createdAt' => 'ASC']);
if(!$andamentos)
return $this->json(['message'=> 'Andamento de Solicitação não encontrado!'],404);
$response = [];
$solicitacao = $em->getRepository(Solicitacao::class)->findOneBy(['id' => $solicitacao]);
/** @var $andamento AndamentoSolicitacao */
foreach ($andamentos as $andamento){
if(!$andamento->getVisivel())
continue;
$respostas = [];
$respostasList = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento], ['createdAt' => 'ASC']);
/** @var $resposta RespostaSolicitacao */
foreach ($respostasList as $resposta) {
$respostas[] = [
'id' => $resposta->getId(),
'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
'assunto' => $resposta->getAssunto(),
'mensagem' => $resposta->getMensagem(),
'respondidoPor' => $resposta->getRespondidoPor(),
'adminResposta' => (!$resposta->getAdminResposta()) ? null : [
'nome' => $resposta->getAdminResposta()->getName(),
'foto' => $this->mediaService->getMediaJson($resposta->getAdminResposta()->getLogo()),
],
/*'clienteResposta' => (!$resposta->getClienteResposta()) ? null : [
'nome' => $resposta->getClienteResposta()->getNomeCompleto(),
'foto' => ''
],*/
'clienteResposta' => (!$resposta->getClienteResposta()) ? null : $resposta->getClienteResposta()->getNomeCompleto(),
'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
];
}
$response[] = [
'id' => $andamento->getId(),
'codigoSolicitacao' => $solicitacao->getCodigo(),
'solicitacao' => $andamento->getSolicitacao()->getId(),
'assunto' => $andamento->getAssunto(),
'mensagem' => $andamento->getMensagem(),
'status' => [
'id' => $andamento->getStatusSolicitacao()->getId(),
'status' => $andamento->getStatusSolicitacao()->getStatus(),
],
'criadoEm' => $this->formatDateTime($andamento->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($andamento->getUpdatedAt()),
'criadoPor' => (!$andamento->getCriadoPor())? null: [
'id' => $andamento->getCriadoPor()->getId(),
'nome' => $andamento->getCriadoPor()->getName(),
'foto' => $this->mediaService->getMediaJson($andamento->getCriadoPor()->getLogo()),
],
'agendamento' => $this->getRepository()->getAgendamento($andamento, $this->mediaService),
'respostas' => $respostas,
];
}
return $this->json($response);
}
// /** ****************************************************************************************** */
// /**
// * Recupera o recurso — RespostaSolicitacao.
// * Recupera o recurso — RespostaSolicitacao.
// */
// #[OA\Parameter( name: 'andamento', description: 'id do andamento', in: 'path')]
// #[OA\Response(
// response: 200,
// description: 'Retorna recurso RespostaSolicitacao',
// content: new OA\JsonContent(
// properties: [
// new OA\Property(property: 'id', type: 'integer'),
// new OA\Property(property: 'assunto', type: 'string'),
// new OA\Property(property: 'mensagem', type: 'string'),
// new OA\Property(property: 'andamento', type: 'integer' ),
// ],
// type: 'object'
// )
// )]
// #[OA\Response(response: 404, description: 'Recurso não encontrado')]
// #[Route('/resposta/{andamento}', name: 'showResposta', methods: ['GET'])]
// #[ACL\Api(enable: true, title: 'Visualizar', description: 'Visualizar RespostaSolicitacao')]
// public function showRespostaAction(Request $request, mixed $andamento): Response
// {
// $this->validateAccess("showRespostaAction");
// $em = $this->doctrine->getManager();
//
// $respostas = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento, ['createdAt' => 'ASC']]);
// if(!$respostas)
// return $this->json(['message' => 'Respostas não encontradas!'], 404);
//
// $response = [];
// /** @var $resposta RespostaSolicitacao */
// foreach ($respostas as $resposta){
// $response[] =[
// 'id' => $resposta->getId(),
// 'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
// 'assunto' => $resposta->getAssunto(),
// 'mensagem' => $resposta->getMensagem(),
// 'respondidoPor' => $resposta->getRespondidoPor(),
// 'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()),
// 'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
// 'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
// ];
// }
//
// return $this->json($response);
// }
#[Route('/resposta', name: 'createResposta', methods: ['POST'])]
#[ACL\Api(enable: true, title: 'Criar', description: 'Criar RespostaSolicitacao')]
public function createRespostaAction(Request $request): Response
{
$this->validateAccess("createRespostaAction");
$em = $this->doctrine->getManager();
/** @var $cliente Cliente */
$cliente = $this->getUser();
if(!$cliente)
return $this->json(['status'=> false, 'message' => 'Não autenticado no sistema!'], 400);
//$assunto = $request->get('assunto');
$mensagem = $request->get('mensagem');
$andamentoSolcitacao = $request->get('andamento');
$anexos = $request->files->get('anexos');
if(!$mensagem && !count($anexos))
return $this->json(['status'=> false, 'message' => 'Deve ser preenchido a mensagem ou anexo de documento!'], 400);
$andamentoSolcitacao = $em->getRepository(AndamentoSolicitacao::class)->find($andamentoSolcitacao);
if(!$andamentoSolcitacao)
return $this->json(['status'=> false, 'message' => 'Andamento não encontrado!'], 400);
/** @var $andamentoSolcitacao AndamentoSolicitacao */
$andamentoSolcitacao = $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['solicitacao' => $andamentoSolcitacao->getSolicitacao(), 'visivel' => true], ['createdAt'=> 'DESC']);
if(in_array($andamentoSolcitacao->getStatusSolicitacao()->getId(), [8, 9]))
return $this->json(['status'=> false, 'message' => 'Chamado com status concluído ou cancelado, não é possível interagir!'], 400);
$resposta = new RespostaSolicitacao();
//$resposta->setAssunto($assunto);
$resposta->setMensagem($mensagem);
$resposta->setAndamentoSolicitacao($andamentoSolcitacao);
$resposta->setRespondidoPor('cliente');
$resposta->setClienteResposta($cliente);
if($anexos){
/** Cria Galeria caso não exista */
$resposta->setAnexos($this->mediaService->createGallery());
/** Cria as Medias e retorna array */
$medias = $this->mediaService->createMultipleMedia($anexos);
/** Adicionar medias em galeria */
$this->mediaService->addMediaInGallery($medias, $resposta->getAnexos());
}
$em->persist($resposta);
$em->flush();
$solicitacao = $resposta->getAndamentoSolicitacao()->getSolicitacao();
$solicitacao->setUltimaInteracao('Cliente');
$em->persist($solicitacao);
$em->flush();
$mail = $this->serviceEmail->getEmail();
$responsavelAtendimento = $resposta->getAndamentoSolicitacao()->getSolicitacao()->getResponsavelAtendimento();
if($responsavelAtendimento){
$mail->addAddress($responsavelAtendimento->getEmail());
}else{
$emailResponsavel = explode(',', $this->serviceEmail->getEmpresa()->getEmailsSolicitacao());
$mail->addAddress($emailResponsavel[0]);
foreach ($emailResponsavel as $email){
$mail->addReplyTo($email);
}
}
$mail->Subject = 'Atualização de Solicitação';
$mail->Body = $this->renderTemplateEmail('emails/solicitacao/notificacao_empresa_interacao_cliente.html.twig', [
'solicitacao' => $resposta->getAndamentoSolicitacao()->getSolicitacao(),
'resposta' => $resposta,
]);
$mail->send();
return $this->json(['status' => true, 'message' => 'Resposta cadastrada com sucesso!'], 201);
}
/** ****************************************************************************************** */
/**
* Recupera o recurso — Status.
* Recupera o recurso — Status.
*/
#[OA\Response(
response: 200,
description: 'Retorna recurso Status',
content: new OA\JsonContent(
properties: [
new OA\Property(property: 'id', type: 'integer'),
new OA\Property(property: 'status', type: 'string'),
],
type: 'object'
)
)]
#[OA\Response(response: 404, description: 'Recurso não encontrado')]
#[Route('/status', name: 'listStatus', methods: ['GET'])]
#[ACL\Api(enable: true, title: 'Listar', description: 'Listar Status')]
public function statusSolicitacaoAction(Request $request): Response
{
$this->validateAccess("statusSolicitacaoAction");
$em = $this->doctrine->getManager();
$status = $em->getRepository(StatusSolicitacao::class)->findAll();
$response = [];
/** @var $object StatusSolicitacao */
foreach ($status as $object){
$response[] =[
'id' => $object->getId(),
'status' => $object->getStatus(),
];
}
return $this->json($response);
}
}