<?php
namespace App\Domain\Entities;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Table(name="agents")
* @ORM\Entity(repositoryClass="App\Infrastructure\Persistence\DoctrineAgentRepository")
*/
class Agent implements Security\Core\User\UserInterface, Security\Core\User\PasswordAuthenticatedUserInterface, Security\Core\User\EquatableInterface
{
/**
* @ORM\Column(name="idagent", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var integer
*
* @ORM\Column(name="adminlevel", type="integer", nullable=false)
*/
protected $adminlevel = '5';
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=60, nullable=false)
*/
protected $username = '';
/**
* @var string
*
* @ORM\Column(name="fname", type="string", length=30, nullable=false)
*/
protected $firstName = '';
/**
* @var string
*
* @ORM\Column(name="lname", type="string", length=30, nullable=false)
*/
protected $lastName = '';
/**
* @var integer
*
* @ORM\Column(name="genmgr", type="integer", nullable=false)
*/
protected $genmgr = '0';
/**
* @var integer
*
* @ORM\Column(name="mgr", type="integer", nullable=false)
*/
protected $mgr = '0';
/**
* @var boolean
*
* @ORM\Column(name="active", type="boolean", nullable=false)
*/
protected $active = '1';
/** @ORM\Column(name="bypass_agent_hierarchy", type="boolean", nullable=false, options={"default":0}) */
protected bool $bypassAgentHierarchy = false;
/** @ORM\Column(name="client_access_bypass", type="boolean", nullable=false, options={"default":0}) */
protected bool $clientAccessBypass = false;
/** @ORM\Column(name="production_report_admin", type="boolean", nullable=false, options={"default":0}) */
protected bool $productionReportAdmin = false;
/** @ORM\Column(name="hide_agency_rates", type="boolean", nullable=false, options={"default":0}) */
protected bool $hideAgencyRates = false;
/**
* @var string
*
* @ORM\Column(name="location", type="string", length=10, nullable=false)
*/
protected $location;
/**
* @var boolean
*
* @ORM\Column(name="staff", type="boolean", nullable=false)
*/
protected $staff = '0';
/**
* @var string
*
* @ORM\Column(name="middle", type="string", length=3, nullable=false)
*/
protected $middle;
/**
* @var string
*
* @ORM\Column(name="suffix", type="string", length=5, nullable=false)
*/
protected $suffix;
/**
* @var string
*
* @ORM\Column(name="street", type="string", length=45, nullable=false)
*/
protected $street;
/**
* @var string
*
* @ORM\Column(name="city", type="string", length=45, nullable=false)
*/
protected $city;
/**
* @var string
*
* @ORM\Column(name="state", type="string", length=2, nullable=false)
*/
protected $state;
/**
* @var string
*
* @ORM\Column(name="zip", type="string", length=10, nullable=false)
*/
protected $zip;
/**
* @var string
*
* @ORM\Column(name="social", type="string", length=255, nullable=false)
*/
protected $social;
/**
* @ORM\Column(name="dateOfBirth", type="date", nullable=true)
*/
protected ?DateTime $dateOfBirth = null;
/**
* @ORM\Column(name="startDate", type="date", nullable=true)
*/
protected ?DateTime $startDate = null;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=75, nullable=false)
*/
protected $email;
/**
* @var integer
*
* @ORM\Column(name="subcontracted", type="integer", nullable=false)
*/
protected $subcontracted = '0';
/**
* @var integer
*
* @ORM\Column(name="closedhouse", type="integer", nullable=false)
*/
protected $closedhouse;
/**
* @ORM\Column(name="lastDayWorked", type="date", nullable=true)
*/
protected ?DateTime $lastDayWorked = null;
/**
* @var boolean
*
* @ORM\Column(name="independent", type="boolean", nullable=false)
*/
protected $independent = '0';
/**
* @var Agent
*
* @ORM\ManyToOne(targetEntity="App\Domain\Entities\Agent")
* @ORM\JoinColumn(name="productionAgentId", referencedColumnName="idagent")
*/
protected $productionAgent;
/**
* @ORM\Column(name="password", type="string", length=60, nullable=false)
*/
protected string $password = '';
public function gravatarHash(): string
{
return md5(strtolower(trim($this->email)));
}
public function getId()
{
return $this->id;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
return $this;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
return $this;
}
public function getName()
{
return $this->firstName . ' ' . $this->lastName;
}
public function getShortName()
{
return $this->firstName;
}
public function getFormattedName()
{
return $this->lastName . ", " . $this->firstName;
}
/**
* Set productionAgent
*
* @param Agent $productionAgent
* @return Agent
*/
public function setProductionAgent(Agent $productionAgent = null)
{
$this->productionAgent = $productionAgent;
return $this;
}
/**
* Get productionAgent
*
* @return Agent
*/
public function getProductionAgent()
{
return $this->productionAgent;
}
public function getEmail()
{
return $this->email;
}
public function isActive(): bool
{
return (bool) $this->active;
}
public function canBypassAgentHierarchy(): bool
{
return $this->bypassAgentHierarchy;
}
public function hasClientAccessBypass(): bool
{
return $this->clientAccessBypass;
}
public function isProductionReportAdmin(): bool
{
return $this->productionReportAdmin;
}
public function shouldHideAgencyRates(): bool
{
return $this->hideAgencyRates;
}
public function isCallCenterOrTrainer(): bool
{
return strpos($this->firstName, 'CallCenter') !== false || $this->isTrainer();
}
public function isTrainer(): bool
{
return strpos($this->firstName, 'Trainer') !== false;
}
public function getPassword(): ?string
{
return $this->password ?: null;
}
public function setPassword(string $password): void
{
$this->password = $password;
}
public function getRoles(): array
{
$roles = ['ROLE_USER'];
if ((int) $this->adminlevel <= 0) {
$roles[] = 'ROLE_SUPER_ADMIN';
} elseif ((int) $this->adminlevel <= 1) {
$roles[] = 'ROLE_ADMIN';
} elseif ((int) $this->adminlevel <= 2) {
$roles[] = 'ROLE_MANAGER';
} elseif ((int) $this->adminlevel <= 5) {
$roles[] = 'ROLE_AGENT';
}
// adminlevel > 5: no additional role beyond ROLE_USER
if ($this->isTrainer()) {
$roles[] = 'ROLE_TRAINER';
}
if (strpos($this->firstName, 'CallCenter') !== false) {
$roles[] = 'ROLE_CALL_CENTER';
}
return $roles;
}
public function getSalt()
{
return $this->username;
}
public function eraseCredentials() {}
public function getUsername()
{
return $this->username;
}
public function getUserIdentifier()
{
return $this->username;
}
public function sessionInformation(): array
{
return [
'userstamp' => $this->username,
'adminlevel' => $this->adminlevel,
'idagent' => $this->id,
'agentloc' => $this->location,
'user' => $this->firstName,
];
}
public function identityInterest(): array
{
return [
'id' => $this->id,
'name' => $this->getName(),
];
}
public function isEqualTo(UserInterface $user): bool
{
return $this->getUserIdentifier() == $user->getUserIdentifier();
}
public function isSuperAdmin(): bool
{
return $this->adminlevel == 0;
}
}