<?php
namespace App\Controller\Admin;
use App\Entity\User;
use App\Event\Account\UserDeletedEvent;
use App\Manager\ActivityManager;
use App\Manager\DonneeCompteClientManager;
use App\Manager\Mailer;
use App\Manager\MailTypeInterface;
use App\Manager\UserActivator;
use App\Repository\Multi\UserRepository;
use App\Traits\TranslatorByDomainTrait;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents;
use EasyCorp\Bundle\EasyAdminBundle\Exception\EntityRemoveException;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class UserController extends EasyAdminController
{
use TranslatorByDomainTrait;
/** @var UserRepository */
protected UserRepository $userRepository;
/** @var Mailer */
protected Mailer $mailer;
/** @var TranslatorInterface */
protected $translator;
/** @var EventDispatcher */
protected $dispatcher;
/** @var EntityManagerInterface */
protected EntityManagerInterface $objectManager;
/** @var UserActivator */
protected UserActivator $userActivator;
/** @var ActivityManager */
protected ActivityManager $activityManager;
protected DonneeCompteClientManager $donneeCompteClientManager;
/**
* UserController constructor.
*/
public function __construct(
UserRepository $userRepository,
Mailer $mailer,
TranslatorInterface $translator,
EventDispatcherInterface $dispatcher,
EntityManagerInterface $objectManager,
UserActivator $userActivator,
ActivityManager $activityManager,
DonneeCompteClientManager $donneeCompteClientManager
)
{
$this->userRepository = $userRepository;
$this->mailer = $mailer;
$this->translator = $translator;
$this->dispatcher = $dispatcher;
$this->objectManager = $objectManager;
$this->userActivator = $userActivator;
$this->activityManager = $activityManager;
$this->donneeCompteClientManager = $donneeCompteClientManager;
}
protected function listAction(): Response
{
$this->dispatch(EasyAdminEvents::PRE_LIST);
$search = trim($this->request->query->get('query'));
$maxPerPage = $this->entity['list']['max_results'];
$currentPage = $this->request->query->get('page', 1);
$offset = ($currentPage - 1) * $maxPerPage;
$totalResults = $this->userRepository->countByNotContact($search);
$nbPages = ceil($totalResults / $maxPerPage);
$users = $this->userRepository->findAllNotContactWithPagination(
$offset,
$maxPerPage,
$search,
$this->request->query->get('sortField'),
$this->request->query->get('sortDirection')
);
foreach ($users as $user) {
$user->setDonneeCompteClient(
$this->donneeCompteClientManager->getDonneeCompteClientByNumeroClient($user->getCustomerNumber())
);
}
$parameters = [
'paginator' => [
'currentPageResults' => $users,
'haveToPaginate' => $nbPages > 1,
'currentPage' => $currentPage,
'nbPages' => $nbPages,
'currentPageOffsetStart' => $offset + 1,
'currentPageOffsetEnd' => min($totalResults, $offset + $maxPerPage),
'nbResults' => $totalResults,
'hasNextPage' => $currentPage < $nbPages,
'hasPreviousPage' => $currentPage > 1,
'previousPage' => $currentPage - 1,
'nextPage' => $currentPage + 1,
],
'fields' => $this->entity['list']['fields'],
'delete_form_template' => $this->createDeleteForm($this->entity['name'], '__id__')->createView(),
];
return $this->executeDynamicMethod('render<EntityName>Template', ['list', $this->entity['templates']['list'], $parameters]);
}
protected function removeMainAccountInformation(User $user)
{
/** @var User $subAccount */
foreach ($user->getContacts() as $subAccount) {
$this->removeSubAccount($subAccount);
}
}
protected function removeSubAccount(User $user)
{
try {
$this->executeDynamicMethod(
'remove<EntityName>Entity',
[$user, $this->createDeleteForm($this->entity['name'], $this->request->query->get('id'))]
);
} catch (ForeignKeyConstraintViolationException $e) {
throw new EntityRemoveException(['entity_name' => $this->entity['name'], 'message' => $e->getMessage()]);
}
}
protected function removeUserEntity(User $user)
{
if ($user->isMainAccount()) {
$this->removeMainAccountInformation($user);
}
$this->activityManager->removeActivity($user);
$this->removeEntity($user);
// Update donneeCompteClient and send emails
$this->dispatcher->dispatch(
new UserDeletedEvent(
$user,
[
'notifyMain' => $this->request->query->get('notify-main', false),
'notifyGuests' => $this->request->query->get('notify-guests', false)
]
),
);
}
protected function searchAction(): Response
{
return $this->listAction();
}
/**
* @Route("/connect-as/{id}", name="user_connect_as")
*/
public function connectAsAction(User $user): Response
{
$this->get('session')->set('admin4preview', $user->getEmail());
return $this->redirectToRoute('app_login_4_preview');
}
/**
* @Route("/send-activation/{id}", name="user_send_activation")
*/
public function sendActivationAction(User $user): JsonResponse
{
$this->userActivator->sendActivation($user);
return $this->json(['result' => 'ok']);
}
}