createdAt = new \DateTime('now'); $this->lastActive = new \DateTime('now'); $this->id = $id; $this->l11n = new Localization(); } /** * Get account id. * * @return int Account id * * @since 1.0.0 */ public function getId() : int { return $this->id; } /** * Get localization. * * Every account can have a different localization which can be accessed here. * * @return Localization * * @since 1.0.0 */ public function getL11n() : Localization { return $this->l11n; } /** * Get groups. * * Every account can belong to multiple groups. * These groups usually are used for permissions and categorize accounts. * * @return array Returns array of all groups * * @since 1.0.0 */ public function getGroups() : array { return $this->groups; } /** * Add group. * * @param mixed $group Group to add * * @return void * * @since 1.0.0 */ public function addGroup($group) : void { $this->groups[] = $group; } /** * Set localization. * * @param Localization $l11n Localization * * @return void * * @since 1.0.0 */ public function setL11n(Localization $l11n) : void { $this->l11n = $l11n; } /** * Set permissions. * * The method accepts an array of permissions. All existing permissions are replaced. * * @param PermissionAbstract[] $permissions Account permissions * * @return void * * @since 1.0.0 */ public function setPermissions(array $permissions) : void { $this->permissions = $permissions; } /** * Add permissions. * * Adds permissions to the account * * @param array $permissions Array of permissions to add to the account * * @return void * * @since 1.0.0 */ public function addPermissions(array $permissions) : void { foreach ($permissions as $permission) { if (\is_array($permission)) { $this->permissions = \array_merge($this->permissions, $permission); } else { $this->permissions[] = $permission; } } } /** * Add permission. * * Adds a single permission to the account * * @param PermissionAbstract $permission Permission to add to the account * * @return void * * @since 1.0.0 */ public function addPermission(PermissionAbstract $permission) : void { $this->permissions[] = $permission; } /** * Get permissions. * * @return PermissionAbstract[] * * @since 1.0.0 */ public function getPermissions() : array { return $this->permissions; } /** * Has permissions. * * Checks if the account has a permission defined * * @param int $permission Permission to check * @param null|int $unit Unit Unit to check (null if all are acceptable) * @param null|string $app App App to check (null if all are acceptable) * @param null|string $module Module Module to check (null if all are acceptable) * @param null|int $type Type (e.g. customer) (null if all are acceptable) * @param null|int $element (e.g. customer id) (null if all are acceptable) * @param null|int $component (e.g. address) (null if all are acceptable) * * @return bool Returns true if the account has the permission, false otherwise * * @since 1.0.0 */ public function hasPermission(int $permission, int $unit = null, string $app = null, string $module = null, int $type = null, int $element = null, int $component = null) : bool { $app = $app !== null ? \strtolower($app) : $app; foreach ($this->permissions as $p) { if (($p->getUnit() === $unit || $p->getUnit() === null || $unit === null) && ($p->getApp() === $app || $p->getApp() === null || $app === null) && ($p->getModule() === $module || $p->getModule() === null || $module === null) && ($p->getType() === $type || $p->getType() === null || $type === null) && ($p->getElement() === $element || $p->getElement() === null || $element === null) && ($p->getComponent() === $component || $p->getComponent() === null || $component === null) && ($p->getPermission() | $permission) === $p->getPermission() ) { return true; } } return false; } /** * Get name. * * @return string * * @since 1.0.0 */ public function getName() : ?string { return $this->login; } /** * Get name1. * * @return string * * @since 1.0.0 */ public function getName1() : string { return $this->name1; } /** * Set name1. * * @param string $name Name * * @return void * * @since 1.0.0 */ public function setName1(string $name) : void { $this->name1 = $name; } /** * Get name2. * * @return string * * @since 1.0.0 */ public function getName2() : string { return $this->name2; } /** * Set name2. * * @param string $name Name * * @return void * * @since 1.0.0 */ public function setName2(string $name) : void { $this->name2 = $name; } /** * Get name3. * * @return string * * @since 1.0.0 */ public function getName3() : string { return $this->name3; } /** * Set name3. * * @param string $name Name * * @return void * * @since 1.0.0 */ public function setName3(string $name) : void { $this->name3 = $name; } /** * Get email. * * @return string * * @since 1.0.0 */ public function getEmail() : string { return $this->email; } /** * Set email. * * @param string $email Email * * @return void * * @throws \InvalidArgumentException Exception is thrown if the provided string is not a valid email * * @since 1.0.0 */ public function setEmail(string $email) : void { if ($email !== '' && !Email::isValid($email)) { throw new \InvalidArgumentException(); } $this->email = \mb_strtolower($email); } /** * Get status. * * AccountStatus * * @return int * * @since 1.0.0 */ public function getStatus() : int { return $this->status; } /** * Get status. * * @param int $status Status * * @return void * * @throws InvalidEnumValue * * @since 1.0.0 */ public function setStatus(int $status) : void { if (!AccountStatus::isValidValue($status)) { throw new InvalidEnumValue($status); } $this->status = $status; } /** * Get type. * * AccountType * * @return int * * @since 1.0.0 */ public function getType() : int { return $this->type; } /** * Get type. * * @param int $type Type * * @return void * * @throws InvalidEnumValue * * @since 1.0.0 */ public function setType(int $type) : void { if (!AccountType::isValidValue($type)) { throw new InvalidEnumValue($type); } $this->type = $type; } /** * Get last activity. * * @return \DateTime * * @since 1.0.0 */ public function getLastActive() : \DateTime { return $this->lastActive ?? $this->getCreatedAt(); } /** * Get created at. * * @return \DateTime * * @since 1.0.0 */ public function getCreatedAt() : \DateTime { return $this->createdAt ?? new \DateTime('NOW'); } /** * Generate password. * * @param string $password Password * * @return void * * @throws \Exception * * @since 1.0.0 */ public function generatePassword(string $password) : void { $temp = \password_hash($password, \PASSWORD_DEFAULT); if ($temp === false) { throw new \Exception(); } $this->password = $temp; } /** * Set name. * * @param string $name Name * * @return void * * @since 1.0.0 */ public function setName(string $name) : void { $this->login = $name; } /** * Update last activity. * * @return void * * @since 1.0.0 */ public function updateLastActive() : void { $this->lastActive = new \DateTime('NOW'); } /** * Get string representation. * * @return string * * @since 1.0.0 */ public function __toString() : string { return (string) \json_encode($this->toArray()); } /** * {@inheritdoc} */ public function toArray() : array { return [ 'id' => $this->id, 'name' => [ $this->name1, $this->name2, $this->name3, ], 'email' => $this->email, 'login' => $this->login, 'groups' => $this->groups, 'permissions' => $this->permissions, 'type' => $this->type, 'status' => $this->status, ]; } /** * Json serialize. * * @return array * * @since 1.0.0 */ public function jsonSerialize() { return $this->toArray(); } }