<?php
//------------------------------------------------------------------------------
// src/Security/CommonVoter.php
//------------------------------------------------------------------------------
namespace App\Security;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use App\Entity\Access;
use App\Entity\SocietyGroup;
use App\Entity\Config\Config;
use App\Entity\Config\OptionConfig;
use App\Entity\Config\Module;
use App\Entity\Config\ModuleConfig;
use App\Entity\Security\Acl;
use App\Services\Config\ModuleTools;
use App\Services\Config\OptionConfigTools;
use App\Services\LogTools;
class CommonVoter extends Voter
{
//--------------------------------------------------------------------------------
// Plan.io Task #3605
const IS_ACTIVE_GHOST_INVOICING = "is_active_ghost_invoicing";
// Plan.io Task #3664
const IS_ACTIVE_IKEA_DEVIS_TEMPLATE = "is_active_ikea_devis_template";
// Plan.io Task #4327
const IS_ACTIVE_JCAF = "is_active_jcaf";
// Plan.io Task #4327
const IS_ACTIVE_CLIENT_ACCOUNT = "is_active_client_account";
// Plan.io Task #4383
const IS_ACTIVE_ONLINE_BOOKING = "is_active_online_booking";
// Plan.io Task #4327
const IS_ACTIVE_CLIENT_ACCOUNT_AUTO = "is_active_client_account_auto";
const IS_GRANTED_CONSTANTS = array(
self::IS_ACTIVE_GHOST_INVOICING,
self::IS_ACTIVE_IKEA_DEVIS_TEMPLATE,
self::IS_ACTIVE_JCAF,
self::IS_ACTIVE_CLIENT_ACCOUNT,
self::IS_ACTIVE_ONLINE_BOOKING,
self::IS_ACTIVE_CLIENT_ACCOUNT_AUTO,
);
//--------------------------------------------------------------------------------
public function __construct(ManagerRegistry $doctrine, ModuleTools $moduleTools, OptionConfigTools $optionConfigTools, LogTools $logTools)
{
$this->em = $doctrine->getManager();
$this->moduleTools = $moduleTools;
$this->optionConfigTools = $optionConfigTools;
$this->logTools = $logTools;
}
// Plan.io Task #4453 [See AccessVoter for details]
public function supportsAttribute(string $attribute): bool
{
return in_array($attribute, self::IS_GRANTED_CONSTANTS, true);
}
protected function supports(string $attribute, $subject): bool
{
// if the attribute isn't one we support, return false
if (!in_array($attribute, self::IS_GRANTED_CONSTANTS))
{
return false;
}
// no subject for now
if ($subject !== null)
{
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof Access)
{
// the user must be logged in; if not, deny access
return false;
}
// The user must have a function; if not deny access
$function = $user->getFunction();
if ($function === null) return false;
// Plan.io Task #3710 : Get current group
$currentGroup = $user->getSocietyGroup();
if ($currentGroup === null)
return false;
$this->currentGroup = $currentGroup;
switch ($attribute)
{
case self::IS_ACTIVE_GHOST_INVOICING:
return $this->isGrantedGhostInvoicing($currentGroup);
case self::IS_ACTIVE_IKEA_DEVIS_TEMPLATE:
return $this->isGrantedIkeaDevisTemplate($currentGroup);
case self::IS_ACTIVE_JCAF:
return $this->isActiveJcaf();
case self::IS_ACTIVE_CLIENT_ACCOUNT:
return $this->isActiveClientAccount();
case self::IS_ACTIVE_ONLINE_BOOKING:
return $this->isActiveOnlineBooking();
case self::IS_ACTIVE_CLIENT_ACCOUNT_AUTO:
return $this->isActiveClientAccountAuto();
}
throw new \LogicException('This code should not be reached!');
}
private function isActiveClientAccount()
{
$module = $this->em->getRepository(Module::class)->findOneByCode(Module::MODULE_CLIENT_ACCOUNT);
if ($module === null)
{
return false;
}
$moduleConfig = $this->em->getRepository(ModuleConfig::class)->findOneBy(array(
'societyGroup' => $this->currentGroup,
'module' => $module,
));
if ($moduleConfig === null)
{
return false;
}
if ($moduleConfig->getValue())
{
return true;
}
return false;
}
private function isActiveOnlineBooking()
{
if (!$this->optionConfigTools->isActive_planningOptimisation($this->currentGroup))
{
return false;
}
if (!$this->isActiveClientAccount())
{
return false;
}
return $this->optionConfigTools->isActive_OnlineBooking($this->currentGroup);
return false;
}
private function isActiveClientAccountAuto()
{
if (!$this->isActiveClientAccount())
{
return false;
}
return $this->optionConfigTools->isActive_ClientAccountAuto($this->currentGroup);
return false;
}
private function isActiveJcaf()
{
$config = $this->em->getRepository(Config::class)->findOneByName(Config::JCAF_STATE);
if ($config === null)
{
return false;
}
return boolval($config->getValue());
}
private function isGrantedGhostInvoicing(SocietyGroup $societyGroup)
{
$optionConfig = $this->em->getRepository(OptionConfig::class)
->findOneBy(array(
'societyGroup' => $societyGroup,
'code' => OptionConfig::GHOST_INVOICING_CODE,
'value' => 1,
));
if ($optionConfig !== null)
{
return true;
}
return false;
}
// Plan.io Task #3664
private function isGrantedIkeaDevisTemplate(SocietyGroup $societyGroup)
{
$optionConfig = $this->em->getRepository(OptionConfig::class)
->findOneBy(array(
'societyGroup' => $societyGroup,
'code' => OptionConfig::IKEA_DEVIS_TEMPLATE_CODE,
'value' => 1,
));
if ($optionConfig !== null)
{
return true;
}
return false;
}
}