<?php
declare(strict_types=1);
namespace App\Entity\User;
use App\Entity\Customer\Customer;
use App\Entity\Order\Order;
use App\Entity\Refund\Refund;
use App\Trait\Archivable;
use BitBag\SyliusAclPlugin\Entity\Role;
use BitBag\SyliusAclPlugin\Entity\RoleInterface;
use BitBag\SyliusAclPlugin\Model\RoleableTrait;
use BitBag\SyliusAclPlugin\Model\ToggleablePermissionCheckerTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Scheb\TwoFactorBundle\Model\Google\TwoFactorInterface;
use Sylius\Component\Core\Model\AdminUser as BaseAdminUser;
use TheCodingMachine\DoubleAuthenticationPlugin\Model\TcmDoubleAuthenticationPluginTrait;
#[ORM\Table(name: 'sylius_admin_user')]
#[ORM\Entity]
class AdminUser extends BaseAdminUser implements TwoFactorInterface
{
use ToggleablePermissionCheckerTrait;
use RoleableTrait;
use TcmDoubleAuthenticationPluginTrait;
use Archivable;
/** @var bool */
#[ORM\Column(type: 'boolean')]
protected $enablePermissionChecker = false;
/** @var Collection<int, RoleInterface>|RoleInterface[] */
#[ORM\JoinTable(name: 'bitbag_admin_users_roles_resources')]
#[ORM\JoinColumn(name: 'admin_user_id', referencedColumnName: 'id', unique: false)]
#[ORM\InverseJoinColumn(name: 'role_resource_id', referencedColumnName: 'id', unique: false)]
#[ORM\ManyToMany(targetEntity: 'BitBag\SyliusAclPlugin\Entity\Role')]
protected $rolesResources;
#[ORM\OneToOne(mappedBy: 'adminUser', targetEntity: Customer::class, cascade: ['all'])]
private Customer|null $customer = null;
#[ORM\OneToMany(mappedBy: 'createdBy', targetEntity: Refund::class, cascade: ['all'], orphanRemoval: true)]
private Collection $createdRefunds;
#[ORM\OneToMany(mappedBy: 'adminUserWhoValidated', targetEntity: Order::class, cascade: ['all'], orphanRemoval: true)]
private Collection $validatedOrders;
#[ORM\OneToMany(mappedBy: 'adminUserReservedBy', targetEntity: Order::class, cascade: ['all'], orphanRemoval: true)]
private Collection $reservedOrders;
#[ORM\OneToMany(mappedBy: 'attachedPDM', targetEntity: Customer::class, cascade: ['all'], orphanRemoval: true)]
private Collection $attachedCustomers;
public function __construct()
{
parent::__construct();
$this->rolesResources = new ArrayCollection();
$this->createdRefunds = new ArrayCollection();
$this->validatedOrders = new ArrayCollection();
$this->reservedOrders = new ArrayCollection();
$this->attachedCustomers = new ArrayCollection();
}
public function getCustomer(): Customer|null
{
return $this->customer;
}
public function setCustomer(Customer|null $customer): void
{
$this->customer = $customer;
}
public function hasRoleResourceByCode(string $code): bool
{
/** @var Role[] $roles */
$roles = $this->rolesResources;
foreach ($roles as $role) {
if ($role->getCode() === $code) {
return true;
}
}
return false;
}
public function getCreatedRefunds(): Collection
{
return $this->createdRefunds;
}
public function setCreatedRefunds(Collection $createdRefunds): void
{
$this->createdRefunds = $createdRefunds;
}
public function addCreatedRefund(Refund $refund): void
{
if ($this->createdRefunds->contains($refund)) {
return;
}
$this->createdRefunds[] = $refund;
$refund->setCreatedBy($this);
}
public function removeCreatedRefund(Refund $refund): void
{
$this->createdRefunds->removeElement($refund);
}
/** @return Collection<array-key, Order> */
public function getValidatedOrders(): Collection
{
return $this->validatedOrders;
}
/** @param Collection<array-key, Order> $validatedOrders */
public function setValidatedOrders(Collection $validatedOrders): void
{
$this->validatedOrders = $validatedOrders;
}
public function addValidatedOrder(Order $order): self
{
if (! $this->validatedOrders->contains($order)) {
$this->validatedOrders[] = $order;
}
return $this;
}
public function removeValidatedOrder(Order $order): self
{
$this->validatedOrders->removeElement($order);
return $this;
}
/** @return Collection<array-key, Order> */
public function getReservedOrders(): Collection
{
return $this->reservedOrders;
}
/** @param Collection<array-key, Order> $reservedOrders */
public function setReservedOrders(Collection $reservedOrders): void
{
$this->reservedOrders = $reservedOrders;
}
public function addReservedOrder(Order $order): self
{
if (! $this->reservedOrders->contains($order)) {
$this->reservedOrders[] = $order;
$order->setAdminUserReservedBy($this);
}
return $this;
}
public function removeReservedOrder(Order $order): self
{
$this->reservedOrders->removeElement($order);
return $this;
}
/** @return Collection<array-key, Customer> */
public function getAttachedCustomers(): Collection
{
return $this->attachedCustomers;
}
/** @param Collection<array-key, Customer> $attachedCustomers */
public function setAttachedCustomers(Collection $attachedCustomers): void
{
$this->attachedCustomers = $attachedCustomers;
}
public function addAttachedCustomer(Customer $customer): self
{
if (! $this->attachedCustomers->contains($customer)) {
$this->attachedCustomers[] = $customer;
$customer->setAttachedPDM($this);
}
return $this;
}
public function removeAttachedCustomer(Customer $customer): self
{
$this->$customer->removeElement($customer);
return $this;
}
public function getGoogleAuthenticatorUsername(): string
{
return $this->email ?: '';
}
public function getFullName(): string
{
return $this->firstName . ' ' . $this->lastName;
}
public function isLocked(): bool
{
return $this->locked;
}
public function hasPermission(string $permission): bool
{
foreach ($this->rolesResources as $roleResource) {
foreach ($roleResource->getPermissions() as $p) {
if ($permission === $p) {
return true;
}
}
}
return false;
}
}