src/Controller/Agents/AgentsController.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Agents;
  3. use App\Application\AgentService;
  4. use App\Domain\Entities\Agent;
  5. use Doctrine\DBAL\Connection;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. class AgentsController extends AbstractController
  11. {
  12.     public function __construct(
  13.         private Connection $connection,
  14.         private RequestStack $requestStack,
  15.         private AgentService $agentService,
  16.     ) {}
  17.     public function index(): Response
  18.     {
  19.         $session    $this->requestStack->getSession();
  20.         $adminLevel = (int) $session->get('adminlevel'5);
  21.         $idAgent    = (int) $session->get('idagent');
  22.         $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"';
  23.         $agentList \agent_list($this->connection$idAgent'idagent'$selectClassfalse);
  24.         return $this->render('agents/index.html.twig', [
  25.             'agent_list' => $agentList,
  26.             'canEdit'    => $adminLevel <= 2,
  27.         ]);
  28.     }
  29.     public function create(Request $request): Response
  30.     {
  31.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  32.         if ($request->isMethod('POST')) {
  33.             $errors $this->validateAgentRequest($requesttrue);
  34.             if (empty($errors)) {
  35.                 $agentId $this->agentService->save(null$requesttruetrue);
  36.                 $this->addFlash('success''Agent created successfully.');
  37.                 return $this->redirectToRoute('agents.edit', ['id' => $agentId]);
  38.             }
  39.             foreach ($errors as $error) {
  40.                 $this->addFlash('error'$error);
  41.             }
  42.         }
  43.         return $this->render('agents/form.html.twig'array_merge(
  44.             $this->agentService->formDataForNew(),
  45.             [
  46.                 'canEditAgent'        => true,
  47.                 'canEditAppointments' => true,
  48.                 'isSuperAdmin'        => false,
  49.                 'isAdmin'             => true,
  50.             ]
  51.         ));
  52.     }
  53.     public function edit(int $idRequest $request): Response
  54.     {
  55.         $this->denyAccessUnlessGranted('ROLE_AGENT');
  56.         if (!$this->isGranted('ROLE_MANAGER')) {
  57.             $ownId = (int) $this->requestStack->getSession()->get('idagent');
  58.             if ($ownId !== $id) {
  59.                 throw $this->createAccessDeniedException();
  60.             }
  61.         }
  62.         /** @var Agent $user */
  63.         $user                $this->getUser();
  64.         $canEditAgent        $this->isGranted('ROLE_ADMIN');
  65.         $canEditAppointments $this->isGranted('ROLE_ADMIN') || $user->isCallCenterOrTrainer();
  66.         $isSuperAdmin        $this->isGranted('ROLE_SUPER_ADMIN');
  67.         $isAdmin             $this->isGranted('ROLE_ADMIN');
  68.         if ($request->isMethod('POST')) {
  69.             $section = (string) $request->request->get('_section''main');
  70.             if ($section === 'comment') {
  71.                 $this->agentService->addComment($id, (string) $request->request->get('frmcomments'''));
  72.                 $this->addFlash('success''Comment added.');
  73.             } elseif ($section === 'commission_note') {
  74.                 $this->agentService->addCommissionNote($id, (string) $request->request->get('add_agent_commission_note'''));
  75.                 $this->addFlash('success''Commission note added.');
  76.             } else {
  77.                 if ($canEditAgent) {
  78.                     $errors $this->validateAgentRequest($requestfalse);
  79.                     if (!empty($errors)) {
  80.                         foreach ($errors as $error) {
  81.                             $this->addFlash('error'$error);
  82.                         }
  83.                         return $this->redirectToRoute('agents.edit', ['id' => $id]);
  84.                     }
  85.                 }
  86.                 $this->agentService->save($id$request$canEditAgent$canEditAppointments);
  87.                 $this->addFlash('success''Agent saved successfully.');
  88.             }
  89.             return $this->redirectToRoute('agents.edit', ['id' => $id]);
  90.         }
  91.         $data $this->agentService->loadFormData($id);
  92.         if (empty($data)) {
  93.             $this->addFlash('error''Agent not found.');
  94.             return $this->redirectToRoute('agents.index');
  95.         }
  96.         return $this->render('agents/form.html.twig'array_merge($data, [
  97.             'canEditAgent'        => $canEditAgent,
  98.             'canEditAppointments' => $canEditAppointments,
  99.             'isSuperAdmin'        => $isSuperAdmin,
  100.             'isAdmin'             => $isAdmin,
  101.         ]));
  102.     }
  103.     public function suggestUsername(Request $request): Response
  104.     {
  105.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  106.         $username $this->agentService->suggestUsername(
  107.             (string) $request->query->get('fname'''),
  108.             (string) $request->query->get('lname''')
  109.         );
  110.         return new Response($username);
  111.     }
  112.     public function deleteComment(int $idRequest $request): Response
  113.     {
  114.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  115.         $this->agentService->deleteComment($id);
  116.         $this->addFlash('success''Comment deleted.');
  117.         $referer $request->headers->get('referer');
  118.         return $referer $this->redirect($referer) : $this->redirectToRoute('agents.index');
  119.     }
  120.     public function deleteCommissionNote(int $idRequest $request): Response
  121.     {
  122.         $this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN');
  123.         $this->agentService->deleteCommissionNote($id);
  124.         $this->addFlash('success''Commission note deleted.');
  125.         $referer $request->headers->get('referer');
  126.         return $referer $this->redirect($referer) : $this->redirectToRoute('agents.index');
  127.     }
  128.     /** @return string[] */
  129.     private function validateAgentRequest(Request $requestbool $requireUsername): array
  130.     {
  131.         $errors = [];
  132.         if (trim((string) $request->request->get('frmagentfname''')) === '') {
  133.             $errors[] = 'First name is required.';
  134.         }
  135.         if (trim((string) $request->request->get('frmagentlname''')) === '') {
  136.             $errors[] = 'Last name is required.';
  137.         }
  138.         if ($requireUsername && trim((string) $request->request->get('frmusername''')) === '') {
  139.             $errors[] = 'Username is required.';
  140.         }
  141.         return $errors;
  142.     }
  143. }