src/Controller/Settings/CustomerCategoryController.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Settings;
  3. use App\Entity\CustomerCategory;
  4. use App\Form\CustomerCategoryType;
  5. use App\Repository\CustomerCategoryRepository;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Security\Csrf\CsrfToken;
  13. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  14. /**
  15.  * @Route("/settings/customer-categories")
  16.  */
  17. class CustomerCategoryController extends AbstractController
  18. {
  19.     private $entityManager;
  20.     private $customerCategoryRepository;
  21.     private $csrfTokenManager;
  22.     public function __construct(
  23.         EntityManagerInterface $entityManager,
  24.         CustomerCategoryRepository $customerCategoryRepository,
  25.         CsrfTokenManagerInterface $csrfTokenManager
  26.     ) {
  27.         $this->entityManager $entityManager;
  28.         $this->customerCategoryRepository $customerCategoryRepository;
  29.         $this->csrfTokenManager $csrfTokenManager;
  30.     }
  31.     /**
  32.      * @Route("", name="settings_customer_categories_index", methods={"GET"})
  33.      */
  34.     public function index(): Response
  35.     {
  36.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  37.         $categories $this->customerCategoryRepository->findAll();
  38.         
  39.         // Calculer les statistiques
  40.         $totalClients 0;
  41.         $mostUsedCategory null;
  42.         $maxClients 0;
  43.         
  44.         foreach ($categories as $category) {
  45.             $clientCount count($category->getCustomers());
  46.             $totalClients += $clientCount;
  47.             
  48.             if ($clientCount $maxClients) {
  49.                 $maxClients $clientCount;
  50.                 $mostUsedCategory $category;
  51.             }
  52.         }
  53.         return $this->render('settings/customer_categories/index.html.twig', [
  54.             'categories' => $categories,
  55.             'totalClients' => $totalClients,
  56.             'mostUsedCategory' => $mostUsedCategory,
  57.         ]);
  58.     }
  59.     /**
  60.      * @Route("/form/new", name="settings_customer_categories_form_new", methods={"GET"})
  61.      */
  62.     public function getNewForm(Request $request): Response
  63.     {
  64.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  65.         if ($request->isXmlHttpRequest()) {
  66.             $category = new CustomerCategory();
  67.             $form $this->createForm(CustomerCategoryType::class, $category, [
  68.                 'action' => $this->generateUrl('settings_customer_categories_new'),
  69.                 'method' => 'POST',
  70.             ]);
  71.             return $this->render('settings/customer_categories/_form.html.twig', [
  72.                 'form' => $form->createView(),
  73.                 'category' => $category,
  74.             ]);
  75.         }
  76.         return new JsonResponse(['error' => 'Invalid request'], 400);
  77.     }
  78.     /**
  79.      * @Route("/form/{id}/edit", name="settings_customer_categories_form_edit", methods={"GET"})
  80.      */
  81.     public function getEditForm(Request $requestint $id): Response
  82.     {
  83.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  84.         $category $this->customerCategoryRepository->find($id);
  85.         
  86.         if (!$category) {
  87.             return new JsonResponse(['error' => 'Catégorie non trouvée'], 404);
  88.         }
  89.         if ($request->isXmlHttpRequest()) {
  90.             $form $this->createForm(CustomerCategoryType::class, $category, [
  91.                 'action' => $this->generateUrl('settings_customer_categories_edit', ['id' => $category->getId()]),
  92.                 'method' => 'POST',
  93.             ]);
  94.             return $this->render('settings/customer_categories/_form.html.twig', [
  95.                 'form' => $form->createView(),
  96.                 'category' => $category,
  97.             ]);
  98.         }
  99.         return new JsonResponse(['error' => 'Invalid request'], 400);
  100.     }
  101.     /**
  102.      * @Route("/new", name="settings_customer_categories_new", methods={"POST"})
  103.      */
  104.     public function new(Request $request): Response
  105.     {
  106.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  107.         if ($request->isXmlHttpRequest()) {
  108.             try {
  109.                 $data $request->request->get('customer_category');
  110.                 $token $data['_token'] ?? null;
  111.                 
  112.                 if (!$token || !$this->csrfTokenManager->isTokenValid(new CsrfToken('customer_category_type'$token))) {
  113.                     return new JsonResponse([
  114.                         'success' => false,
  115.                         'message' => 'Token CSRF invalide',
  116.                         'errors' => []
  117.                     ], 403);
  118.                 }
  119.                 
  120.                 $category = new CustomerCategory();
  121.                 $category->setShortname($data['shortname']);
  122.                 $category->setName($data['name']);
  123.                 
  124.                 $this->entityManager->persist($category);
  125.                 $this->entityManager->flush();
  126.                 return new JsonResponse([
  127.                     'success' => true,
  128.                     'message' => 'Catégorie créée avec succès !',
  129.                     'category' => [
  130.                         'id' => $category->getId(),
  131.                         'shortname' => $category->getShortname(),
  132.                         'name' => $category->getName(),
  133.                         'createdAt' => $category->getCreatedAt()->format('d/m/Y'),
  134.                     ]
  135.                 ]);
  136.             } catch (\Exception $e) {
  137.                 return new JsonResponse([
  138.                     'success' => false,
  139.                     'message' => 'Erreur lors de la création : ' $e->getMessage(),
  140.                     'errors' => []
  141.                 ], 400);
  142.             }
  143.         } else {
  144.             return new JsonResponse([
  145.                     'success' => false,
  146.                     'message' => 'Requête invalide',
  147.                     'errors' => []
  148.                 ], 400);
  149.         }
  150.     }
  151.     /**
  152.      * @Route("/{id}/edit", name="settings_customer_categories_edit", methods={"POST"})
  153.      */
  154.     public function edit(Request $requestint $id): Response
  155.     {
  156.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  157.         $category $this->customerCategoryRepository->find($id);
  158.         
  159.         if (!$category) {
  160.             return new JsonResponse([
  161.                 'success' => false,
  162.                 'message' => 'Catégorie non trouvée',
  163.                 'errors' => []
  164.             ], 404);
  165.         }
  166.         if ($request->isXmlHttpRequest()) {
  167.             try {
  168.                 $data $request->request->get('customer_category');
  169.                 $token $data['_token'] ?? null;
  170.                 
  171.                 if (!$token || !$this->csrfTokenManager->isTokenValid(new CsrfToken('customer_category_type'$token))) {
  172.                     return new JsonResponse([
  173.                         'success' => false,
  174.                         'message' => 'Token CSRF invalide',
  175.                         'errors' => []
  176.                     ], 403);
  177.                 }
  178.                 
  179.                 $category->setShortname($data['shortname']);
  180.                 $category->setName($data['name']);
  181.                 
  182.                 $this->entityManager->flush();
  183.                 return new JsonResponse([
  184.                     'success' => true,
  185.                     'message' => 'Catégorie modifiée avec succès !',
  186.                     'category' => [
  187.                         'id' => $category->getId(),
  188.                         'shortname' => $category->getShortname(),
  189.                         'name' => $category->getName(),
  190.                         'createdAt' => $category->getCreatedAt()->format('d/m/Y'),
  191.                         'updatedAt' => $category->getUpdatedAt() ? $category->getUpdatedAt()->format('d/m/Y') : null,
  192.                     ]
  193.                 ]);
  194.             } catch (\Exception $e) {
  195.                 return new JsonResponse([
  196.                     'success' => false,
  197.                     'message' => 'Erreur lors de la modification : ' $e->getMessage(),
  198.                     'errors' => []
  199.                 ], 400);
  200.             }
  201.         }
  202.         $form $this->createForm(CustomerCategoryType::class, $category);
  203.         $form->handleRequest($request);
  204.         return $this->render('settings/customer_categories/index.html.twig', [
  205.             'categories' => $this->customerCategoryRepository->findAll(),
  206.             'form' => $form->createView(),
  207.             'category' => $category,
  208.             'errors' => $form->getErrors(true),
  209.         ]);
  210.     }
  211.     /**
  212.      * @Route("/{id}/delete", name="settings_customer_categories_delete", methods={"POST"})
  213.      */
  214.     public function delete(Request $requestint $id): Response
  215.     {
  216.         $this->denyAccessUnlessGranted('ROLE_SUPERADMIN');
  217.         $category $this->customerCategoryRepository->find($id);
  218.         
  219.         if (!$category) {
  220.             return new JsonResponse([
  221.                 'success' => false,
  222.                 'message' => 'Catégorie non trouvée',
  223.                 'errors' => []
  224.             ], 404);
  225.         }
  226.         if ($category->getCustomers()->count() > 0) {
  227.             return new JsonResponse([
  228.                 'success' => false,
  229.                 'message' => 'Impossible de supprimer cette catégorie car elle contient ' $category->getCustomers()->count() . ' client(s).',
  230.                 'errors' => ['Cette catégorie est liée à des clients. Veuillez d\'abord supprimer ou réaffecter les clients.']
  231.             ], 400);
  232.         }
  233.         if ($request->isXmlHttpRequest()) {
  234.             try {
  235.                 $this->entityManager->remove($category);
  236.                 $this->entityManager->flush();
  237.                 return new JsonResponse([
  238.                     'success' => true,
  239.                     'message' => 'Catégorie supprimée avec succès !',
  240.                     'id' => $id
  241.                 ]);
  242.             } catch (\Exception $e) {
  243.                 return new JsonResponse([
  244.                     'success' => false,
  245.                     'message' => 'Erreur lors de la suppression : ' $e->getMessage()
  246.                 ], 500);
  247.             }
  248.         }
  249.         if ($this->isCsrfTokenValid('delete'.$category->getId(), $request->request->get('_token'))) {
  250.             $this->entityManager->remove($category);
  251.             $this->entityManager->flush();
  252.             $this->addFlash('success''Catégorie supprimée avec succès !');
  253.         }
  254.         return $this->redirectToRoute('settings_customer_categories_index');
  255.     }
  256.     /**
  257.      * @Route("/{id}/customers", name="settings_customer_categories_customers", methods={"GET"})
  258.      */
  259.     public function customers(int $id): Response
  260.     {
  261.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  262.         $category $this->customerCategoryRepository->find($id);
  263.         
  264.         if (!$category) {
  265.             throw $this->createNotFoundException('Catégorie non trouvée');
  266.         }
  267.         return $this->render('settings/customer_categories/customers.html.twig', [
  268.             'category' => $category,
  269.             'customers' => $category->getCustomers(),
  270.         ]);
  271.     }
  272.     /**
  273.      * @Route("/{id}/customers/export/excel", name="settings_customer_categories_customers_export_excel", methods={"GET"})
  274.      */
  275.     public function exportCustomersExcel(int $id): Response
  276.     {
  277.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  278.         $category $this->customerCategoryRepository->find($id);
  279.         
  280.         if (!$category) {
  281.             throw $this->createNotFoundException('Catégorie non trouvée');
  282.         }
  283.         $customers $category->getCustomers();
  284.         $exportService = new \App\Service\CustomerExportService();
  285.         $tempFile $exportService->exportToExcel($customers->toArray());
  286.         $response = new Response(file_get_contents($tempFile));
  287.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  288.         $response->headers->set('Content-Disposition''attachment; filename="clients_categorie_' $category->getShortname() . '_' date('Y-m-d_His') . '.xlsx"');
  289.         unlink($tempFile);
  290.         return $response;
  291.     }
  292.     /**
  293.      * @Route("/{id}/customers/export/pdf", name="settings_customer_categories_customers_export_pdf", methods={"GET"})
  294.      */
  295.     public function exportCustomersPdf(int $id): Response
  296.     {
  297.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  298.         $category $this->customerCategoryRepository->find($id);
  299.         
  300.         if (!$category) {
  301.             throw $this->createNotFoundException('Catégorie non trouvée');
  302.         }
  303.         $customers $category->getCustomers();
  304.         $exportService = new \App\Service\CustomerExportService();
  305.         
  306.         // Chemin vers le logo (à adapter selon votre structure)
  307.         $logoPath $this->getParameter('kernel.project_dir') . '/public/images/logo.png';
  308.         if (!file_exists($logoPath)) {
  309.             $logoPath null;
  310.         }
  311.         
  312.         $tempFile $exportService->exportToPdf($customers->toArray(), $logoPath);
  313.         $response = new Response(file_get_contents($tempFile));
  314.         $response->headers->set('Content-Type''application/pdf');
  315.         $response->headers->set('Content-Disposition''attachment; filename="clients_categorie_' $category->getShortname() . '_' date('Y-m-d_His') . '.pdf"');
  316.         unlink($tempFile);
  317.         return $response;
  318.     }
  319. }