src/Controller/Visao/Gestor/Componentes/DistribuicaoIdicadores.php line 59

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\ColorHelper;
  6. use App\Helper\DateHelper;
  7. use App\Helper\PeriodoHelper;
  8. use App\Repository\Cliente\Dados\CalculoRepository;
  9. use App\Repository\Cliente\Modelagem\IndicadorRepository;
  10. use App\Repository\Cliente\Rastreabilidade\RastreabilidadeRepository;
  11. use Doctrine\DBAL\Driver\ResultStatement;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * @Route("gestor/distribuicao-indicadores")
  18.  */
  19. class DistribuicaoIdicadores extends ComponenteAbstract
  20. {
  21.     const TEMPLATEBASE 'visao/gestor/componentes/';
  22.     /**
  23.      * @var CalculoRepository
  24.      */
  25.     private $calculoRepository;
  26.     private $indicadorRepository;
  27.     private $rastreabilidadeRepository;
  28.     /**
  29.      * @var ColorHelper
  30.      */
  31.     private $colorHelper;
  32.     /**
  33.      * @param CalculoRepository $calculoRepository
  34.      * @param ColorHelper $colorHelper
  35.      */
  36.     public function __construct(CalculoRepository $calculoRepositoryIndicadorRepository $indicadorRepositoryRastreabilidadeRepository $rastreabilidadeRepositoryColorHelper $colorHelper)
  37.     {
  38.         $this->calculoRepository $calculoRepository;
  39.         $this->indicadorRepository $indicadorRepository;
  40.         $this->rastreabilidadeRepository $rastreabilidadeRepository;
  41.         $this->colorHelper $colorHelper;
  42.     }
  43.     /**
  44.      * @param Request $request
  45.      * @return Response
  46.      */
  47.     public function index(Request $request): Response
  48.     {
  49.         $id_busca $request->query->get('id_busca'null);
  50.         $id_avaliado $request->query->get('id_filtro'null);
  51.         $this->getSession()->set('id_busca'$id_busca);
  52.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  53.         //Monta as strings de busca da query a ser executada
  54.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  55.         $dados $this->calculoRepository->getIndicadoresContagemPorDesempenho($this->getPrograma(), $this->getPeriodo(), $filtro$gestor_permissoes['where']);
  56.         $dados $this->processo($dados);
  57.         return $this->render('evs-distribuicao-indicadores.html.twig', [
  58.              'dados'    => $dados
  59.             ,'id_busca' => $id_busca
  60.         ]);
  61.     }
  62.     /**
  63.      * @Route("/reload", name="distribuicao_indicadores_reload")
  64.      *
  65.      * @param Request $request
  66.      * @return Response
  67.      */
  68.     public function reload(Request $request): Response
  69.     {
  70.         $id_busca $request->query->get('id_busca'null);
  71.         $this->getSession()->set('id_busca'$id_busca);
  72.         $id_filtro $request->query->get('id_filtro'null);
  73.         $dimensao $request->query->get('dimensao'null);
  74.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  75.         $filtro Dimensao::atualizaFiltro($dimensao$id_filtro$id_busca);
  76.         $dados $this->calculoRepository->getIndicadoresContagemPorDesempenho($this->getPrograma(), $this->getPeriodo(), $filtro$gestor_permissoes['where']);
  77.         $dados $this->processo($dados);
  78.         return $this->render('evs-distribuicao-indicadores.html.twig', [
  79.             'dados' => $dados,
  80.         ]);
  81.     }
  82.     /**
  83.      * @Route("/detalhes-grafico/{id_indicador}/{performance}"
  84.      *  ,requirements={"id_indicador"="\d+"}
  85.      *  ,name="distribuicao_indicadores_detalhes_grafico"
  86.      * )
  87.      * @param integer $id_indicador
  88.      * @param float $performance
  89.      * @return Response
  90.      */
  91.     public function detalhesGraficoDistribuicao(int $id_indicadorfloat $performance) :Response
  92.     {
  93.         $dimensao $this->getSession()->get('dimensao');
  94.         $id_busca $dimensao->getIdBusca();
  95.         $id_avaliado $dimensao->getIdFiltro();
  96.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  97.         unset($dimensao);
  98.         $indicador $this->indicadorRepository->find($id_indicador);
  99.         
  100.         $periodoSessao $this->getSession()->get('visao_gestor_periodo');
  101.         $from $periodoSessao['from']['ano'] . $periodoSessao['from']['periodo'];
  102.         $to $periodoSessao['to']['ano'] . $periodoSessao['to']['periodo'];
  103.         $periodos = [];
  104.         while ( $from <= $to ) {
  105.             $periodos[] = intval($from);
  106.             if (substr($from, -2) == 12 ) {
  107.                 $from $from 89;
  108.             } else {
  109.                 $from++;
  110.             }
  111.         }
  112.         $hasNovoCalculo $this->calculoRepository->checkIfHasBancoNovoCalculo($id_indicador);
  113.         if ( $hasNovoCalculo ) {
  114.             $dados $this->calculoRepository->getDetalhesDesempenhoIndicadorNovoCalculoFaixa(
  115.                 $id_indicador$periodoSessao$filtro$this->getPrograma(), $performance
  116.             );
  117.             foreach ($dados AS $dado) {
  118.                 if ( !isset($dadosNovos[$dado['id_avaliado']]) ) {
  119.                     $dadosNovos[$dado['id_avaliado']] = [
  120.                         'id_avaliado' => $dado['id_avaliado'],
  121.                         'nome_avaliado' => $dado['nome_avaliado'],
  122.                         'id_indicador' => $dado['id_indicador'],
  123.                         'indicador' => $dado['indicador'],
  124.                         'unidade_indicador' => $dado['unidade_indicador'],
  125.                         'avaliado_media_performance' => $dado['avaliado_media_performance'],
  126.                         'nome_grupo' => $dado['nome_grupo'],
  127.                         'performance_0' => $dado['performance_0'],
  128.                         'performance_1' => $dado['performance_1'],
  129.                         'resultado' => [],
  130.                         'performances' => $dado['performances']
  131.                     ];
  132.                 }
  133.                 $dadosNovos[$dado['id_avaliado']]['resultado'][] = $dado['resultado'];
  134.             }
  135.             if ( !empty($dadosNovos) ) {
  136.                 foreach ($dadosNovos AS &$value) {
  137.                     $resultadoAvaliados json_decode($value['resultado'][array_key_last($value['resultado'])], true);
  138.                     if ( array_values($resultadoAvaliados)[0]['performance'] === null ) {
  139.                         unset($value['resultado'][array_key_last($value['resultado'])]);
  140.                     }
  141.                     $resultadoArray = isset($value['resultado'][0]) ? json_decode($value['resultado'][0], true) : [];
  142.                     $periodosResultado = !empty($resultadoAvaliados) ? array_keys($resultadoAvaliados $resultadoArray) : array_keys($resultadoArray);
  143.                     foreach ( $value['resultado'] AS &$valor) {
  144.                         $valor json_decode($valortrue);
  145.                         if (array_values($resultadoAvaliados)[0]['performance'] === null ) {
  146.                             $valor $resultadoAvaliados $valor;
  147.                         }
  148.                         $periodosResultado array_keys($valor) + $periodosResultado;
  149.                         if (array_diff($periodos$periodosResultado)) {
  150.                             foreach (array_unique(array_diff($periodos$periodosResultado)) AS $periodoFaltando) {
  151.                                 if ( array_values($resultadoAvaliados)[0]['risco'] === null ) {
  152.                                     $valor[$periodoFaltando] = array_values($resultadoAvaliados)[0];
  153.                                 } else {
  154.                                     $valor[$periodoFaltando] = [
  155.                                         'risco' => null,
  156.                                         'valor' => null,
  157.                                         'numerador' => null,
  158.                                         'denominador' => null,
  159.                                         'performance' => null,
  160.                                         'performance_risco' => null,
  161.                                     ];
  162.                                 }
  163.                             }
  164.                         }
  165.                         ksort($valor);
  166.                         $valor json_encode($valor);
  167.                     }
  168.                     $value['performances'] = json_decode($value['performances'], true);
  169.                     foreach ($periodos AS $periodoKey) {
  170.                         if ( !isset($value['performances'][$periodoKey]) ) {
  171.                             $value['performances'][$periodoKey] = null;
  172.                         }
  173.                     }
  174.                     ksort($value['performances']);
  175.                     $value['performances'] = json_encode($value['performances']);
  176.                 }
  177.                 $dados array_values($dadosNovos);
  178.             }
  179.         } else {
  180.             $dados $this->calculoRepository->getDetalhesDesempenhoIndicador(
  181.                 $id_indicador$periodoSessao$filtro$this->getPrograma(), $performance
  182.             );
  183.         }
  184.         return $this->render('detalhe-evs-distribuicao-indicadores.html.twig', [
  185.              'dados'  => $dados
  186.             ,'periodos' => array_values($periodos)
  187.             ,'faixa' => $performance
  188.             ,'indicador' => $indicador
  189.         ]);
  190.     }
  191.     /**
  192.      * @param ResultStatement $dados
  193.      * @return array
  194.      */
  195.     public function processo(ResultStatement $dados): array
  196.     {
  197.         $retorno = [];
  198.         foreach ($dados as $dominio) {
  199.             $retorno[$dominio['nome_dominio']] = [];
  200.             foreach (json_decode($dominio['indicadores'], true) as $dominio_key => $indicador) {
  201.                 $retorno[$dominio['nome_dominio']]['categorias'][$dominio_key] = [
  202.                     'value' => $indicador['nome_indicador'],
  203.                     'url' => $this->generateUrl('distribuicao_indicadores_detalhes_grafico', [
  204.                         'id_indicador' => $indicador['id_indicador']
  205.                        ,'performance' => 999
  206.                    ])
  207.                 ];
  208.                 foreach ($indicador['performance'] as $key_performance => $performance) {
  209.                     if (!is_null($performance)) {
  210.                         $retorno[$dominio['nome_dominio']]['categorias'][$dominio_key]['vazio'] = false;
  211.                         $retorno[$dominio['nome_dominio']]['series'][strval($performance)]['name'] = $performance;
  212.                         $retorno[$dominio['nome_dominio']]['series'][strval($performance)]['data'][(int) $dominio_key] = [
  213.                             'y' => $indicador['contagem'][$key_performance],
  214.                             'color' => $this->colorHelper->numberToColorHsl($performance ?? 0),
  215.                             'valor_total' => $indicador['total_indicador'],
  216.                             'url' => $this->generateUrl('distribuicao_indicadores_detalhes_grafico', [
  217.                                  'id_indicador' => $indicador['id_indicador']
  218.                                 ,'performance' => $performance
  219.                             ])
  220.                         ];
  221.                     } else {
  222.                         //O 'nome' da posição no gráfico é 101 para que a faixa ND fique sempre à direita
  223.                         $retorno[$dominio['nome_dominio']]['series'][strval($performance)]['name'] = 101;
  224.                         //Por conta da rota do gráfico receber apenas números, foi definido que -1 seria o número da faixa ND
  225.                         $retorno[$dominio['nome_dominio']]['series'][strval($performance)]['data'][(int) $dominio_key] = [
  226.                             'y' => $indicador['contagem'][$key_performance],
  227.                             'color' => '#D1D1D1',
  228.                             'valor_total' => $indicador['total_indicador'],
  229.                             'url' => $this->generateUrl('distribuicao_indicadores_detalhes_grafico', [
  230.                                 'id_indicador' => $indicador['id_indicador']
  231.                                ,'performance' => -1
  232.                            ])
  233.                         ];
  234.                         $retorno[$dominio['nome_dominio']]['categorias'][$dominio_key]['vazio'] = isset($retorno[$dominio['nome_dominio']]['categorias'][$dominio_key]['vazio']) ? false true;
  235.                     }
  236.                     $retorno[$dominio['nome_dominio']]['series'][strval($performance)]['data'] = $this->organizaArray($dominio_key$retorno[$dominio['nome_dominio']]['series'][strval($performance)]['data']);
  237.                 }
  238.             }
  239.             ksort($retorno[$dominio['nome_dominio']]['series']);
  240.             rsort($retorno[$dominio['nome_dominio']]['series']);
  241.             $retorno[$dominio['nome_dominio']]['series'] = json_encode($retorno[$dominio['nome_dominio']]['series']);
  242.             $retorno[$dominio['nome_dominio']]['categorias'] = json_encode($retorno[$dominio['nome_dominio']]['categorias']);
  243.         }
  244.         return $retorno ?? [];
  245.     }
  246.     /**
  247.      * Trata o array para funcionar no highcharts sem erros de informações em linhas diferentes
  248.      * este metodo é necessario para que o highcharts tenha as posições zeradas quando existirem 2 linhas para o mesmo dominio.
  249.      * Aqui ele pegará o array e irá preenxelo com valores zero para as posições onde existem informações, assim nunca haverá um array com apenas a posição 1,
  250.      * pois essa função criará a posição de acordo com a chave passada.
  251.      *
  252.      * @author Guilhermer Arduino <guilherme.barlatti@2im.com.br>
  253.      *
  254.      * @param integer $key
  255.      * @param array $array
  256.      * @return array
  257.      */
  258.     public function organizaArray(int $key, array $array): array
  259.     {
  260.         $cria_array range(0$key);
  261.         foreach ($cria_array as $chave) {
  262.             if (!array_key_exists($chave$array)) {
  263.                 $array[$chave] =
  264.                 [
  265.                     'y' => 0,
  266.                 ];
  267.             }
  268.         }
  269.         ksort($array);
  270.         return $array;
  271.     }
  272.     
  273.     /**
  274.      * @Route("/detalhes-grafico-rastreabilidade"
  275.      *  ,name="distribuicao_indicadores_detalhes_rastreabilidade"
  276.      * )
  277.      * 
  278.      * @param integer $id_indicador
  279.      * @param integer $id_avaliado
  280.      * @param integer $periodo
  281.      * 
  282.      * @return Response
  283.      */
  284.     public function detalhesGraficoDistribuicaoRasteabilidade(Request $request) :Response
  285.     {
  286.         $dimensao $this->getSession()->get('dimensao');
  287.         $id_busca $dimensao->getIdBusca();
  288.         $id_avaliado $dimensao->getIdFiltro();
  289.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  290.         unset($dimensao);
  291.         $id_indicador $request->query->get('id_indicador');
  292.         $id_avaliado $request->query->get('id_avaliado');
  293.         $periodo $request->query->get('periodo');
  294.         
  295.         $indicador $this->indicadorRepository->find($id_indicador);
  296.         if($indicador->getIdIndicadorTipo() == 3) {
  297.             $dados $this->rastreabilidadeRepository->getRastrabilidadeVariavelByIndicador(
  298.                 $this->getPrograma()['where']
  299.                 , $periodo
  300.                 null
  301.                 $id_avaliado
  302.                 $id_indicador
  303.             );
  304.             $rastreabilidades = [];
  305.             foreach($dados AS $k => $d) {
  306.                 $rastreabilidades[$d['id_ajuste_risco']][$d['tipo']] = $dados[$k];
  307.             }
  308.         
  309.             return $this->render('detalhe-evs-distribuicao-indicadores-rastreabilidade-ar.html.twig', [
  310.                 'nome_indicador' => $dados[0]['titulo'] ?? ''
  311.                 'id_indicador' => $dados[0]['id_indicador'] ?? ''
  312.                 'periodo' => DateHelper::toString($periodo)
  313.                 , 'rastreabilidades' => $rastreabilidades ?? []
  314.             ]);
  315.         } elseif($indicador->getIdIndicadorTipo() == 2) {
  316.             $dados $this->calculoRepository->getDetalhesDesempenhoIndicadorRastreabilidadeDrg(
  317.                 $id_indicador$periodo$filtro$this->getPrograma(), $id_avaliado
  318.             );
  319.             
  320.             return $this->render('detalhe-evs-distribuicao-indicadores-rastreabilidade-drg.html.twig', [
  321.                 'nome_indicador' => $indicador->getTitulo() ?? ''
  322.                 'id_indicador' => $indicador->getIdIndicador() ?? ''
  323.                 'periodo' => DateHelper::toString($periodo)
  324.                 , 'rastreabilidades' => $dados ?? []
  325.             ]);
  326.         } else {
  327.             $dados $this->calculoRepository->getDetalhesDesempenhoIndicadorRastreabilidade(
  328.                 $id_indicador$periodo$filtro$this->getPrograma(), $id_avaliado
  329.             );
  330.         }
  331.         
  332.         if(!$dados) {
  333.             $dados $this->calculoRepository->getCalculo(
  334.                 $id_indicador$periodo$filtro$this->getPrograma(), $id_avaliado
  335.             );
  336.             $banda json_decode($dados['dados'], TRUE);
  337.             $periodo json_decode($dados['periodo'], TRUE);
  338.             $ficha_tecnica json_decode($dados['ficha_tecnica'], TRUE);
  339.             
  340.             if(isset($banda['banda']['tipo']) && $banda['banda']['tipo'] == 'ND') {
  341.                 return $this->render('detalhe-evs-distribuicao-indicadores-rastreabilidade-nd.html.twig', [
  342.                     'nome_indicador' => $dados['nome_indicador']
  343.                     , 'id_indicador' => $dados['id_indicador']
  344.                     , 'ficha_tecnica' => $ficha_tecnica
  345.                     'periodo' => DateHelper::toString($periodo['ano'].$periodo['periodo'])
  346.                     , 'texto' => $banda['resultado']['txt']
  347.                 ]);
  348.             }
  349.             
  350.         }
  351.         $numerador $denominador = [];
  352.         $cabecalho json_decode($dados['cabecalho'], TRUE);
  353.         $numerador = [
  354.             'cabecalho' => $cabecalho['numerador']
  355.             , 'dados' => json_decode($dados['numerador'], TRUE)
  356.         ];
  357.         if(isset($cabecalho['denominador'])) {
  358.             $denominador = [
  359.                 'cabecalho' => $cabecalho['denominador']
  360.                 , 'dados' => json_decode($dados['denominador'], TRUE)
  361.             ];
  362.         }
  363.         $periodo json_decode($dados['periodo'], TRUE);
  364.         $ficha_tecnica json_decode($dados['ficha_tecnica'], TRUE);
  365.         
  366.         return $this->render('detalhe-evs-distribuicao-indicadores-rastreabilidade.html.twig', [
  367.             'nome_indicador' => $dados['titulo']
  368.             , 'id_indicador' => $dados['id_indicador']
  369.             , 'periodo' => DateHelper::toString($periodo['ano'].$periodo['periodo'])
  370.             , 'ficha_tecnica' => $ficha_tecnica
  371.             'numerador' => $numerador
  372.             'denominador' => $denominador
  373.         ]);
  374.     }
  375. }