<?php
namespace App\Controller\Visao\GPS\Avaliado;
use App\Controller\Componentes\PeriodoController;
use App\Controller\Customs\Custom2IMController;
use App\Repository\Cliente\Dados\EvsRepository;
use App\Repository\Cliente\Dados\GpsRepository;
use App\Repository\Cliente\Fornecidos\DadosEnviadosRepository;
use App\Repository\Cliente\Fornecidos\SolicitacaoRepository;
use App\Repository\Painel\VisaoRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
/**
* @Route("/gps/visao-avaliado")
*
* Controller central para a visão de Avaliado dentro do sistema
*/
class AvaliadoController extends Custom2IMController
{
const TEMPLATEBASE = 'visao/gps/avaliado/';
protected $componentes = [];
protected $visao = 'avaliado';
protected $rotas = ['avaliado_fechamento_dashboard', 'avaliado_privilegio_dashboard', 'relacionamento_dashboard'];
/**
* @var GpsRepository
*/
protected $gpsRepository;
/**
* @var SolicitacaoRepository
*/
protected $solicitacaoRepo;
/**
* @var DadosEnviadosRepository
*/
protected $dadosEnviadosRepo;
/**
* @param RequestStack $requestStack
* @param GpsRepository $gpsRepository
*/
public function __construct(
RequestStack $requestStack,
GpsRepository $gpsRepository,
SolicitacaoRepository $solicitacaoRepository,
DadosEnviadosRepository $dadosEnviadosRepository
) {
$this->gpsRepository = $gpsRepository;
$this->solicitacaoRepo = $solicitacaoRepository;
$this->dadosEnviadosRepo = $dadosEnviadosRepository;
$sess = $requestStack->getCurrentRequest()->getSession();
// nesta condicao precisa refazer a sessao do avaliado para setar uma única modelagem
// Quando o avaliado loga o array é formado por chave numerada (fechtAllAssociative)
// Daqui em diante para dashboard/indicador/detalhes sera usado array puro
if ( $sess->has('modelagem') AND $sess->has('periodo') AND isset($sess->get('avaliado')[0]) ) {
$idModelagem = $sess->get('modelagem')->getIdModelagem();
$sess->set('avaliado', current(array_filter($sess->get('avaliado'), function($row) use($idModelagem) {
return $row['id_modelagem'] === $idModelagem; }
)));
}
unset($sess);
}
/**
* @Route("/dashboard", name="gps_visao_avaliado_dashboard")
*
* @param VisaoRepository $visaoRepository
* @param RouterInterface $router
* @return Response
*/
public function index(VisaoRepository $visaoRepository, RouterInterface $router) :Response
{
$solicitacoes = [];
$dadosEnviados = [];
// a chave http_referer vem do GestorController::redirectAvaliadoDashboard
// usada no click da dimensao especialidade no nome do avaliado
// neste caso, eh o comportamento normal quando acesso for direto pelo avaliado
if ( $this->hasAvaliado() AND !array_key_exists('http_referer', $this->getAvaliado()) ) {
if ( $this->hasModelagem() AND $this->hasPeriodo() ) {
$solicitacoes = $this->solicitacaoRepo->findDocumentosByEspecialidade($this->getAvaliado()['id_grupo']);
$dadosEnviados = $this->dadosEnviadosRepo->getDadosEnviadosByAvaliado($this->getAvaliado()['id_avaliado']);
$possuiProducao = $this->gpsRepository->possuiProducao($this->getAvaliado(), $this->getPeriodo());
if ( !$possuiProducao ) {
return $this->render('sem-producao.html.twig', []);
}
// quando avaliado
// ultimo mes de producao
if ( 'ROLE_AVALIADO' === $this->getUser()->getPerfil()->getRole() ) {
$sessAvaliado = $this->getAvaliado();
$periodoProducao = current(explode(',', $possuiProducao));
$sessAvaliado['periodo'] = $periodoProducao;
$this->getSession()->set('avaliado', $sessAvaliado);
}
foreach ($solicitacoes AS $keySolicitacao => $solicitacao) {
foreach ($dadosEnviados AS $dado) {
if ( $dado['id_solicitacao'] === $solicitacao['id_solicitacao'] ) {
unset($solicitacoes[$keySolicitacao]);
}
}
}
}
$this->setarSessoesVisao(
'Avaliado'
,false
,$this->isGranted('ROLE_GESTOR') ? true : false
,$this->hasPeriodo() && $this->hasAvaliado() ? '' : 'no-periodo'
,$this->getCurrentRoute()
);
$visaoObj = $visaoRepository->findOneBy(['slug' => $this->visao]);
$valida = $this->testaPermissoes(
($visaoObj ? $visaoObj->getIdVisao() : 0)
,$this->getUser()->getPerfil()->getRota_default()
,$router, $visaoRepository
);
if ( $valida ) {
return $valida;
}
$this->getSession()->set('tela-anterior', $this->generateUrl('gps_visao_avaliado_dashboard'));
$this->getSession()->remove('telas');
}
$performanceDominio = $this->gpsRepository->graficoPerformanceDominio(
['where' => "AND id_programa = {$this->getPrograma()['programa']['id_programa']} AND id_modelagem = {$this->getAvaliado()['id_modelagem']}"],
$this->getPeriodo(),
[' AND id_avaliado = ' . $this->getAvaliado()['id_avaliado'], ' AND id_grupo = ' . $this->getAvaliado()['id_grupo']],
""
);
return $this->render('base.html.twig', [
'dominios' => $performanceDominio,
'periodo' => $this->getPeriodoReferencia(),
'dadosEnviados' => $dadosEnviados,
'solicitacoes' => $solicitacoes
]);
}
/**
* @Route("/dashboard-anual/{ano}", name="gps_visao_avaliado_dashboard_anual", defaults={"ano"=null}, requirements={"ano"="\d+"} )
*
* @param GpsRepository $gpsRepository
* @param integer|null $ano
* @return Response
*/
public function anual(Request $request, GpsRepository $gpsRepository, PeriodoController $periodoController, ?int $ano) :Response
{
if ( $this->hasAvaliado() AND $this->hasPeriodo() ) {
// setters
$anosComAvaliado = $gpsRepository->avaliadoAnosComAvaliacao($this->getAvaliado());
$anos = array_keys($anosComAvaliado);
$ano = (int) ($ano ?? $this->getPeriodo()['from']['ano']);
$ano = in_array($ano, $anos) ? $ano : current($anos);
// refaz o periodo da sessao do avaliado
// nova sessao de periodo
$periodoController->processa($request, [
'from' => join('|',['Mensal',$ano, $anosComAvaliado[$ano]['min_mes']])
,'to' => join('|',['Mensal',$ano, $anosComAvaliado[$ano]['min_mes']])
,'referer' => 'avaliado'
]);
unset($anosComAvaliado);
// grafico
// $dadosGraficoEvolucao = $this->gpsRepository->evolucaoQualidadeCustoEVS($this->getAvaliado(), $ano);
$buscaConsenso = [];
$buscaConsenso = $this->dadosEnviadosRepo->getConsenso($this->getAvaliado(), $this->getUser());
$avaliacao = [];
if(isset($buscaConsenso['avaliacao'])) {
$avaliacao = json_decode($buscaConsenso['avaliacao'], TRUE);
}
return $this->render('base.anual.html.twig',[
'var_anos' => $anos
,'var_ano_atual' => $ano
, 'avaliacao' => $avaliacao
, 'consenso' => $buscaConsenso
// ,'var_grafico_evolucao_evs' => $dadosGraficoEvolucao
]);
}
return $this->render('base.anual.html.twig',[]);
}
/**
* @Route("/sem-producao", name="gps_sem_producao")
*
* @return Response
*/
public function semProducao() :Response
{
return $this->render('sem-producao.html.twig', []);
}
/**
* @Route("/consenso", name="consenso")
*
* @return Response
*/
public function consenso(Request $request) :Response
{
if ($request->isMethod('POST')) {
$avaliacao = $request->request->all();
if(isset($avaliacao['assinatura-profissional'])) {
$this->dadosEnviadosRepo->updateSubjetiva($avaliacao, $this->getAvaliado(), $this->getUser());
$request->getSession()->getFlashBag()->add('sucess', 'Assinatura realizada!');
} else {
//unset($avaliacao['assinatura-lideranca']);
$this->dadosEnviadosRepo->insertSubjetiva($avaliacao, $this->getAvaliado(), $this->getUser());
$request->getSession()->getFlashBag()->add('sucess', 'Assinatura realizada!');
}
}
$buscaConsenso = $this->dadosEnviadosRepo->getConsenso($this->getAvaliado(), $this->getUser());
$avaliacao = [];
if(isset($buscaConsenso['avaliacao'])) {
$avaliacao = json_decode($buscaConsenso['avaliacao'], TRUE);
}
return $this->render('consenso.html.twig', ['avaliacao' => $avaliacao, 'consenso' => $buscaConsenso]);
}
}