src/Controller/Visao/Gestor/Componentes/EvsInformativoController.php line 61

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Visao\Gestor\Componentes;
  3. use App\Controller\Componentes\ComponenteAbstract;
  4. use App\Entity\Cliente\Dimensao;
  5. use App\Helper\DateHelper;
  6. use App\Helper\StringHelper;
  7. use App\Repository\Cliente\Dados\EvsRepository;
  8. use App\Repository\Cliente\Modelagem\AvaliadoRepository;
  9. use App\Repository\Cliente\Modelagem\GrupoRepository;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. class EvsInformativoController extends ComponenteAbstract
  15. {
  16.     const TEMPLATEBASE 'visao/gestor/componentes/';
  17.     /**
  18.      * @var EvsRepository
  19.      */
  20.     private $evsRepository;
  21.     /**
  22.      *  @var AvaliadoRepository
  23.      */
  24.     private $avaliado;
  25.     /**
  26.      * @var SessionInterface
  27.      */
  28.     private $session;
  29.     /**
  30.      * @param EvsRepository $evsRepository
  31.      * @param AvaliadoRepository $avaliadoRepository
  32.      * @param SessionInterface $session
  33.      */
  34.     public function __construct(EvsRepository $evsRepositoryAvaliadoRepository $avaliadoRepositorySessionInterface $session)
  35.     {
  36.         $this->evsRepository $evsRepository;
  37.         $this->avaliado $avaliadoRepository;
  38.         $this->session $session;
  39.     }
  40.     /**
  41.      * @param float $valor
  42.      * @return float
  43.      */
  44.     private function __calculaEstrelas(float $valor): float
  45.     {
  46.         return ($valor 100) / 5;
  47.     }
  48.     /**
  49.      * @param Request $request
  50.      * @return Response
  51.      */
  52.     public function index(Request $request): Response
  53.     {
  54.         $retorno = [];
  55.         $dimensao $request->query->get('dimensao');
  56.         $id_busca $request->query->get('id_busca'null);
  57.         $id_avaliado $request->query->get('id_filtro'null);
  58.         $permissao_gestor $this->session->get('gestor_permissoes');
  59.         $busca Dimensao::atualizaFiltro(
  60.             $dimensao
  61.             ,(($id_avaliado) ? [$id_avaliado] : NULL// quando clique no avaliado
  62.             ,$id_busca
  63.         );
  64.         $dados $this->evsRepository->buscarPerformanceDoPrograma($this->getPrograma(), $this->getPeriodo(), $busca$permissao_gestor['where']);
  65.         if (empty($dados)) {
  66.             return $this->render('sem-producao.html.twig');
  67.         }
  68.         $retorno $this->processo($dados);
  69.         $modelagem $this->getPrograma()['modelagem_nome'];
  70.         $programa $this->getPrograma()['programa']['titulo'];
  71.         return $this->render('evs-informativo.html.twig', [
  72.             'retorno' => $retorno,
  73.             'icones' => $this->getIcones(),
  74.             'programa' => $programa,
  75.             'modelagem' => $modelagem,
  76.             'dimensao' => $dimensao,
  77.             'id_busca' => $id_busca,
  78.         ]);
  79.     }
  80.     public function indiceQualidade(Request $request)
  81.     {
  82.         $avaliado $this->avaliado->getAvaliadoView($request->query->getInt('id_avaliado'$this->getIdAvaliado()));
  83.         $dados $this->evsRepository->avaliado($this->getPrograma(), $this->getPeriodo(), $avaliado);
  84.         $retorno $this->processo($dados);
  85.         $indiceQualidade $retorno['dados']['performance_qualidade'];
  86.         $pesoDaQualiade $retorno['dados']['peso_qualidade'];
  87.         return $this->render('indice-qualidade.html.twig', [
  88.             'indice_qualidade' => $indiceQualidade,
  89.             'peso_qualidade' => $pesoDaQualiade,
  90.         ]);
  91.     }
  92.     public function indiceCusteio(Request $request)
  93.     {
  94.         $avaliado $this->avaliado->getAvaliadoView($request->query->getInt('id_avaliado'$this->getIdAvaliado()));
  95.         $dados $this->evsRepository->avaliado($this->getPrograma(), $this->getPeriodo(), $avaliado);
  96.         $retorno $this->processo($dados);
  97.         $indiceCusteio $retorno['dados']['performance_custo'];
  98.         $pesoDoCusto $retorno['dados']['peso_custo'];
  99.         return $this->render('indice-custeio.html.twig', [
  100.             'indice_custeio' => $indiceCusteio,
  101.             'peso_custo' => $pesoDoCusto,
  102.         ]);
  103.     }
  104.     public function processo(array $dados): array
  105.     {
  106.         $retorno = [
  107.             'valor' => $dados['valor'],
  108.             'performance_qualidade' => $dados['performance_qualidade'],
  109.             'performance_custo' => $dados['performance_custo'],
  110.             'peso_qualidade' => $dados['peso_qualidade'],
  111.             'peso_custo' => $dados['peso_custo'],
  112.             'diferenca' => 0,
  113.         ];
  114.         $porcentagemEstrelas $this->__calculaEstrelas($dados['valor']);
  115.         return [
  116.             'dados' => $retorno,
  117.             'estrelas' => $porcentagemEstrelas,
  118.         ];
  119.     }
  120.     /**
  121.      * @Route("/grafico-informativo/{dimensao}", name="grafico_informativo")
  122.      *
  123.      * @param Request $request
  124.      * @param string $dimensao
  125.      * @return Response
  126.      */
  127.     public function abrirGrafico(Request $requeststring $dimensao) :Response
  128.     {
  129.         $dimensao_nome $request->get('dimensao'null);
  130.         $id_busca $request->query->get('id_busca'null);
  131.         $id_avaliado $request->query->get('id_filtro'null);
  132.         $gestor_permissoes $this->session->get('gestor_permissoes');
  133.         $busca Dimensao::atualizaFiltro(
  134.              $dimensao_nome
  135.             ,(($id_avaliado) ? [$id_avaliado] : NULL// quando clique no avaliado
  136.             ,$id_busca
  137.         );
  138.         $dados $this->evsRepository->graficoEvolucaoEvs($this->getPrograma(), $this->getPeriodo(), $busca$gestor_permissoes['where']);
  139.         
  140.         $dados $this->organizarGrafico($dados);
  141.         return $this->render('grafico-informativo.html.twig', [
  142.              'dados_evs'                   => $dados['evs']
  143.             ,'dados_performance_custo'     => $dados['performance_custo']
  144.             ,'dados_performance_qualidade' => $dados['performance_qualidade']
  145.             ,'categorias'                  => $dados['categorias']
  146.         ]);
  147.     }
  148.     /**
  149.      * monta as informações para de acordo com que o grafico precisa.
  150.      */
  151.     public function organizarGrafico(array $dados): array
  152.     {
  153.         $retorno = [
  154.             'series' => '''categorias' => '',
  155.         ];
  156.         $legenda = [
  157.             'performance_qualidade' => 'Performance Qualidade''performance_custo' => 'Performance Custeio''valor' => 'EVS',
  158.         ];
  159.         if (empty($dados) || !$dados) {
  160.             return $retorno;
  161.         }
  162.         if (is_array($dados)) {
  163.             $categorias $dados[0]['periodo'];
  164.             $info $dados[0];
  165.             foreach ($legenda as $key => $row) {
  166.                 $series[$key] = json_decode($info[$key], true);
  167.             }
  168.             $retorno = [
  169.                 'categorias' => DateHelper::converteStringArrayPeriodos($categoriastrue), 'performance_qualidade' => json_encode($series['performance_qualidade'], true), 'performance_custo' => json_encode($series['performance_custo'], true),
  170.                 'evs' => json_encode($series['valor'], true),
  171.             ];
  172.         }
  173.         return $retorno;
  174.     }
  175.     /**
  176.      * @Route("/recarregar-cards", name="recarregar_cards")
  177.      */
  178.     public function getCardIndices(Request $request)
  179.     {
  180.         $dimensao $request->query->get('dimensao');
  181.         $id_busca $request->query->get('id_busca'null);
  182.         $id_filtro $request->query->get('id_filtro'null);
  183.         $gestor_permissoes $request->getSession()->get('gestor_permissoes');
  184.         $busca Dimensao::atualizaFiltro($dimensao$id_filtro$id_busca);
  185.         $dados $this->evsRepository->buscarPerformanceDoPrograma($this->getPrograma(), $this->getPeriodo(), $busca$gestor_permissoes['where']);
  186.         if (empty($dados)) {
  187.             return $this->json('Erro ao recarregar cards'Response::HTTP_PRECONDITION_FAILED);
  188.         }
  189.         return $this->json([
  190.             'performance_custo' => StringHelper::isFloat($dados['performance_custo']), 'performance_qualidade' => StringHelper::isFloat($dados['performance_qualidade']), 'evs' => StringHelper::isFloat($dados['valor']), 'estrelas' => $this->__calculaEstrelas($dados['valor']),
  191.         ], Response::HTTP_OK);
  192.     }
  193.     /**
  194.      * Função que carrega o gráfico de evolução de performance por Domínio
  195.      *
  196.      * @Route("/grafico-performance-dominio/{dimensao}",name="grafico_performance_dominio")
  197.      */
  198.     public function evolucaoDominio(Request $requeststring $dimensao): Response
  199.     {
  200.         $dimensaoNome $request->get('dimensao');
  201.         $idBusca $request->get('id_busca');
  202.         $idAvaliado $request->query->get('id_filtro');
  203.         $gestorPermissoes $request->getSession()->get('gestor_permissoes');
  204.         $busca Dimensao::atualizaFiltro(
  205.             $dimensaoNome,
  206.             ($idAvaliado ? [$idAvaliado] : null),
  207.             $idBusca
  208.         );
  209.         if($this->getSession()->get('cliente')->getDbname() === 'analytics_unimed_cwb_ajuste'){
  210.             $dados $this->evsRepository->graficoPerformanceDominioCWB($this->getPrograma(), $this->getPeriodo(), $busca$gestorPermissoes['where']);
  211.         } else {
  212.             $dados $this->evsRepository->graficoPerformanceDominio($this->getPrograma(), $this->getPeriodo(), $busca$gestorPermissoes['where']);
  213.         }
  214.         $periodos = [];
  215.         $series = [];
  216.         if ( count($dados) ) {
  217.             foreach(json_decode($dados[0]['performances'], true) as $dado) {
  218.                 $periodos[] = $dado['periodo'];
  219.             }
  220.             foreach($dados as $dominio) {
  221.                 foreach(json_decode($dominio['performances'], true) as $dado) {
  222.                     $series[$dominio['nome_dominio']][$dado['periodo']] = $dado['performance'];
  223.                 }
  224.             }
  225.         }
  226.         
  227.         $periodos DateHelper::intervalo($this->getPeriodo()['from']['ano'].$this->getPeriodo()['from']['periodo'], $this->getPeriodo()['to']['ano'].$this->getPeriodo()['to']['periodo']);
  228.         
  229.         return $this->render('grafico-performance-dominio.html.twig',[
  230.             'series' => json_encode($seriesJSON_UNESCAPED_UNICODE),
  231.             'categorias' => DateHelper::converteStringArrayPeriodos(json_encode($periodosJSON_UNESCAPED_UNICODE), true)
  232.         ]);
  233.     }
  234.     /**
  235.      * @Route("/grafico-dispersao/{dimensao}", name="grafico_dispersao_evs")
  236.      * @param Request $request
  237.      * @param String $dimensao
  238.      */
  239.     public function graficoDispersao(Request $requeststring $dimensaoGrupoRepository $grupoRepository)
  240.     {
  241.         $dimensaoNome $this->session->get('dimensao')->getDimensao();
  242.         $idBusca $this->session->get('dimensao')->getIdBusca() ?? null;
  243.         $idAvaliado $this->session->get('dimensao')->getIdFiltro() ?? null;
  244.         $gestorPermissoes $this->session->get('gestor_permissoes');
  245.         $busca Dimensao::atualizaFiltro(
  246.             $dimensaoNome,
  247.             ($idAvaliado ? [$idAvaliado] : null),
  248.             $idBusca
  249.         );
  250.         
  251.         if($this->getSession()->get('cliente')->getDbname() === 'analytics_unimed_cwb_ajuste'){
  252.             $dados $this->evsRepository->graficoDispersaoCWB($this->getPrograma(), $this->getPeriodo(), $busca$gestorPermissoes['where']);
  253.         } else {
  254.             $dados $this->evsRepository->graficoDispersao($this->getPrograma(), $this->getPeriodo(), $busca$gestorPermissoes['where']);
  255.         }
  256.         
  257.         //Organização para o Gráfico
  258.         $series = array();
  259.         foreach($dados as $key => $content) {
  260.             $series[] = [
  261.                 "id" => $content['id'],
  262.                 "name" => $content['nome'],
  263.                 'data' => [[
  264.                     (float) $content['performance_eficiencia'],
  265.                     (float) $content['performance_efetividade']
  266.                 ]]
  267.             ];
  268.         }
  269.         ksort($series);
  270.         $especialidade null;
  271.         if (Dimensao::POR_ESPECIALIDADE == $dimensaoNome) {
  272.             $especialidade $grupoRepository->find($idBusca);
  273.         }
  274.         return $this->render('grafico-dispersao.html.twig', [
  275.             'series' => json_encode($series),
  276.             'dimensao' => $dimensaoNome,
  277.             'especialidade' => $especialidade
  278.         ]);
  279.     }
  280.     /**
  281.      * @Route("/grafico-desempenho-decil/{dimensao}", name="grafico_desempenho_decil")
  282.      */
  283.     public function desempenhoDecil(Request $requeststring $dimensao): Response
  284.     {
  285.         $dimensaoNome $request->get('dimensao');
  286.         $idBusca $request->query->get('id_busca');
  287.         $idAvaliado $request->query->get('id_filtro');
  288.         $gestorPermissoes $this->session->get('gestor_permissoes');
  289.         $busca Dimensao::atualizaFiltro(
  290.             $dimensaoNome,
  291.             ($idAvaliado ? [$idAvaliado] : null),
  292.             $idBusca
  293.         );
  294.         $dados $this->evsRepository->graficoDesempenhoDecil($this->getPrograma(), $this->getPeriodo(), $busca$gestorPermissoes['where']);
  295.         //Organização para o Gráfico
  296.         $series = [];
  297.         $categorias = [];
  298.         $colors = [
  299.             '4~5' => '#0f9246',
  300.             '3~4' => '#7dbb42',
  301.             '2~3' => '#e6aa29',
  302.             '1~2' => '#e6aa29',
  303.             '0~1' => '#e66729',
  304.             '0~0' => '#e62b29',
  305.         ];
  306.         foreach($dados as $key => $content) {
  307.             $categorias[] = str_replace('~''-'$content['decil']);
  308.             $series[0]['name'] = 'Quantidade';
  309.             $series[0]['type'] = 'column';
  310.             $series[0]['data'][] = [
  311.                 'y' => $content['qtd'],
  312.                 'color' =>  $colors[$content['decil']]
  313.             ];
  314.             $series[0]['yAxis'] = 0;
  315.             $series[1]['name'] = 'Porcentagem';
  316.             $series[1]['yAxis'] = 1;
  317.             $series[1]['type'] = 'spline';
  318.             $series[1]['color'] = '#6D869F';
  319.             $series[1]['tooltip'] = ['valueSuffix' => ' %'];
  320.             $series[1]['data'][] = (float) $content['porcentagem'];
  321.         }
  322.         ksort($series);
  323.         $maxValue $dados[0]['total'];
  324.         return $this->render('grafico-desempenho-decil.html.twig', [
  325.             'series' => json_encode($series),
  326.             'categorias' => json_encode($categorias),
  327.             'maxValue' => $maxValue
  328.         ]);
  329.     }
  330. }