src/Controller/App/ClassroomController.php line 33

  1. <?php
  2. namespace App\Controller\App;
  3. use App\Entity\Child;
  4. use App\Entity\Employee;
  5. use App\Entity\Section;
  6. use App\Entity\Classroom;
  7. use App\Form\ClassroomType;
  8. use App\Entity\enums\ClassroomStatus;
  9. use App\Form\ClassroomTypeBasic;
  10. use App\Repository\ChildRepository;
  11. use App\Repository\ClassroomRepository;
  12. use App\Repository\EmployeeRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. #[Route('/app/classroom')]
  23. class ClassroomController extends AbstractController
  24. {
  25.     public function __construct(private TranslatorInterface $translator)
  26.     {
  27.     }
  28.     #[Route('/'name'app_classroom_index'methods: ['GET''POST'])]
  29.     public function index(Request $requestClassroomRepository $classroomRepositoryEntityManagerInterface $manager): Response
  30.     {
  31.         if ($request->isXmlHttpRequest()) {
  32.             if ($this->isCsrfTokenValid('classroom_type_basic'$_POST['classroom_type_basic']['_token'])) {
  33.                 $classroom = new Classroom();
  34.                 $form $this->createForm(ClassroomTypeBasic::class, $classroom);
  35.                 $section $manager->getRepository(Section::class)->find($_POST['classroom_type_basic']['section']);
  36.                 $classroom
  37.                     ->setName($_POST['classroom_type_basic']['name'])
  38.                     ->setDescription($_POST['classroom_type_basic']['description'])
  39.                     ->setCapacity($_POST['classroom_type_basic']['capacity'])
  40.                     ->setStatus(ClassroomStatus::INACTIVE)
  41.                     ->setSection($section);
  42.                 $classroomRepository->add($classroomtrue);
  43.                 return new JsonResponse(['status' => 'ok''data' => $classroom->getId(), 'msg' =>$this->translator->trans('Classe crée !')]);
  44.             } else {
  45.                 return new JsonResponse(['status' => 'no''data' => null'msg' => $this->translator->trans('token invalid !')]);
  46.             }
  47.         }
  48.         $classroom = new Classroom();
  49.         $form $this->createForm(ClassroomTypeBasic::class, $classroom);
  50.         $edit_form $this->createForm(ClassroomTypeBasic::class, $classroom, [
  51.             'action' => $this->generateUrl('app_classroom_edit_ajax', ['id' => '1']),
  52.             'method' => 'POST',
  53.             'attr' => ['name' => 'classroom_type_basic_edit']
  54.         ]);
  55.         return $this->render('app/classroom/index.html.twig', [
  56.             'classrooms' => $classroomRepository->findAll(),
  57.             'form' => $form->createView(),
  58.             'edit_form' => $edit_form->createView()
  59.         ]);
  60.     }
  61.     #[Route('/new'name'app_classroom_new'methods: ['GET''POST'])]
  62.     public function new(Request $requestClassroomRepository $classroomRepository): Response
  63.     {
  64.         return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
  65.         // $classroom = new Classroom();
  66.         // $form = $this->createForm(ClassroomType::class, $classroom);
  67.         // $form->handleRequest($request);
  68.         // if ($form->isSubmitted() && $form->isValid()) {
  69.         //     $classroomRepository->add($classroom, true);
  70.         //     $this->addFlash('success', $this->translator->trans('Succès !!'));
  71.         //     return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
  72.         // }
  73.         // return $this->renderForm('app/classroom/new.html.twig', [
  74.         //     'classroom' => $classroom,
  75.         //     'form' => $form,
  76.         // ]);
  77.     }
  78.     #[Route('/{id}'name'app_classroom_show'methods: ['GET'])]
  79.     public function show(Classroom $classroom): Response
  80.     {
  81.         return $this->render('app/classroom/show.html.twig', [
  82.             'classroom' => $classroom,
  83.         ]);
  84.     }
  85.     #[Route('/ajax/{id}'name'app_classroom_show_ajax'methods: ['GET'])]
  86.     public function show_ajax(Classroom $classroomSerializerInterface $serializer): Response
  87.     {
  88.         $json $serializer->serialize($classroom'json', ['groups' => ['read:classroom:basic''read:section:basic']]);
  89.         return $this->json(json_decode($json));
  90.     }
  91.     #[Route('/{id}/edit'name'app_classroom_edit'methods: ['GET''POST'])]
  92.     public function edit(Request $requestClassroom $classroomClassroomRepository $classroomRepository): Response
  93.     {
  94.         return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
  95.         // $form = $this->createForm(ClassroomType::class, $classroom);
  96.         // $form->handleRequest($request);
  97.         // if ($form->isSubmitted() && $form->isValid()) {
  98.         //     $classroomRepository->add($classroom, true);
  99.         //     $this->addFlash('success', $this->translator->trans('Succès !!'));
  100.         //     return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
  101.         // }
  102.         // return $this->renderForm('app/classroom/edit.html.twig', [
  103.         //     'classroom' => $classroom,
  104.         //     'form' => $form,
  105.         // ]);
  106.     }
  107.     #[Route('/{id}/status/{status}'name'app_classroom_status'methods: ['GET'])]
  108.     public function status(Request $requestClassroomStatus $statusClassroom $classroomClassroomRepository $classroomRepository): Response
  109.     {
  110.         $classroom->setStatus($status);
  111.         $classroomRepository->add($classroomtrue);
  112.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  113.         return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
  114.     }
  115.     #[Route('/{id?}/edit/ajax'name'app_classroom_edit_ajax'methods: ['GET''POST'])]
  116.     public function edit_ajax(Request $requestClassroom $classroomClassroomRepository $classroomRepositoryEntityManagerInterface $manager): Response
  117.     {
  118.         if ($request->isXmlHttpRequest()) {
  119.             if ($this->isCsrfTokenValid('edit_classroom'$_POST['classroom_type_basic']['_token'])) {
  120.                 $section $manager->getRepository(Section::class)->find($_POST['classroom_type_basic']['section']);
  121.                 $form $this->createForm(ClassroomTypeBasic::class, $classroom);
  122.                 $classroom
  123.                     ->setName($_POST['classroom_type_basic']['name'])
  124.                     ->setDescription($_POST['classroom_type_basic']['description'])
  125.                     ->setCapacity($_POST['classroom_type_basic']['capacity'])
  126.                     ->setSection($section);
  127.                 $form->handleRequest($request);
  128.                 $classroomRepository->add($classroomtrue);
  129.                 return new JsonResponse(['status' => 'ok''data' => $classroom->getId(), 'msg' => $this->translator->trans('Salle de classe mise à jour !')]);
  130.             } else {
  131.                 return new JsonResponse(['status' => 'no''data' => null'msg' => $this->translator->trans('token invalid !')]);
  132.             }
  133.         }
  134.     }
  135.     #[Route('/{id}'name'app_classroom_delete'methods: ['POST'])]
  136.     public function delete(Request $requestClassroom $classroomClassroomRepository $classroomRepository): Response
  137.     {
  138.         if ($this->isCsrfTokenValid('delete' $classroom->getId(), $request->request->get('_token'))) {
  139.             try {
  140.                 $classroomRepository->remove($classroomtrue);
  141.                 $this->addFlash('success'$this->translator->trans('Succès !!'));
  142.             } catch (\Exception $e) {
  143.                 $errorMessage $e->getMessage();
  144.                 $result explode(':'$errorMessage);
  145.                 $this->addFlash('error'$result[0]);
  146.             }
  147.         }
  148.         return $this->redirectToRoute('app_classroom_index', [], Response::HTTP_SEE_OTHER);
  149.     }
  150.     #[Route('/assign/child/{classroom}/{child}'name'app_classroom_assign_child'methods: ['GET'])]
  151.     public function assign_child(Child $childClassroom $classroomChildRepository $childRepository): Response
  152.     {
  153.         $child->addClassroom($classroom);
  154.         $childRepository->add($childtrue);
  155.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  156.         return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
  157.     }
  158.     #[Route('/unassign/child/{classroom}/{child}'name'app_classroom_unassign_child'methods: ['GET'])]
  159.     public function unassign_child(Child $childClassroom $classroomChildRepository $childRepository): Response
  160.     {
  161.         $child->removeClassroom($classroom);
  162.         $childRepository->add($childtrue);
  163.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  164.         return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
  165.     }
  166.     #[Route('/assign/employee/{classroom}/{employee}'name'app_classroom_assign_employee'methods: ['GET'])]
  167.     public function assign_employee(Employee $employeeClassroom $classroomEmployeeRepository $employeeRepository): Response
  168.     {
  169.         $employee->addClassroom($classroom);
  170.         $employeeRepository->add($employeetrue);
  171.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  172.         return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
  173.     }
  174.     #[Route('/unassign/employee/{classroom}/{employee}'name'app_classroom_unassign_employee'methods: ['GET'])]
  175.     public function unassign_employee(Employee $employeeClassroom $classroomEmployeeRepository $employeeRepository): Response
  176.     {
  177.         $employee->removeClassroom($classroom);
  178.         $employeeRepository->add($employeetrue);
  179.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  180.         return $this->redirectToRoute('app_classroom_show', ['id' => $classroom->getId()], Response::HTTP_SEE_OTHER);
  181.     }
  182.     #[Route('{id}/export/children/csv'name'app_classroom_export_children_csv'methods: ['GET'])]
  183.     public function export_csv(Classroom $classroomSerializerInterface $serializer): Response
  184.     {
  185.         $children $classroom->getChildren();
  186.         $csv $serializer->serialize($children'csv', ['groups' => ['read:child:export''read:section:export']]);
  187.         $csv str_replace('first_name''Prénom'$csv);
  188.         $csv str_replace('last_name''Nom'$csv);
  189.         $csv str_replace('gender''Genre'$csv);
  190.         $csv str_replace('birth_date''Date de naissance'$csv);
  191.         $csv str_replace('birth_place''Lieu de naissance'$csv);
  192.         $csv str_replace('blood''Groupe sanguin'$csv);
  193.         // id,,,,,,,diseases,allergies,food_habit,behavior,fears,interests,description,section,section.id,section.name,section.description,section.age_range ◀
  194.         header('Content-Type: text/csv; charset=utf-8');
  195.         header('Content-Disposition: attachment; filename="e-rawdha-' $classroom->getName() . 'children-' date('m-d-Y') . '.csv"');
  196.         header("Pragma: no-cache");
  197.         header("Expires: 0");
  198.         return new Response($csv);
  199.     }
  200.     #[Route('{id}/export/children/pdf'name'app_classroom_export_children_pdf'methods: ['GET'])]
  201.     public function export_pdf(Classroom $classroomSerializerInterface $serializer): Response
  202.     {
  203.         $company $classroom->getOwner();
  204.         try {
  205.             $path_logo 'uploads/companies/' $company->getLogo();
  206.             $type pathinfo($path_logoPATHINFO_EXTENSION);
  207.             $data file_get_contents($path_logo);
  208.             $logo 'data:image/' $type ';base64,' base64_encode($data);
  209.         } catch (\Throwable $th) {
  210.             $logo 'data:image/png;base64,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';
  211.         }
  212.         $children $serializer->serialize($classroom->getChildren(), 'json', ['groups' => ['read:child:basic''read:section:basic']]);
  213.         return $this->render('app/classroom/pdf-list-children.html.twig', [
  214.             'user' => $this->getUser(),
  215.             'classroom' => $classroom,
  216.             'children' => $classroom->getChildren(),
  217.             //$children,
  218.             'company' => $company,
  219.             'qrcode' => 'AMGHAR',
  220.             // 'photo' => $photo,
  221.             'logo' => $logo
  222.         ]);
  223.     }
  224. }