<?php
namespace App\Application\Internit\ContentBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\Response;
use Sonata\AdminBundle\Controller\CoreController as BaseCoreContBroller;
class CoreController extends BaseCoreContBroller
{
private $dashboardActionRoles = array('ROLE_MASTER_ADMIN', 'ROLE_CONSTRUTORA', 'ROLE_IMOBILIARIA', 'ROLE_CORRETOR', 'ROLE_AGENCIA');
public function dashboardAction()
{
$user = $this->get('security.token_storage')->getToken()->getUser();
// construtora pode ver todos os imóveis e espelhos de vendas cadastrados no sistema,
// independente da imobiliária a qual o imóvel percente.
// userId para construtora será null. Assim ela poderá ver tudo
$userId = in_array('ROLE_CONSTRUTORA', $user->getRoles()) ? null : $user->getId();
if( $this->permissionByRole(['ROLE_MASTER_ADMIN'], $user) ){
//$realtys = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->dashBoardRealty($userId);
$realtys = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->findBy(['user' => $userId]);
$mirrors = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->dashBoardMirror($userId);
}elseif( $this->permissionByRole(['ROLE_CONSTRUTORA'], $user) ) {
$realtys = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->findBy([ 'builder'=> $user->getBuilder()->getId() ]);
$mirrors = [];
}elseif( $this->permissionByRole(['ROLE_IMOBILIARIA', 'ROLE_CORRETOR'], $user) ) {
//$realtys = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->dashBoardRealty($userId);
//$realtys = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->findBy(['user' => $userId]);
$realtys = $user->getRealEstates()[0]->getRealys();
$mirrors = $this->getDoctrine()->getRepository("ApplicationInternitRealEstateBundle:Realty")->dashBoardMirror($userId);
}elseif( $this->permissionByRole(['ROLE_AGENCIA'], $user) ) {
$realtys = [];
$mirrors = [];
}
$where = array();
$proposalOrder = array('createdAt' => 'DESC');
if (in_array('ROLE_CORRETOR', $this->get('security.token_storage')->getToken()->getUser()->getRoles()))
$where = array('user'=>$this->get('security.token_storage')->getToken()->getUser()->getid());
// usuário com perfil imobiliária vê todas as propostas abertas para empreendimentos
// da imobiliária
if (in_array('ROLE_IMOBILIARIA', $user->getRoles())) {
$proposals = $this->getDoctrine()
->getRepository('ApplicationInternitProposalBundle:Proposal')
->findByUserRealEstates($user->getId());
}
else {
// usuário com perfil corretor e perfil construtora
$proposals = $this->getDoctrine()
->getRepository('ApplicationInternitProposalBundle:Proposal')
->findBy($where, $proposalOrder);
}
// mostrar opções de imóveis das imobiliárias que o corretor faz parte
if (in_array('ROLE_CONSTRUTORA', $user->getRoles())) {
// construtora: vê todos os rankings do sistema
$rankings = $this->getDoctrine()
->getRepository("ApplicationInternitRealEstateBundle:Realty")
->dashBoardRanking();
}
elseif (in_array('ROLE_IMOBILIARIA', $user->getRoles())) {
// imobiliária: vê os rankings dos imóveis da imobiliária
$rankings = $this->getDoctrine()
->getRepository("ApplicationInternitRealEstateBundle:Realty")
->dashBoardRankingRealEstate($userId);
}
else {
// corretor: vê os rankings dos quais participa
$rankings = $this->getDoctrine()
->getRepository("ApplicationInternitRealEstateBundle:Realty")
->dashBoardRankingUser($userId);
}
// Adicionando uma opção vazia ao array de opções
$rankings = array_merge(
[ [ 'id' => '', 'realty' => 'Selecione um Empreendimento' ] ],
$rankings
);
//SALESGOAL
if (in_array('ROLE_CONSTRUTORA', $user->getRoles())) {
$data = $this->getDoctrine()->getRepository('ApplicationInternitSalesGoalBundle:SalesGoal')->findAll();
}
else {
$data = $this->getDoctrine()
->getRepository('ApplicationInternitSalesGoalBundle:SalesGoal')
->findByUserRealEstate($userId);
}
//$infoSaleGoal = $this->getDoctrine()->getRepository('ApplicationInternitSalesGoalBundle:SalesGoal')->showSalesGoal();
$infoSaleGoal = [];
//Edit Pós
$goals = array();
$value = 0;
$salesGoal = array();
foreach($data as $d)
{
foreach($infoSaleGoal as $info)
{
if($info['id'] == $d->getId())
{
if($info['type']=='valor')
{
$value = floatval($info['total_proposal']) + $value;
$goals[$d->getId()]['total'] = $value;
$goals[$d->getId()]['points'][$info['month_year']] = floatval($info['total_proposal']);
}
elseif($info['type']=='unidades')
{
$value = floatval($info['amount_proposal']) + $value;
$goals[$d->getId()]['total'] = $value;
$goals[$d->getId()]['points'][$info['month_year']] = floatval($info['amount_proposal']);
}
}
}
$value = 0;
}
$salesGoal['goals'] = $goals;
$salesGoal['datas'] = $data;
//SALESGOAL
/******************** QUIZ **********************/
$userId = $this->getUser()->getId();
// obtém as respostas que o usuário fez aos quizes
$userAnswers = $this->getDoctrine()->getRepository('ApplicationInternitQuizBundle:Quiz')
->viewUserAnswers($userId);
// quizes que o usuário ainda não respondeu
if (in_array('ROLE_CONSTRUTORA', $user->getRoles())) {
$quizesToAnswer = $this->getDoctrine()
->getRepository('ApplicationInternitQuizBundle:Quiz')
->viewUnansweredQuiz($userId);
}
else {
$quizesToAnswer = $this->getDoctrine()
->getRepository('ApplicationInternitQuizBundle:Quiz')
->viewRealtorUnansweredQuiz($userId);
}
$numQuizesToAnswer = count($quizesToAnswer);
$spentPoints = $this->getDoctrine()
->getRepository('ApplicationInternitQuizBundle:Quiz')->fetchSpentPoints($userId);
// para a última resposta do usuário
$lastUserAnswer = empty($userAnswers) ? null : $userAnswers[0];
$lastUserAnswerHitsPercentage = 0;
// para estatísticas de pontos e porcentagem de acertos totais
$totalScore = 0;
$totalHits = 0;
$totalHitsPercentage = 0;
$totalNumAnswers = 0;
$lastHits = 0;
$lastNumAnswers = 0;
foreach($userAnswers as $ua) {
$totalScore += $ua->getScore();
$totalHits += $ua->getNumHits();
$totalNumAnswers += count($ua->getAnswers());
if ($ua->getCreatedAt() > $lastUserAnswer->getCreatedAt()) {
$lastUserAnswer = $ua;
}
}
$availablePoints = $totalScore - $spentPoints;
if ($totalNumAnswers > 0) {
$totalHitsPercentage = ($totalHits / $totalNumAnswers) * 100;
}
if ($lastUserAnswer) {
$lastUserAnswerHitsPercentage = $lastUserAnswer->getHitsPercentage();
$lastHits = $lastUserAnswer->getNumHits();
$lastNumAnswers = count($lastUserAnswer->getAnswers());
}
$randomRewards = $this->getDoctrine()
->getRepository('ApplicationInternitQuizBundle:Quiz')->viewRandomReward($userId, 2);
/********************* FIM QUIZ **********************/
return $this->render(
'@ApplicationInternit/ContentBundle/Resources/views/home.html.twig',
[
'realtys' => $realtys,
'mirrors' => $mirrors,
'proposals' => $proposals,
'rankings' => $rankings,
'salesGoal' => $salesGoal,
'availablePoints' => $availablePoints,
'totalHitsPercentage' => $totalHitsPercentage,
'numQuizesToAnswer' => $numQuizesToAnswer,
'lastAnswerHits' => $lastUserAnswerHitsPercentage,
'randomRewards' => $randomRewards,
'totalHits' => $totalHits,
'totalNumAnswers' => $totalNumAnswers,
'totalHitsPercentage' => $totalHitsPercentage,
'lastHits' => $lastHits,
'lastNumAnswers' => $lastNumAnswers,
'lastUserAnswerHitsPercentage' => $lastUserAnswerHitsPercentage
]
);
}
public function permissionByRole(array $modulesName, $user)
{
if(in_array('ROLE_MASTER_ADMIN', $modulesName))
if( $this->isMasterAdmin($user->getRoles()) )
return true;
foreach ($modulesName as $module)
if( in_array($module, $user->getRoles()) )
return true;
return false;
}
public function isMasterAdmin($userRoles){
$masterAdmin = [
"ROLE_SUPER_ADMIN",
"ROLE_CORRETOR",
"ROLE_IMOBILIARIA",
"ROLE_CONSTRUTORA",
"ROLE_AGENCIA",
"ROLE_USER"
];
$isMaster = 0;
foreach ($masterAdmin as $module)
if( in_array($module, $userRoles) )
$isMaster ++;
if($isMaster == 6)
return true;
return false;
}
}