<?php
namespace App\Voter;
use App\Entity\__Accounting\Supplier;
use App\Entity\Product\MarginCabin;
use Crea\SecurityBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class ManagerVoter extends Voter
{
const DEPOSIT_LIST = "MANAGER_DEPOSIT_LIST";
const DEPOSIT_CREATE = "MANAGER_DEPOSIT_CREATE";
const DEPOSIT_UPDATE = "MANAGER_DEPOSIT_UPDATE";
const DEPOSIT_REMOVE = "MANAGER_DEPOSIT_REMOVE";
const CANCEL_FEE_LIST = "MANAGER_CANCEL_FEE_LIST";
const CANCEL_FEE_CREATE = "MANAGER_CANCEL_FEE_CREATE";
const CANCEL_FEE_UPDATE = "MANAGER_CANCEL_FEE_UPDATE";
const CANCEL_FEE_REMOVE = "MANAGER_CANCEL_FEE_REMOVE";
const BALANCE_BEFORE_DEPARTURE_LIST = "MANAGER_BALANCE_BEFORE_DEPARTURE_LIST";
const BALANCE_BEFORE_DEPARTURE_CREATE = "MANAGER_BALANCE_BEFORE_DEPARTURE_CREATE";
const BALANCE_BEFORE_DEPARTURE_UPDATE = "MANAGER_BALANCE_BEFORE_DEPARTURE_UPDATE";
const BALANCE_BEFORE_DEPARTURE_REMOVE = "MANAGER_BALANCE_BEFORE_DEPARTURE_REMOVE";
const SUPPLIER_LIST = "MANAGER_SUPPLIER_LIST";
const SUPPLIER_CREATE = "MANAGER_SUPPLIER_CREATE";
const SUPPLIER_UPDATE = "MANAGER_SUPPLIER_UPDATE";
const SUPPLIER_REMOVE = "MANAGER_SUPPLIER_REMOVE";
const SUPPLIER_SWITCH_ACTIVE = "MANAGER_SUPPLIER_SWITCH_ACTIVE";
const SUPPLIER_MARGIN_LIST = "MANAGER_SUPPLIER_MARGIN_LIST";
const SUPPLIER_MARGIN_CREATE = "MANAGER_SUPPLIER_MARGIN_CREATE";
const SUPPLIER_MARGIN_UPDATE = "MANAGER_SUPPLIER_MARGIN_UPDATE";
const SUPPLIER_MARGIN_UPDATE_FORCE = "MANAGER_SUPPLIER_MARGIN_UPDATE_FORCE";
const SUPPLIER_MARGIN_DELETE = "MANAGER_SUPPLIER_MARGIN_DELETE";
const PRODUCT_MARGIN_LIST = "MANAGER_PRODUCT_MARGIN_LIST";
const PRODUCT_MARGIN_CREATE = "MANAGER_PRODUCT_MARGIN_CREATE";
const PRODUCT_MARGIN_UPDATE = "MANAGER_PRODUCT_MARGIN_UPDATE";
const PRODUCT_MARGIN_UPDATE_FORCE = "MANAGER_PRODUCT_MARGIN_UPDATE_FORCE";
const PRODUCT_MARGIN_DELETE = "MANAGER_PRODUCT_MARGIN_DELETE";
const PORT_TAXE_LIST = "MANAGER_PORT_TAXE_LIST";
const PORT_TAXE_CREATE = "MANAGER_PORT_TAXE_CREATE";
const PORT_TAXE_UPDATE = "MANAGER_PORT_TAXE_UPDATE";
const PORT_TAXE_REMOVE = "MANAGER_PORT_TAXE_REMOVE";
const APPLICATION_FEE_LIST = "MANAGER_APPLICATION_FEE_LIST";
const APPLICATION_FEE_CREATE = "MANAGER_APPLICATION_FEE_CREATE";
const APPLICATION_FEE_UPDATE = "MANAGER_APPLICATION_FEE_UPDATE";
const APPLICATION_FEE_REMOVE = "MANAGER_APPLICATION_FEE_REMOVE";
const TURNOVER_OBJECTIVE_LIST = "MANAGER_TURNOVER_OBJECTIVE_LIST";
const TURNOVER_OBJECTIVE_CREATE = "MANAGER_TURNOVER_OBJECTIVE_CREATE";
const TURNOVER_OBJECTIVE_UPDATE = "MANAGER_TURNOVER_OBJECTIVE_UPDATE";
const TURNOVER_OBJECTIVE_REMOVE = "MANAGER_TURNOVER_OBJECTIVE_REMOVE";
protected function supports($attribute, $subject): bool
{
return in_array($attribute, [
self::DEPOSIT_LIST,
self::DEPOSIT_CREATE,
self::DEPOSIT_UPDATE,
self::DEPOSIT_REMOVE,
self::CANCEL_FEE_LIST,
self::CANCEL_FEE_CREATE,
self::CANCEL_FEE_UPDATE,
self::CANCEL_FEE_REMOVE,
self::BALANCE_BEFORE_DEPARTURE_LIST,
self::BALANCE_BEFORE_DEPARTURE_CREATE,
self::BALANCE_BEFORE_DEPARTURE_UPDATE,
self::BALANCE_BEFORE_DEPARTURE_REMOVE,
self::SUPPLIER_LIST,
self::SUPPLIER_CREATE,
self::SUPPLIER_UPDATE,
self::SUPPLIER_REMOVE,
self::SUPPLIER_SWITCH_ACTIVE,
self::SUPPLIER_MARGIN_LIST,
self::SUPPLIER_MARGIN_CREATE,
self::SUPPLIER_MARGIN_UPDATE,
self::SUPPLIER_MARGIN_UPDATE_FORCE,
self::SUPPLIER_MARGIN_DELETE,
self::PRODUCT_MARGIN_LIST,
self::PRODUCT_MARGIN_CREATE,
self::PRODUCT_MARGIN_UPDATE,
self::PRODUCT_MARGIN_UPDATE_FORCE,
self::PRODUCT_MARGIN_DELETE,
self::PORT_TAXE_LIST,
self::PORT_TAXE_CREATE,
self::PORT_TAXE_UPDATE,
self::PORT_TAXE_REMOVE,
self::APPLICATION_FEE_LIST,
self::APPLICATION_FEE_CREATE,
self::APPLICATION_FEE_UPDATE,
self::APPLICATION_FEE_REMOVE,
self::TURNOVER_OBJECTIVE_LIST,
self::TURNOVER_OBJECTIVE_CREATE,
self::TURNOVER_OBJECTIVE_UPDATE,
self::TURNOVER_OBJECTIVE_REMOVE,
]);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var User $loggedUser */
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface)
return false;
switch ($attribute) {
case self::SUPPLIER_MARGIN_UPDATE:
return $this->voteOnSupplierMarginUpdate($subject, $loggedUser);
case self::PRODUCT_MARGIN_UPDATE:
return $this->voteOnProductMarginUpdate($subject, $loggedUser);
case self::SUPPLIER_REMOVE:
return $this->voteOnRemove($subject, $loggedUser);
default:
return in_array($attribute, $loggedUser->getRoles());
}
}
private function voteOnSupplierMarginUpdate($subject, UserInterface $loggedUser): bool
{
if ($subject === null) {
return false;
}
/** @var MarginCabin $marginCabin */
$marginCabin = $subject;
if ($marginCabin->getIsArchived() || $marginCabin->getIsDefault()) {
return in_array(self::SUPPLIER_MARGIN_UPDATE_FORCE, $loggedUser->getRoles());
}
return in_array(self::SUPPLIER_MARGIN_UPDATE, $loggedUser->getRoles());
}
private function voteOnProductMarginUpdate($subject, UserInterface $loggedUser): bool
{
if ($subject === null) {
return false;
}
/** @var MarginCabin $marginCabin */
$marginCabin = $subject;
if ($marginCabin->getIsArchived() || $marginCabin->getIsDefault()) {
return in_array(self::PRODUCT_MARGIN_UPDATE_FORCE, $loggedUser->getRoles());
}
return in_array(self::PRODUCT_MARGIN_UPDATE, $loggedUser->getRoles());
}
private function voteOnRemove($subject, UserInterface $loggedUser): bool
{
if ($subject === null) {
return false;
}
/** @var Supplier $supplier */
$supplier = $subject;
if ($supplier->getSupplierPayments()->count() > 0 ||
$supplier->getContacts()->count() > 0 ||
$supplier->getDiscounts()->count() > 0 ||
$supplier->getProducts()->count() > 0 ||
$supplier->getSaleTerms()->count() > 0) {
return false;
}
return in_array(self::SUPPLIER_REMOVE, $loggedUser->getRoles());
}
}