<?php
namespace App\Controller\Visao\Gestor\Componentes;
use App\Controller\Componentes\ComponenteAbstract;
use App\Entity\Cliente\Dimensao;
use App\Helper\DateHelper;
use App\Helper\StringHelper;
use App\Repository\Cliente\Dados\EvsRepository;
use App\Repository\Cliente\Modelagem\AvaliadoRepository;
use App\Repository\Cliente\Modelagem\GrupoRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class EvsInformativoController extends ComponenteAbstract
{
const TEMPLATEBASE = 'visao/gestor/componentes/';
/**
* @var EvsRepository
*/
private $evsRepository;
/**
* @var AvaliadoRepository
*/
private $avaliado;
/**
* @var SessionInterface
*/
private $session;
/**
* @param EvsRepository $evsRepository
* @param AvaliadoRepository $avaliadoRepository
* @param SessionInterface $session
*/
public function __construct(EvsRepository $evsRepository, AvaliadoRepository $avaliadoRepository, SessionInterface $session)
{
$this->evsRepository = $evsRepository;
$this->avaliado = $avaliadoRepository;
$this->session = $session;
}
/**
* @param float $valor
* @return float
*/
private function __calculaEstrelas(float $valor): float
{
return ($valor * 100) / 5;
}
/**
* @param Request $request
* @return Response
*/
public function index(Request $request): Response
{
$retorno = [];
$dimensao = $request->query->get('dimensao');
$id_busca = $request->query->get('id_busca', null);
$id_avaliado = $request->query->get('id_filtro', null);
$permissao_gestor = $this->session->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro(
$dimensao
,(($id_avaliado) ? [$id_avaliado] : NULL) // quando clique no avaliado
,$id_busca
);
$dados = $this->evsRepository->buscarPerformanceDoPrograma($this->getPrograma(), $this->getPeriodo(), $busca, $permissao_gestor['where']);
if (empty($dados)) {
return $this->render('sem-producao.html.twig');
}
$retorno = $this->processo($dados);
$modelagem = $this->getPrograma()['modelagem_nome'];
$programa = $this->getPrograma()['programa']['titulo'];
return $this->render('evs-informativo.html.twig', [
'retorno' => $retorno,
'icones' => $this->getIcones(),
'programa' => $programa,
'modelagem' => $modelagem,
'dimensao' => $dimensao,
'id_busca' => $id_busca,
]);
}
public function indiceQualidade(Request $request)
{
$avaliado = $this->avaliado->getAvaliadoView($request->query->getInt('id_avaliado', $this->getIdAvaliado()));
$dados = $this->evsRepository->avaliado($this->getPrograma(), $this->getPeriodo(), $avaliado);
$retorno = $this->processo($dados);
$indiceQualidade = $retorno['dados']['performance_qualidade'];
$pesoDaQualiade = $retorno['dados']['peso_qualidade'];
return $this->render('indice-qualidade.html.twig', [
'indice_qualidade' => $indiceQualidade,
'peso_qualidade' => $pesoDaQualiade,
]);
}
public function indiceCusteio(Request $request)
{
$avaliado = $this->avaliado->getAvaliadoView($request->query->getInt('id_avaliado', $this->getIdAvaliado()));
$dados = $this->evsRepository->avaliado($this->getPrograma(), $this->getPeriodo(), $avaliado);
$retorno = $this->processo($dados);
$indiceCusteio = $retorno['dados']['performance_custo'];
$pesoDoCusto = $retorno['dados']['peso_custo'];
return $this->render('indice-custeio.html.twig', [
'indice_custeio' => $indiceCusteio,
'peso_custo' => $pesoDoCusto,
]);
}
public function processo(array $dados): array
{
$retorno = [
'valor' => $dados['valor'],
'performance_qualidade' => $dados['performance_qualidade'],
'performance_custo' => $dados['performance_custo'],
'peso_qualidade' => $dados['peso_qualidade'],
'peso_custo' => $dados['peso_custo'],
'diferenca' => 0,
];
$porcentagemEstrelas = $this->__calculaEstrelas($dados['valor']);
return [
'dados' => $retorno,
'estrelas' => $porcentagemEstrelas,
];
}
/**
* @Route("/grafico-informativo/{dimensao}", name="grafico_informativo")
*
* @param Request $request
* @param string $dimensao
* @return Response
*/
public function abrirGrafico(Request $request, string $dimensao) :Response
{
$dimensao_nome = $request->get('dimensao', null);
$id_busca = $request->query->get('id_busca', null);
$id_avaliado = $request->query->get('id_filtro', null);
$gestor_permissoes = $this->session->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro(
$dimensao_nome
,(($id_avaliado) ? [$id_avaliado] : NULL) // quando clique no avaliado
,$id_busca
);
$dados = $this->evsRepository->graficoEvolucaoEvs($this->getPrograma(), $this->getPeriodo(), $busca, $gestor_permissoes['where']);
$dados = $this->organizarGrafico($dados);
return $this->render('grafico-informativo.html.twig', [
'dados_evs' => $dados['evs']
,'dados_performance_custo' => $dados['performance_custo']
,'dados_performance_qualidade' => $dados['performance_qualidade']
,'categorias' => $dados['categorias']
]);
}
/**
* monta as informações para de acordo com que o grafico precisa.
*/
public function organizarGrafico(array $dados): array
{
$retorno = [
'series' => '', 'categorias' => '',
];
$legenda = [
'performance_qualidade' => 'Performance Qualidade', 'performance_custo' => 'Performance Custeio', 'valor' => 'EVS',
];
if (empty($dados) || !$dados) {
return $retorno;
}
if (is_array($dados)) {
$categorias = $dados[0]['periodo'];
$info = $dados[0];
foreach ($legenda as $key => $row) {
$series[$key] = json_decode($info[$key], true);
}
$retorno = [
'categorias' => DateHelper::converteStringArrayPeriodos($categorias, true), 'performance_qualidade' => json_encode($series['performance_qualidade'], true), 'performance_custo' => json_encode($series['performance_custo'], true),
'evs' => json_encode($series['valor'], true),
];
}
return $retorno;
}
/**
* @Route("/recarregar-cards", name="recarregar_cards")
*/
public function getCardIndices(Request $request)
{
$dimensao = $request->query->get('dimensao');
$id_busca = $request->query->get('id_busca', null);
$id_filtro = $request->query->get('id_filtro', null);
$gestor_permissoes = $request->getSession()->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro($dimensao, $id_filtro, $id_busca);
$dados = $this->evsRepository->buscarPerformanceDoPrograma($this->getPrograma(), $this->getPeriodo(), $busca, $gestor_permissoes['where']);
if (empty($dados)) {
return $this->json('Erro ao recarregar cards', Response::HTTP_PRECONDITION_FAILED);
}
return $this->json([
'performance_custo' => StringHelper::isFloat($dados['performance_custo']), 'performance_qualidade' => StringHelper::isFloat($dados['performance_qualidade']), 'evs' => StringHelper::isFloat($dados['valor']), 'estrelas' => $this->__calculaEstrelas($dados['valor']),
], Response::HTTP_OK);
}
/**
* Função que carrega o gráfico de evolução de performance por Domínio
*
* @Route("/grafico-performance-dominio/{dimensao}",name="grafico_performance_dominio")
*/
public function evolucaoDominio(Request $request, string $dimensao): Response
{
$dimensaoNome = $request->get('dimensao');
$idBusca = $request->get('id_busca');
$idAvaliado = $request->query->get('id_filtro');
$gestorPermissoes = $request->getSession()->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro(
$dimensaoNome,
($idAvaliado ? [$idAvaliado] : null),
$idBusca
);
if($this->getSession()->get('cliente')->getDbname() === 'analytics_unimed_cwb_ajuste'){
$dados = $this->evsRepository->graficoPerformanceDominioCWB($this->getPrograma(), $this->getPeriodo(), $busca, $gestorPermissoes['where']);
} else {
$dados = $this->evsRepository->graficoPerformanceDominio($this->getPrograma(), $this->getPeriodo(), $busca, $gestorPermissoes['where']);
}
$periodos = [];
$series = [];
if ( count($dados) ) {
foreach(json_decode($dados[0]['performances'], true) as $dado) {
$periodos[] = $dado['periodo'];
}
foreach($dados as $dominio) {
foreach(json_decode($dominio['performances'], true) as $dado) {
$series[$dominio['nome_dominio']][$dado['periodo']] = $dado['performance'];
}
}
}
$periodos = DateHelper::intervalo($this->getPeriodo()['from']['ano'].$this->getPeriodo()['from']['periodo'], $this->getPeriodo()['to']['ano'].$this->getPeriodo()['to']['periodo']);
return $this->render('grafico-performance-dominio.html.twig',[
'series' => json_encode($series, JSON_UNESCAPED_UNICODE),
'categorias' => DateHelper::converteStringArrayPeriodos(json_encode($periodos, JSON_UNESCAPED_UNICODE), true)
]);
}
/**
* @Route("/grafico-dispersao/{dimensao}", name="grafico_dispersao_evs")
* @param Request $request
* @param String $dimensao
*/
public function graficoDispersao(Request $request, string $dimensao, GrupoRepository $grupoRepository)
{
$dimensaoNome = $this->session->get('dimensao')->getDimensao();
$idBusca = $this->session->get('dimensao')->getIdBusca() ?? null;
$idAvaliado = $this->session->get('dimensao')->getIdFiltro() ?? null;
$gestorPermissoes = $this->session->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro(
$dimensaoNome,
($idAvaliado ? [$idAvaliado] : null),
$idBusca
);
if($this->getSession()->get('cliente')->getDbname() === 'analytics_unimed_cwb_ajuste'){
$dados = $this->evsRepository->graficoDispersaoCWB($this->getPrograma(), $this->getPeriodo(), $busca, $gestorPermissoes['where']);
} else {
$dados = $this->evsRepository->graficoDispersao($this->getPrograma(), $this->getPeriodo(), $busca, $gestorPermissoes['where']);
}
//Organização para o Gráfico
$series = array();
foreach($dados as $key => $content) {
$series[] = [
"id" => $content['id'],
"name" => $content['nome'],
'data' => [[
(float) $content['performance_eficiencia'],
(float) $content['performance_efetividade']
]]
];
}
ksort($series);
$especialidade = null;
if (Dimensao::POR_ESPECIALIDADE == $dimensaoNome) {
$especialidade = $grupoRepository->find($idBusca);
}
return $this->render('grafico-dispersao.html.twig', [
'series' => json_encode($series),
'dimensao' => $dimensaoNome,
'especialidade' => $especialidade
]);
}
/**
* @Route("/grafico-desempenho-decil/{dimensao}", name="grafico_desempenho_decil")
*/
public function desempenhoDecil(Request $request, string $dimensao): Response
{
$dimensaoNome = $request->get('dimensao');
$idBusca = $request->query->get('id_busca');
$idAvaliado = $request->query->get('id_filtro');
$gestorPermissoes = $this->session->get('gestor_permissoes');
$busca = Dimensao::atualizaFiltro(
$dimensaoNome,
($idAvaliado ? [$idAvaliado] : null),
$idBusca
);
$dados = $this->evsRepository->graficoDesempenhoDecil($this->getPrograma(), $this->getPeriodo(), $busca, $gestorPermissoes['where']);
//Organização para o Gráfico
$series = [];
$categorias = [];
$colors = [
'4~5' => '#0f9246',
'3~4' => '#7dbb42',
'2~3' => '#e6aa29',
'1~2' => '#e6aa29',
'0~1' => '#e66729',
'0~0' => '#e62b29',
];
foreach($dados as $key => $content) {
$categorias[] = str_replace('~', '-', $content['decil']);
$series[0]['name'] = 'Quantidade';
$series[0]['type'] = 'column';
$series[0]['data'][] = [
'y' => $content['qtd'],
'color' => $colors[$content['decil']]
];
$series[0]['yAxis'] = 0;
$series[1]['name'] = 'Porcentagem';
$series[1]['yAxis'] = 1;
$series[1]['type'] = 'spline';
$series[1]['color'] = '#6D869F';
$series[1]['tooltip'] = ['valueSuffix' => ' %'];
$series[1]['data'][] = (float) $content['porcentagem'];
}
ksort($series);
$maxValue = $dados[0]['total'];
return $this->render('grafico-desempenho-decil.html.twig', [
'series' => json_encode($series),
'categorias' => json_encode($categorias),
'maxValue' => $maxValue
]);
}
}