<?php
namespace App\Controller\Agents;
use App\Application\AgentService;
use App\Domain\Entities\Agent;
use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RequestStack;
class AgentsController extends AbstractController
{
public function __construct(
private Connection $connection,
private RequestStack $requestStack,
private AgentService $agentService,
) {}
public function index(): Response
{
$session = $this->requestStack->getSession();
$adminLevel = (int) $session->get('adminlevel', 5);
$idAgent = (int) $session->get('idagent');
$selectClass = 'class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:text-white"';
$agentList = \agent_list($this->connection, $idAgent, 'idagent', $selectClass, false);
return $this->render('agents/index.html.twig', [
'agent_list' => $agentList,
'canEdit' => $adminLevel <= 2,
]);
}
public function create(Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
if ($request->isMethod('POST')) {
$errors = $this->validateAgentRequest($request, true);
if (empty($errors)) {
$agentId = $this->agentService->save(null, $request, true, true);
$this->addFlash('success', 'Agent created successfully.');
return $this->redirectToRoute('agents.edit', ['id' => $agentId]);
}
foreach ($errors as $error) {
$this->addFlash('error', $error);
}
}
return $this->render('agents/form.html.twig', array_merge(
$this->agentService->formDataForNew(),
[
'canEditAgent' => true,
'canEditAppointments' => true,
'isSuperAdmin' => false,
'isAdmin' => true,
]
));
}
public function edit(int $id, Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_AGENT');
if (!$this->isGranted('ROLE_MANAGER')) {
$ownId = (int) $this->requestStack->getSession()->get('idagent');
if ($ownId !== $id) {
throw $this->createAccessDeniedException();
}
}
/** @var Agent $user */
$user = $this->getUser();
$canEditAgent = $this->isGranted('ROLE_ADMIN');
$canEditAppointments = $this->isGranted('ROLE_ADMIN') || $user->isCallCenterOrTrainer();
$isSuperAdmin = $this->isGranted('ROLE_SUPER_ADMIN');
$isAdmin = $this->isGranted('ROLE_ADMIN');
if ($request->isMethod('POST')) {
$section = (string) $request->request->get('_section', 'main');
if ($section === 'comment') {
$this->agentService->addComment($id, (string) $request->request->get('frmcomments', ''));
$this->addFlash('success', 'Comment added.');
} elseif ($section === 'commission_note') {
$this->agentService->addCommissionNote($id, (string) $request->request->get('add_agent_commission_note', ''));
$this->addFlash('success', 'Commission note added.');
} else {
if ($canEditAgent) {
$errors = $this->validateAgentRequest($request, false);
if (!empty($errors)) {
foreach ($errors as $error) {
$this->addFlash('error', $error);
}
return $this->redirectToRoute('agents.edit', ['id' => $id]);
}
}
$this->agentService->save($id, $request, $canEditAgent, $canEditAppointments);
$this->addFlash('success', 'Agent saved successfully.');
}
return $this->redirectToRoute('agents.edit', ['id' => $id]);
}
$data = $this->agentService->loadFormData($id);
if (empty($data)) {
$this->addFlash('error', 'Agent not found.');
return $this->redirectToRoute('agents.index');
}
return $this->render('agents/form.html.twig', array_merge($data, [
'canEditAgent' => $canEditAgent,
'canEditAppointments' => $canEditAppointments,
'isSuperAdmin' => $isSuperAdmin,
'isAdmin' => $isAdmin,
]));
}
public function suggestUsername(Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$username = $this->agentService->suggestUsername(
(string) $request->query->get('fname', ''),
(string) $request->query->get('lname', '')
);
return new Response($username);
}
public function deleteComment(int $id, Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->agentService->deleteComment($id);
$this->addFlash('success', 'Comment deleted.');
$referer = $request->headers->get('referer');
return $referer ? $this->redirect($referer) : $this->redirectToRoute('agents.index');
}
public function deleteCommissionNote(int $id, Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
$this->agentService->deleteCommissionNote($id);
$this->addFlash('success', 'Commission note deleted.');
$referer = $request->headers->get('referer');
return $referer ? $this->redirect($referer) : $this->redirectToRoute('agents.index');
}
/** @return string[] */
private function validateAgentRequest(Request $request, bool $requireUsername): array
{
$errors = [];
if (trim((string) $request->request->get('frmagentfname', '')) === '') {
$errors[] = 'First name is required.';
}
if (trim((string) $request->request->get('frmagentlname', '')) === '') {
$errors[] = 'Last name is required.';
}
if ($requireUsername && trim((string) $request->request->get('frmusername', '')) === '') {
$errors[] = 'Username is required.';
}
return $errors;
}
}