src/Application/Internit/SolicitacaoBundle/Controller/SolicitacaoAdminController.php line 964

Open in your IDE?
  1. <?php
  2. namespace App\Application\Internit\SolicitacaoBundle\Controller;
  3. use App\Application\Internit\AgendamentoBundle\Entity\Agendamento;
  4. use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
  5. use App\Application\Internit\EmpreendimentoBundle\Entity\Empreendimento;
  6. use App\Application\Internit\OrdemServicoBundle\Entity\OrdemServico;
  7. use App\Application\Internit\PeriodoAgendamentoBundle\Entity\PeriodoAgendamento;
  8. use App\Application\Internit\PesquisaSatisfacaoBundle\Entity\PesquisaSatisfacao;
  9. use App\Application\Internit\PesquisaSatisfacaoBundle\Entity\Resposta;
  10. use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
  11. use App\Application\Internit\RespostaSolicitacaoBundle\Entity\RespostaSolicitacao;
  12. use App\Application\Internit\SolicitacaoBundle\Entity\Solicitacao;
  13. use App\Application\Internit\SolicitacaoBundle\Form\SolicitacaoAdminType;
  14. use App\Application\Internit\StatusSolicitacaoBundle\Entity\StatusSolicitacao;
  15. use App\Application\Project\ContentBundle\Attributes\Acl as ACL;
  16. use App\Application\Project\ContentBundle\Controller\Base\BaseAdminController;
  17. use App\Application\Project\ContentBundle\Service\FilterDoctrine;
  18. use Doctrine\Persistence\ObjectRepository;
  19. use Sonata\AdminBundle\Bridge\Exporter\AdminExporter;
  20. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use function Symfony\Component\String\s;
  25. #[ACL\Admin(enabletruetitle'Solicitacao'description'Permissões modulo Solicitacao')]
  26. class SolicitacaoAdminController extends BaseAdminController
  27. {
  28.     protected $baseRoute 'admin_internit_solicitacao_solicitacao_';
  29.     protected $baseTemplate "@ApplicationInternitSolicitacao/solicitacao/";
  30.     public function dashboardAction()
  31.     {
  32.         return new JsonResponse([]);
  33.         /* Here goes your code */
  34.     }
  35.     public function getClass(): string
  36.     {
  37.         return Solicitacao::class;
  38.     }
  39.     public function getRepository(): ObjectRepository
  40.     {
  41.         return $this->managerRegistry->getManager()->getRepository($this->getClass());
  42.     }
  43.     /*#[ACL\Admin(enable: true, title: 'Listar', description: 'Listar Solicitacao')]
  44.     public function listAction(Request $request): Response
  45.     {
  46.         $this->validateAccess("listAction");
  47.         return parent::listAction($request);
  48.     }*/
  49.     #[ACL\Admin(enabletruetitle'Listar'description'Listar Solicitacao')]
  50.     public function listAction(Request $request): Response
  51.     {
  52.         $this->assertObjectExists($request);
  53.         $this->admin->checkAccess('list');
  54.         $preResponse $this->preList($request);
  55.         if (null !== $preResponse) {
  56.             return $preResponse;
  57.         }
  58.         $listMode $request->get('_list_mode');
  59.         if (\is_string($listMode)) {
  60.             $this->admin->setListMode($listMode);
  61.         }
  62.         $datagrid $this->admin->getDatagrid();
  63.         $formView $datagrid->getForm()->createView();
  64.         // set the theme for the current Admin Form
  65.         $this->setFormTheme($formView$this->admin->getFilterTheme());
  66.         //$template = $this->templateRegistry->getTemplate('list');
  67.         if ($this->container->has('sonata.admin.admin_exporter')) {
  68.             $exporter $this->container->get('sonata.admin.admin_exporter');
  69.             \assert($exporter instanceof AdminExporter);
  70.             $exportFormats $exporter->getAvailableFormats($this->admin);
  71.         }
  72.         $solicitacoes $this->managerRegistry->getManager()->getRepository(Solicitacao::class)->findAll();
  73.         $jsonSolicitacoes = [];
  74.         foreach ($solicitacoes as $solicitacao) {
  75.             $jsonSolicitacoes[] = [
  76.                 'id' => $solicitacao->getId(),
  77.                 'codigo' => $solicitacao->getCodigo(),
  78.                 'nomeCliente' => (!empty($solicitacao->getCliente()->getNomeCompleto()))? $solicitacao->getCliente()->getNomeCompleto() : $solicitacao->getCliente()->getNomeFantasia(),
  79.                 'mensagem' => $solicitacao->getMensagem(),
  80.                 'dataCriacao' => $this->formatDateTime($solicitacao->getCreatedAt()),
  81.             ];
  82.         }
  83.         return $this->renderWithExtraParams($this->baseTemplate.'admin/list.html.twig', [
  84.             'action' => 'list',
  85.             'form' => $formView,
  86.             'solicitacoes' => json_encode($jsonSolicitacoes),
  87.             'datagrid' => $datagrid,
  88.             'csrf_token' => $this->getCsrfToken('sonata.batch'),
  89.             'export_formats' => $exportFormats ?? $this->admin->getExportFormats(),
  90.         ]);
  91.     }
  92.     #[ACL\Admin(enabletruetitle'Visualizar'description'Visualizar Solicitacao')]
  93.     public function showAction(Request $request): Response
  94.     {
  95.         $this->validateAccess("showAction");
  96.         //return parent::showAction($request);
  97.         $id $request->get('id');
  98.         if(!$id)
  99.             return $this->redirectToRoute($this->baseRoute.'list');
  100.         return $this->redirectToRoute($this->baseRoute.'edit', ['id' => $id]);
  101.     }
  102.     #[ACL\Admin(enabletruetitle'Criar'description'Criar Solicitacao')]
  103.     public function createAction(Request $request): Response
  104.     {
  105.         $this->validateAccess("createAction");
  106.         //return parent::createAction($request);
  107.         $entityManager $this->managerRegistry->getManager();
  108.         $data = new Solicitacao();
  109.         $data->setUltimaInteracao('Atendimento');
  110.         $form $this->createForm(SolicitacaoAdminType::class, $data);
  111.         //dd($etapas);
  112.         $form->handleRequest($request);
  113.         if($form->isSubmitted() && $form->isValid()){
  114.             /** @var Solicitacao $data */
  115.             $data $form->getData();
  116.             $statusSolicitacao $entityManager->getRepository(StatusSolicitacao::class)->findOneBy(['id' => 1]);
  117.             $data->setStatusAtual($statusSolicitacao);
  118.             $data->setUltimaInteracao('Atendimento');
  119.             /** Cria Galeria caso não exista */
  120.             $data->setAnexos($this->mediaService->createGallery());
  121.             /** Cria as Medias e retorna array */
  122.             $medias $this->mediaService->createMultipleMedia($data->getMultipleUpload());
  123.             /** Adicionar medias em galeria */
  124.             $this->mediaService->addMediaInGallery($medias$data->getAnexos());
  125.             /** Atualiza a galeria de Media conforme a request*/
  126.             $this->mediaService->mediaUpdateRequest($data->getAnexos(), $request);
  127.             $entityManager->persist($data);
  128.             $entityManager->flush();
  129.             if($data->getCliente()){
  130.                 $flagName = ($data->getCliente()->getNomeCompleto()) ?
  131.                     strtoupper(substr($data->getCliente()->getNomeCompleto(), 03)) :
  132.                     strtoupper(substr($data->getCliente()->getCnpj(), 03)) ;
  133.                 $data->setCodigo($flagName."000".$data->getCliente()->getId().".".$data->getId());
  134.                 $entityManager->persist($data);
  135.                 $entityManager->flush();
  136.             }
  137.             if($data->getResponsavelAtendimento())
  138.                 $this->notificarResponsavelAtendimento($data);
  139.             $this->getRepository()->primeiroAndamentoSolicitacao($data);
  140.             $this->notificarCliente($data);
  141.             $redirectAction $request->get('btn_action');
  142.             if($redirectAction === "btn_create_and_edit")
  143.                 return $this->redirectToRoute($this->baseRoute 'edit', ['id' => $data->getId()]);
  144.             if($redirectAction === "btn_create_and_list")
  145.                 return $this->redirectToRoute($this->baseRoute 'list');
  146.             if($redirectAction === "btn_create_and_create")
  147.                 return $this->redirectToRoute($this->baseRoute 'create');
  148.         }
  149.         $template $this->baseTemplate "admin/create.html.twig";
  150.         return $this->renderWithExtraParams($template,[
  151.             'title' => 'Criar',
  152.             'form' => $form->createView(),
  153.         ]);
  154.     }
  155.     #[ACL\Admin(enabletruetitle'Editar'description'Editar Solicitacao')]
  156.     public function editAction(Request $request): Response
  157.     {
  158.         $this->validateAccess("editAction");
  159.         //return parent::editAction($request);
  160.         $entityManager $this->managerRegistry->getManager();
  161.         /*** @var Solicitacao $existingObject */
  162.         $existingObject $this->assertObjectExists($requesttrue);
  163.         $existingObject->setEmpreendimento($existingObject->getUnidade()->getBloco()->getEmpreendimento());
  164.         $existingObject->setBloco($existingObject->getUnidade()->getBloco());
  165.         $lastResponsavel $existingObject->getResponsavelAtendimento();
  166.         if(!$existingObject)
  167.             return $this->redirectToRoute($this->baseRoute 'list');
  168.         $form $this->createForm(SolicitacaoAdminType::class, $existingObject);
  169.         $form->handleRequest($request);
  170.         if($form->isSubmitted()){
  171.             /** @var Solicitacao $data */
  172.             $data $form->getData();
  173.             $data->setUltimaInteracao('Atendimento');
  174.             if( !$data->getAnexos() )
  175.                 $data->setAnexos($this->mediaService->createGallery());
  176.             /** Cria as Medias e retorna array */
  177.             $medias $this->mediaService->createMultipleMedia($data->getMultipleUpload());
  178.             /** Adicionar medias em galeria */
  179.             $this->mediaService->addMediaInGallery($medias$data->getAnexos());
  180.             /** Atualiza a galeria de Media conforme a request*/
  181.             $this->mediaService->mediaUpdateRequest($data->getAnexos(), $request);
  182.             $entityManager->persist($data);
  183.             $entityManager->flush();
  184.             if($data->getCliente()){
  185.                 $flagName utf8_encode(($data->getCliente()->getNomeCompleto()) ?
  186.                     strtoupper(substr($data->getCliente()->getNomeCompleto(), 03)) :
  187.                     strtoupper(substr($data->getCliente()->getCnpj(), 03))) ;
  188.                 $data->setCodigo($flagName."000".$data->getCliente()->getId().".".$data->getId());
  189.                 $entityManager->persist($data);
  190.                 $entityManager->flush();
  191.             }
  192.             if($data->getResponsavelAtendimento())
  193.                 if(!$lastResponsavel || ($data->getResponsavelAtendimento()->getId() !== $lastResponsavel->getId()) )
  194.                     $this->notificarResponsavelAtendimento($data);
  195.             $this->notificarCliente($data);
  196.             $redirectAction $request->get('btn_action');
  197.             if($redirectAction === "btn_create_and_edit")
  198.                 return $this->redirectToRoute($this->baseRoute 'edit', ['id' => $data->getId()]);
  199.             if($redirectAction === "btn_create_and_list")
  200.                 return $this->redirectToRoute($this->baseRoute 'list');
  201.         }
  202.        // dump($existingObject);
  203.         $ordemServicos = [];
  204.         foreach ($existingObject->getAndamentoSolicitacao() as $andamento) {
  205.             /*** @var AndamentoSolicitacao $andamento */
  206.             if($andamento->getAgendamento()){
  207.                 foreach ($andamento->getAgendamento()->getOrdemServicos() as $ordemServico)
  208.                 $ordemServicos[] = $ordemServico;
  209.             }
  210.         }
  211.         $pesquisa $entityManager->getRepository(PesquisaSatisfacao::class)->findOneBy(['solicitacao' => $existingObject]);
  212.         $extraInfos = [
  213.             'statusSolicitacao' => $entityManager->getRepository(StatusSolicitacao::class)->findAll(),
  214.             'periodos' => $entityManager->getRepository(PeriodoAgendamento::class)->findAll(),
  215.             'profissionais' => $entityManager->getRepository(Profissional::class)->findAll(),
  216.             'andamentos' => $entityManager->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $existingObject], ['createdAt' => 'DESC']),
  217.             'chat' => $this->getDataChat($existingObject->getId()),
  218.             'ordemServicos' => $ordemServicos,
  219.             'pesquisa' => (!$pesquisa)? null : [
  220.                 'pesquisa' => $pesquisa,
  221.                 'respostas' => $this->getRespostaPesquisa($pesquisa),
  222.             ],
  223.         ];
  224.         return $this->renderWithExtraParams($this->baseTemplate.'admin/edit.html.twig',[
  225.             'title' => 'Editar',
  226.             'form' => $form->createView(),
  227.             'object' => $existingObject,
  228.             'extraInfos' => $extraInfos,
  229.         ]);
  230.     }
  231.     private function getRespostaPesquisa(PesquisaSatisfacao $pesquisa)
  232.     {
  233.         $em $this->managerRegistry->getManager();
  234.         $respostas = [
  235.             'atendente' => null,
  236.             'profissional' => []
  237.         ];
  238.         $solicitacao $pesquisa->getSolicitacao();
  239.         $respostasData $em->getRepository(Resposta::class)->findBy([
  240.             'pesquisaSatisfacao' => $pesquisa->getId()], [
  241.             'createdAt' => 'DESC'
  242.         ]);
  243.         if($solicitacao->getResponsavelAtendimento()){
  244.             $perguntas = [];
  245.             foreach ($respostasData as $resp) {
  246.                 if($resp->getResponsavelAtendimento()){
  247.                     $perguntas[] = [
  248.                         'pergunta' => $resp->getPergunta(),
  249.                         'resposta' => $resp->getResposta(),
  250.                         'tipoPergunta' => $resp->getTipoPergunta(),
  251.                     ];
  252.                 }
  253.             }
  254.             $respostas['atendente'] = [
  255.                 'id' => $solicitacao->getResponsavelAtendimento()->getId(),
  256.                 'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
  257.                 'imagem' => $this->mediaService->getMediaJson($solicitacao->getResponsavelAtendimento()->getLogo()),
  258.                 'perguntas' => $perguntas,
  259.             ];
  260.         }
  261.         foreach ($solicitacao->getAllProffisionais() as $profissional) {
  262.             $perguntas = [];
  263.             foreach ($respostasData as $resp) {
  264.                 if($resp->getProfissional() && $resp->getProfissional()->getId() == $profissional->getId()){
  265.                     $perguntas[] = [
  266.                         'pergunta' => $resp->getPergunta(),
  267.                         'resposta' => $resp->getResposta(),
  268.                         'tipoPergunta' => $resp->getTipoPergunta(),
  269.                     ];
  270.                 }
  271.             }
  272.             $respostas['profissional'][] = [
  273.                 'id' => $profissional->getId(),
  274.                 'nome' => $profissional->getNomecompleto(),
  275.                 'imagem' => $this->mediaService->getMediaJson($profissional->getLogo()),
  276.                 'perguntas' => $perguntas,
  277.             ];
  278.         }
  279.         return $respostas;
  280.     }
  281.     #[ACL\Admin(enabletruetitle'Excluir'description'Excluir Solicitacao')]
  282.     public function deleteAction(Request $request): Response
  283.     {
  284.         $this->validateAccess("deleteAction");
  285.         return parent::deleteAction($request);
  286.     }
  287.     #[ACL\Admin(enabletruetitle'Excluir em Lote'description'Excluir Solicitacao em lote')]
  288.     public function batchActionDelete(ProxyQueryInterface $query): Response
  289.     {
  290.         $this->validateAccess("batchActionDelete");
  291.         return parent::batchActionDelete($query);
  292.     }
  293.     public function batchAction(Request $request): Response
  294.     {
  295.         $this->validateAccess("batchActionDelete");
  296.         return parent::batchAction($request);
  297.     }
  298.     #[ACL\Admin(enabletruetitle'Exportar'description'Exportar Solicitacao')]
  299.     public function exportAction(Request $request): Response
  300.     {
  301.         $this->validateAccess("exportAction");
  302.         return parent::exportAction($request);
  303.     }
  304.     #[ACL\Admin(enabletruetitle'Auditoria'description'Auditar Solicitacao')]
  305.     public function historyAction(Request $request): Response
  306.     {
  307.         $this->validateAccess("historyAction");
  308.         return parent::historyAction($request);
  309.     }
  310.     public function historyViewRevisionAction(Request $requeststring $revision): Response
  311.     {
  312.         $this->validateAccess("historyAction");
  313.         return parent::historyViewRevisionAction($request$revision);
  314.     }
  315.     public function historyCompareRevisionsAction(Request $requeststring $baseRevisionstring $compareRevision): Response
  316.     {
  317.         $this->validateAccess("historyAction");
  318.         return parent::historyCompareRevisionsAction($request$baseRevision$compareRevision);
  319.     }
  320.     /** ##############################
  321.      * API */
  322.     public function apiGetAndamentoSolicitacaoAction(Request $request): JsonResponse
  323.     {
  324.         $this->validateAccess("listAction");
  325.         $id $request->get('id');
  326.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  327.         $andamentoSolicitacao $this->managerRegistry->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
  328.         $profissionais = [];
  329.         if($andamentoSolicitacao->getAgendamento())
  330.             foreach ($andamentoSolicitacao->getAgendamento()->getProfissionais() as $profissional){
  331.                 $profissionais[] = $profissional->getId();
  332.             }
  333.         $response = [
  334.             'id' => $andamentoSolicitacao->getId(),
  335.             'status' => ($andamentoSolicitacao->getStatusSolicitacao())? $andamentoSolicitacao->getStatusSolicitacao()->getId(): null,
  336.             'solicitacao' => $andamentoSolicitacao->getSolicitacao()->getId(),
  337.             'assunto' => $andamentoSolicitacao->getAssunto(),
  338.             'mensagem' => $andamentoSolicitacao->getMensagem(),
  339.             'visivel' => $andamentoSolicitacao->getVisivel(),
  340.             'agendamento' => !$andamentoSolicitacao->getAgendamento()? null : [
  341.                 'id' => $andamentoSolicitacao->getAgendamento()->getId(),
  342.                 'data' => date_format($andamentoSolicitacao->getAgendamento()->getData(), 'Y-m-d'),
  343.                 'periodo' => date_format($andamentoSolicitacao->getAgendamento()->getHora(), 'H:i'),
  344.                 'observacoes' => $andamentoSolicitacao->getAgendamento()->getObservacoes(),
  345.                 'profissionais' => $profissionais,
  346.                 'anexos' => $this->mediaService->getGalleryJson($andamentoSolicitacao->getAgendamento()->getAnexos()),
  347.             ],
  348.         ];
  349.         return $this->json($response);
  350.     }
  351.     public function listAndamentoSolicitacaoAction(Request $request): JsonResponse
  352.     {
  353.         $em $this->managerRegistry->getManager();
  354.         $data json_decode$request->getContent() );
  355.         $solicitacao $data->solicitacao;
  356.         $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao], ['createdAt' => 'DESC']);
  357.         $response = [];
  358.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  359.         foreach ($andamentos as $andamentoSolicitacao) {
  360.             $response[] = [
  361.                 'id' => $andamentoSolicitacao->getId(),
  362.                 'status' => ($andamentoSolicitacao->getStatusSolicitacao())? $andamentoSolicitacao->getStatusSolicitacao()->getStatus(): null,
  363.                 'solicitacao' => $andamentoSolicitacao->getSolicitacao()->getId(),
  364.                 'assunto' => $andamentoSolicitacao->getAssunto(),
  365.                 'mensagem' => $andamentoSolicitacao->getMensagem(),
  366.                 'visivel' => $andamentoSolicitacao->getVisivel(),
  367.                 'createdAt' => $andamentoSolicitacao->getCreatedAt()? date_format($andamentoSolicitacao->getCreatedAt(),"d/m/Y H:i:s"): null,
  368.                 'updatedAt' => $andamentoSolicitacao->getUpdatedAt()? date_format($andamentoSolicitacao->getUpdatedAt(),"d/m/Y H:i:s"): null,
  369.             ];
  370.         }
  371.         return $this->json($response);
  372.     }
  373.     public function novoAndamentoSolicitacaoAction(Request $request): JsonResponse
  374.     {
  375.         $em $this->managerRegistry->getManager();
  376.         $data = (object) $request->request->all();
  377.         $status $data->status;
  378.         $solicitacao $data->solicitacao;
  379.         $mensagem $data->mensagem;
  380.         $visivel $data->visivel;
  381.         $agendamentoPeriodo $data->agendamento['periodo'];
  382.         $agendamentoData $data->agendamento['data'];
  383.         $agendamentoProfissionais explode(',',$data->agendamento['profissionais'] );
  384.         $agendamentoObservacoes $data->agendamento['observacoes'];
  385.         $anexos = [];
  386.         for ($i=0$i<10$i++) {
  387.             if (isset($request->files->get('agendamento')['file-' $i]))
  388.             {
  389.                 $file $request->files->get('agendamento')['file-'.$i];
  390.                 if($file)
  391.                     $anexos[] = $file;
  392.             }
  393.         }
  394. /*
  395.         var_dump($anexos);
  396.         return $this->json('');*/
  397.         $andamentoSolicitacao = new AndamentoSolicitacao();
  398.         $andamentoSolicitacao->setAlteradoPor($this->getUser());
  399.         $andamentoSolicitacao->setCriadoPor($this->getUser());
  400.         $andamentoSolicitacao->setVisivel($visivel);
  401.         $andamentoSolicitacao->setMensagem($mensagem);
  402.         $solicitacao $em->getRepository(Solicitacao::class)->findOneBy(['id' => $solicitacao]);
  403.         if($solicitacao)
  404.             $andamentoSolicitacao->setSolicitacao($solicitacao);
  405.         $status $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
  406.         if($status)
  407.             $andamentoSolicitacao->setStatusSolicitacao($status);
  408.         if(in_array($status->getId(), [4,6])){
  409.             $agendamento = new Agendamento();
  410.             $agendamento->setData(new \DateTime($agendamentoData));
  411.             $agendamento->setHora(new \DateTime($agendamentoPeriodo));
  412.             $agendamento->setObservacoes($agendamentoObservacoes);
  413.             foreach ($agendamentoProfissionais as $profissional){
  414.                 $profissional $em->getRepository(Profissional::class)->find($profissional);
  415.                 if($profissional)
  416.                     $agendamento->getProfissionais()->add($profissional);
  417.             }
  418.             if($anexos){
  419.                 $agendamento->setAnexos($this->mediaService->createGallery());
  420.                 $medias $this->mediaService->createMultipleMedia($anexos);
  421.                 $this->mediaService->addMediaInGallery($medias$agendamento->getAnexos());
  422.             }
  423.             $em->persist($agendamento);
  424.             $em->flush();
  425.             $andamentoSolicitacao->setAgendamento($agendamento);
  426.             $em->persist($andamentoSolicitacao);
  427.             $em->flush();
  428.             $this->createOrdemServico($agendamento$solicitacao$andamentoSolicitacao);
  429.         }
  430.         $em->persist($andamentoSolicitacao);
  431.         $em->flush();
  432.         if($andamentoSolicitacao->getVisivel()){
  433.             $solicitacao $andamentoSolicitacao->getSolicitacao();
  434.             $solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
  435.             $solicitacao->setUltimaInteracao('Atendimento');
  436.             $em->persist($solicitacao);
  437.             $em->flush();
  438.             $this->notificarCliente($andamentoSolicitacao->getSolicitacao());
  439.             if($status->getId() === 7){
  440.                 $this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
  441.             }
  442.         }
  443.         return $this->json(['status' => true]);
  444.     }
  445.     public function editAndamentoSolicitacaoAction(Request $request): JsonResponse
  446.     {
  447.         $em $this->managerRegistry->getManager();
  448.         $data json_decode$request->getContent() );
  449.         $id $data->id;
  450.         $status $data->status;
  451.         $solicitacao $data->solicitacao;
  452.         $mensagem $data->mensagem;
  453.         $visivel $data->visivel;
  454.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  455.         $andamentoSolicitacao $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
  456.         $status $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
  457.         if($status)
  458.             $andamentoSolicitacao->setStatusSolicitacao($status);
  459.         $andamentoSolicitacao->setMensagem($mensagem);
  460.         $andamentoSolicitacao->setVisivel($visivel);
  461.         $andamentoSolicitacao->setAlteradoPor($this->getUser());
  462.         if(in_array($status->getId(), [4,6])){
  463.             $agendamento $andamentoSolicitacao->getAgendamento();
  464.             if(!$agendamento)
  465.                 $agendamento = new Agendamento();
  466.             $agendamento->setData(new \DateTime($data->agendamento->data));
  467.             $agendamento->setHora(new \DateTime($data->agendamento->periodo));
  468.             $agendamento->setObservacoes($data->agendamento->observacoes);
  469.             $agendamento->getProfissionais()->clear();
  470.             foreach ($data->agendamento->profissionais as $profissional){
  471.                 $profissional $em->getRepository(Profissional::class)->find($profissional);
  472.                 if($profissional)
  473.                     $agendamento->getProfissionais()->add($profissional);
  474.             }
  475.             $em->persist($agendamento);
  476.             $em->flush();
  477.             $andamentoSolicitacao->setAgendamento($agendamento);
  478.             $em->persist($andamentoSolicitacao);
  479.             $em->flush();
  480.       /*      $resposta  = new RespostaSolicitacao();
  481.             $resposta->setMensagem('Sua vistoria foi agendada para o dia '.
  482.                 $this->formatDate($agendamento->getData()) . ' às '. $this->formatTime($agendamento->getHora())
  483.             );
  484.             $resposta->setRespondidoPor('atendimento');
  485.             $resposta->setAndamentoSolicitacao($andamentoSolicitacao);
  486.             $em->persist($resposta);
  487.             $em->flush();*/
  488.             //$this->createOrdemServico($agendamento);
  489.         }else{
  490.             if($andamentoSolicitacao->getAgendamento()){
  491.                 $em->remove($andamentoSolicitacao->getAgendamento());
  492.                 $em->flush();
  493.             }
  494.             $andamentoSolicitacao->setAgendamento(null);
  495.         }
  496.         $em->persist($andamentoSolicitacao);
  497.         $em->flush();
  498.         if($andamentoSolicitacao->getVisivel()){
  499.             $solicitacao $andamentoSolicitacao->getSolicitacao();
  500.             $solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
  501.             $solicitacao->setUltimaInteracao('Atendimento');
  502.             $em->persist($solicitacao);
  503.             $em->flush();
  504.             $this->notificarCliente($andamentoSolicitacao->getSolicitacao());
  505.             if($status->getId() === 7){
  506.                 $this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
  507.             }
  508.         }
  509.         return $this->json(['status' => true]);
  510.     }
  511.     public function deleteAndamentoSolicitacaoAction(Request $request): JsonResponse
  512.     {
  513.         $em $this->managerRegistry->getManager();
  514.         $data json_decode$request->getContent() );
  515.         $id $data->id;
  516.         /** @var $andamento AndamentoSolicitacao */
  517.         $andamento $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
  518.         if(!$andamento)
  519.             return $this->json(['message' => 'Andamento não encontrado.'],400);
  520.         if($andamento->getAgendamento())
  521.             if(count($andamento->getAgendamento()->getOrdemServicos()->toArray()))
  522.                 return $this->json(['message' => 'Não é possível excluir o status atual pois ele possui uma ordem de serviço associada!'],400);
  523.         if($andamento->getAgendamento()){
  524.             $em->remove($andamento->getAgendamento());
  525.             $em->flush();
  526.         }
  527.         /** @var $solicitacao Solicitacao */
  528.         $solicitacao $andamento->getSolicitacao();
  529.         $em->remove($andamento);
  530.         $em->flush();
  531.         /** @var $andamento AndamentoSolicitacao */
  532.         $andamento $solicitacao->getAndamentoSolicitacao()->last();
  533.         $solicitacao->setStatusAtual(($andamento)? $andamento->getStatusSolicitacao() : null);
  534.         $em->persist($solicitacao);
  535.         $em->flush();
  536.         return $this->json([]);
  537.     }
  538.     /************************************************************************************************************
  539.      * Respostas
  540.      */
  541.     public function listRespostasSolicitacaoAction(Request $request): JsonResponse
  542.     {
  543.         $em $this->managerRegistry->getManager();
  544.         $data json_decode$request->getContent() );
  545.         $andamento $data->andamento;
  546.         $respostas $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento], ['createdAt' => 'DESC']);
  547.         $response = [];
  548.         /** @var $resposta RespostaSolicitacao */
  549.         foreach ($respostas as $resposta) {
  550.             $response[] = [
  551.                 'id' => $resposta->getId(),
  552.                 'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  553.                 'assunto' => $resposta->getAssunto(),
  554.                 'mensagem' => $resposta->getMensagem(),
  555.                 'respondidoPor' => $resposta->getRespondidoPor(),
  556.                 'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
  557.                 'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
  558.             ];
  559.         }
  560.         return $this->json($response);
  561.     }
  562.     public function getRespostaSolicitacaoAction(Request $request): JsonResponse
  563.     {
  564.         $this->validateAccess("listAction");
  565.         $id $request->get('id');
  566.         /** @var $resposta RespostaSolicitacao */
  567.         $resposta $this->managerRegistry->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  568.         $response = [
  569.             'id' => $resposta->getId(),
  570.             'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  571.             'assunto' => $resposta->getAssunto(),
  572.             'mensagem' => $resposta->getMensagem(),
  573.             'respondidoPor' => $resposta->getRespondidoPor(),
  574.             'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
  575.             'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
  576.         ];
  577.         return $this->json($response);
  578.     }
  579.     public function novaRespostaSolicitacaoAction(Request $request): JsonResponse
  580.     {
  581.         $em $this->managerRegistry->getManager();
  582.         $solicitacao $request->request->get('solicitacao');
  583.         $mensagem $request->request->get('mensagem');
  584.         $anexos = [];
  585.         for ($i=0$i<10$i++){
  586.             $file $request->files->get('file-'.$i);
  587.             if($file)
  588.                 $anexos[] = $file;
  589.         }
  590.         if(!$mensagem)
  591.             return $this->json(['message' => 'Mensagem não encontrado.'],400);
  592.         $solicitacao $em->getRepository(Solicitacao::class)->find($solicitacao);
  593.         if(!$solicitacao)
  594.             return $this->json(['message' => 'Solicitação não encontrado.'],400);
  595.         $resposta = new RespostaSolicitacao();
  596.         $resposta->setAndamentoSolicitacao($solicitacao->getAndamentoSolicitacao()->last());
  597.         $resposta->setMensagem($mensagem);
  598.         $resposta->setRespondidoPor('atendimento');
  599.         $resposta->setAdminResposta($this->getUser());
  600.         if($anexos){
  601.             /** Cria Galeria caso não exista */
  602.             $resposta->setAnexos($this->mediaService->createGallery());
  603.             /** Cria as Medias e retorna array */
  604.             $medias $this->mediaService->createMultipleMedia($anexos);
  605.             /** Adicionar medias em galeria */
  606.             $this->mediaService->addMediaInGallery($medias$resposta->getAnexos());
  607.         }
  608.         $em->persist($resposta);
  609.         $em->flush();
  610.         if($resposta->getAndamentoSolicitacao()->getVisivel()){
  611.             $solicitacao $resposta->getAndamentoSolicitacao()->getSolicitacao();
  612.             $solicitacao->setUltimaInteracao('Atendimento');
  613.             $em->persist($solicitacao);
  614.             $em->flush();
  615.             $this->notificarCliente($solicitacao);
  616.         }
  617.         return $this->json(['status' => true]);
  618.     }
  619.     public function editRespostaSolicitacaoAction(Request $request): JsonResponse
  620.     {
  621.         $em $this->managerRegistry->getManager();
  622.         $data json_decode$request->getContent() );
  623.         $id $data->id;
  624.         $andamento $data->andamento;
  625.         $mensagem $data->mensagem;
  626.         /** @var $resposta RespostaSolicitacao */
  627.         $resposta $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  628.         $resposta->setMensagem($mensagem);
  629.         $em->persist($resposta);
  630.         $em->flush();
  631.         if($resposta->getAndamentoSolicitacao()->getVisivel()){
  632.             $solicitacao $resposta->getAndamentoSolicitacao()->getSolicitacao();
  633.             $solicitacao->setUltimaInteracao('Atendimento');
  634.             $em->persist($solicitacao);
  635.             $em->flush();
  636.             $this->notificarCliente($solicitacao);
  637.         }
  638.         return $this->json(['status' => true]);
  639.     }
  640.     public function deleteRespostaSolicitacaoAction(Request $request): JsonResponse
  641.     {
  642.         $em $this->managerRegistry->getManager();
  643.         $data json_decode$request->getContent() );
  644.         $id $data->id;
  645.         $resposta $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  646.         if(!$resposta)
  647.             return $this->json(['message' => 'Resposta não encontrado.'],400);
  648.         $em->remove($resposta);
  649.         $em->flush();
  650.         return $this->json([]);
  651.     }
  652.     /************************************************************************************************************
  653.      * Ordem de Serviço
  654.      */
  655.     public function apiListOrdemServicoAction(Request $request): JsonResponse
  656.     {
  657.         $em $this->managerRegistry->getManager();
  658.         $data json_decode$request->getContent() );
  659.         $solicitacao $data->solicitacao;
  660.         $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao], ['createdAt' => 'DESC']);
  661.         $response = [];
  662.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  663.         foreach ($andamentos as $andamentoSolicitacao) {
  664.             if(!$andamentoSolicitacao->getAgendamento())
  665.                 continue;
  666.             /** @var $ordemServico OrdemServico */
  667.             foreach ($andamentoSolicitacao->getAgendamento()->getOrdemServicos() as $ordemServico){
  668.                 $response[] = [
  669.                     'id' => $ordemServico->getId(),
  670.                     'codigo' => $ordemServico->getCodigo(),
  671.                     'profissional' => $ordemServico->getProfissional()->getNomecompleto(),
  672.                     'status' => $ordemServico->getStatus(),
  673.                     'dataAgendamento' => $this->formatDate($ordemServico->getData()),
  674.                     'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
  675.                     'createdAt' => $this->formatDateTime($ordemServico->getCreatedAt()),
  676.                     'updatedAt' => $this->formatDateTime($ordemServico->getUpdatedAt()),
  677.                 ];
  678.             }
  679.         }
  680.         return $this->json($response);
  681.     }
  682.     public function apiGetOrdemServicoAction(Request $request): JsonResponse
  683.     {
  684.         $this->validateAccess("listAction");
  685.         $id $request->get('id');
  686.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  687.         $ordemServico $this->managerRegistry->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
  688.         if(!$ordemServico)
  689.             return $this->json(['status' => false'message' => 'Ordem de serviço não encontrada!']);
  690.         /** @var Solicitacao $solicitacao */
  691.         $solicitacao $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  692.         $response = [
  693.             'id' => $ordemServico->getId(),
  694.             'codigo' => $ordemServico->getCodigo(),
  695.             'status' => $ordemServico->getStatus(),
  696.             'dataAgendamento' => $this->formatDate($ordemServico->getData()),
  697.             'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
  698.             'mensagemDinamica' => $ordemServico->getAgendamento()->getObservacoes(),
  699.             'cliente' => (!$solicitacao->getCliente())? null: [
  700.                 'id' => $solicitacao->getCliente()->getId(),
  701.                 'nome' => $solicitacao->getCliente()->getNomeCompleto(),
  702.                 'telefone' => $solicitacao->getCliente()->getTelefone(),
  703.                 'email' => $solicitacao->getCliente()->getEmail(),
  704.             ],
  705.             'unidade' => (!$solicitacao->getUnidade())? null: [
  706.                 'empreendimento' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  707.                 'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  708.                 'unidade' => $solicitacao->getUnidade()->getUnidade(),
  709.             ],
  710.             'agendamento' => (!$ordemServico->getAgendamento())? null: [
  711.                 'id'=> $ordemServico->getAgendamento()->getId()
  712.             ],
  713.             'profissional' => (!$ordemServico->getProfissional())? null: [
  714.                 'id'=> $ordemServico->getProfissional()->getId(),
  715.                 'nomeCompleto'=> $ordemServico->getProfissional()->getNomecompleto(),
  716.                 'email'=> $ordemServico->getProfissional()->getEmail(),
  717.             ],
  718.             'descricao' => $ordemServico->getDescricao(),
  719.             'anexosPreparacao' => $this->mediaService->getGalleryJson($ordemServico->getAnexosPreparacao()),
  720.             'anexosTrabalhoAndamento' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoAndamento()),
  721.             'anexosTrabalhoFinalizado' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoFinalizado()),
  722.             'assinaturaCliente' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaCliente()),
  723.             'assinaturaProfissional' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaProfissional()),
  724.             'aCaminho' => $this->formatDateTime($ordemServico->getDataACaminho()),
  725.             'inicioAtendimento' => $this->formatDateTime($ordemServico->getDataIniciarAtendimento()),
  726.             'finalAtendimento' => $this->formatDateTime($ordemServico->getDataFinalAtendimento()),
  727.             'criadoEm' => $this->formatDateTime($ordemServico->getCreatedAt()),
  728.             'atualizadoEm' => $this->formatDateTime($ordemServico->getUpdatedAt()),
  729.         ];
  730.         return $this->json($response);
  731.     }
  732.     public function deleteOrdemServicoAction(Request $request): JsonResponse
  733.     {
  734.         $em $this->managerRegistry->getManager();
  735.         $id $request->get('id');
  736.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
  737.         if(!$ordemServico)
  738.             return $this->json(['message' => 'Ordem de serviço não encontrado.'],400);
  739.         $em->remove($ordemServico);
  740.         $em->flush();
  741.         return $this->json([]);
  742.     }
  743.     /************************************************************************************************************
  744.      * Chat
  745.      */
  746.     public function chatAction(Request $request): JsonResponse
  747.     {
  748.         $em $this->managerRegistry->getManager();
  749.         $solicitacao $request->get('solicitacao');
  750.         $response $this->getDataChat($solicitacao);
  751.         return new JsonResponse($response);
  752.     }
  753.     public function getDataChat($solicitacaoId)
  754.     {
  755.         $em $this->managerRegistry->getManager();
  756.         $andamentos $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacaoId], ['createdAt' => 'ASC']);
  757.         $response = [];
  758.         /** @var $andamento AndamentoSolicitacao */
  759.         foreach ($andamentos as $andamento) {
  760.             $respostasData $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento->getId()], ['createdAt' => 'ASC']);
  761.             $respostas = [];
  762.             /** @var $resposta RespostaSolicitacao */
  763.             foreach ($respostasData as $resposta) {
  764.                 $respostas[] = [
  765.                     'id' => $resposta->getId(),
  766.                     'assunto' => $resposta->getAssunto(),
  767.                     'mensagem' => $resposta->getMensagem(),
  768.                     'respondidoPor' => $resposta->getRespondidoPor(),
  769.                     'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()) ,
  770.                     'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
  771.                     'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
  772.                 ];
  773.             }
  774.             $profissionais = [];
  775.             if($andamento->getAgendamento())
  776.                 foreach ($andamento->getAgendamento()->getProfissionais() as $profissional){
  777.                     $profissionais[] = $profissional->getId();
  778.                 }
  779.             $response[] = [
  780.                 'id' => $andamento->getId(),
  781.                 'status' => !$andamento->getStatusSolicitacao()? null: [
  782.                     'id' => $andamento->getStatusSolicitacao()->getId(),
  783.                     'status' => $andamento->getStatusSolicitacao()->getStatus(),
  784.                 ],
  785.                 'assunto' => $andamento->getAssunto(),
  786.                 'mensagem' => $andamento->getMensagem(),
  787.                 'visivel' =>  $andamento->getVisivel(),
  788.                 'criadoEm' =>  $this->formatDateTime($andamento->getCreatedAt()),
  789.                 'atualizadoEm' => $this->formatDateTime($andamento->getUpdatedAt()) ,
  790.                 'agendamento' => !$andamento->getAgendamento()? null : [
  791.                     'id' => $andamento->getAgendamento()->getId(),
  792.                     'data' => date_format($andamento->getAgendamento()->getData(), 'Y-m-d'),
  793.                     'periodo' => date_format($andamento->getAgendamento()->getData(), 'h:i'),
  794.                     'observacoes' => $andamento->getAgendamento()->getObservacoes(),
  795.                     'profissionais' => $profissionais,
  796.                 ],
  797.                 'respostas' => $respostas,
  798.             ];
  799.         }
  800.         return $response;
  801.     }
  802.     /************************************************************************************************************
  803.      * Aux
  804.      */
  805.     public function createPesquisaSatisfacao(Solicitacao $solicitacao)
  806.     {
  807.         $pesquisa = new PesquisaSatisfacao();
  808.         $pesquisa->setSolicitacao($solicitacao);
  809.         $pesquisa->setCliente($solicitacao->getCliente());
  810.         $this->managerRegistry->getManager()->persist($pesquisa);
  811.         $this->managerRegistry->getManager()->flush();
  812.         $mail $this->serviceEmail->getEmail();
  813.         $mail->addAddress($solicitacao->getCliente()->getEmail());
  814.         $mail->Subject 'Aguardando Avaliação';
  815.         $mail->Body $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_pesquisa_satisfacao.html.twig', [
  816.             'solicitacao' => $solicitacao,
  817.         ]);
  818.         $mail->send();
  819.     }
  820.     public function notificarCliente(Solicitacao $solicitacao): void
  821.     {
  822.         $mail $this->serviceEmail->getEmail();
  823.         $mail->addAddress($solicitacao->getCliente()->getEmail());
  824.         $mail->Subject 'Atualização de Solicitação';
  825.         $mail->Body $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_atualizacao_solicitacao.html.twig', [
  826.             'solicitacao' => $solicitacao,
  827.         ]);
  828.         $mail->send();
  829.     }
  830.     public function notificarResponsavelAtendimento(Solicitacao $solicitacao): void
  831.     {
  832.         /*$mail = $this->serviceEmail->getEmail();
  833.         $mail->addAddress($solicitacao->getResponsavelAtendimento()->getEmail());
  834.         $mail->Subject = 'Atribuição de Solicitação';
  835.         $mail->Body = $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_reponsavelAtendimento.html.twig', [
  836.             'solicitacao' => $solicitacao,
  837.         ]);
  838.         $mail->send();*/
  839.     }
  840.     public function createOrdemServico(Agendamento $agendamentoSolicitacao $solicitacaoAndamentoSolicitacao $andamento): void
  841.     {
  842.         $em $this->managerRegistry->getManager();
  843.         $empresa $this->serviceEmail->getEmpresa();
  844.         /** @var $profissional Profissional */
  845.         foreach ($agendamento->getProfissionais() as $profissional) {
  846.             $ordemServico = new OrdemServico();
  847.             $ordemServico->setAgendamento($agendamento);
  848.             $ordemServico->setData($agendamento->getData());
  849.             $ordemServico->setHora($agendamento->getHora());
  850.             $ordemServico->setProfissional($profissional);
  851.             $ordemServico->setStatus('Agendado');
  852.             $em->persist($ordemServico);
  853.             $em->flush();
  854.             $ordemServico->setCodigo("DIN00" $ordemServico->getId() . "-1");
  855.             $em->persist($ordemServico);
  856.             $em->flush();
  857.             $resposta  = new RespostaSolicitacao();
  858.             $resposta->setMensagem('Prezado(a) Senhor(a) '.$solicitacao->getCliente()->getNomeCompleto().'.
  859.             Agendamos para o dia '.$this->formatDate($agendamento->getData()).' às '.date_format($agendamento->getHora(),'H:i').'h a visita técnica.
  860.             Havendo qualquer dúvida, estamos à total disposição.
  861.             Atenciosamente,
  862.             Pedro Pachion');
  863.             $resposta->setRespondidoPor('atendimento');
  864.             $resposta->setAndamentoSolicitacao($andamento);
  865.             $em->persist($resposta);
  866.             $em->flush();
  867.             $urlProfissional = ( (substr($empresa->getUrlCliente(), -1) == '/')? $empresa->getUrlCliente(): $empresa->getUrlCliente().'/')
  868.                 .'os/'.$profissional->getId().'/'.str_replace(' ''-'$profissional->getNomecompleto());
  869.             /** START Fluxo SMS */
  870.             $phone = ($profissional->getTelefone1())?: $profissional->getTelefone2();
  871.             $nomeProfissional explode(' '$profissional->getNomecompleto());
  872.                         
  873.             $message "Olá "$nomeProfissional[0] .", a OS "$ordemServico->getCodigo() .
  874.                 " está disponível para a execução, acesse: ".
  875.                 $urlProfissional " Att, " $empresa->getNome();
  876.             
  877.             if($phone)
  878.                 $this->serviceComteleSMS->sendSMS($phone,$message);
  879.             /** END Fluxo SMS */
  880.             /** START Fluxo Email */
  881.             $mail $this->serviceEmail->getEmail();
  882.             $mail->addAddress($profissional->getEmail());
  883.             if($solicitacao->getResponsavelAtendimento())
  884.                 $mail->addReplyTo($solicitacao->getResponsavelAtendimento()->getEmail());
  885.             $mail->Subject 'Nova Ordem de Serviço';
  886.             $mail->Body $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_profissional_os_criada.html.twig', [
  887.                 'profissional' => $profissional,
  888.                 'os' => $ordemServico,
  889.                 'urlProfissional' => $urlProfissional,
  890.             ]);
  891.             $mail->send();
  892.             /** END Fluxo Email */
  893.         }
  894.     }
  895.     public function apiDashboardSolicitacoesAction(Request $request)
  896.     {
  897.         $em $this->managerRegistry->getManager();
  898.         $empreendimentosFilter = ($request->query->get('empreendimentos'))? explode(","$request->query->get('empreendimentos')): false;
  899.         $dataAgendamentoDe = ($request->query->get('dataAgendamentoDe'))? new \DateTime($request->query->get('dataAgendamentoDe')): false;
  900.         $dataAgendamentoAte = ($request->query->get('dataAgendamentoAte'))? new \DateTime($request->query->get('dataAgendamentoAte')): false;
  901.         $solicitacoes $em->getRepository(Solicitacao::class)->findBy(['statusAtual' => 4]);
  902.         $solicitacoesAgendadas = [];
  903.         /** @var $solicitacao Solicitacao */
  904.         foreach ($solicitacoes as $solicitacao) {
  905.             $andamento $solicitacao->getAndamentoSolicitacao()->last();
  906.             /** @var $agendamento Agendamento */
  907.             $agendamento $andamento->getAgendamento();
  908.             if(!$agendamento)
  909.                 continue;
  910.             $profissionais "";
  911.             foreach ($agendamento->getProfissionais() as $profissional) {
  912.                 $profissionais .= $profissional->getNomecompleto() . ', ';
  913.             }
  914.             $dateNow = new \DateTime('now');
  915.             /*if($agendamento->getData() < $dateNow)
  916.                 continue;*/
  917.             if($empreendimentosFilter && !in_array($solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(), $empreendimentosFilter))
  918.                 continue;
  919.             if($dataAgendamentoDe && ($dataAgendamentoDe $agendamento->getData()))
  920.                 continue;
  921.             if($dataAgendamentoAte && ($dataAgendamentoAte $agendamento->getData()))
  922.                 continue;
  923.             $solicitacoesAgendadas[] = [
  924.                 'id' => $solicitacao->getId(),
  925.                 'codigo' => $solicitacao->getCodigo(),
  926.                 'empreendimento'=> $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  927.                 'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  928.                 'unidade' => $solicitacao->getUnidade()->getUnidade(),
  929.                 'cliente' => $solicitacao->getCliente()->getNomeCompleto(),
  930.                 'profissional' => $profissionais,
  931.                 'dataAgendamento' => date_format($agendamento->getData(), 'd/m/Y') . ' ' .date_format($agendamento->getHora(), 'H:i'),
  932.                 'mensagem' => $solicitacao->getMensagem(),
  933.             ];
  934.         }
  935.         $empreendimentos = [];
  936.         foreach ($em->getRepository(Empreendimento::class)->findBy([], ['nome' => 'ASC']) as $empreendimento) {
  937.             $empreendimentos[] = [
  938.                 'id' => $empreendimento->getId(),
  939.                 'name' => $empreendimento->getNome(),
  940.             ];
  941.         }
  942.         return $this->json([
  943.            'solicitacoesAgendadas' => $solicitacoesAgendadas,
  944.             'empreendimentos' => $empreendimentos,
  945.         ]);
  946.     }
  947. }