<?php
namespace App\EventListener;
use App\Services\UserDelegationService;
use App\Traits\Log;
use Carbon\Carbon;
use Exception;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Event\Model\ElementEventInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class UserDelegationEventListener
{
use Log;
private $service;
public function __construct()
{
$this->service = new UserDelegationService;
}
public function onPreUpdate(ElementEventInterface $e)
{
if (
$e instanceof DataObjectEvent &&
method_exists($e->getObject(), 'getClassName') &&
$e->getObject() instanceof \Pimcore\Model\DataObject\User
) {
/**
* @var \Pimcore\Model\DataObject\User $user
*/
$user = $e->getObject();
$errors = $this->service->validation($user);
if (!empty($errors)) {
throw new Exception(implode("<br>", $errors));
}
$versions = $user->getVersions();
//if ($user->getUserDelegation() != null && !$this->service->isRecipientAvailable($user))
// throw new Exception("User Delegation is already a PLT. Please choose other user.");
}
}
public function onPostUpdate(ElementEventInterface $e)
{
if (
$e instanceof DataObjectEvent &&
method_exists($e->getObject(), 'getClassName') &&
$e->getObject() instanceof \Pimcore\Model\DataObject\User
) {
/**
* @var \Pimcore\Model\DataObject\User $delegator
*/
$delegator = $e->getObject();
if ($this->service->isEligible($delegator)) {
try {
$recipient = \Pimcore\Model\DataObject\User::getByPimcoreUserId( $delegator->getUserDelegation(), 1 );
$this->service->updatePLT(
$recipient,
"Set as PLT by {$delegator->getNip()}",
true,
$delegator->getDivisionId(),
$delegator->getJobPositionId(),
$delegator->getDepartmentId()
);
$delegatorRole = \Pimcore\Model\User::getById( $delegator->getPimcoreUserId() );
$recipientRole = \Pimcore\Model\User::getById( $recipient->getPimcoreUserId() );
$recipientPreviouseRoles = $recipientRole->getRoles();
$recipientRole->setRoles( array_merge($recipientPreviouseRoles, $delegatorRole->getRoles()) );
$recipientRole->save();
// user update
if ($delegator->getDelegation() != null && $delegator->getDelegation()->getRecipient() != $recipient) {
$oldDelegation = $delegator->getDelegation();
$oldDelegation->setIsActive(false);
$oldDelegation->setPublished(false);
$oldDelegation->save();
}
$delegationHistoryObject = $this->service->saveDelegationHistory($delegator, $recipient, $recipientPreviouseRoles);
$delegator->setDelegation( $delegationHistoryObject );
$delegator->save();
$this->service->delegationLog($delegator, $recipient);
} catch (\Exception $e) {
$this->simpleLog('DELEGATION', $e);
throw new Exception("Delegation is failed! Error: " . $e->getMessage());
}
}
}
}
}