<?php
namespace App\Application\Internit\SolicitacaoBundle\Controller;
use App\Application\Internit\AgendamentoBundle\Entity\Agendamento;
use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
use App\Application\Internit\EmpreendimentoBundle\Entity\Empreendimento;
use App\Application\Internit\OrdemServicoBundle\Entity\OrdemServico;
use App\Application\Internit\PeriodoAgendamentoBundle\Entity\PeriodoAgendamento;
use App\Application\Internit\PesquisaSatisfacaoBundle\Entity\PesquisaSatisfacao;
use App\Application\Internit\PesquisaSatisfacaoBundle\Entity\Resposta;
use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
use App\Application\Internit\RespostaSolicitacaoBundle\Entity\RespostaSolicitacao;
use App\Application\Internit\SolicitacaoBundle\Entity\Solicitacao;
use App\Application\Internit\SolicitacaoBundle\Form\SolicitacaoAdminType;
use App\Application\Internit\StatusSolicitacaoBundle\Entity\StatusSolicitacao;
use App\Application\Project\ContentBundle\Attributes\Acl as ACL;
use App\Application\Project\ContentBundle\Controller\Base\BaseAdminController;
use App\Application\Project\ContentBundle\Service\FilterDoctrine;
use Doctrine\Persistence\ObjectRepository;
use Sonata\AdminBundle\Bridge\Exporter\AdminExporter;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use function Symfony\Component\String\s;
#[ACL\Admin(enable: true, title: 'Solicitacao', description: 'Permissões modulo Solicitacao')]
class SolicitacaoAdminController extends BaseAdminController
{
protected $baseRoute = 'admin_internit_solicitacao_solicitacao_';
protected $baseTemplate = "@ApplicationInternitSolicitacao/solicitacao/";
public function dashboardAction()
{
return new JsonResponse([]);
/* Here goes your code */
}
public function getClass(): string
{
return Solicitacao::class;
}
public function getRepository(): ObjectRepository
{
return $this->managerRegistry->getManager()->getRepository($this->getClass());
}
/*#[ACL\Admin(enable: true, title: 'Listar', description: 'Listar Solicitacao')]
public function listAction(Request $request): Response
{
$this->validateAccess("listAction");
return parent::listAction($request);
}*/
#[ACL\Admin(enable: true, title: 'Listar', description: 'Listar Solicitacao')]
public function listAction(Request $request): Response
{
$this->assertObjectExists($request);
$this->admin->checkAccess('list');
$preResponse = $this->preList($request);
if (null !== $preResponse) {
return $preResponse;
}
$listMode = $request->get('_list_mode');
if (\is_string($listMode)) {
$this->admin->setListMode($listMode);
}
$datagrid = $this->admin->getDatagrid();
$formView = $datagrid->getForm()->createView();
// set the theme for the current Admin Form
$this->setFormTheme($formView, $this->admin->getFilterTheme());
//$template = $this->templateRegistry->getTemplate('list');
if ($this->container->has('sonata.admin.admin_exporter')) {
$exporter = $this->container->get('sonata.admin.admin_exporter');
\assert($exporter instanceof AdminExporter);
$exportFormats = $exporter->getAvailableFormats($this->admin);
}
$solicitacoes = $this->managerRegistry->getManager()->getRepository(Solicitacao::class)->findAll();
$jsonSolicitacoes = [];
foreach ($solicitacoes as $solicitacao) {
$jsonSolicitacoes[] = [
'id' => $solicitacao->getId(),
'codigo' => $solicitacao->getCodigo(),
'nomeCliente' => (!empty($solicitacao->getCliente()->getNomeCompleto()))? $solicitacao->getCliente()->getNomeCompleto() : $solicitacao->getCliente()->getNomeFantasia(),
'mensagem' => $solicitacao->getMensagem(),
'dataCriacao' => $this->formatDateTime($solicitacao->getCreatedAt()),
];
}
return $this->renderWithExtraParams($this->baseTemplate.'admin/list.html.twig', [
'action' => 'list',
'form' => $formView,
'solicitacoes' => json_encode($jsonSolicitacoes),
'datagrid' => $datagrid,
'csrf_token' => $this->getCsrfToken('sonata.batch'),
'export_formats' => $exportFormats ?? $this->admin->getExportFormats(),
]);
}
#[ACL\Admin(enable: true, title: 'Visualizar', description: 'Visualizar Solicitacao')]
public function showAction(Request $request): Response
{
$this->validateAccess("showAction");
//return parent::showAction($request);
$id = $request->get('id');
if(!$id)
return $this->redirectToRoute($this->baseRoute.'list');
return $this->redirectToRoute($this->baseRoute.'edit', ['id' => $id]);
}
#[ACL\Admin(enable: true, title: 'Criar', description: 'Criar Solicitacao')]
public function createAction(Request $request): Response
{
$this->validateAccess("createAction");
//return parent::createAction($request);
$entityManager = $this->managerRegistry->getManager();
$data = new Solicitacao();
$data->setUltimaInteracao('Atendimento');
$form = $this->createForm(SolicitacaoAdminType::class, $data);
//dd($etapas);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
/** @var Solicitacao $data */
$data = $form->getData();
$statusSolicitacao = $entityManager->getRepository(StatusSolicitacao::class)->findOneBy(['id' => 1]);
$data->setStatusAtual($statusSolicitacao);
$data->setUltimaInteracao('Atendimento');
/** Cria Galeria caso não exista */
$data->setAnexos($this->mediaService->createGallery());
/** Cria as Medias e retorna array */
$medias = $this->mediaService->createMultipleMedia($data->getMultipleUpload());
/** Adicionar medias em galeria */
$this->mediaService->addMediaInGallery($medias, $data->getAnexos());
/** Atualiza a galeria de Media conforme a request*/
$this->mediaService->mediaUpdateRequest($data->getAnexos(), $request);
$entityManager->persist($data);
$entityManager->flush();
if($data->getCliente()){
$flagName = ($data->getCliente()->getNomeCompleto()) ?
strtoupper(substr($data->getCliente()->getNomeCompleto(), 0, 3)) :
strtoupper(substr($data->getCliente()->getCnpj(), 0, 3)) ;
$data->setCodigo($flagName."000".$data->getCliente()->getId().".".$data->getId());
$entityManager->persist($data);
$entityManager->flush();
}
if($data->getResponsavelAtendimento())
$this->notificarResponsavelAtendimento($data);
$this->getRepository()->primeiroAndamentoSolicitacao($data);
$this->notificarCliente($data);
$redirectAction = $request->get('btn_action');
if($redirectAction === "btn_create_and_edit")
return $this->redirectToRoute($this->baseRoute . 'edit', ['id' => $data->getId()]);
if($redirectAction === "btn_create_and_list")
return $this->redirectToRoute($this->baseRoute . 'list');
if($redirectAction === "btn_create_and_create")
return $this->redirectToRoute($this->baseRoute . 'create');
}
$template = $this->baseTemplate . "admin/create.html.twig";
return $this->renderWithExtraParams($template,[
'title' => 'Criar',
'form' => $form->createView(),
]);
}
#[ACL\Admin(enable: true, title: 'Editar', description: 'Editar Solicitacao')]
public function editAction(Request $request): Response
{
$this->validateAccess("editAction");
//return parent::editAction($request);
$entityManager = $this->managerRegistry->getManager();
/*** @var Solicitacao $existingObject */
$existingObject = $this->assertObjectExists($request, true);
$existingObject->setEmpreendimento($existingObject->getUnidade()->getBloco()->getEmpreendimento());
$existingObject->setBloco($existingObject->getUnidade()->getBloco());
$lastResponsavel = $existingObject->getResponsavelAtendimento();
if(!$existingObject)
return $this->redirectToRoute($this->baseRoute . 'list');
$form = $this->createForm(SolicitacaoAdminType::class, $existingObject);
$form->handleRequest($request);
if($form->isSubmitted()){
/** @var Solicitacao $data */
$data = $form->getData();
$data->setUltimaInteracao('Atendimento');
if( !$data->getAnexos() )
$data->setAnexos($this->mediaService->createGallery());
/** Cria as Medias e retorna array */
$medias = $this->mediaService->createMultipleMedia($data->getMultipleUpload());
/** Adicionar medias em galeria */
$this->mediaService->addMediaInGallery($medias, $data->getAnexos());
/** Atualiza a galeria de Media conforme a request*/
$this->mediaService->mediaUpdateRequest($data->getAnexos(), $request);
$entityManager->persist($data);
$entityManager->flush();
if($data->getCliente()){
$flagName = utf8_encode(($data->getCliente()->getNomeCompleto()) ?
strtoupper(substr($data->getCliente()->getNomeCompleto(), 0, 3)) :
strtoupper(substr($data->getCliente()->getCnpj(), 0, 3))) ;
$data->setCodigo($flagName."000".$data->getCliente()->getId().".".$data->getId());
$entityManager->persist($data);
$entityManager->flush();
}
if($data->getResponsavelAtendimento())
if(!$lastResponsavel || ($data->getResponsavelAtendimento()->getId() !== $lastResponsavel->getId()) )
$this->notificarResponsavelAtendimento($data);
$this->notificarCliente($data);
$redirectAction = $request->get('btn_action');
if($redirectAction === "btn_create_and_edit")
return $this->redirectToRoute($this->baseRoute . 'edit', ['id' => $data->getId()]);
if($redirectAction === "btn_create_and_list")
return $this->redirectToRoute($this->baseRoute . 'list');
}
// dump($existingObject);
$ordemServicos = [];
foreach ($existingObject->getAndamentoSolicitacao() as $andamento) {
/*** @var AndamentoSolicitacao $andamento */
if($andamento->getAgendamento()){
foreach ($andamento->getAgendamento()->getOrdemServicos() as $ordemServico)
$ordemServicos[] = $ordemServico;
}
}
$pesquisa = $entityManager->getRepository(PesquisaSatisfacao::class)->findOneBy(['solicitacao' => $existingObject]);
$extraInfos = [
'statusSolicitacao' => $entityManager->getRepository(StatusSolicitacao::class)->findAll(),
'periodos' => $entityManager->getRepository(PeriodoAgendamento::class)->findAll(),
'profissionais' => $entityManager->getRepository(Profissional::class)->findAll(),
'andamentos' => $entityManager->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $existingObject], ['createdAt' => 'DESC']),
'chat' => $this->getDataChat($existingObject->getId()),
'ordemServicos' => $ordemServicos,
'pesquisa' => (!$pesquisa)? null : [
'pesquisa' => $pesquisa,
'respostas' => $this->getRespostaPesquisa($pesquisa),
],
];
return $this->renderWithExtraParams($this->baseTemplate.'admin/edit.html.twig',[
'title' => 'Editar',
'form' => $form->createView(),
'object' => $existingObject,
'extraInfos' => $extraInfos,
]);
}
private function getRespostaPesquisa(PesquisaSatisfacao $pesquisa)
{
$em = $this->managerRegistry->getManager();
$respostas = [
'atendente' => null,
'profissional' => []
];
$solicitacao = $pesquisa->getSolicitacao();
$respostasData = $em->getRepository(Resposta::class)->findBy([
'pesquisaSatisfacao' => $pesquisa->getId()], [
'createdAt' => 'DESC'
]);
if($solicitacao->getResponsavelAtendimento()){
$perguntas = [];
foreach ($respostasData as $resp) {
if($resp->getResponsavelAtendimento()){
$perguntas[] = [
'pergunta' => $resp->getPergunta(),
'resposta' => $resp->getResposta(),
'tipoPergunta' => $resp->getTipoPergunta(),
];
}
}
$respostas['atendente'] = [
'id' => $solicitacao->getResponsavelAtendimento()->getId(),
'nome' => $solicitacao->getResponsavelAtendimento()->getName(),
'imagem' => $this->mediaService->getMediaJson($solicitacao->getResponsavelAtendimento()->getLogo()),
'perguntas' => $perguntas,
];
}
foreach ($solicitacao->getAllProffisionais() as $profissional) {
$perguntas = [];
foreach ($respostasData as $resp) {
if($resp->getProfissional() && $resp->getProfissional()->getId() == $profissional->getId()){
$perguntas[] = [
'pergunta' => $resp->getPergunta(),
'resposta' => $resp->getResposta(),
'tipoPergunta' => $resp->getTipoPergunta(),
];
}
}
$respostas['profissional'][] = [
'id' => $profissional->getId(),
'nome' => $profissional->getNomecompleto(),
'imagem' => $this->mediaService->getMediaJson($profissional->getLogo()),
'perguntas' => $perguntas,
];
}
return $respostas;
}
#[ACL\Admin(enable: true, title: 'Excluir', description: 'Excluir Solicitacao')]
public function deleteAction(Request $request): Response
{
$this->validateAccess("deleteAction");
return parent::deleteAction($request);
}
#[ACL\Admin(enable: true, title: 'Excluir em Lote', description: 'Excluir Solicitacao em lote')]
public function batchActionDelete(ProxyQueryInterface $query): Response
{
$this->validateAccess("batchActionDelete");
return parent::batchActionDelete($query);
}
public function batchAction(Request $request): Response
{
$this->validateAccess("batchActionDelete");
return parent::batchAction($request);
}
#[ACL\Admin(enable: true, title: 'Exportar', description: 'Exportar Solicitacao')]
public function exportAction(Request $request): Response
{
$this->validateAccess("exportAction");
return parent::exportAction($request);
}
#[ACL\Admin(enable: true, title: 'Auditoria', description: 'Auditar Solicitacao')]
public function historyAction(Request $request): Response
{
$this->validateAccess("historyAction");
return parent::historyAction($request);
}
public function historyViewRevisionAction(Request $request, string $revision): Response
{
$this->validateAccess("historyAction");
return parent::historyViewRevisionAction($request, $revision);
}
public function historyCompareRevisionsAction(Request $request, string $baseRevision, string $compareRevision): Response
{
$this->validateAccess("historyAction");
return parent::historyCompareRevisionsAction($request, $baseRevision, $compareRevision);
}
/** ##############################
* API */
public function apiGetAndamentoSolicitacaoAction(Request $request): JsonResponse
{
$this->validateAccess("listAction");
$id = $request->get('id');
/** @var $andamentoSolicitacao AndamentoSolicitacao */
$andamentoSolicitacao = $this->managerRegistry->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
$profissionais = [];
if($andamentoSolicitacao->getAgendamento())
foreach ($andamentoSolicitacao->getAgendamento()->getProfissionais() as $profissional){
$profissionais[] = $profissional->getId();
}
$response = [
'id' => $andamentoSolicitacao->getId(),
'status' => ($andamentoSolicitacao->getStatusSolicitacao())? $andamentoSolicitacao->getStatusSolicitacao()->getId(): null,
'solicitacao' => $andamentoSolicitacao->getSolicitacao()->getId(),
'assunto' => $andamentoSolicitacao->getAssunto(),
'mensagem' => $andamentoSolicitacao->getMensagem(),
'visivel' => $andamentoSolicitacao->getVisivel(),
'agendamento' => !$andamentoSolicitacao->getAgendamento()? null : [
'id' => $andamentoSolicitacao->getAgendamento()->getId(),
'data' => date_format($andamentoSolicitacao->getAgendamento()->getData(), 'Y-m-d'),
'periodo' => date_format($andamentoSolicitacao->getAgendamento()->getHora(), 'H:i'),
'observacoes' => $andamentoSolicitacao->getAgendamento()->getObservacoes(),
'profissionais' => $profissionais,
'anexos' => $this->mediaService->getGalleryJson($andamentoSolicitacao->getAgendamento()->getAnexos()),
],
];
return $this->json($response);
}
public function listAndamentoSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$solicitacao = $data->solicitacao;
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao], ['createdAt' => 'DESC']);
$response = [];
/** @var $andamentoSolicitacao AndamentoSolicitacao */
foreach ($andamentos as $andamentoSolicitacao) {
$response[] = [
'id' => $andamentoSolicitacao->getId(),
'status' => ($andamentoSolicitacao->getStatusSolicitacao())? $andamentoSolicitacao->getStatusSolicitacao()->getStatus(): null,
'solicitacao' => $andamentoSolicitacao->getSolicitacao()->getId(),
'assunto' => $andamentoSolicitacao->getAssunto(),
'mensagem' => $andamentoSolicitacao->getMensagem(),
'visivel' => $andamentoSolicitacao->getVisivel(),
'createdAt' => $andamentoSolicitacao->getCreatedAt()? date_format($andamentoSolicitacao->getCreatedAt(),"d/m/Y H:i:s"): null,
'updatedAt' => $andamentoSolicitacao->getUpdatedAt()? date_format($andamentoSolicitacao->getUpdatedAt(),"d/m/Y H:i:s"): null,
];
}
return $this->json($response);
}
public function novoAndamentoSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = (object) $request->request->all();
$status = $data->status;
$solicitacao = $data->solicitacao;
$mensagem = $data->mensagem;
$visivel = $data->visivel;
$agendamentoPeriodo = $data->agendamento['periodo'];
$agendamentoData = $data->agendamento['data'];
$agendamentoProfissionais = explode(',',$data->agendamento['profissionais'] );
$agendamentoObservacoes = $data->agendamento['observacoes'];
$anexos = [];
for ($i=0; $i<10; $i++) {
if (isset($request->files->get('agendamento')['file-' . $i]))
{
$file = $request->files->get('agendamento')['file-'.$i];
if($file)
$anexos[] = $file;
}
}
/*
var_dump($anexos);
return $this->json('');*/
$andamentoSolicitacao = new AndamentoSolicitacao();
$andamentoSolicitacao->setAlteradoPor($this->getUser());
$andamentoSolicitacao->setCriadoPor($this->getUser());
$andamentoSolicitacao->setVisivel($visivel);
$andamentoSolicitacao->setMensagem($mensagem);
$solicitacao = $em->getRepository(Solicitacao::class)->findOneBy(['id' => $solicitacao]);
if($solicitacao)
$andamentoSolicitacao->setSolicitacao($solicitacao);
$status = $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
if($status)
$andamentoSolicitacao->setStatusSolicitacao($status);
if(in_array($status->getId(), [4,6])){
$agendamento = new Agendamento();
$agendamento->setData(new \DateTime($agendamentoData));
$agendamento->setHora(new \DateTime($agendamentoPeriodo));
$agendamento->setObservacoes($agendamentoObservacoes);
foreach ($agendamentoProfissionais as $profissional){
$profissional = $em->getRepository(Profissional::class)->find($profissional);
if($profissional)
$agendamento->getProfissionais()->add($profissional);
}
if($anexos){
$agendamento->setAnexos($this->mediaService->createGallery());
$medias = $this->mediaService->createMultipleMedia($anexos);
$this->mediaService->addMediaInGallery($medias, $agendamento->getAnexos());
}
$em->persist($agendamento);
$em->flush();
$andamentoSolicitacao->setAgendamento($agendamento);
$em->persist($andamentoSolicitacao);
$em->flush();
$this->createOrdemServico($agendamento, $solicitacao, $andamentoSolicitacao);
}
$em->persist($andamentoSolicitacao);
$em->flush();
if($andamentoSolicitacao->getVisivel()){
$solicitacao = $andamentoSolicitacao->getSolicitacao();
$solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
$solicitacao->setUltimaInteracao('Atendimento');
$em->persist($solicitacao);
$em->flush();
$this->notificarCliente($andamentoSolicitacao->getSolicitacao());
if($status->getId() === 7){
$this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
}
}
return $this->json(['status' => true]);
}
public function editAndamentoSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$id = $data->id;
$status = $data->status;
$solicitacao = $data->solicitacao;
$mensagem = $data->mensagem;
$visivel = $data->visivel;
/** @var $andamentoSolicitacao AndamentoSolicitacao */
$andamentoSolicitacao = $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
$status = $em->getRepository(StatusSolicitacao::class)->findOneBy(['id' => $status]);
if($status)
$andamentoSolicitacao->setStatusSolicitacao($status);
$andamentoSolicitacao->setMensagem($mensagem);
$andamentoSolicitacao->setVisivel($visivel);
$andamentoSolicitacao->setAlteradoPor($this->getUser());
if(in_array($status->getId(), [4,6])){
$agendamento = $andamentoSolicitacao->getAgendamento();
if(!$agendamento)
$agendamento = new Agendamento();
$agendamento->setData(new \DateTime($data->agendamento->data));
$agendamento->setHora(new \DateTime($data->agendamento->periodo));
$agendamento->setObservacoes($data->agendamento->observacoes);
$agendamento->getProfissionais()->clear();
foreach ($data->agendamento->profissionais as $profissional){
$profissional = $em->getRepository(Profissional::class)->find($profissional);
if($profissional)
$agendamento->getProfissionais()->add($profissional);
}
$em->persist($agendamento);
$em->flush();
$andamentoSolicitacao->setAgendamento($agendamento);
$em->persist($andamentoSolicitacao);
$em->flush();
/* $resposta = new RespostaSolicitacao();
$resposta->setMensagem('Sua vistoria foi agendada para o dia '.
$this->formatDate($agendamento->getData()) . ' às '. $this->formatTime($agendamento->getHora())
);
$resposta->setRespondidoPor('atendimento');
$resposta->setAndamentoSolicitacao($andamentoSolicitacao);
$em->persist($resposta);
$em->flush();*/
//$this->createOrdemServico($agendamento);
}else{
if($andamentoSolicitacao->getAgendamento()){
$em->remove($andamentoSolicitacao->getAgendamento());
$em->flush();
}
$andamentoSolicitacao->setAgendamento(null);
}
$em->persist($andamentoSolicitacao);
$em->flush();
if($andamentoSolicitacao->getVisivel()){
$solicitacao = $andamentoSolicitacao->getSolicitacao();
$solicitacao->setStatusAtual($andamentoSolicitacao->getStatusSolicitacao());
$solicitacao->setUltimaInteracao('Atendimento');
$em->persist($solicitacao);
$em->flush();
$this->notificarCliente($andamentoSolicitacao->getSolicitacao());
if($status->getId() === 7){
$this->createPesquisaSatisfacao($andamentoSolicitacao->getSolicitacao());
}
}
return $this->json(['status' => true]);
}
public function deleteAndamentoSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$id = $data->id;
/** @var $andamento AndamentoSolicitacao */
$andamento = $em->getRepository(AndamentoSolicitacao::class)->findOneBy(['id' => $id]);
if(!$andamento)
return $this->json(['message' => 'Andamento não encontrado.'],400);
if($andamento->getAgendamento())
if(count($andamento->getAgendamento()->getOrdemServicos()->toArray()))
return $this->json(['message' => 'Não é possível excluir o status atual pois ele possui uma ordem de serviço associada!'],400);
if($andamento->getAgendamento()){
$em->remove($andamento->getAgendamento());
$em->flush();
}
/** @var $solicitacao Solicitacao */
$solicitacao = $andamento->getSolicitacao();
$em->remove($andamento);
$em->flush();
/** @var $andamento AndamentoSolicitacao */
$andamento = $solicitacao->getAndamentoSolicitacao()->last();
$solicitacao->setStatusAtual(($andamento)? $andamento->getStatusSolicitacao() : null);
$em->persist($solicitacao);
$em->flush();
return $this->json([]);
}
/************************************************************************************************************
* Respostas
*/
public function listRespostasSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$andamento = $data->andamento;
$respostas = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento], ['createdAt' => 'DESC']);
$response = [];
/** @var $resposta RespostaSolicitacao */
foreach ($respostas as $resposta) {
$response[] = [
'id' => $resposta->getId(),
'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
'assunto' => $resposta->getAssunto(),
'mensagem' => $resposta->getMensagem(),
'respondidoPor' => $resposta->getRespondidoPor(),
'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
];
}
return $this->json($response);
}
public function getRespostaSolicitacaoAction(Request $request): JsonResponse
{
$this->validateAccess("listAction");
$id = $request->get('id');
/** @var $resposta RespostaSolicitacao */
$resposta = $this->managerRegistry->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
$response = [
'id' => $resposta->getId(),
'andamento' => $resposta->getAndamentoSolicitacao()->getId(),
'assunto' => $resposta->getAssunto(),
'mensagem' => $resposta->getMensagem(),
'respondidoPor' => $resposta->getRespondidoPor(),
'createdAt' => $resposta->getCreatedAt()? date_format($resposta->getCreatedAt(),"d/m/Y H:i:s"): null,
'updatedAt' => $resposta->getUpdatedAt()? date_format($resposta->getUpdatedAt(),"d/m/Y H:i:s"): null,
];
return $this->json($response);
}
public function novaRespostaSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$solicitacao = $request->request->get('solicitacao');
$mensagem = $request->request->get('mensagem');
$anexos = [];
for ($i=0; $i<10; $i++){
$file = $request->files->get('file-'.$i);
if($file)
$anexos[] = $file;
}
if(!$mensagem)
return $this->json(['message' => 'Mensagem não encontrado.'],400);
$solicitacao = $em->getRepository(Solicitacao::class)->find($solicitacao);
if(!$solicitacao)
return $this->json(['message' => 'Solicitação não encontrado.'],400);
$resposta = new RespostaSolicitacao();
$resposta->setAndamentoSolicitacao($solicitacao->getAndamentoSolicitacao()->last());
$resposta->setMensagem($mensagem);
$resposta->setRespondidoPor('atendimento');
$resposta->setAdminResposta($this->getUser());
if($anexos){
/** Cria Galeria caso não exista */
$resposta->setAnexos($this->mediaService->createGallery());
/** Cria as Medias e retorna array */
$medias = $this->mediaService->createMultipleMedia($anexos);
/** Adicionar medias em galeria */
$this->mediaService->addMediaInGallery($medias, $resposta->getAnexos());
}
$em->persist($resposta);
$em->flush();
if($resposta->getAndamentoSolicitacao()->getVisivel()){
$solicitacao = $resposta->getAndamentoSolicitacao()->getSolicitacao();
$solicitacao->setUltimaInteracao('Atendimento');
$em->persist($solicitacao);
$em->flush();
$this->notificarCliente($solicitacao);
}
return $this->json(['status' => true]);
}
public function editRespostaSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$id = $data->id;
$andamento = $data->andamento;
$mensagem = $data->mensagem;
/** @var $resposta RespostaSolicitacao */
$resposta = $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
$resposta->setMensagem($mensagem);
$em->persist($resposta);
$em->flush();
if($resposta->getAndamentoSolicitacao()->getVisivel()){
$solicitacao = $resposta->getAndamentoSolicitacao()->getSolicitacao();
$solicitacao->setUltimaInteracao('Atendimento');
$em->persist($solicitacao);
$em->flush();
$this->notificarCliente($solicitacao);
}
return $this->json(['status' => true]);
}
public function deleteRespostaSolicitacaoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$id = $data->id;
$resposta = $em->getRepository(RespostaSolicitacao::class)->findOneBy(['id' => $id]);
if(!$resposta)
return $this->json(['message' => 'Resposta não encontrado.'],400);
$em->remove($resposta);
$em->flush();
return $this->json([]);
}
/************************************************************************************************************
* Ordem de Serviço
*/
public function apiListOrdemServicoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$data = json_decode( $request->getContent() );
$solicitacao = $data->solicitacao;
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacao], ['createdAt' => 'DESC']);
$response = [];
/** @var $andamentoSolicitacao AndamentoSolicitacao */
foreach ($andamentos as $andamentoSolicitacao) {
if(!$andamentoSolicitacao->getAgendamento())
continue;
/** @var $ordemServico OrdemServico */
foreach ($andamentoSolicitacao->getAgendamento()->getOrdemServicos() as $ordemServico){
$response[] = [
'id' => $ordemServico->getId(),
'codigo' => $ordemServico->getCodigo(),
'profissional' => $ordemServico->getProfissional()->getNomecompleto(),
'status' => $ordemServico->getStatus(),
'dataAgendamento' => $this->formatDate($ordemServico->getData()),
'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
'createdAt' => $this->formatDateTime($ordemServico->getCreatedAt()),
'updatedAt' => $this->formatDateTime($ordemServico->getUpdatedAt()),
];
}
}
return $this->json($response);
}
public function apiGetOrdemServicoAction(Request $request): JsonResponse
{
$this->validateAccess("listAction");
$id = $request->get('id');
/** @var $andamentoSolicitacao AndamentoSolicitacao */
$ordemServico = $this->managerRegistry->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
if(!$ordemServico)
return $this->json(['status' => false, 'message' => 'Ordem de serviço não encontrada!']);
/** @var Solicitacao $solicitacao */
$solicitacao = $ordemServico->getAgendamento()->getAndamento()->getSolicitacao();
$response = [
'id' => $ordemServico->getId(),
'codigo' => $ordemServico->getCodigo(),
'status' => $ordemServico->getStatus(),
'dataAgendamento' => $this->formatDate($ordemServico->getData()),
'horaAgendamento' => $this->formatTime($ordemServico->getHora()),
'mensagemDinamica' => $ordemServico->getAgendamento()->getObservacoes(),
'cliente' => (!$solicitacao->getCliente())? null: [
'id' => $solicitacao->getCliente()->getId(),
'nome' => $solicitacao->getCliente()->getNomeCompleto(),
'telefone' => $solicitacao->getCliente()->getTelefone(),
'email' => $solicitacao->getCliente()->getEmail(),
],
'unidade' => (!$solicitacao->getUnidade())? null: [
'empreendimento' => $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
'unidade' => $solicitacao->getUnidade()->getUnidade(),
],
'agendamento' => (!$ordemServico->getAgendamento())? null: [
'id'=> $ordemServico->getAgendamento()->getId()
],
'profissional' => (!$ordemServico->getProfissional())? null: [
'id'=> $ordemServico->getProfissional()->getId(),
'nomeCompleto'=> $ordemServico->getProfissional()->getNomecompleto(),
'email'=> $ordemServico->getProfissional()->getEmail(),
],
'descricao' => $ordemServico->getDescricao(),
'anexosPreparacao' => $this->mediaService->getGalleryJson($ordemServico->getAnexosPreparacao()),
'anexosTrabalhoAndamento' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoAndamento()),
'anexosTrabalhoFinalizado' => $this->mediaService->getGalleryJson($ordemServico->getAnexosTrabalhoFinalizado()),
'assinaturaCliente' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaCliente()),
'assinaturaProfissional' => $this->mediaService->getMediaJson($ordemServico->getAssinaturaProfissional()),
'aCaminho' => $this->formatDateTime($ordemServico->getDataACaminho()),
'inicioAtendimento' => $this->formatDateTime($ordemServico->getDataIniciarAtendimento()),
'finalAtendimento' => $this->formatDateTime($ordemServico->getDataFinalAtendimento()),
'criadoEm' => $this->formatDateTime($ordemServico->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($ordemServico->getUpdatedAt()),
];
return $this->json($response);
}
public function deleteOrdemServicoAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$id = $request->get('id');
$ordemServico = $em->getRepository(OrdemServico::class)->findOneBy(['id' => $id]);
if(!$ordemServico)
return $this->json(['message' => 'Ordem de serviço não encontrado.'],400);
$em->remove($ordemServico);
$em->flush();
return $this->json([]);
}
/************************************************************************************************************
* Chat
*/
public function chatAction(Request $request): JsonResponse
{
$em = $this->managerRegistry->getManager();
$solicitacao = $request->get('solicitacao');
$response = $this->getDataChat($solicitacao);
return new JsonResponse($response);
}
public function getDataChat($solicitacaoId)
{
$em = $this->managerRegistry->getManager();
$andamentos = $em->getRepository(AndamentoSolicitacao::class)->findBy(['solicitacao' => $solicitacaoId], ['createdAt' => 'ASC']);
$response = [];
/** @var $andamento AndamentoSolicitacao */
foreach ($andamentos as $andamento) {
$respostasData = $em->getRepository(RespostaSolicitacao::class)->findBy(['andamentoSolicitacao' => $andamento->getId()], ['createdAt' => 'ASC']);
$respostas = [];
/** @var $resposta RespostaSolicitacao */
foreach ($respostasData as $resposta) {
$respostas[] = [
'id' => $resposta->getId(),
'assunto' => $resposta->getAssunto(),
'mensagem' => $resposta->getMensagem(),
'respondidoPor' => $resposta->getRespondidoPor(),
'criadoEm' => $this->formatDateTime($resposta->getCreatedAt()) ,
'atualizadoEm' => $this->formatDateTime($resposta->getUpdatedAt()),
'anexos' => $this->mediaService->getGalleryJson($resposta->getAnexos()),
];
}
$profissionais = [];
if($andamento->getAgendamento())
foreach ($andamento->getAgendamento()->getProfissionais() as $profissional){
$profissionais[] = $profissional->getId();
}
$response[] = [
'id' => $andamento->getId(),
'status' => !$andamento->getStatusSolicitacao()? null: [
'id' => $andamento->getStatusSolicitacao()->getId(),
'status' => $andamento->getStatusSolicitacao()->getStatus(),
],
'assunto' => $andamento->getAssunto(),
'mensagem' => $andamento->getMensagem(),
'visivel' => $andamento->getVisivel(),
'criadoEm' => $this->formatDateTime($andamento->getCreatedAt()),
'atualizadoEm' => $this->formatDateTime($andamento->getUpdatedAt()) ,
'agendamento' => !$andamento->getAgendamento()? null : [
'id' => $andamento->getAgendamento()->getId(),
'data' => date_format($andamento->getAgendamento()->getData(), 'Y-m-d'),
'periodo' => date_format($andamento->getAgendamento()->getData(), 'h:i'),
'observacoes' => $andamento->getAgendamento()->getObservacoes(),
'profissionais' => $profissionais,
],
'respostas' => $respostas,
];
}
return $response;
}
/************************************************************************************************************
* Aux
*/
public function createPesquisaSatisfacao(Solicitacao $solicitacao)
{
$pesquisa = new PesquisaSatisfacao();
$pesquisa->setSolicitacao($solicitacao);
$pesquisa->setCliente($solicitacao->getCliente());
$this->managerRegistry->getManager()->persist($pesquisa);
$this->managerRegistry->getManager()->flush();
$mail = $this->serviceEmail->getEmail();
$mail->addAddress($solicitacao->getCliente()->getEmail());
$mail->Subject = 'Aguardando Avaliação';
$mail->Body = $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_pesquisa_satisfacao.html.twig', [
'solicitacao' => $solicitacao,
]);
$mail->send();
}
public function notificarCliente(Solicitacao $solicitacao): void
{
$mail = $this->serviceEmail->getEmail();
$mail->addAddress($solicitacao->getCliente()->getEmail());
$mail->Subject = 'Atualização de Solicitação';
$mail->Body = $this->renderTemplateEmail('emails/solicitacao/notificacao_cliente_atualizacao_solicitacao.html.twig', [
'solicitacao' => $solicitacao,
]);
$mail->send();
}
public function notificarResponsavelAtendimento(Solicitacao $solicitacao): void
{
/*$mail = $this->serviceEmail->getEmail();
$mail->addAddress($solicitacao->getResponsavelAtendimento()->getEmail());
$mail->Subject = 'Atribuição de Solicitação';
$mail->Body = $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_reponsavelAtendimento.html.twig', [
'solicitacao' => $solicitacao,
]);
$mail->send();*/
}
public function createOrdemServico(Agendamento $agendamento, Solicitacao $solicitacao, AndamentoSolicitacao $andamento): void
{
$em = $this->managerRegistry->getManager();
$empresa = $this->serviceEmail->getEmpresa();
/** @var $profissional Profissional */
foreach ($agendamento->getProfissionais() as $profissional) {
$ordemServico = new OrdemServico();
$ordemServico->setAgendamento($agendamento);
$ordemServico->setData($agendamento->getData());
$ordemServico->setHora($agendamento->getHora());
$ordemServico->setProfissional($profissional);
$ordemServico->setStatus('Agendado');
$em->persist($ordemServico);
$em->flush();
$ordemServico->setCodigo("DIN00" . $ordemServico->getId() . "-1");
$em->persist($ordemServico);
$em->flush();
$resposta = new RespostaSolicitacao();
$resposta->setMensagem('Prezado(a) Senhor(a) '.$solicitacao->getCliente()->getNomeCompleto().'.
Agendamos para o dia '.$this->formatDate($agendamento->getData()).' às '.date_format($agendamento->getHora(),'H:i').'h a visita técnica.
Havendo qualquer dúvida, estamos à total disposição.
Atenciosamente,
Pedro Pachion');
$resposta->setRespondidoPor('atendimento');
$resposta->setAndamentoSolicitacao($andamento);
$em->persist($resposta);
$em->flush();
$urlProfissional = ( (substr($empresa->getUrlCliente(), -1) == '/')? $empresa->getUrlCliente(): $empresa->getUrlCliente().'/')
.'os/'.$profissional->getId().'/'.str_replace(' ', '-', $profissional->getNomecompleto());
/** START Fluxo SMS */
$phone = ($profissional->getTelefone1())?: $profissional->getTelefone2();
$nomeProfissional = explode(' ', $profissional->getNomecompleto());
$message = "Olá ". $nomeProfissional[0] .", a OS ". $ordemServico->getCodigo() .
" está disponível para a execução, acesse: ".
$urlProfissional . " Att, " . $empresa->getNome();
if($phone)
$this->serviceComteleSMS->sendSMS($phone,$message);
/** END Fluxo SMS */
/** START Fluxo Email */
$mail = $this->serviceEmail->getEmail();
$mail->addAddress($profissional->getEmail());
if($solicitacao->getResponsavelAtendimento())
$mail->addReplyTo($solicitacao->getResponsavelAtendimento()->getEmail());
$mail->Subject = 'Nova Ordem de Serviço';
$mail->Body = $this->renderTemplateEmail('emails/solicitacao/agendamento/notificacao_profissional_os_criada.html.twig', [
'profissional' => $profissional,
'os' => $ordemServico,
'urlProfissional' => $urlProfissional,
]);
$mail->send();
/** END Fluxo Email */
}
}
public function apiDashboardSolicitacoesAction(Request $request)
{
$em = $this->managerRegistry->getManager();
$empreendimentosFilter = ($request->query->get('empreendimentos'))? explode(",", $request->query->get('empreendimentos')): false;
$dataAgendamentoDe = ($request->query->get('dataAgendamentoDe'))? new \DateTime($request->query->get('dataAgendamentoDe')): false;
$dataAgendamentoAte = ($request->query->get('dataAgendamentoAte'))? new \DateTime($request->query->get('dataAgendamentoAte')): false;
$solicitacoes = $em->getRepository(Solicitacao::class)->findBy(['statusAtual' => 4]);
$solicitacoesAgendadas = [];
/** @var $solicitacao Solicitacao */
foreach ($solicitacoes as $solicitacao) {
$andamento = $solicitacao->getAndamentoSolicitacao()->last();
/** @var $agendamento Agendamento */
$agendamento = $andamento->getAgendamento();
if(!$agendamento)
continue;
$profissionais = "";
foreach ($agendamento->getProfissionais() as $profissional) {
$profissionais .= $profissional->getNomecompleto() . ', ';
}
$dateNow = new \DateTime('now');
/*if($agendamento->getData() < $dateNow)
continue;*/
if($empreendimentosFilter && !in_array($solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getId(), $empreendimentosFilter))
continue;
if($dataAgendamentoDe && ($dataAgendamentoDe > $agendamento->getData()))
continue;
if($dataAgendamentoAte && ($dataAgendamentoAte < $agendamento->getData()))
continue;
$solicitacoesAgendadas[] = [
'id' => $solicitacao->getId(),
'codigo' => $solicitacao->getCodigo(),
'empreendimento'=> $solicitacao->getUnidade()->getBloco()->getEmpreendimento()->getNome(),
'bloco' => $solicitacao->getUnidade()->getBloco()->getBloco(),
'unidade' => $solicitacao->getUnidade()->getUnidade(),
'cliente' => $solicitacao->getCliente()->getNomeCompleto(),
'profissional' => $profissionais,
'dataAgendamento' => date_format($agendamento->getData(), 'd/m/Y') . ' ' .date_format($agendamento->getHora(), 'H:i'),
'mensagem' => $solicitacao->getMensagem(),
];
}
$empreendimentos = [];
foreach ($em->getRepository(Empreendimento::class)->findBy([], ['nome' => 'ASC']) as $empreendimento) {
$empreendimentos[] = [
'id' => $empreendimento->getId(),
'name' => $empreendimento->getNome(),
];
}
return $this->json([
'solicitacoesAgendadas' => $solicitacoesAgendadas,
'empreendimentos' => $empreendimentos,
]);
}
}