<?php
namespace App\Service;
use App\Entity\Cliente\Dimensao;
use App\Helper\ColorHelper;
use App\Repository\Cliente\Dados\EvsRepository;
use App\Repository\Cliente\Dados\GpsRepository;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class DimensaoDeBuscaGestorService
{
private $evsRepository;
private $gpsRepository;
private $session;
private $tipo;
public function __construct(
EvsRepository $evsRepository,
GpsRepository $gpsRepository,
SessionInterface $session
) {
$this->evsRepository = $evsRepository;
$this->gpsRepository = $gpsRepository;
$this->session = $session;
}
public function execute(Dimensao $dimensao, $tipo = 'EVS'): array
{
$this->tipo = $tipo;
$dadosDaDimensao = [];
$permissao_gestor = $this->session->get('gestor_permissoes');
switch ($dimensao->getDimensao()) {
case Dimensao::POR_ESPECIALIDADE:
if ('GPS' === $tipo) {
$dadosDaDimensao = $this->gpsRepository->buscarPerformanceDeAvaliadosPorEspecialidade(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca(),
$permissao_gestor['where'] ?? '',
$dimensao->getIdFiltro() ?? 0
);
} else {
$dadosDaDimensao = $this->evsRepository->buscarPerformanceDeAvaliadosPorEspecialidade(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca(),
$permissao_gestor['where'] ?? '',
$dimensao->getIdFiltro() ?? 0
);
}
$dadosDaDimensao = $this->defineColorPoint($dadosDaDimensao);
if ('GPS' === $tipo) {
$especialidade = $this->gpsRepository->buscarPerformanceDaEspecialidade(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca(),
$permissao_gestor['where'] ?? ''
);
} else {
$especialidade = $this->evsRepository->buscarPerformanceDaEspecialidade(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca(),
$permissao_gestor['where'] ?? ''
);
}
$this->session->set('especialidade_selecionada', $especialidade);
$this->session->remove('avaliado_selecionado');
break;
case Dimensao::POR_AVALIADO:
$dadosDaDimensao = $this->evsRepository->buscarPerformancePorAvaliado(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca()
);
$dadosDaDimensao = $this->defineColorPoint($dadosDaDimensao);
$this->session->set('avaliado_selecionado', $dadosDaDimensao[0]);
break;
case Dimensao::PROGRAMA:
if($tipo == 'GPS'){
$dadosDaDimensao = $this->gpsRepository->buscarPerformanceDeTodasEspecialidades(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$permissao_gestor['where'] ?? ''
);
} else {
$dadosDaDimensao = $this->evsRepository->buscarPerformanceDeTodasEspecialidades(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$permissao_gestor['where'] ?? ''
);
}
$dadosDaDimensao = $this->defineColorPoint($dadosDaDimensao, $tipo);
$this->session->remove('avaliado_selecionado');
$this->session->remove('especialidade_selecionada');
break;
case Dimensao::AVALIADO_DETALHES:
$dadosDaDimensao = $this->evsRepository->dispersaoQualidadeCustoProgramaPorAvaliado(
$dimensao->getPrograma(),
$dimensao->getPeriodo(),
$dimensao->getIdBusca()
);
$dadosDaDimensao = $this->defineColorPoint($dadosDaDimensao);
break;
default:
throw new InvalidDimensaoException('Dimensão invalida');
break;
}
return $dadosDaDimensao;
}
public function defineColorPoint($dados): array
{
$dados = array_map(function ($dado) {
$dado['color'] = ColorHelper::colorPoint(($this->tipo == 'EVS' ? $dado['evs'] : $dado['performance']));
$dado['color_grafico'] = ColorHelper::colorPointGrafico(($this->tipo == 'EVS' ? $dado['evs'] : $dado['performance']));
return $dado;
}, $dados);
return $dados;
}
}
class InvalidDimensaoException extends \Exception
{
}