src/Application/Internit/ApiBundle/Controller/OrdemServicoApiController.php line 64

Open in your IDE?
  1. <?php
  2. namespace App\Application\Internit\ApiBundle\Controller;
  3. use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
  4. use App\Application\Internit\ClienteBundle\Entity\Cliente;
  5. use App\Application\Internit\DepartamentoBundle\Entity\Departamento;
  6. use App\Application\Internit\OrdemServicoBundle\Entity\OrdemServico;
  7. use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
  8. use App\Application\Internit\RespostaSolicitacaoBundle\Entity\RespostaSolicitacao;
  9. use App\Application\Internit\SacBundle\Entity\Relatorio;
  10. use App\Application\Internit\SolicitacaoBundle\Entity\Solicitacao;
  11. use App\Application\Project\ContentBundle\Attributes\Acl as ACL;
  12. use App\Application\Project\ContentBundle\Controller\Base\BaseApiController;
  13. use Doctrine\Persistence\ObjectRepository;
  14. use Dompdf\Dompdf;
  15. use Fpdf\Fpdf;
  16. use Mpdf\Mpdf;
  17. use OpenApi\Attributes as OA;
  18. use Spipu\Html2Pdf\Html2Pdf;
  19. use Symfony\Component\Filesystem\Filesystem;
  20. use Symfony\Component\HttpFoundation\File\UploadedFile;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use function Symfony\Component\Translation\t;
  26. #[Route('/api/ordemServico'name'api_ordemServico_')]
  27. #[OA\Tag(name'Sac')]
  28. #[ACL\Api(enabletruetitle'Sac'description'Permissões do modulo Ordem de Serviço')]
  29. class OrdemServicoApiController extends BaseApiController
  30. {
  31.     public function getClass(): string
  32.     {
  33.         return OrdemServico::class;
  34.     }
  35.     public function getRepository(): ObjectRepository
  36.     {
  37.         return $this->doctrine->getManager()->getRepository($this->getClass());
  38.     }
  39.     #[Route('/sms'name'sms'methods: ['GET'])]
  40.     #[ACL\Api(enabletruetitle'SMS'description'SMS')]
  41.     public function sendSMS(Request $request): Response
  42.     {
  43.         //$this->serviceComteleSMS->sendSMS("numeroaqui", 'Teste SMS' );
  44.         $this->serviceComteleSMS->sendSMS('5521997734518','teste');
  45.         //$this->serviceComteleSMS->consultarCreditos();
  46.         return new Response('ok');
  47.     }
  48.     #[Route('/profissional/{idProfissional}'name'listAction'methods: ['GET'])]
  49.     #[ACL\Api(enabletruetitle'Listagem Ordem Serviço'description'Listagem Ordem de Serviço')]
  50.     public function listAction(Request $request$idProfissional): Response
  51.     {
  52.         $em $this->doctrine->getManager();
  53.         $ordemServicos $em->getRepository(OrdemServico::class)->findBy(['profissional' => $idProfissional],['data' => 'DESC']);
  54.         $response = [];
  55.         /** @var OrdemServico $ordem */
  56.         foreach ($ordemServicos as $ordem) {
  57.             if(!$ordem->getAgendamento() )
  58.                 continue;
  59.             if(!$ordem->getAgendamento()->getAndamento())
  60.                 continue;
  61.             /** @var Solicitacao $solicitacao */
  62.             $solicitacao $ordem->getAgendamento()->getAndamento()->getSolicitacao();
  63.             if(!$solicitacao)
  64.                 continue;
  65.             $response[] = [
  66.                 'id' => $ordem->getId(),
  67.                 'codigo' => $ordem->getCodigo(),
  68.                 'cliente' => ($solicitacao->getCliente())? $solicitacao->getCliente()->getNomeCompleto() : null,
  69.                 'unidade' => (!$solicitacao->getUnidade())? null: [
  70.                     'empreendimento' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  71.                     'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  72.                     'unidade' => $solicitacao->getUnidade()->getUnidade(),
  73.                 ],
  74.                 'dataAgendamento' => $this->formatDate($ordem->getData()),
  75.                 'horaAgendamento' => $this->formatTime($ordem->getHora()),
  76.                 'status' => $ordem->getStatus(),
  77.             ];
  78.         }
  79.         return $this->json($response);
  80.     }
  81.     #[Route('/{idOrdem}'name'showAction'methods: ['GET'])]
  82.     #[ACL\Api(enabletruetitle'Exibe Ordem Serviço'description'Exibe Ordem de Serviço')]
  83.     public function showAction(Request $request$idOrdem): Response
  84.     {
  85.         $em $this->doctrine->getManager();
  86.         $cliente $this->getUser();
  87.         /** @var OrdemServico $ordemServico */
  88.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  89.         if(!$ordemServico)
  90.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!']);
  91.         /** @var Solicitacao $solicitacao */
  92.         $solicitacao $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  93.         $response $this->osToJson($ordemServico$solicitacao);
  94.         return $this->json($response);
  95.     }
  96.     public function osToJson(OrdemServico $ordemServicoSolicitacao $solicitacao)
  97.     {
  98.         $anexosSolicitacao $this->mediaService->getGalleryJson($solicitacao->getAnexos()) ;
  99.         $anexosAgendamento $this->mediaService->getGalleryJson($ordemServico->getAgendamento()->getAnexos()) ;
  100.         $anexos array_merge($anexosSolicitacao$anexosAgendamento);
  101.         return [
  102.             'id' => $ordemServico->getId(),
  103.             'codigo' => $ordemServico->getCodigo(),
  104.             'status' => $ordemServico->getStatus(),
  105.             'dataAgendamento' => $this->formatDate($ordemServico->getData()),
  106.             'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
  107.             'mensagemDinamica' => $ordemServico->getAgendamento()->getObservacoes(),
  108.             'anexosSolicitacao' => $anexos,
  109.             'cliente' => (!$solicitacao->getCliente())? null: [
  110.                 'id' => $solicitacao->getCliente()->getId(),
  111.                 'nome' => $solicitacao->getCliente()->getNomeCompleto(),
  112.                 'telefone' => $solicitacao->getCliente()->getCelular(),
  113.                 'email' => $solicitacao->getCliente()->getEmail(),
  114.             ],
  115.             'unidade' => (!$solicitacao->getUnidade())? null: [
  116.                 'empreendimento' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
  117.                 'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
  118.                 'unidade' => $solicitacao->getUnidade()->getUnidade(),
  119.             ],
  120.             'agendamento' => (!$ordemServico->getAgendamento())? null: [
  121.                 'id'=> $ordemServico->getAgendamento()->getId()
  122.             ],
  123.             'profissional' => (!$ordemServico->getProfissional())? null: [
  124.                 'id'=> $ordemServico->getProfissional()->getId(),
  125.                 'nomeCompleto'=> $ordemServico->getProfissional()->getNomecompleto(),
  126.                 'email'=> $ordemServico->getProfissional()->getEmail(),
  127.             ],
  128.             'descricao' => $ordemServico->getDescricao(),
  129.             'anexosPreparacao' => $this->mediaService->getGalleryJson($ordemServico->getAnexosPreparacao()),
  130.             'anexosTrabalhoAndamento' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoAndamento()),
  131.             'anexosTrabalhoFinalizado' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoFinalizado()),
  132.             'assinaturaCliente' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaCliente()),
  133.             'assinaturaProfissional' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaProfissional()),
  134.             'aCaminho' => $this->formatDateTime($ordemServico->getDataACaminho()),
  135.             'inicioAtendimento' => $this->formatDateTime($ordemServico->getDataIniciarAtendimento()),
  136.             'finalAtendimento' => $this->formatDateTime($ordemServico->getDataFinalAtendimento()),
  137.             'criadoEm' => $this->formatDateTime($ordemServico->getCreatedAt()),
  138.             'atualizadoEm' => $this->formatDateTime($ordemServico->getUpdatedAt()),
  139.         ];
  140.     }
  141.     #[Route('/{idOrdem}/aCaminho'name'aCaminhoAction'methods: ['GET'])]
  142.     #[ACL\Api(enabletruetitle'Exibe Ordem Serviço'description'Exibe Ordem de Serviço')]
  143.     public function aCaminhoAction(Request $request$idOrdem): Response
  144.     {
  145.         $em $this->doctrine->getManager();
  146.         $cliente $this->getUser();
  147.         /** @var OrdemServico $ordemServico */
  148.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  149.         if(!$ordemServico)
  150.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!']);
  151.         if($ordemServico->getDataFinalAtendimento())
  152.             return $this->json([
  153.                 'status' => false,
  154.                 'message' => 'Atendimento já foi Finalizado!'
  155.             ], 400);
  156.         if($ordemServico->getDataACaminho())
  157.             return $this->json([
  158.                 'status' => false,
  159.                 'message' => 'Profissional já está a caminho!'
  160.             ], 400);
  161.         $ordemServico->setDataACaminho(new \DateTime('now'));
  162.         $ordemServico->setStatus('A Caminho');
  163.         $this->notificarClienteProfissionalACaminho($ordemServico);
  164.         $this->notificarResponsavelAtendimento($ordemServico0);
  165.         $em->persist($ordemServico);
  166.         $em->flush();
  167.         return $this->json([
  168.             'status' => true,
  169.             'message' => 'Registro realizado!'
  170.         ]);
  171.     }
  172.     #[Route('/{idOrdem}/iniciarAtendimento'name'iniciarAtendimento'methods: ['GET'])]
  173.     #[ACL\Api(enabletruetitle'Iniciar Atendimento'description'Iniciar Atendimento')]
  174.     public function iniciarAtendimento(Request $request$idOrdem): Response
  175.     {
  176.         $em $this->doctrine->getManager();
  177.         $cliente $this->getUser();
  178.         /** @var OrdemServico $ordemServico */
  179.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  180.         if(!$ordemServico)
  181.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!']);
  182.         if($ordemServico->getDataFinalAtendimento())
  183.             return $this->json([
  184.                 'status' => false,
  185.                 'message' => 'Atendimento já foi Finalizado!'
  186.             ], 400);
  187.         if(!$ordemServico->getDataACaminho())
  188.             return $this->json([
  189.                 'status' => false,
  190.                 'message' => 'Inicie o trajeto até o cliente antes de iniciar o atendimento!'
  191.             ], 400);
  192.         if($ordemServico->getDataIniciarAtendimento())
  193.             return $this->json([
  194.                 'status' => false,
  195.                 'message' => 'Atendimento já Iniciado!'
  196.             ], 400);
  197.         $ordemServico->setDataIniciarAtendimento(new \DateTime('now'));
  198.         $ordemServico->setStatus('Atendimento Iniciado!');
  199.         $em->persist($ordemServico);
  200.         $em->flush();
  201.         return $this->json([
  202.             'status' => true,
  203.             'message' => 'Registro realizado!'
  204.         ]);
  205.     }
  206.     #[Route('/{idOrdem}/salvar'name'salvar'methods: ['POST'])]
  207.     #[ACL\Api(enabletruetitle'Savar Dados'description'Salvar Dados')]
  208.     public function salvar(Request $request$idOrdem): Response
  209.     {
  210.         $em $this->doctrine->getManager();
  211.         //$cliente = $this->getUser();
  212.         /** @var OrdemServico $ordemServico */
  213.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  214.         if(!$ordemServico)
  215.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!']);
  216.         if(!$ordemServico->getDataIniciarAtendimento())
  217.             return $this->json([
  218.                 'status' => false,
  219.                 'message' => 'Inicie o atendimento antes de salvar as informações!'
  220.             ], 400);
  221.         if($ordemServico->getDataFinalAtendimento())
  222.             return $this->json([
  223.                 'status' => false,
  224.                 'message' => 'Atendimento já foi Finalizado!'
  225.             ], 400);
  226.         $this->atualizarOrdemServico($ordemServico$request);
  227.         return $this->json([
  228.             'status' => true,
  229.             'message' => 'Registro Realizado!'
  230.         ]);
  231.     }
  232.     #[Route('/{idOrdem}/finalizarAtendimento'name'finalizarAtendimento'methods: ['POST'])]
  233.     #[ACL\Api(enabletruetitle'Finalizar Atendimento'description'Finalizar Atendimento')]
  234.     public function finalizarAtendimento(Request $request$idOrdem): Response
  235.     {
  236.         $em $this->doctrine->getManager();
  237.         $cliente $this->getUser();
  238.         /** @var OrdemServico $ordemServico */
  239.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  240.         if(!$ordemServico)
  241.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!']);
  242.         if(!$ordemServico->getDataIniciarAtendimento())
  243.             return $this->json([
  244.                 'status' => false,
  245.                 'message' => 'Inicie o atendimento antes de finalizar o mesmo!'
  246.             ], 400);
  247.         if($ordemServico->getDataFinalAtendimento())
  248.             return $this->json([
  249.                 'status' => false,
  250.                 'message' => 'Atendimento já foi Finalizado!'
  251.             ], 400);
  252.         $this->atualizarOrdemServico($ordemServico$request);
  253.         if(!$this->checkOrdemServico($ordemServico))
  254.             return $this->json([
  255.                 'status' => false,
  256.                 'message' => 'Para finalizar o atendimento, todos os dados devem ser preenchidos!'
  257.             ], 400);
  258.         $ordemServico->setDataFinalAtendimento(new \DateTime('now'));
  259.         $ordemServico->setStatus('Finalizado!');
  260.         $em->persist($ordemServico);
  261.         $em->flush();
  262.         $this->notificarResponsavelAtendimento($ordemServico1);
  263.         return $this->json([
  264.             'status' => true,
  265.             'message' => 'Registro realizado!'
  266.         ]);
  267.     }
  268.     #[Route('/{idOrdem}/retornoAtendimento'name'retornoAtendimento'methods: ['POST'])]
  269.     #[ACL\Api(enabletruetitle'Retorno Atendimento'description'Retorno Atendimento')]
  270.     public function retornoAtendimento(Request $request$idOrdem): Response
  271.     {
  272.         $em $this->doctrine->getManager();
  273.         $cliente $this->getUser();
  274.         $data = ($request->request->get('data'))? new \DateTime($request->request->get('data')) : null;
  275.         $hora = ($request->request->get('hora'))? new \DateTime($request->request->get('hora')) : null;
  276.         if(!$data)
  277.             return $this->json(['status' => false'message'=> 'Data Não informada!'], 400);
  278.         if(!$hora)
  279.             return $this->json(['status' => false'message'=> 'Hora Não informada!'], 400);
  280.         $dataHora = new \DateTime($request->request->get('data') . $request->request->get('hora'));
  281.         /** @var OrdemServico $ordemServico */
  282.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  283.         if(!$ordemServico)
  284.             return $this->json(['status' => false'message'=> 'Ordem de Serviço não encontrada!'], 400);
  285.         if(!$ordemServico->getDataIniciarAtendimento())
  286.             return $this->json([
  287.                 'status' => false,
  288.                 'message' => 'Inicie o atendimento antes de finalizar o mesmo!'
  289.             ], 400);
  290.         if($ordemServico->getDataFinalAtendimento())
  291.             return $this->json([
  292.                 'status' => false,
  293.                 'message' => 'Atendimento já foi Finalizado!'
  294.             ], 400);
  295.         $this->atualizarOrdemServico($ordemServico$request);
  296.         if(!$this->checkOrdemServico($ordemServico))
  297.             return $this->json([
  298.                 'status' => false,
  299.                 'message' => 'Para finalizar o atendimento, todos os dados devem ser preenchidos!'
  300.             ], 400);
  301.         $ordemServico->setDataFinalAtendimento(new \DateTime('now'));
  302.         $ordemServico->setDataRetorno($dataHora);
  303.         $ordemServico->setStatus('Finalizado!');
  304.         $em->persist($ordemServico);
  305.         $em->flush();
  306.         /** Ordem de Serviço - Retorno */
  307.         $os = new OrdemServico();
  308.         $codigo explode('-'$ordemServico->getCodigo());
  309.         $os->setAgendamento($ordemServico->getAgendamento());
  310.         $os->setProfissional($ordemServico->getProfissional());
  311.         $os->setCodigo($codigo[0] . '-' intval($codigo[1]) + );
  312.         $os->setStatus('Agendado');
  313.         $os->setData($data);
  314.         $os->setHora($hora);
  315.         $em->persist($os);
  316.         $em->flush();
  317.         $empresa $this->serviceEmail->getEmpresa();
  318.         /** @var $profissional Profissional */
  319.         $profissional $os->getProfissional();
  320.         $urlProfissional = ( (substr($empresa->getUrlCliente(), -1) == '/')? $empresa->getUrlCliente(): $empresa->getUrlCliente().'/')
  321.             .'os/'.$profissional->getId().'/'.str_replace(' ''-'$profissional->getNomecompleto());
  322.         /** START Fluxo SMS */
  323.         $phone = ($profissional->getTelefone1())?: $profissional->getTelefone2();
  324.         $nomeProfissional explode(' '$profissional->getNomecompleto());
  325.         $message "Olá "$nomeProfissional[0] .", a OS "$os->getCodigo() .
  326.             " está disponível para a execução, acesse: ".
  327.             $urlProfissional " Att, " $empresa->getNome();
  328.         if($phone)
  329.             $this->serviceComteleSMS->sendSMS($phone,$message);
  330.         /** END Fluxo SMS */
  331.         /** @var $andamento AndamentoSolicitacao */
  332.         $andamento $os->getAgendamento()->getAndamento();
  333.         $solicitacao $andamento->getSolicitacao();
  334.         /** START Fluxo Email */
  335.         $mail $this->serviceEmail->getEmail();
  336.         $mail->addAddress($profissional->getEmail());
  337.         if($solicitacao->getResponsavelAtendimento())
  338.             $mail->addReplyTo($solicitacao->getResponsavelAtendimento()->getEmail());
  339.         $mail->Subject 'Nova Ordem de Serviço';
  340.         $mail->Body $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_profissional_os_criada.html.twig', [
  341.             'profissional' => $profissional,
  342.             'os' => $os,
  343.             'urlProfissional' => $urlProfissional,
  344.         ]);
  345.         $mail->send();
  346.         /** END Fluxo Email */
  347.         $this->notificarResponsavelAtendimento($os2);
  348.         return $this->json([
  349.             'status' => true,
  350.             'message' => 'Registro realizado!'
  351.         ]);
  352.     }
  353.     #[Route('/{idOrdem}/relatorio'name'relatorioAction'methods: ['GET'])]
  354.     #[ACL\Api(enabletruetitle'Exibe Relatorio Ordem Serviço'description'Exibe Relatorio Ordem de Serviço')]
  355.     public function relatorioAction(Request $request$idOrdem): Response
  356.     {
  357.         $em $this->doctrine->getManager();
  358.         /** @var OrdemServico $ordemServico */
  359.         $ordemServico $em->getRepository(OrdemServico::class)->findOneBy(['id' => $idOrdem]);
  360.         if(!$ordemServico)
  361.             return new Response();
  362.         /** @var Solicitacao $solicitacao */
  363.         if(!$ordemServico->getAgendamento()->getAndamento())
  364.             return new Response();
  365.         $solicitacao $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  366.         $osJson $this->osToJson($ordemServico$solicitacao);
  367.         $html $this->renderView('ordemServico/relatorio_pdf.html.twig', [
  368.             'objOS' => $ordemServico,
  369.             'jsonOS' => $osJson,
  370.             'solicitacao' => $solicitacao,
  371.         ]);
  372.         $dompdf = new Dompdf(["enable_remote" => true]);
  373.         $dompdf->loadHtml($html);
  374.         $dompdf->render();
  375.         return new Response (
  376.             $dompdf->stream('Relatório_OS_' $ordemServico->getCodigo(), ["Attachment" => false]),
  377.             Response::HTTP_OK,
  378.             ['Content-Type' => 'application/pdf']
  379.         );
  380.         //  return $this->json('ok');
  381.     }
  382.     public function checkOrdemServico(OrdemServico $ordemServico): bool
  383.     {
  384.         if(!$this->mediaService->countGallery($ordemServico->getAnexosPreparacao()))
  385.             return false;
  386.         if(!$this->mediaService->countGallery($ordemServico->getAnexosTrabalhoAndamento()))
  387.             return false;
  388.         if(!$this->mediaService->countGallery($ordemServico->getAnexosTrabalhoFinalizado()))
  389.             return false;
  390.         if(!$ordemServico->getAssinaturaProfissional())
  391.             return false;
  392.         if(!$ordemServico->getAssinaturaCliente())
  393.             return false;
  394.         if(!$ordemServico->getDescricao())
  395.             return false;
  396.         return true;
  397.     }
  398.     public function atualizarOrdemServico(OrdemServico $ordemServicoRequest $request)
  399.     {
  400.         $em $this->doctrine->getManager();
  401.         $descricao $request->request->get('descricao');
  402.         $anexosPreparacao $request->files->get('anexosPreparacao');
  403.         $anexosTrabalhoAndamento $request->files->get('anexosTrabalhoAndamento');
  404.         $anexosTrabalhoFinalizado $request->files->get('anexosTrabalhoFinalizado');
  405.         $assinaturaCliente $request->request->get('assinaturaCliente');
  406.         $assinaturaProfissional $request->request->get('assinaturaProfissional');
  407.         if($descricao && $descricao !== "")
  408.             $ordemServico->setDescricao($descricao);
  409.         if($anexosPreparacao){
  410.             if(!$ordemServico->getAnexosPreparacao())
  411.                 $ordemServico->setAnexosPreparacao$this->mediaService->createGallery() );
  412.             $this->mediaService->deleteAllMediaGallery($ordemServico->getAnexosPreparacao());
  413.             $medias $this->mediaService->createMultipleMedia($anexosPreparacao);
  414.             $this->mediaService->addMediaInGallery($medias$ordemServico->getAnexosPreparacao());
  415.         }
  416.         if($anexosTrabalhoAndamento){
  417.             if(!$ordemServico->getAnexosTrabalhoAndamento())
  418.                 $ordemServico->setAnexosTrabalhoAndamento$this->mediaService->createGallery() );
  419.             $this->mediaService->deleteAllMediaGallery($ordemServico->getAnexosTrabalhoAndamento());
  420.             $medias $this->mediaService->createMultipleMedia($anexosTrabalhoAndamento);
  421.             $this->mediaService->addMediaInGallery($medias$ordemServico->getAnexosTrabalhoAndamento());
  422.         }
  423.         if($anexosTrabalhoFinalizado){
  424.             if(!$ordemServico->getAnexosTrabalhoFinalizado())
  425.                 $ordemServico->setAnexosTrabalhoFinalizado$this->mediaService->createGallery() );
  426.             $this->mediaService->deleteAllMediaGallery($ordemServico->getAnexosTrabalhoFinalizado());
  427.             $medias $this->mediaService->createMultipleMedia($anexosTrabalhoFinalizado);
  428.             $this->mediaService->addMediaInGallery($medias$ordemServico->getAnexosTrabalhoFinalizado());
  429.         }
  430.         if($assinaturaCliente){
  431.             //var_dump($assinaturaCliente);
  432. //            if($ordemServico->getAssinaturaCliente()){
  433. //                $em->remove($ordemServico->getAssinaturaCliente());
  434. //                $em->flush();
  435. //            }
  436.             $ordemServico->setAssinaturaCliente$this->mediaService->createMediaBase64($assinaturaCliente'assinaturaCliente') );
  437.         }
  438.         if($assinaturaProfissional){
  439. //            if($ordemServico->getAssinaturaProfissional()){
  440. //                $em->remove($ordemServico->getAssinaturaProfissional());
  441. //                $em->flush();
  442. //            }
  443.             $ordemServico->setAssinaturaProfissional$this->mediaService->createMediaBase64($assinaturaProfissional'assinaturaProfissional') );
  444.         }
  445.         $em->persist($ordemServico);
  446.         $em->flush();
  447.     }
  448. //    #[Route('', name: 'edit', methods: ['POST'])]
  449. //    #[ACL\Api(enable: true, title: 'Criar', description: 'Iniciar Ordem Servico')]
  450. //    public function editAction(Request $request): Response
  451. //    {
  452. //        $this->validateAccess("createAction");
  453. //        $em = $this->doctrine->getManager();
  454. //
  455. //        $departamento = $request->request->get('departamento');
  456. //        $assunto = $request->request->get('assunto');
  457. //        $mensagem = $request->request->get('mensagem');
  458. //        $anexos = $request->files->get('anexos');
  459. //        //$unidade = $request->request->get('unidade');
  460. //
  461. //        $departamento = $this->doctrine->getRepository(Departamento::class)->findOneBy(['id' => $departamento]);
  462. //        if(!$departamento)
  463. //            return new JsonResponse(['status' => false, 'message' => 'Informe um departamento!'], 400);
  464. //
  465. //        if(!$assunto)
  466. //            return new JsonResponse(['status' => false, 'message' => 'Informe um Assunto!'], 400);
  467. //
  468. //        if(!$mensagem)
  469. //            return new JsonResponse(['status' => false, 'message' => 'Informe a Mensagem!'], 400);
  470. //
  471. //        $sac = new Sac();
  472. //
  473. //        $sac->setAssunto($assunto);
  474. //        $sac->setMensagem($mensagem);
  475. //        $sac->setDepartamento($departamento);
  476. //        $sac->setCliente($this->getUser());
  477. //
  478. //        if($anexos){
  479. //            /** Cria Galeria caso não exista */
  480. //            $sac->setAnexo($this->mediaService->createGallery());
  481. //            /** Cria as Medias e retorna array */
  482. //            $medias = $this->mediaService->createMultipleMedia($anexos);
  483. //            /** Adicionar medias em galeria */
  484. //            $this->mediaService->addMediaInGallery($medias, $sac->getAnexo());
  485. //            /** Atualiza a galeria de Media conforme a request*/
  486. //            //$this->mediaService->mediaUpdateRequest($sac->getAnexo(), $request);
  487. //        }
  488. //
  489. //
  490. //        $em->persist($sac);
  491. //        $em->flush();
  492. //
  493. //        $emailsNotificacao = explode(',', $departamento->getEmail());
  494. //        foreach ($emailsNotificacao as $email){
  495. //            $mail = $this->serviceEmail->getEmail();
  496. //            $mail->addAddress($email);
  497. //            $mail->Subject = 'Notificação - Contato Realizado';
  498. //            $mail->Body = $this->renderTemplateEmail('emails/sac/sac.html.twig', [
  499. //                'sac' => $sac,
  500. //            ]);
  501. //            $mail->send();
  502. //        }
  503. //
  504. //        return $this->json([
  505. //            'status' => true,
  506. //            'message' => 'Contato realizado com sucesso!',
  507. //        ], 200);
  508. //
  509. //    }
  510.     public function notificarClienteProfissionalACaminho(OrdemServico $ordemServico): void
  511.     {
  512.         $em $this->doctrine->getManager();
  513.         /** @var Solicitacao $solicitacao */
  514.         $solicitacao $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  515.         $empresa $this->serviceEmail->getEmpresa();
  516.         $mensagem = new RespostaSolicitacao();
  517.         $mensagem->setAndamentoSolicitacao($solicitacao->getAndamentoSolicitacao()->last());
  518.         $mensagem->setRespondidoPor('atendimento');
  519.         $mensagem->setMensagem('O profissional está a caminho e chegará até o horário agendado.');
  520.         $em->persist($mensagem);
  521.         $em->flush();
  522.         $phone = ($solicitacao->getCliente()->getCelular())? $solicitacao->getCliente()->getCelular() : $solicitacao->getCliente()->getTelefone();
  523.         $message "Olá "explode($solicitacao->getCliente()->getNomeCompleto()," ")[0] .", o profissional "$ordemServico->getProfissional()->getNomecompleto() .
  524.             " está a caminho para atender a solicitação {"$solicitacao->getCodigo() ."}. Att. "$empresa->getNome() . ".";
  525.         if($phone)
  526.             $this->serviceComteleSMS->sendSMS($phone,$message);
  527.         $mail $this->serviceEmail->getEmail();
  528.         $mail->addAddress($solicitacao->getCliente()->getEmail());
  529.             $mail->Subject 'Profissional a Caminho';
  530.             $mail->Body $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_cliente_profissional_a_caminho.html.twig', [
  531.                 'cliente' => $solicitacao->getCliente(),
  532.                 'solicitacao' => $solicitacao,
  533.                 'ordemServico' => $ordemServico,
  534.             ]);
  535.             $mail->send();
  536.     }
  537.     public function notificarResponsavelAtendimento(OrdemServico $ordemServicoint $notification): void
  538.     {
  539.         $tiposNotificacao = [
  540.             => 'Profissional a Caminho',
  541.             => 'Atendimento Finalizado',
  542.             => 'Atendimento Reagendado',
  543.         ];
  544.         if(!isset($tiposNotificacao[$notification]))
  545.             return;
  546.         $em $this->doctrine->getManager();
  547.         /** @var Solicitacao $solicitacao */
  548.         $solicitacao $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
  549.         $empresa $this->serviceEmail->getEmpresa();
  550.         if(!$solicitacao->getResponsavelAtendimento())
  551.             return;
  552.         $mail $this->serviceEmail->getEmail();
  553.         $mail->addAddress($solicitacao->getResponsavelAtendimento()->getEmail());
  554.         $mail->Subject 'Atualização OS - '.$tiposNotificacao[$notification];
  555.         $mail->Body $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_atualizacao_os_responsavel_atendimento.html.twig', [
  556.             'cliente' => $solicitacao->getCliente(),
  557.             'solicitacao' => $solicitacao,
  558.             'ordemServico' => $ordemServico,
  559.             'tipoNotificao' => $tiposNotificacao[$notification],
  560.         ]);
  561.         $mail->send();
  562.     }
  563. }