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

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(enable: true, title: '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(enable: true, title: '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(enable: true, title: '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(enable: true, title: '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(), 0, 3)) :
  132.                     strtoupper(substr($data->getCliente()->getCnpj(), 0, 3)) ;
  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(enable: true, title: '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($request, true);
  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(), 0, 3)) :
  187.                     strtoupper(substr($data->getCliente()->getCnpj(), 0, 3))) ;
  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(enable: true, title: '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(enable: true, title: '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(enable: true, title: '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(enable: true, title: '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 $request, string $revision): Response
  311.     {
  312.         $this->validateAccess("historyAction");
  313.         return parent::historyViewRevisionAction($request, $revision);
  314.     }
  315.     public function historyCompareRevisionsAction(Request $request, string $baseRevision, string $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.         $solicitacao = $em->getRepository(Solicitacao::class)->findOneBy(['id' => $solicitacao]);
  402.         if($solicitacao)
  403.             $andamentoSolicitacao->setSolicitacao($solicitacao);
  404.         $status = $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
  405.         if($status)
  406.             $andamentoSolicitacao->setStatusSolicitacao($status);
  407.         if(in_array($status->getId(), [4,6])){
  408.             $agendamento = new Agendamento();
  409.             $agendamento->setData(new \DateTime($agendamentoData));
  410.             $agendamento->setHora(new \DateTime($agendamentoPeriodo));
  411.             $agendamento->setObservacoes($agendamentoObservacoes);
  412.             foreach ($agendamentoProfissionais as $profissional){
  413.                 $profissional = $em->getRepository(Profissional::class)->find($profissional);
  414.                 if($profissional)
  415.                     $agendamento->getProfissionais()->add($profissional);
  416.             }
  417.             if($anexos){
  418.                 $agendamento->setAnexos($this->mediaService->createGallery());
  419.                 $medias = $this->mediaService->createMultipleMedia($anexos);
  420.                 $this->mediaService->addMediaInGallery($medias, $agendamento->getAnexos());
  421.             }
  422.             $mensagem = str_replace(
  423.                 ['{data}', '{hora}'],
  424.                 [$this->formatDate($agendamento->getData()), date_format($agendamento->getHora(), 'H:i')],
  425.                 $mensagem
  426.             );
  427.             $em->persist($agendamento);
  428.             $em->flush();
  429.             $andamentoSolicitacao->setAgendamento($agendamento);
  430.             $andamentoSolicitacao->setMensagem($mensagem);
  431.             $em->persist($andamentoSolicitacao);
  432.             $em->flush();
  433.             $this->createOrdemServico($agendamento, $solicitacao, $andamentoSolicitacao);
  434.         } else {
  435.             $andamentoSolicitacao->setMensagem($mensagem);
  436.         }
  437.         $em->persist($andamentoSolicitacao);
  438.         $em->flush();
  439.         if($andamentoSolicitacao->getVisivel()){
  440.             $solicitacao = $andamentoSolicitacao->getSolicitacao();
  441.             $solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
  442.             $solicitacao->setUltimaInteracao('Atendimento');
  443.             $em->persist($solicitacao);
  444.             $em->flush();
  445.             $this->notificarCliente($andamentoSolicitacao->getSolicitacao());
  446.             if($status->getId() === 7){
  447.                 $this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
  448.             }
  449.         }
  450.         return $this->json(['status' => true]);
  451.     }
  452.     public function editAndamentoSolicitacaoAction(Request $request): JsonResponse
  453.     {
  454.         $em = $this->managerRegistry->getManager();
  455.         $data = json_decode( $request->getContent() );
  456.         $id = $data->id;
  457.         $status = $data->status;
  458.         $solicitacao = $data->solicitacao;
  459.         $mensagem = $data->mensagem;
  460.         $visivel = $data->visivel;
  461.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  462.         $andamentoSolicitacao = $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
  463.         $status = $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
  464.         if($status)
  465.             $andamentoSolicitacao->setStatusSolicitacao($status);
  466.         $andamentoSolicitacao->setMensagem($mensagem);
  467.         $andamentoSolicitacao->setVisivel($visivel);
  468.         $andamentoSolicitacao->setAlteradoPor($this->getUser());
  469.         if(in_array($status->getId(), [4,6])){
  470.             $agendamento = $andamentoSolicitacao->getAgendamento();
  471.             if(!$agendamento)
  472.                 $agendamento = new Agendamento();
  473.             $agendamento->setData(new \DateTime($data->agendamento->data));
  474.             $agendamento->setHora(new \DateTime($data->agendamento->periodo));
  475.             $agendamento->setObservacoes($data->agendamento->observacoes);
  476.             $agendamento->getProfissionais()->clear();
  477.             foreach ($data->agendamento->profissionais as $profissional){
  478.                 $profissional = $em->getRepository(Profissional::class)->find($profissional);
  479.                 if($profissional)
  480.                     $agendamento->getProfissionais()->add($profissional);
  481.             }
  482.             $em->persist($agendamento);
  483.             $em->flush();
  484.             $andamentoSolicitacao->setAgendamento($agendamento);
  485.             $em->persist($andamentoSolicitacao);
  486.             $em->flush();
  487.       /*      $resposta  = new RespostaSolicitacao();
  488.             $resposta->setMensagem('Sua vistoria foi agendada para o dia '.
  489.                 $this->formatDate($agendamento->getData()) . ' às '. $this->formatTime($agendamento->getHora())
  490.             );
  491.             $resposta->setRespondidoPor('atendimento');
  492.             $resposta->setAndamentoSolicitacao($andamentoSolicitacao);
  493.             $em->persist($resposta);
  494.             $em->flush();*/
  495.             //$this->createOrdemServico($agendamento);
  496.         }else{
  497.             if($andamentoSolicitacao->getAgendamento()){
  498.                 $em->remove($andamentoSolicitacao->getAgendamento());
  499.                 $em->flush();
  500.             }
  501.             $andamentoSolicitacao->setAgendamento(null);
  502.         }
  503.         $em->persist($andamentoSolicitacao);
  504.         $em->flush();
  505.         if($andamentoSolicitacao->getVisivel()){
  506.             $solicitacao = $andamentoSolicitacao->getSolicitacao();
  507.             $solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
  508.             $solicitacao->setUltimaInteracao('Atendimento');
  509.             $em->persist($solicitacao);
  510.             $em->flush();
  511.             $this->notificarCliente($andamentoSolicitacao->getSolicitacao());
  512.             if($status->getId() === 7){
  513.                 $this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
  514.             }
  515.         }
  516.         return $this->json(['status' => true]);
  517.     }
  518.     public function deleteAndamentoSolicitacaoAction(Request $request): JsonResponse
  519.     {
  520.         $em = $this->managerRegistry->getManager();
  521.         $data = json_decode( $request->getContent() );
  522.         $id = $data->id;
  523.         /** @var $andamento AndamentoSolicitacao */
  524.         $andamento = $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
  525.         if(!$andamento)
  526.             return $this->json(['message' => 'Andamento não encontrado.'],400);
  527.         if($andamento->getAgendamento())
  528.             if(count($andamento->getAgendamento()->getOrdemServicos()->toArray()))
  529.                 return $this->json(['message' => 'Não é possível excluir o status atual pois ele possui uma ordem de serviço associada!'],400);
  530.         if($andamento->getAgendamento()){
  531.             $em->remove($andamento->getAgendamento());
  532.             $em->flush();
  533.         }
  534.         /** @var $solicitacao Solicitacao */
  535.         $solicitacao = $andamento->getSolicitacao();
  536.         $em->remove($andamento);
  537.         $em->flush();
  538.         /** @var $andamento AndamentoSolicitacao */
  539.         $andamento = $solicitacao->getAndamentoSolicitacao()->last();
  540.         $solicitacao->setStatusAtual(($andamento)? $andamento->getStatusSolicitacao() : null);
  541.         $em->persist($solicitacao);
  542.         $em->flush();
  543.         return $this->json([]);
  544.     }
  545.     /************************************************************************************************************
  546.      * Respostas
  547.      */
  548.     public function listRespostasSolicitacaoAction(Request $request): JsonResponse
  549.     {
  550.         $em = $this->managerRegistry->getManager();
  551.         $data = json_decode( $request->getContent() );
  552.         $andamento = $data->andamento;
  553.         $respostas = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento], ['createdAt' => 'DESC']);
  554.         $response = [];
  555.         /** @var $resposta RespostaSolicitacao */
  556.         foreach ($respostas as $resposta) {
  557.             $response[] = [
  558.                 'id' => $resposta->getId(),
  559.                 'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  560.                 'assunto' => $resposta->getAssunto(),
  561.                 'mensagem' => $resposta->getMensagem(),
  562.                 'respondidoPor' => $resposta->getRespondidoPor(),
  563.                 'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
  564.                 'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
  565.             ];
  566.         }
  567.         return $this->json($response);
  568.     }
  569.     public function getRespostaSolicitacaoAction(Request $request): JsonResponse
  570.     {
  571.         $this->validateAccess("listAction");
  572.         $id = $request->get('id');
  573.         /** @var $resposta RespostaSolicitacao */
  574.         $resposta = $this->managerRegistry->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  575.         $response = [
  576.             'id' => $resposta->getId(),
  577.             'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
  578.             'assunto' => $resposta->getAssunto(),
  579.             'mensagem' => $resposta->getMensagem(),
  580.             'respondidoPor' => $resposta->getRespondidoPor(),
  581.             'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
  582.             'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
  583.         ];
  584.         return $this->json($response);
  585.     }
  586.     public function novaRespostaSolicitacaoAction(Request $request): JsonResponse
  587.     {
  588.         $em = $this->managerRegistry->getManager();
  589.         $solicitacao = $request->request->get('solicitacao');
  590.         $mensagem = $request->request->get('mensagem');
  591.         $anexos = [];
  592.         for ($i=0; $i<10; $i++){
  593.             $file = $request->files->get('file-'.$i);
  594.             if($file)
  595.                 $anexos[] = $file;
  596.         }
  597.         if(!$mensagem)
  598.             return $this->json(['message' => 'Mensagem não encontrado.'],400);
  599.         $solicitacao = $em->getRepository(Solicitacao::class)->find($solicitacao);
  600.         if(!$solicitacao)
  601.             return $this->json(['message' => 'Solicitação não encontrado.'],400);
  602.         $resposta = new RespostaSolicitacao();
  603.         $resposta->setAndamentoSolicitacao($solicitacao->getAndamentoSolicitacao()->last());
  604.         $resposta->setMensagem($mensagem);
  605.         $resposta->setRespondidoPor('atendimento');
  606.         $resposta->setAdminResposta($this->getUser());
  607.         if($anexos){
  608.             /** Cria Galeria caso não exista */
  609.             $resposta->setAnexos($this->mediaService->createGallery());
  610.             /** Cria as Medias e retorna array */
  611.             $medias = $this->mediaService->createMultipleMedia($anexos);
  612.             /** Adicionar medias em galeria */
  613.             $this->mediaService->addMediaInGallery($medias, $resposta->getAnexos());
  614.         }
  615.         $em->persist($resposta);
  616.         $em->flush();
  617.         if($resposta->getAndamentoSolicitacao()->getVisivel()){
  618.             $solicitacao = $resposta->getAndamentoSolicitacao()->getSolicitacao();
  619.             $solicitacao->setUltimaInteracao('Atendimento');
  620.             $em->persist($solicitacao);
  621.             $em->flush();
  622.             $this->notificarCliente($solicitacao);
  623.         }
  624.         return $this->json(['status' => true]);
  625.     }
  626.     public function editRespostaSolicitacaoAction(Request $request): JsonResponse
  627.     {
  628.         $em = $this->managerRegistry->getManager();
  629.         $data = json_decode( $request->getContent() );
  630.         $id = $data->id;
  631.         $andamento = $data->andamento;
  632.         $mensagem = $data->mensagem;
  633.         /** @var $resposta RespostaSolicitacao */
  634.         $resposta = $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  635.         $resposta->setMensagem($mensagem);
  636.         $em->persist($resposta);
  637.         $em->flush();
  638.         if($resposta->getAndamentoSolicitacao()->getVisivel()){
  639.             $solicitacao = $resposta->getAndamentoSolicitacao()->getSolicitacao();
  640.             $solicitacao->setUltimaInteracao('Atendimento');
  641.             $em->persist($solicitacao);
  642.             $em->flush();
  643.             $this->notificarCliente($solicitacao);
  644.         }
  645.         return $this->json(['status' => true]);
  646.     }
  647.     public function deleteRespostaSolicitacaoAction(Request $request): JsonResponse
  648.     {
  649.         $em = $this->managerRegistry->getManager();
  650.         $data = json_decode( $request->getContent() );
  651.         $id = $data->id;
  652.         $resposta = $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
  653.         if(!$resposta)
  654.             return $this->json(['message' => 'Resposta não encontrado.'],400);
  655.         $em->remove($resposta);
  656.         $em->flush();
  657.         return $this->json([]);
  658.     }
  659.     /************************************************************************************************************
  660.      * Ordem de Serviço
  661.      */
  662.     public function apiListOrdemServicoAction(Request $request): JsonResponse
  663.     {
  664.         $em = $this->managerRegistry->getManager();
  665.         $data = json_decode( $request->getContent() );
  666.         $solicitacao = $data->solicitacao;
  667.         $andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao], ['createdAt' => 'DESC']);
  668.         $response = [];
  669.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  670.         foreach ($andamentos as $andamentoSolicitacao) {
  671.             if(!$andamentoSolicitacao->getAgendamento())
  672.                 continue;
  673.             /** @var $ordemServico OrdemServico */
  674.             foreach ($andamentoSolicitacao->getAgendamento()->getOrdemServicos() as $ordemServico){
  675.                 $response[] = [
  676.                     'id' => $ordemServico->getId(),
  677.                     'codigo' => $ordemServico->getCodigo(),
  678.                     'profissional' => $ordemServico->getProfissional()->getNomecompleto(),
  679.                     'status' => $ordemServico->getStatus(),
  680.                     'dataAgendamento' => $this->formatDate($ordemServico->getData()),
  681.                     'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
  682.                     'createdAt' => $this->formatDateTime($ordemServico->getCreatedAt()),
  683.                     'updatedAt' => $this->formatDateTime($ordemServico->getUpdatedAt()),
  684.                 ];
  685.             }
  686.         }
  687.         return $this->json($response);
  688.     }
  689.     public function apiGetOrdemServicoAction(Request $request): JsonResponse
  690.     {
  691.         $this->validateAccess("listAction");
  692.         $id = $request->get('id');
  693.         /** @var $andamentoSolicitacao AndamentoSolicitacao */
  694.         $ordemServico = $this->managerRegistry->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
  695.         if(!$ordemServico)
  696.             return $this->json(['status' => false, 'message' => 'Ordem de serviço não encontrada!']);
  697.         /** @var Solicitacao $solicitacao */
  698.         $solicitacao = $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  699.         $response = [
  700.             'id' => $ordemServico->getId(),
  701.             'codigo' => $ordemServico->getCodigo(),
  702.             'status' => $ordemServico->getStatus(),
  703.             'dataAgendamento' => $this->formatDate($ordemServico->getData()),
  704.             'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
  705.             'mensagemDinamica' => $ordemServico->getAgendamento()->getObservacoes(),
  706.             'cliente' => (!$solicitacao->getCliente())? null: [
  707.                 'id' => $solicitacao->getCliente()->getId(),
  708.                 'nome' => $solicitacao->getCliente()->getNomeCompleto(),
  709.                 'telefone' => $solicitacao->getCliente()->getTelefone(),
  710.                 'email' => $solicitacao->getCliente()->getEmail(),
  711.             ],
  712.             'unidade' => (!$solicitacao->getUnidade())? null: [
  713.                 'empreendimento' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  714.                 'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  715.                 'unidade' => $solicitacao->getUnidade()->getUnidade(),
  716.             ],
  717.             'agendamento' => (!$ordemServico->getAgendamento())? null: [
  718.                 'id'=> $ordemServico->getAgendamento()->getId()
  719.             ],
  720.             'profissional' => (!$ordemServico->getProfissional())? null: [
  721.                 'id'=> $ordemServico->getProfissional()->getId(),
  722.                 'nomeCompleto'=> $ordemServico->getProfissional()->getNomecompleto(),
  723.                 'email'=> $ordemServico->getProfissional()->getEmail(),
  724.             ],
  725.             'descricao' => $ordemServico->getDescricao(),
  726.             'anexosPreparacao' => $this->mediaService->getGalleryJson($ordemServico->getAnexosPreparacao()),
  727.             'anexosTrabalhoAndamento' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoAndamento()),
  728.             'anexosTrabalhoFinalizado' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoFinalizado()),
  729.             'assinaturaCliente' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaCliente()),
  730.             'assinaturaProfissional' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaProfissional()),
  731.             'aCaminho' => $this->formatDateTime($ordemServico->getDataACaminho()),
  732.             'inicioAtendimento' => $this->formatDateTime($ordemServico->getDataIniciarAtendimento()),
  733.             'finalAtendimento' => $this->formatDateTime($ordemServico->getDataFinalAtendimento()),
  734.             'criadoEm' => $this->formatDateTime($ordemServico->getCreatedAt()),
  735.             'atualizadoEm' => $this->formatDateTime($ordemServico->getUpdatedAt()),
  736.         ];
  737.         return $this->json($response);
  738.     }
  739.     public function deleteOrdemServicoAction(Request $request): JsonResponse
  740.     {
  741.         $em = $this->managerRegistry->getManager();
  742.         $id = $request->get('id');
  743.         $ordemServico = $em->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
  744.         if(!$ordemServico)
  745.             return $this->json(['message' => 'Ordem de serviço não encontrado.'],400);
  746.         $em->remove($ordemServico);
  747.         $em->flush();
  748.         return $this->json([]);
  749.     }
  750.     /************************************************************************************************************
  751.      * Chat
  752.      */
  753.     public function chatAction(Request $request): JsonResponse
  754.     {
  755.         $em = $this->managerRegistry->getManager();
  756.         $solicitacao = $request->get('solicitacao');
  757.         $response = $this->getDataChat($solicitacao);
  758.         return new JsonResponse($response);
  759.     }
  760.     public function getDataChat($solicitacaoId)
  761.     {
  762.         $em = $this->managerRegistry->getManager();
  763.         $andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacaoId], ['createdAt' => 'ASC']);
  764.         $response = [];
  765.         /** @var $andamento AndamentoSolicitacao */
  766.         foreach ($andamentos as $andamento) {
  767.             $respostasData = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento->getId()], ['createdAt' => 'ASC']);
  768.             $respostas = [];
  769.             /** @var $resposta RespostaSolicitacao */
  770.             foreach ($respostasData as $resposta) {
  771.                 $respostas[] = [
  772.                     'id' => $resposta->getId(),
  773.                     'assunto' => $resposta->getAssunto(),
  774.                     'mensagem' => $resposta->getMensagem(),
  775.                     'respondidoPor' => $resposta->getRespondidoPor(),
  776.                     'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()) ,
  777.                     'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
  778.                     'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
  779.                 ];
  780.             }
  781.             $profissionais = [];
  782.             if($andamento->getAgendamento())
  783.                 foreach ($andamento->getAgendamento()->getProfissionais() as $profissional){
  784.                     $profissionais[] = $profissional->getId();
  785.                 }
  786.             $response[] = [
  787.                 'id' => $andamento->getId(),
  788.                 'status' => !$andamento->getStatusSolicitacao()? null: [
  789.                     'id' => $andamento->getStatusSolicitacao()->getId(),
  790.                     'status' => $andamento->getStatusSolicitacao()->getStatus(),
  791.                 ],
  792.                 'assunto' => $andamento->getAssunto(),
  793.                 'mensagem' => $andamento->getMensagem(),
  794.                 'visivel' =>  $andamento->getVisivel(),
  795.                 'criadoEm' =>  $this->formatDateTime($andamento->getCreatedAt()),
  796.                 'atualizadoEm' => $this->formatDateTime($andamento->getUpdatedAt()) ,
  797.                 'agendamento' => !$andamento->getAgendamento()? null : [
  798.                     'id' => $andamento->getAgendamento()->getId(),
  799.                     'data' => date_format($andamento->getAgendamento()->getData(), 'Y-m-d'),
  800.                     'periodo' => date_format($andamento->getAgendamento()->getData(), 'h:i'),
  801.                     'observacoes' => $andamento->getAgendamento()->getObservacoes(),
  802.                     'profissionais' => $profissionais,
  803.                 ],
  804.                 'respostas' => $respostas,
  805.             ];
  806.         }
  807.         return $response;
  808.     }
  809.     /************************************************************************************************************
  810.      * Aux
  811.      */
  812.     public function createPesquisaSatisfacao(Solicitacao $solicitacao)
  813.     {
  814.         $pesquisa = new PesquisaSatisfacao();
  815.         $pesquisa->setSolicitacao($solicitacao);
  816.         $pesquisa->setCliente($solicitacao->getCliente());
  817.         $this->managerRegistry->getManager()->persist($pesquisa);
  818.         $this->managerRegistry->getManager()->flush();
  819.         $mail = $this->serviceEmail->getEmail();
  820.         $mail->addAddress($solicitacao->getCliente()->getEmail());
  821.         $mail->Subject = 'Aguardando Avaliação';
  822.         $mail->Body = $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_pesquisa_satisfacao.html.twig', [
  823.             'solicitacao' => $solicitacao,
  824.         ]);
  825.         $mail->send();
  826.     }
  827.     public function notificarCliente(Solicitacao $solicitacao): void
  828.     {
  829.         $mail = $this->serviceEmail->getEmail();
  830.         $mail->addAddress($solicitacao->getCliente()->getEmail());
  831.         $mail->Subject = 'Atualização de Solicitação';
  832.         $mail->Body = $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_atualizacao_solicitacao.html.twig', [
  833.             'solicitacao' => $solicitacao,
  834.         ]);
  835.         $mail->send();
  836.     }
  837.     public function notificarResponsavelAtendimento(Solicitacao $solicitacao): void
  838.     {
  839.         /*$mail = $this->serviceEmail->getEmail();
  840.         $mail->addAddress($solicitacao->getResponsavelAtendimento()->getEmail());
  841.         $mail->Subject = 'Atribuição de Solicitação';
  842.         $mail->Body = $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_reponsavelAtendimento.html.twig', [
  843.             'solicitacao' => $solicitacao,
  844.         ]);
  845.         $mail->send();*/
  846.     }
  847.     public function createOrdemServico(Agendamento $agendamento, Solicitacao $solicitacao, AndamentoSolicitacao $andamento): void
  848.     {
  849.         $em = $this->managerRegistry->getManager();
  850.         $empresa = $this->serviceEmail->getEmpresa();
  851.         /** @var $profissional Profissional */
  852.         foreach ($agendamento->getProfissionais() as $profissional) {
  853.             $ordemServico = new OrdemServico();
  854.             $ordemServico->setAgendamento($agendamento);
  855.             $ordemServico->setData($agendamento->getData());
  856.             $ordemServico->setHora($agendamento->getHora());
  857.             $ordemServico->setProfissional($profissional);
  858.             $ordemServico->setStatus('Agendado');
  859.             $em->persist($ordemServico);
  860.             $em->flush();
  861.             $ordemServico->setCodigo("DIN00" . $ordemServico->getId() . "-1");
  862.             $em->persist($ordemServico);
  863.             $em->flush();
  864.             $urlProfissional = ( (substr($empresa->getUrlCliente(), -1) == '/')? $empresa->getUrlCliente(): $empresa->getUrlCliente().'/')
  865.                 .'os/'.$profissional->getId().'/'.str_replace(' ', '-', $profissional->getNomecompleto());
  866.             /** START Fluxo SMS */
  867.             $phone = ($profissional->getTelefone1())?: $profissional->getTelefone2();
  868.             $nomeProfissional = explode(' ', $profissional->getNomecompleto());
  869.                         
  870.             $message = "Olá ". $nomeProfissional[0] .", a OS ". $ordemServico->getCodigo() .
  871.                 " está disponível para a execução, acesse: ".
  872.                 $urlProfissional . " Att, " . $empresa->getNome();
  873.             
  874.             if($phone)
  875.                 $this->serviceComteleSMS->sendSMS($phone,$message);
  876.             /** END Fluxo SMS */
  877.             /** START Fluxo Email */
  878.             $mail = $this->serviceEmail->getEmail();
  879.             $mail->addAddress($profissional->getEmail());
  880.             if($solicitacao->getResponsavelAtendimento())
  881.                 $mail->addReplyTo($solicitacao->getResponsavelAtendimento()->getEmail());
  882.             $mail->Subject = 'Nova Ordem de Serviço';
  883.             $mail->Body = $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_profissional_os_criada.html.twig', [
  884.                 'profissional' => $profissional,
  885.                 'os' => $ordemServico,
  886.                 'urlProfissional' => $urlProfissional,
  887.             ]);
  888.             $mail->send();
  889.             /** END Fluxo Email */
  890.         }
  891.     }
  892.     public function apiDashboardSolicitacoesAction(Request $request)
  893.     {
  894.         $em = $this->managerRegistry->getManager();
  895.         $empreendimentosFilter = ($request->query->get('empreendimentos'))? explode(",", $request->query->get('empreendimentos')): false;
  896.         $dataAgendamentoDe = ($request->query->get('dataAgendamentoDe'))? new \DateTime($request->query->get('dataAgendamentoDe')): false;
  897.         $dataAgendamentoAte = ($request->query->get('dataAgendamentoAte'))? new \DateTime($request->query->get('dataAgendamentoAte')): false;
  898.         $solicitacoes = $em->getRepository(Solicitacao::class)->findBy(['statusAtual' => 4]);
  899.         $solicitacoesAgendadas = [];
  900.         /** @var $solicitacao Solicitacao */
  901.         foreach ($solicitacoes as $solicitacao) {
  902.             $andamento = $solicitacao->getAndamentoSolicitacao()->last();
  903.             /** @var $agendamento Agendamento */
  904.             $agendamento = $andamento->getAgendamento();
  905.             if(!$agendamento)
  906.                 continue;
  907.             $profissionais = "";
  908.             foreach ($agendamento->getProfissionais() as $profissional) {
  909.                 $profissionais .= $profissional->getNomecompleto() . ', ';
  910.             }
  911.             $dateNow = new \DateTime('now');
  912.             /*if($agendamento->getData() < $dateNow)
  913.                 continue;*/
  914.             if($empreendimentosFilter && !in_array($solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(), $empreendimentosFilter))
  915.                 continue;
  916.             if($dataAgendamentoDe && ($dataAgendamentoDe > $agendamento->getData()))
  917.                 continue;
  918.             if($dataAgendamentoAte && ($dataAgendamentoAte < $agendamento->getData()))
  919.                 continue;
  920.             $solicitacoesAgendadas[] = [
  921.                 'id' => $solicitacao->getId(),
  922.                 'codigo' => $solicitacao->getCodigo(),
  923.                 'empreendimento'=> $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  924.                 'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  925.                 'unidade' => $solicitacao->getUnidade()->getUnidade(),
  926.                 'cliente' => $solicitacao->getCliente()->getNomeCompleto(),
  927.                 'profissional' => $profissionais,
  928.                 'dataAgendamento' => date_format($agendamento->getData(), 'd/m/Y') . ' ' .date_format($agendamento->getHora(), 'H:i'),
  929.                 'mensagem' => $solicitacao->getMensagem(),
  930.             ];
  931.         }
  932.         $empreendimentos = [];
  933.         foreach ($em->getRepository(Empreendimento::class)->findBy([], ['nome' => 'ASC']) as $empreendimento) {
  934.             $empreendimentos[] = [
  935.                 'id' => $empreendimento->getId(),
  936.                 'name' => $empreendimento->getNome(),
  937.             ];
  938.         }
  939.         return $this->json([
  940.            'solicitacoesAgendadas' => $solicitacoesAgendadas,
  941.             'empreendimentos' => $empreendimentos,
  942.         ]);
  943.     }
  944. }