<?php
namespace App\Controller\Visao\GPS\Avaliado\Componentes;
use App\Controller\Componentes\ComponenteAbstract;
use App\Helper\DateHelper;
use App\Repository\Cliente\Dados\CalculoRepository;
use App\Repository\Cliente\Dados\GpsRepository;
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\Routing\Annotation\Route;
/**
* Route("gps/avaliado/performance-avaliado").
*/
class PerformanceAvaliadoController extends ComponenteAbstract
{
const TEMPLATEBASE = 'visao/gps/avaliado/componentes/';
public $jsFiles = ['avaliado/performanceAvaliado.js'];
protected $paginator;
private $calculo;
private $avaliado;
private $grupo;
public function __construct(CalculoRepository $calculo, AvaliadoRepository $avaliado, GrupoRepository $grupo)
{
$this->calculo = $calculo;
$this->avaliado = $avaliado;
$this->grupo = $grupo;
}
/**
* @Route("/", name="gps_visao_avaliado_performance")
*/
public function index(Request $request): Response
{
$data = [];
$nomeAvaliado = '';
$nomeGrupo = '';
$programa = [];
if ($this->hasAvaliado()) {
$avaliado = $this->avaliado->getAvaliadoView($request->query->getInt('id_avaliado', $this->getIdAvaliado()));
$grupo = $this->grupo->find($avaliado['id_grupo']);
$nomeAvaliado = $avaliado['nome'];
$nomeGrupo = $grupo->getTitulo();
$tipoPeriodo = $this->getPeriodo()['from']['tipo'];
$programa = $this->getPrograma();
$dados = $this->calculo->performanceAnual($programa, $this->getPeriodo(), $avaliado);
$params = [
'tipoPeriodo' => $tipoPeriodo, 'dados' => $dados, 'filtroClick' => $tipoPeriodo,
];
$data = $this->processo($params);
}
return $this->render('avaliado/performance.html.twig', [
'dados' => json_encode($data), 'nome_avaliado' => $nomeAvaliado, 'nome_grupo' => $nomeGrupo, 'med' => $programa ? (isset(json_decode($programa['programa']['config'])->performance_tipo_media) ? 'MEDIANA ' : 'MÉDIA ') : '', 'tamanhoModal' => $request->query->get('tamanhoModal', 'col-12'),
]);
}
public function processo(array $dados): array
{
$data = [
'avaliado' => [], 'mediaAvaliado' => [], 'grupo' => [], 'mediaGrupo' => [],
];
$periodos = [];
$categorias = [];
foreach ($dados['dados'] as $row) {
$categorias[] = $this->getDataFormatada($row['periodo'], true);
$periodos[] = $row['periodo'];
$data['avaliado'][] = (float) $row['avaliado_porcentagem'];
$data['mediaAvaliado'][] = (float) $row['media_avaliado_porcentagem'];
$data['grupo'][] = (float) $row['grupo_porcentagem'];
$data['mediaGrupo'][] = (float) $row['media_grupo_porcentagem'];
}
$data['filtroClick'] = $dados['filtroClick'];
return [
'data' => $data, 'periodos' => $periodos, 'categorias' => $categorias,
];
}
/**
* @param Request $request
* @return Response
*/
public function abrirGrafico(Request $request, GpsRepository $gpsRepository): Response
{
$anual = $request->query->get('anual');
$periodoWhere = [
'from' => $this->getPeriodo()['from'],
'to' => $this->getPeriodo()['to'],
'where' => " AND periodo->>'ano' = '" . $this->getPeriodo()['from']['ano'] . "'",
'select' => $this->getPeriodo()['select']
];
$dados = $gpsRepository->graficoEvolucaoAvaliadoGps(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
$periodoWhere,
[' AND id_grupo = ' . $this->getAvaliado()['id_grupo'], ' AND id_avaliado = ' . $this->getAvaliado()['id_avaliado']],
'',
$anual ?? false
);
$periodosAvaliados = explode(", ", $dados[0]['periodo']);
$periodosAvaliados = implode("', '", $periodosAvaliados);
$periodosAvaliados = str_replace(['[', ']'], ["('", "')"], $periodosAvaliados);
$dadosGrupo = $gpsRepository->graficoEvolucaoAvaliadoGps(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
['is_grupo' => true,'from' => $this->getPeriodo()['from'],'where' => " AND CONCAT(periodo->>'ano', periodo->>'periodo') in " . $periodosAvaliados, 'select' => $this->getPeriodo()['select']],
[' AND id_grupo = ' . $this->getAvaliado()['id_grupo']],
'',
$anual ?? false
);
$dados = $this->organizarGrafico($dados);
$dadosGrupo = $this->organizarGrafico($dadosGrupo);
$mediaAvaliado = $gpsRepository->mediaPerformance(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
['where' => " AND periodo->>'ano' = '" . $this->getPeriodo()['from']['ano'] . "'", 'select' => $this->getPeriodo()['select']],
[' AND id_grupo = ' . $this->getAvaliado()['id_grupo'], ' AND id_avaliado = ' . $this->getAvaliado()['id_avaliado']],
''
);
$mediaGrupo = $gpsRepository->mediaPerformance(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
['where' => " AND CONCAT(periodo->>'ano', periodo->>'periodo') in " . $periodosAvaliados, 'select' => $this->getPeriodo()['select']],
[' AND id_grupo = ' . $this->getAvaliado()['id_grupo']],
''
);
$media = [
'avaliado' => array_fill(0, sizeof(json_decode($dados['performance'], true)), (float) $mediaAvaliado['media']),
'grupo' => array_fill(0, sizeof(json_decode($dados['performance'], true)), (float) $mediaGrupo['media'])
];
return $this->render('grafico-informativo.html.twig', [
'dados_performance' => $dados['performance'],
'categorias' => $dados['categorias'],
'dados_performance_grupo' => $dadosGrupo['performance'],
'medias' => json_encode($media)
]);
}
/**
* monta as informações para de acordo com que o grafico precisa.
*/
public function organizarGrafico(array $dados): array
{
$retorno = [
'series' => '', 'categorias' => '',
];
$legenda = [
'valor' => 'Performance',
];
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' => json_encode($series['valor'], true),
];
}
return $retorno;
}
/**
* Função que carrega o gráfico de evolução de performance por Domínio
*
* @Route("/grafico-performance-dominio")
*/
public function evolucaoDominio(Request $request, GpsRepository $gpsRepository): Response
{
$anual = $request->query->get('anual', false);
$dados = $gpsRepository->graficoEvolucaoPerformanceDominio(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
$this->getPeriodo(),
[' AND id_grupo = ' . $this->getAvaliado()['id_grupo'], ' AND id_avaliado = ' . $this->getAvaliado()['id_avaliado']],
'',
$anual
);
$periodos = [];
$series = [];
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'];
}
}
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),
'anual' => $anual
]);
}
}