src/Application/Internit/ApiBundle/Controller/SolicitacaoApiController.php line 642

Open in your IDE?
  1. <?php
  2. namespace App\Application\Internit\ApiBundle\Controller;
  3. use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
  4. use App\Application\Internit\ClienteBundle\Entity\Cliente;
  5. use App\Application\Internit\DiaIndisponivelAgendamentoBundle\Entity\DiaIndisponivelAgendamento;
  6. use App\Application\Internit\DiaSemanaBundle\Entity\DiaSemana;
  7. use App\Application\Internit\PeriodoAgendamentoBundle\Entity\PeriodoAgendamento;
  8. use App\Application\Internit\PeriodoDisponivelAgendamentoBundle\Entity\PeriodoDisponivelAgendamento;
  9. use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
  10. use App\Application\Internit\RespostaSolicitacaoBundle\Entity\RespostaSolicitacao;
  11. use App\Application\Internit\SolicitacaoBundle\Entity\Solicitacao;
  12. use App\Application\Internit\SolicitacaoBundle\Repository\SolicitacaoRepository;
  13. use App\Application\Internit\StatusSolicitacaoBundle\Entity\StatusSolicitacao;
  14. use App\Application\Internit\TipoSolicitacaoBundle\Entity\TipoSolicitacao;
  15. use App\Application\Internit\UnidadeBundle\Entity\Unidade;
  16. use App\Application\Internit\UnidadeClienteBundle\Entity\UnidadeCliente;
  17. use App\Application\Project\ContentBundle\Attributes\Acl as ACL;
  18. use App\Application\Project\ContentBundle\Controller\Base\BaseApiController;
  19. use Doctrine\ORM\Query\QueryException;
  20. use Doctrine\Persistence\ObjectRepository;
  21. use OpenApi\Attributes as OA;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use function Symfony\Component\Translation\t;
  26. use Normalizer;
  27. #[Route('/api/assistencia'name'api_assistencia_')]
  28. #[OA\Tag(name'Assistência técnica')]
  29. #[ACL\Api(enabletruetitle'Solicitacao'description'Permissões do modulo Solicitacao')]
  30. class SolicitacaoApiController extends BaseApiController
  31. {
  32.     public function getClass(): string
  33.     {
  34.         return Solicitacao::class;
  35.     }
  36.     public function getRepository(): SolicitacaoRepository
  37.     {
  38.         return new SolicitacaoRepository($this->doctrine);
  39.     }
  40.     /** ****************************************************************************************** */
  41.     /**
  42.      * Recupera a coleção de recursos — Solicitacao.
  43.      * Recupera a coleção de recursos — Solicitacao.
  44.      * @throws QueryException
  45.      */
  46.     #[OA\Parametername'pagina'description'O número da página da coleção'in'query'requiredfalseallowEmptyValuetrueexample1)]
  47.     #[OA\Parametername'paginaTamanho'description'O tamanho da página da coleção'in'query'requiredfalseexample10)]
  48.     #[OA\Response(
  49.         response200,
  50.         description'Retorna Coleção de recursos Solicitacao',
  51.         content: new OA\JsonContent(
  52.             properties: [
  53.                 new OA\Property(property'id'type'integer'),
  54.                 new OA\Property(property'assunto'type'string'),
  55.                 new OA\Property(property'mensagem'type'string'),
  56.                 new OA\Property(property'data'type'string'),
  57.                 new OA\Property(property'tipoSolicitacao'type'integer' ),
  58.                 new OA\Property(property'periodoAgendamento'type'integer' ),
  59.                 new OA\Property(property'unidade'type'integer' ),
  60.                 new OA\Property(property'cliente'type'integer' ),
  61.                 new OA\Property(property'anexos'type'integer' ),
  62.             ],
  63.             type'object'
  64.         )
  65.     )]
  66.     #[Route('/solicitacao'name'solicitacao_list'methods: ['GET'])]
  67.     #[ACL\Api(enabletruetitle'Listar'description'Listar Solicitacao')]
  68.     public function listarSolcitacaoAction(Request $request): Response
  69.     {
  70.         /** @var $cliente Cliente */
  71.         $cliente $this->getUser();
  72.         if(!$cliente)
  73.             return $this->json(['status'=> false'message' => 'Não autenticado no sistema!'], 400);
  74.         $this->validateAccess(actionName"listarSolcitacaoAction");
  75.         $em $this->doctrine->getManager();
  76.         /** @var $cliente Cliente */
  77.         $cliente $this->getUser();
  78.         $empreendimentoId $request->get('empreendimento');
  79.         $statusId $request->get('status');
  80.         $solicitacoes $this->doctrine->getRepository(Solicitacao::class)->findBy([ 'cliente' => $cliente->getId() ], ['createdAt' => 'DESC']);
  81.         /** @var $unidadeCliente UnidadeCliente */
  82.         foreach ($cliente->getUnidades() as $unidadeCliente) {
  83.             if($unidadeCliente->getTipoCliente()->getId() !== 1)
  84.                 continue;
  85.             $solicitacoesUnidades $this->doctrine->getRepository(Solicitacao::class)->findBy([ 'unidade' => $unidadeCliente->getUnidade()->getId() ]);
  86.             $solicitacoes array_merge($solicitacoes$solicitacoesUnidades);
  87.         }
  88.         $solicitacoes array_unique($solicitacoesSORT_REGULAR);
  89.         $solicitacoes $this->doctrine->getRepository(Solicitacao::class)->orderSolicitacao($solicitacoes);
  90.         $solicitacoes array_reverse($solicitacoes);
  91.         $response = [];
  92.         /** @var $solicitacao Solicitacao */
  93.         foreach ($solicitacoes as $solicitacao){
  94.             if($empreendimentoId && $solicitacao->getUnidade())
  95.                 if($solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId() !== intval($empreendimentoId))
  96.                     continue;
  97.             $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao'visivel' => true], ['createdAt' => 'ASC']);
  98.             /** @var $ultimoAndamento AndamentoSolicitacao */
  99.             $ultimoAndamento end($andamentos);
  100.             if($ultimoAndamento && $statusId)
  101.                 if($ultimoAndamento->getStatusSolicitacao()->getId() !== intval($statusId))
  102.                     continue;
  103.             $response[] = [
  104.                 'id' => $solicitacao->getId(),
  105.                 'codigoSolicitacao' => $solicitacao->getCodigo(),
  106.                 'mensagem' => $solicitacao->getMensagem(),
  107.                 'dataAgendamento' => $this->formatDate($solicitacao->getData()),
  108.                 'criadoEm' => $this->formatDateTime($solicitacao->getCreatedAt()),
  109.                 'atualizadoEm' => $this->formatDateTime($solicitacao->getUpdatedAt()),
  110.                 'pesquisaSatisfacao' => $this->getRepository()->getPesquisaSatisfacaoJson($solicitacao),
  111.                 'empreendimento' => (!$solicitacao->getUnidade()->getBloco()->getEmpreendimento())? null: [
  112.                     'id' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(),
  113.                     'nome' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  114.                 ],
  115.                 'bloco' => (!$solicitacao->getUnidade()->getBloco())? null: [
  116.                     'id' => $solicitacao->getUnidade()->getBloco()->getId(),
  117.                     'nome' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  118.                 ],
  119.                 'unidade' => (!$solicitacao->getUnidade())? null: [
  120.                     'id' => $solicitacao->getUnidade()->getId(),
  121.                     'nome' => $solicitacao->getUnidade()->getUnidade(),
  122.                 ],
  123.                 'tipoSolicitacao' => (!$solicitacao->getTipoSolicitacao())? null: [
  124.                     'id' =>$solicitacao->getTipoSolicitacao()->getId(),
  125.                     'tipo' =>$solicitacao->getTipoSolicitacao()->getTipo(),
  126.                 ],
  127.                 'assunto' => (!$solicitacao->getAssunto())? null: [
  128.                     'id' =>$solicitacao->getAssunto()->getId(),
  129.                     'assunto' =>$solicitacao->getAssunto()->getAssunto(),
  130.                 ],
  131.                 'periodoAgendamento' => (!$solicitacao->getPeriodoAgendamento())? null: [
  132.                     'id' =>  $solicitacao->getPeriodoAgendamento()->getId(),
  133.                     'periodo' =>  $solicitacao->getPeriodoAgendamento()->getPeriodo(),
  134.                 ],
  135.                 'cliente' => (!$solicitacao->getCliente())? null: [
  136.                     'id' => $solicitacao->getCliente()->getId(),
  137.                     'nomeCompleto' => $solicitacao->getCliente()->getNomeCompleto(),
  138.                 ],
  139.                 'responsavelAtendimento' => (!$solicitacao->getResponsavelAtendimento())? null: [
  140.                     'id' => $solicitacao->getResponsavelAtendimento()->getId(),
  141.                     'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
  142.                     'email' => $solicitacao->getResponsavelAtendimento()->getEmail(),
  143.                 ],
  144.                 'ultimoAndamento' => (!$ultimoAndamento)? null: [
  145.                     'id' => $ultimoAndamento->getId(),
  146.                     'status' => [
  147.                         'id' => $ultimoAndamento->getStatusSolicitacao()->getId(),
  148.                         'status' => $ultimoAndamento->getStatusSolicitacao()->getStatus(),
  149.                     ],
  150.                     'assunto' => $ultimoAndamento->getAssunto(),
  151.                     'mensagem' => $ultimoAndamento->getMensagem(),
  152.                     'agendamento' => $this->getRepository()->getAgendamento($ultimoAndamento$this->mediaService),
  153.                     'criadoEm' => $this->formatDateTime($ultimoAndamento->getCreatedAt()),
  154.                     'atualizadoEm' => $this->formatDateTime($ultimoAndamento->getUpdatedAt()),
  155.                 ],
  156.                 'anexos' => $this->mediaService->getGalleryJson($solicitacao->getAnexos()),
  157.             ];
  158.         }
  159.         return $this->json($response);
  160.     }
  161.     /** ****************************************************************************************** */
  162.     /**
  163.      * Recupera uma — Solicitacao.
  164.      * Recupera uma — Solicitacao.
  165.      * @throws QueryException
  166.      */
  167.     #[OA\Response(
  168.         response200,
  169.         description'Retorna Coleção de recursos Solicitacao',
  170.         content: new OA\JsonContent(
  171.             properties: [
  172.                 new OA\Property(property'id'type'integer'),
  173.                 new OA\Property(property'assunto'type'string'),
  174.                 new OA\Property(property'mensagem'type'string'),
  175.                 new OA\Property(property'data'type'string'),
  176.                 new OA\Property(property'tipoSolicitacao'type'integer' ),
  177.                 new OA\Property(property'periodoAgendamento'type'integer' ),
  178.                 new OA\Property(property'unidade'type'integer' ),
  179.                 new OA\Property(property'cliente'type'integer' ),
  180.                 new OA\Property(property'anexos'type'integer' ),
  181.             ],
  182.             type'object'
  183.         )
  184.     )]
  185.     #[Route('/solicitacao/{id}'name'solicitacao_show'methods: ['GET'])]
  186.     #[ACL\Api(enabletruetitle'Exibir'description'Exibir Solicitacão')]
  187.     public function exibirSolcitacaoAction(Request $requestint $id): Response
  188.     {
  189.         /** @var $cliente Cliente */
  190.         $cliente $this->getUser();
  191.         if(!$cliente)
  192.             return $this->json(['status'=> false'message' => 'Não autenticado no sistema!'], 400);
  193.         $this->validateAccess(actionName"listarSolcitacaoAction");
  194.         /** @var $cliente Cliente */
  195.         $cliente $this->getUser();
  196.         $em $this->doctrine->getManager();
  197.         /** @var $solicitacao Solicitacao */
  198.         $solicitacao $em->getRepository(Solicitacao::class)->find($id);
  199.         if(!$solicitacao)
  200.             return $this->json(['status' => false'mensagem' => "Solicitação não encontrada!"], 400);
  201.         $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao'visivel' => true], ['createdAt' => 'ASC']);
  202.         /** @var $ultimoAndamento AndamentoSolicitacao */
  203.         $ultimoAndamento end($andamentos);
  204.         $response = [
  205.             'id' => $solicitacao->getId(),
  206.             'codigoSolicitacao' => $solicitacao->getCodigo(),
  207.             'mensagem' => $solicitacao->getMensagem(),
  208.             'dataAgendamento' => $this->formatDate($solicitacao->getData()),
  209.             'criadoEm' => $this->formatDateTime($solicitacao->getCreatedAt()),
  210.             'atualizadoEm' => $this->formatDateTime($solicitacao->getUpdatedAt()),
  211.             'pesquisaSatisfacao' => $this->getRepository()->getPesquisaSatisfacaoJson($solicitacao),
  212.             'empreendimento' => (!$solicitacao->getUnidade()->getBloco()->getEmpreendimento())? null: [
  213.                 'id' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(),
  214.                 'nome' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  215.             ],
  216.             'bloco' => (!$solicitacao->getUnidade()->getBloco())? null: [
  217.                 'id' => $solicitacao->getUnidade()->getBloco()->getId(),
  218.                 'nome' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  219.             ],
  220.             'unidade' => (!$solicitacao->getUnidade())? null: [
  221.                 'id' => $solicitacao->getUnidade()->getId(),
  222.                 'nome' => $solicitacao->getUnidade()->getUnidade(),
  223.             ],
  224.             'tipoSolicitacao' => (!$solicitacao->getTipoSolicitacao())? null: [
  225.                 'id' =>$solicitacao->getTipoSolicitacao()->getId(),
  226.                 'tipo' =>$solicitacao->getTipoSolicitacao()->getTipo(),
  227.             ],
  228.             'assunto' => (!$solicitacao->getAssunto())? null: [
  229.                 'id' =>$solicitacao->getAssunto()->getId(),
  230.                 'assunto' =>$solicitacao->getAssunto()->getAssunto(),
  231.             ],
  232.             'periodoAgendamento' => (!$solicitacao->getPeriodoAgendamento())? null: [
  233.                 'id' =>  $solicitacao->getPeriodoAgendamento()->getId(),
  234.                 'periodo' =>  $solicitacao->getPeriodoAgendamento()->getPeriodo(),
  235.             ],
  236.             'cliente' => (!$solicitacao->getCliente())? null: [
  237.                 'id' => $solicitacao->getCliente()->getId(),
  238.                 'nomeCompleto' => $solicitacao->getCliente()->getNomeCompleto(),
  239.             ],
  240.             'responsavelAtendimento' => (!$solicitacao->getResponsavelAtendimento())? null: [
  241.                 'id' => $solicitacao->getResponsavelAtendimento()->getId(),
  242.                 'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
  243.                 'email' => $solicitacao->getResponsavelAtendimento()->getEmail(),
  244.             ],
  245.             'ultimoAndamento' => (!$ultimoAndamento)? null: [
  246.                 'id' => $ultimoAndamento->getId(),
  247.                 'status' => [
  248.                     'id' => $ultimoAndamento->getStatusSolicitacao()->getId(),
  249.                     'status' => $ultimoAndamento->getStatusSolicitacao()->getStatus(),
  250.                 ],
  251.                 'criadoPor' => (!$ultimoAndamento->getCriadoPor())? null: [
  252.                     'id' => $ultimoAndamento->getCriadoPor()->getId(),
  253.                     'nome' => $ultimoAndamento->getCriadoPor()->getName(),
  254.                     'foto' => $this->mediaService->getMediaJson($ultimoAndamento->getCriadoPor()->getLogo()),
  255.                 ],
  256.                 /*'alteradoPor' => (!$ultimoAndamento->getAlteradoPor())? null: [
  257.                     'id' => $ultimoAndamento->getAlteradoPor()->getId(),
  258.                     'name' => $ultimoAndamento->getAlteradoPor()->getName(),
  259.                     'foto' => $this->mediaService->getMediaJson($ultimoAndamento->getAlteradoPor()->getLogo()),
  260.                 ],*/
  261.                 'assunto' => $ultimoAndamento->getAssunto(),
  262.                 'mensagem' => $ultimoAndamento->getMensagem(),
  263.                 'criadoEm' => $this->formatDateTime($ultimoAndamento->getCreatedAt()),
  264.                 'atualizadoEm' => $this->formatDateTime($ultimoAndamento->getUpdatedAt()),
  265.                 'agendamento' => $this->getRepository()->getAgendamento($ultimoAndamento$this->mediaService),
  266.             ],
  267.             'anexos' => $this->mediaService->getGalleryJson($solicitacao->getAnexos()),
  268.         ];
  269.         return $this->json($response);
  270.     }
  271.     /** ****************************************************************************************** */
  272.     /**
  273.      * Cria o Recurso — Solicitacao.
  274.      * Cria o Recurso — Solicitacao.
  275.      * @throws \Exception
  276.      */
  277.     #[OA\Response(
  278.         response201,
  279.         description'Retorna novo recurso Solicitacao',
  280.         content: new OA\JsonContent(
  281.             properties: [
  282.                 new OA\Property(property'id'type'integer'),
  283.                 new OA\Property(property'assunto'type'string'),
  284.                 new OA\Property(property'mensagem'type'string'),
  285.                 new OA\Property(property'data'type'string'),
  286.                 new OA\Property(property'tipoSolicitacao'type'integer' ),
  287.                 new OA\Property(property'periodoAgendamento'type'integer' ),
  288.                 new OA\Property(property'unidade'type'integer' ),
  289.                 new OA\Property(property'cliente'type'integer' ),
  290.                 new OA\Property(property'anexos'type'integer' ),
  291.             ],
  292.             type'object'
  293.         )
  294.     )]
  295.     #[OA\Response(response400description'Dados inválidos!')]
  296.     #[OA\RequestBody(
  297.         description'Json Payload',
  298.         content: new OA\JsonContent(
  299.             properties: [
  300.                 new OA\Property(property'assunto'type'string'),
  301.                 new OA\Property(property'mensagem'type'string'),
  302.                 new OA\Property(property'data'type'string'),
  303.                 new OA\Property(property'tipoSolicitacao'type'integer' ),
  304.                 new OA\Property(property'periodoAgendamento'type'integer' ),
  305.                 new OA\Property(property'unidade'type'integer' ),
  306.                 new OA\Property(property'cliente'type'integer' ),
  307.                 new OA\Property(property'anexos'type'integer' ),
  308.             ],
  309.             type'object'
  310.         )
  311.     )]
  312.     #[Route('/solicitacao'name'create_solicitacao'methods: ['POST'])]
  313.     #[ACL\Api(enabletruetitle'Criar'description'Criar Solicitacao')]
  314.     public function createSolicitacaoAction(Request $request): Response
  315.     {
  316.         /** @var $cliente Cliente */
  317.         $cliente $this->getUser();
  318.         if(!$cliente)
  319.             return $this->json(['status'=> false'message' => 'Não autenticado no sistema!'], 400);
  320.         $this->validateAccess("createSolicitacaoAction");
  321.         //$assunto = $request->request->get('assunto');
  322.         $mensagem $request->request->get('mensagem');
  323.         $unidade $request->request->get('unidade');
  324.         $dataAgendamento $request->request->get('dataAgendamento');
  325.         $periodoAgendamento $request->request->get('periodoAgendamento');
  326.         $anexos $request->files->get('anexos');
  327.         $solicitacao = new Solicitacao();
  328.         $solicitacao->setCliente($this->getUser());
  329.         $solicitacao->setUltimaInteracao('Cliente');
  330. //        if($assunto)
  331. //            $solicitacao->setAssunto($assunto);
  332.         if($mensagem)
  333.             $solicitacao->setMensagem($mensagem);
  334.         if($dataAgendamento)
  335.             $solicitacao->setData(new \DateTime($dataAgendamento));
  336.         $unidade $this->doctrine->getRepository(Unidade::class)->findOneBy(['id' => $unidade]);
  337.         if($unidade)
  338.             $solicitacao->setUnidade($unidade);
  339.         $periodoAgendamento $this->doctrine->getRepository(PeriodoAgendamento::class)->findOneBy(['id' => $periodoAgendamento]);
  340.         if($periodoAgendamento)
  341.             $solicitacao->setPeriodoAgendamento($periodoAgendamento);
  342.         if($anexos){
  343.             /** Cria Galeria caso não exista */
  344.             $solicitacao->setAnexos($this->mediaService->createGallery());
  345.             /** Cria as Medias e retorna array */
  346.             $medias $this->mediaService->createMultipleMedia($anexos);
  347.             /** Adicionar medias em galeria */
  348.             $this->mediaService->addMediaInGallery($medias$solicitacao->getAnexos());
  349.             /** Atualiza a galeria de Media conforme a request*/
  350.             //$this->mediaService->mediaUpdateRequest($sac->getAnexo(), $request);
  351.         }
  352.         /** Valida Restrições do objeto */
  353.         $errors $this->validateConstraintErros($solicitacao);
  354.         if($errors)
  355.             return $this->json($errors400);
  356.         /** Valida Regra de negócio */
  357.         $errors $this->getRepository()->preCadastroSolicitacao($solicitacao);
  358.         if($errors)
  359.             return $this->json($errors400);
  360.         $em $this->doctrine->getManager();
  361.         $em->persist($solicitacao);
  362.         $em->flush();
  363.         if($solicitacao->getCliente()){
  364.             $nome $solicitacao->getCliente()->getNomeCompleto();
  365.             if($nome){
  366.                 if(class_exists('Normalizer')){
  367.                     $nome Normalizer::normalize($nomeNormalizer::FORM_D);
  368.                     $nome preg_replace('/\p{M}/u'''$nome);
  369.                 }
  370.                 $nome strtoupper($nome);
  371.                 $flagName substr(preg_replace('/[^A-Z0-9]/'''$nome), 03);
  372.             }else{
  373.                 $flagName strtoupper(substr($solicitacao->getCliente()->getCnpj(), 03));
  374.             }
  375.             $solicitacao->setCodigo($flagName."000".$solicitacao->getCliente()->getId().".".$solicitacao->getId());
  376.             $em->persist($solicitacao);
  377.             $em->flush();
  378.         }
  379.         $this->getRepository()->primeiroAndamentoSolicitacao($solicitacao);
  380.         $this->getRepository()->notificarEmpresaCriacaoSolicitacao($solicitacao$this->serviceEmail$this);
  381.         $response = [
  382.             'status' => true,
  383.             'mensagem' => "Solicitação Cadastrada com Sucesso!"
  384.         ];
  385.         return $this->json($response201);
  386.     }
  387.     /** ****************************************************************************************** */
  388.     /**
  389.      * Recupera a coleção de recursos — PeriodoAgendamento.
  390.      * Recupera a coleção de recursos — PeriodoAgendamento.
  391.      * @throws QueryException
  392.      */
  393.     #[OA\Parametername'pagina'description'O número da página da coleção'in'query'requiredfalseallowEmptyValuetrueexample1)]
  394.     #[OA\Parametername'paginaTamanho'description'O tamanho da página da coleção'in'query'requiredfalseexample10)]
  395.     #[OA\Response(
  396.         response200,
  397.         description'Retorna Coleção de recursos PeriodoAgendamento',
  398.         content: new OA\JsonContent(
  399.             properties: [
  400.                 new OA\Property(property'id'type'integer'),
  401.                 new OA\Property(property'periodo'type'string'),
  402.                 new OA\Property(property'visivel'type'boolean'),
  403.             ],
  404.             type'object'
  405.         )
  406.     )]
  407.     #[Route('/periodoAgendamento'name'periodoagendamento'methods: ['GET'])]
  408.     #[ACL\Api(enabletruetitle'Listar'description'Listar PeriodoAgendamento')]
  409.     public function listAction(Request $request): Response
  410.     {
  411.         $this->validateAccess(actionName"listAction");
  412.         $periodosAgendamento $this->doctrine->getRepository(PeriodoAgendamento::class)
  413.             ->findBy(['visivel' => true]);
  414.         $response = [];
  415.         /** @var $periodo PeriodoAgendamento */
  416.         foreach ($periodosAgendamento as $periodo) {
  417.             $response[] = [
  418.                 'id' => $periodo->getId(),
  419.                 'periodo' => $periodo->getPeriodo(),
  420.             ];
  421.         }
  422.         return $this->json($response);
  423.     }
  424.     #[Route('/diaDisponivelAgendamento'name'diaDisponivelAgendamento'methods: ['GET'])]
  425.     #[ACL\Api(enabletruetitle'Listar'description'Listar Dia Disponivel para Agendamento')]
  426.     public function diaDisponivelAgendamentoAction(Request $request): Response
  427.     {
  428.         $this->validateAccess(actionName"diaDisponivelAgendamentoAction");
  429.         $peridoDisponivelAgendamento $this->doctrine->getRepository(PeriodoDisponivelAgendamento::class)
  430.             ->findAll();
  431.         $response = [];
  432.         /** @var $periodo PeriodoDisponivelAgendamento */
  433.         foreach ($peridoDisponivelAgendamento as $periodo){
  434.             $response[$periodo->getDiaSemana()->getDia()]['dia'] = $periodo->getDiaSemana()->getDia();
  435.             $response[$periodo->getDiaSemana()->getDia()]['diaSemana'] = $periodo->getDiaSemana()->getDiasemana();
  436.             $response[$periodo->getDiaSemana()->getDia()]['diaSemana'] = $periodo->getDiaSemana()->getDiasemana();
  437.             $response[$periodo->getDiaSemana()->getDia()]['disponivel'] = $periodo->getDisponivel();
  438.             $response[$periodo->getDiaSemana()->getDia()]['periodo'][] = [
  439.                 'id' => $periodo->getPeriodoAgendamento()->getId(),
  440.                 'periodo' => $periodo->getPeriodoAgendamento()->getPeriodo(),
  441.                 'disponivel' => $periodo->getQuatidadeagendamentos() > 0,
  442.             ];
  443.         }
  444.         return $this->json(array_values($response));
  445.     }
  446.     #[Route('/diaIndisponivelAgendamento'name'diaIndisponivelAgendamento'methods: ['GET'])]
  447.     #[ACL\Api(enabletruetitle'Listar'description'Listar Dia Indiponivel para Agendamento')]
  448.     public function diaIndisponivelAgendamentoAction(Request $request): Response
  449.     {
  450.         $this->validateAccess(actionName"diaIndisponivelAgendamentoAction");
  451.         $diasIndisponiveis $this->doctrine->getRepository(DiaIndisponivelAgendamento::class)->findAll();
  452.         $response = [];
  453.         /** @var $dia DiaIndisponivelAgendamento */
  454.         foreach ($diasIndisponiveis as $dia){
  455.             if(!$dia->getIndisponivel() && !$dia->getFeriado())
  456.                 continue;
  457.             $response[] = [
  458.                 'data' => $this->formatDate($dia->getData()),
  459.                 'descricao' => $dia->getDescricao(),
  460.                 'todosAnos' => $dia->getFeriado(),
  461.                 'anoAtual' => ($dia->getFeriado()) ? false $dia->getIndisponivel(),
  462.             ];
  463.         }
  464.         return $this->json(array_values($response));
  465.     }
  466.     #[Route('/verificarDisponibilidadeAgendamento'name'verificarDisponibilidadeAgendamento'methods: ['POST'])]
  467.     #[ACL\Api(enabletruetitle'Listar'description'Verificar Disponibilidade Agendamento')]
  468.     public function verificarDisponibilidadeAgendamentoAction(Request $request): Response
  469.     {
  470.         $this->validateAccess(actionName"verificarDisponibilidadeAgendamentoAction");
  471.         $em $this->doctrine->getManager();
  472.         $requestBody json_decode($request->getContent());
  473.         $periodo = (isset($requestBody->periodo)) ? $requestBody->periodo null;
  474.         $data = ( isset($requestBody->data)) ? new \DateTime($requestBody->data) : null;
  475.         if(!$data)
  476.             return $this->json([
  477.                 'status' => false,
  478.                 'message' => 'Data não preenchida!',
  479.             ], 400);
  480.         $periodo $em->getRepository(PeriodoAgendamento::class)->findOneBy(['id' => $periodo]);
  481.         if(!$periodo)
  482.             return $this->json([
  483.                 'status' => false,
  484.                 'message' => 'Período de Agendamento não Encontrado!',
  485.             ], 400);
  486.         $solicitacao = new Solicitacao();
  487.         $solicitacao->setPeriodoAgendamento($periodo);
  488.         $solicitacao->setData($data);
  489.         $solRepo = new SolicitacaoRepository($this->doctrine);
  490.         $resposta $solRepo->validarDataSolicitacao($solicitacao);
  491.         if($resposta){
  492.             return $this->json($resposta400);
  493.         }else{
  494.             return $this->json([
  495.                 'status' => true,
  496.                 'message' => 'Dia e Período disponível para agendamento!',
  497.             ], 200);
  498.         }
  499. //        $diasIndisponiveis = $em->getRepository(DiaIndisponivelAgendamento::class)->findAll();
  500. //
  501. //        /** @var $dia DiaIndisponivelAgendamento */
  502. //        foreach ($diasIndisponiveis as $dia) {
  503. //            if(date_format($dia->getData(), "d-m") === date_format($data, "d-m")){
  504. //                if($dia->getIndisponivel()){
  505. //                    return $this->json([
  506. //                        'disponivel' => false,
  507. //                        'message' => 'Está data nesse período está indisponível para agendamento!',
  508. //                    ], 200);
  509. //                }else if($dia->getFeriado()) {
  510. //                    if(date_format($dia->getData(), "d-m-Y") === date_format($data, "d-m-Y")){
  511. //                        return $this->json([
  512. //                            'disponivel' => false,
  513. //                            'message' => 'Está data nesse período está indisponível para agendamento!',
  514. //                        ], 200);
  515. //                    }
  516. //                }
  517. //            }
  518. //        }
  519. //
  520. //        $solicitacoes = $em->getRepository(Solicitacao::class)->findBy(['data' => $data]);
  521. //
  522. //        $diasemana_numero = date('w', strtotime(date_format($data,'Y-m-d')));
  523. //        $diaSemana = $em->getRepository(DiaSemana::class)->findOneBy(['id' => $diasemana_numero+1]);
  524. //        /** @var $diaAgendamento PeriodoDisponivelAgendamento */
  525. //        $diaAgendamento = $em->getRepository(PeriodoDisponivelAgendamento::class)->findOneBy(['diaSemana' => $diaSemana, 'periodoAgendamento' => $periodo]);
  526. //
  527. //
  528. //        if(!$diaAgendamento->getDisponivel())
  529. //            return $this->json([
  530. //                'status' => false,
  531. //                'message' => 'Dia e Período indisponível para agendamento!',
  532. //            ], 400);
  533. //
  534. //        if(count($solicitacoes) >= $diaAgendamento->getQuatidadeagendamentos()) {
  535. //            return $this->json([
  536. //                'status' => false,
  537. //                'message' => 'Dia e Período indisponível para agendamento!',
  538. //            ], 400);
  539. //        }else{
  540. //            return $this->json([
  541. //                'status' => true,
  542. //                'message' => 'Dia e Período disponível para agendamento!',
  543. //            ], 200);
  544. //        }
  545.     }
  546.     /** ****************************************************************************************** */
  547.     /**
  548.      * Recupera o recurso — AndamentoSolicitacao.
  549.      * Recupera o recurso — AndamentoSolicitacao.
  550.      */
  551.     #[OA\Parametername'solicitacao'description'Identificador do recurso'in'path')]
  552.     #[OA\Response(
  553.         response200,
  554.         description'Retorna recurso AndamentoSolicitacao',
  555.         content: new OA\JsonContent(
  556.             properties: [
  557.                 new OA\Property(property'id'type'integer'),
  558.                 new OA\Property(property'assunto'type'string'),
  559.                 new OA\Property(property'mensagem'type'string'),
  560.                 new OA\Property(property'status'type'integer' ),
  561.                 new OA\Property(property'solicitacao'type'integer' ),
  562.             ],
  563.             type'object'
  564.         )
  565.     )]
  566.     #[OA\Response(response404description'Recurso não encontrado')]
  567.     #[Route('/andamentoSolicitacao/{solicitacao}'name'showAndamento'methods: ['GET'])]
  568.     #[ACL\Api(enabletruetitle'Visualizar'description'Visualizar AndamentoSolicitacao')]
  569.     public function showAndamentoAction(Request $requestmixed $solicitacao): Response
  570.     {
  571.         /** @var $cliente Cliente */
  572.         $cliente $this->getUser();
  573.         if(!$cliente)
  574.             return $this->json(['status'=> false'message' => 'Não autenticado no sistema!'], 400);
  575.         $this->validateAccess("showAndamentoAction");
  576.         $em $this->doctrine->getManager();
  577.         $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao'visivel' => true], ['createdAt' => 'ASC']);
  578.         if(!$andamentos)
  579.             return $this->json(['message'=> 'Andamento de Solicitação não encontrado!'],404);
  580.         $response = [];
  581.         $solicitacao $em->getRepository(Solicitacao::class)->findOneBy(['id' => $solicitacao]);
  582.         /** @var $andamento AndamentoSolicitacao */
  583.         foreach ($andamentos as $andamento){
  584.             if(!$andamento->getVisivel())
  585.                 continue;
  586.             $respostas = [];
  587.             $respostasList $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento], ['createdAt' => 'ASC']);
  588.             /** @var $resposta RespostaSolicitacao */
  589.             foreach ($respostasList as $resposta) {
  590.                 $respostas[] = [
  591.                     'id' => $resposta->getId(),
  592.                     'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  593.                     'assunto' => $resposta->getAssunto(),
  594.                     'mensagem' => $resposta->getMensagem(),
  595.                     'respondidoPor' => $resposta->getRespondidoPor(),
  596.                     'adminResposta' => (!$resposta->getAdminResposta()) ? null : [
  597.                       'nome' => $resposta->getAdminResposta()->getName(),
  598.                       'foto' => $this->mediaService->getMediaJson($resposta->getAdminResposta()->getLogo()),
  599.                     ],
  600.                     /*'clienteResposta' => (!$resposta->getClienteResposta()) ? null : [
  601.                         'nome' => $resposta->getClienteResposta()->getNomeCompleto(),
  602.                         'foto' => ''
  603.                     ],*/
  604.                     'clienteResposta' => (!$resposta->getClienteResposta()) ? null $resposta->getClienteResposta()->getNomeCompleto(),
  605.                     'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()),
  606.                     'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
  607.                     'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
  608.                 ];
  609.             }
  610.             $response[] = [
  611.                 'id' => $andamento->getId(),
  612.                 'codigoSolicitacao' => $solicitacao->getCodigo(),
  613.                 'solicitacao' => $andamento->getSolicitacao()->getId(),
  614.                 'assunto' => $andamento->getAssunto(),
  615.                 'mensagem' => $andamento->getMensagem(),
  616.                 'status' => [
  617.                     'id' => $andamento->getStatusSolicitacao()->getId(),
  618.                     'status' => $andamento->getStatusSolicitacao()->getStatus(),
  619.                 ],
  620.                 'criadoEm' => $this->formatDateTime($andamento->getCreatedAt()),
  621.                 'atualizadoEm' => $this->formatDateTime($andamento->getUpdatedAt()),
  622.                 'criadoPor' => (!$andamento->getCriadoPor())? null: [
  623.                     'id' => $andamento->getCriadoPor()->getId(),
  624.                     'nome' => $andamento->getCriadoPor()->getName(),
  625.                     'foto' => $this->mediaService->getMediaJson($andamento->getCriadoPor()->getLogo()),
  626.                 ],
  627.                 'agendamento' => $this->getRepository()->getAgendamento($andamento$this->mediaService),
  628.                 'respostas' => $respostas,
  629.             ];
  630.         }
  631.         return $this->json($response);
  632.     }
  633. //    /** ****************************************************************************************** */
  634. //    /**
  635. //     * Recupera o recurso — RespostaSolicitacao.
  636. //     * Recupera o recurso — RespostaSolicitacao.
  637. //     */
  638. //    #[OA\Parameter( name: 'andamento', description: 'id do andamento', in: 'path')]
  639. //    #[OA\Response(
  640. //        response: 200,
  641. //        description: 'Retorna recurso RespostaSolicitacao',
  642. //        content: new OA\JsonContent(
  643. //            properties: [
  644. //                new OA\Property(property: 'id', type: 'integer'),
  645. //                new OA\Property(property: 'assunto', type: 'string'),
  646. //                new OA\Property(property: 'mensagem', type: 'string'),
  647. //                new OA\Property(property: 'andamento', type: 'integer' ),
  648. //            ],
  649. //            type: 'object'
  650. //        )
  651. //    )]
  652. //    #[OA\Response(response: 404, description: 'Recurso não encontrado')]
  653. //    #[Route('/resposta/{andamento}', name: 'showResposta', methods: ['GET'])]
  654. //    #[ACL\Api(enable: true, title: 'Visualizar', description: 'Visualizar RespostaSolicitacao')]
  655. //    public function showRespostaAction(Request $request, mixed $andamento): Response
  656. //    {
  657. //        $this->validateAccess("showRespostaAction");
  658. //        $em = $this->doctrine->getManager();
  659. //
  660. //        $respostas = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento, ['createdAt' => 'ASC']]);
  661. //        if(!$respostas)
  662. //            return $this->json(['message' => 'Respostas não encontradas!'], 404);
  663. //
  664. //        $response = [];
  665. //        /** @var $resposta RespostaSolicitacao */
  666. //        foreach ($respostas as $resposta){
  667. //            $response[] =[
  668. //                'id' => $resposta->getId(),
  669. //                'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  670. //                'assunto' => $resposta->getAssunto(),
  671. //                'mensagem' => $resposta->getMensagem(),
  672. //                'respondidoPor' => $resposta->getRespondidoPor(),
  673. //                'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()),
  674. //                'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
  675. //                'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
  676. //            ];
  677. //        }
  678. //
  679. //        return $this->json($response);
  680. //    }
  681.     #[Route('/resposta'name'createResposta'methods: ['POST'])]
  682.     #[ACL\Api(enabletruetitle'Criar'description'Criar RespostaSolicitacao')]
  683.     public function createRespostaAction(Request $request): Response
  684.     {
  685.         $this->validateAccess("createRespostaAction");
  686.         $em $this->doctrine->getManager();
  687.         /** @var $cliente Cliente */
  688.         $cliente $this->getUser();
  689.         if(!$cliente)
  690.             return $this->json(['status'=> false'message' => 'Não autenticado no sistema!'], 400);
  691.         //$assunto = $request->get('assunto');
  692.         $mensagem $request->get('mensagem');
  693.         $andamentoSolcitacao $request->get('andamento');
  694.         $anexos $request->files->get('anexos');
  695.         if(!$mensagem && !count($anexos))
  696.             return $this->json(['status'=> false'message' => 'Deve ser preenchido a mensagem ou anexo de documento!'], 400);
  697.         $andamentoSolcitacao $em->getRepository(AndamentoSolicitacao::class)->find($andamentoSolcitacao);
  698.         if(!$andamentoSolcitacao)
  699.             return $this->json(['status'=> false'message' => 'Andamento não encontrado!'], 400);
  700.         /** @var $andamentoSolcitacao AndamentoSolicitacao */
  701.         $andamentoSolcitacao $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['solicitacao' => $andamentoSolcitacao->getSolicitacao(), 'visivel' => true], ['createdAt'=> 'DESC']);
  702.         if(in_array($andamentoSolcitacao->getStatusSolicitacao()->getId(), [89]))
  703.             return $this->json(['status'=> false'message' => 'Chamado com status concluído ou cancelado, não é possível interagir!'], 400);
  704.         $resposta = new RespostaSolicitacao();
  705.         //$resposta->setAssunto($assunto);
  706.         $resposta->setMensagem($mensagem);
  707.         $resposta->setAndamentoSolicitacao($andamentoSolcitacao);
  708.         $resposta->setRespondidoPor('cliente');
  709.         $resposta->setClienteResposta($cliente);
  710.         if($anexos){
  711.             /** Cria Galeria caso não exista */
  712.             $resposta->setAnexos($this->mediaService->createGallery());
  713.             /** Cria as Medias e retorna array */
  714.             $medias $this->mediaService->createMultipleMedia($anexos);
  715.             /** Adicionar medias em galeria */
  716.             $this->mediaService->addMediaInGallery($medias$resposta->getAnexos());
  717.         }
  718.         $em->persist($resposta);
  719.         $em->flush();
  720.         $solicitacao $resposta->getAndamentoSolicitacao()->getSolicitacao();
  721.         $solicitacao->setUltimaInteracao('Cliente');
  722.         $em->persist($solicitacao);
  723.         $em->flush();
  724.         $mail $this->serviceEmail->getEmail();
  725.         $responsavelAtendimento $resposta->getAndamentoSolicitacao()->getSolicitacao()->getResponsavelAtendimento();
  726.         if($responsavelAtendimento){
  727.             $mail->addAddress($responsavelAtendimento->getEmail());
  728.         }else{
  729.             $emailResponsavel explode(','$this->serviceEmail->getEmpresa()->getEmailsSolicitacao());
  730.             $mail->addAddress($emailResponsavel[0]);
  731.             foreach ($emailResponsavel as $email){
  732.                 $mail->addReplyTo($email);
  733.             }
  734.         }
  735.         $mail->Subject 'Atualização de Solicitação';
  736.         $mail->Body $this->renderTemplateEmail('emails/solicitacao/notificacao_empresa_interacao_cliente.html.twig', [
  737.             'solicitacao' => $resposta->getAndamentoSolicitacao()->getSolicitacao(),
  738.             'resposta' => $resposta,
  739.         ]);
  740.         $mail->send();
  741.         return $this->json(['status' => true'message' => 'Resposta cadastrada com sucesso!'], 201);
  742.     }
  743.     /** ****************************************************************************************** */
  744.     /**
  745.      * Recupera o recurso — Status.
  746.      * Recupera o recurso — Status.
  747.      */
  748.     #[OA\Response(
  749.         response200,
  750.         description'Retorna recurso Status',
  751.         content: new OA\JsonContent(
  752.             properties: [
  753.                 new OA\Property(property'id'type'integer'),
  754.                 new OA\Property(property'status'type'string'),
  755.             ],
  756.             type'object'
  757.         )
  758.     )]
  759.     #[OA\Response(response404description'Recurso não encontrado')]
  760.     #[Route('/status'name'listStatus'methods: ['GET'])]
  761.     #[ACL\Api(enabletruetitle'Listar'description'Listar Status')]
  762.     public function statusSolicitacaoAction(Request $request): Response
  763.     {
  764.         $this->validateAccess("statusSolicitacaoAction");
  765.         $em $this->doctrine->getManager();
  766.         $status $em->getRepository(StatusSolicitacao::class)->findAll();
  767.         $response = [];
  768.         /** @var $object StatusSolicitacao */
  769.         foreach ($status as $object){
  770.             $response[] =[
  771.                 'id' => $object->getId(),
  772.                 'status' => $object->getStatus(),
  773.             ];
  774.         }
  775.         return $this->json($response);
  776.     }
  777. }