src/Controller/Front/FrontSchoolController.php line 337

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Degree;
  4. use App\Entity\PersonDegree;
  5. use App\Entity\Company;
  6. use App\Entity\Region;
  7. use App\Entity\Country;
  8. use App\Entity\School;
  9. use App\Entity\SectorArea;
  10. use App\Form\SchoolType;
  11. use App\Repository\CompanyRepository;
  12. use App\Repository\SchoolRepository;
  13. use App\Repository\PersonDegreeRepository;
  14. use App\Repository\SatisfactionSalaryRepository;
  15. use App\Repository\UserRepository;
  16. use App\Repository\RoleRepository;
  17. use App\Repository\CountryRepository;
  18. use App\Repository\RegionRepository;
  19. use App\Repository\CityRepository;
  20. use App\Repository\DegreeRepository;
  21. use App\Repository\LegalStatusRepository;
  22. use App\Repository\SectorAreaRepository;
  23. use App\Repository\ActivityRepository;
  24. use App\Services\ActivityService;
  25. use App\Services\EmailService;
  26. use App\Services\EnrollmentTemplateService;
  27. use App\Services\PersonDegreeDatatableService;
  28. use App\Services\SchoolService;
  29. use App\Services\PersonDegreeService;
  30. use App\Tools\Utils;
  31. use DateTime;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  34. use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
  35. use PhpOffice\PhpSpreadsheet\Exception;
  36. use PhpOffice\PhpSpreadsheet\NamedRange;
  37. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  38. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  39. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  40. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  41. use ReflectionClass;
  42. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  43. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. use Symfony\Component\HttpFoundation\JsonResponse;
  46. use Symfony\Component\HttpFoundation\RedirectResponse;
  47. use Symfony\Component\HttpFoundation\Request;
  48. use Symfony\Component\HttpFoundation\Response;
  49. use Symfony\Component\HttpFoundation\StreamedResponse;
  50. use Symfony\Component\Routing\Annotation\Route;
  51. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  52. use App\Entity\User;
  53. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  54. use Symfony\Contracts\Translation\TranslatorInterface;
  55. #[Route(path'front/school')]
  56. #[Security("is_granted('ROLE_ETABLISSEMENT') or 
  57.             is_granted('ROLE_PRINCIPAL')")]
  58. class FrontSchoolController extends AbstractController {
  59.     private EntityManagerInterface $em;
  60.     private ActivityService $activityService;
  61.     private SchoolService $schoolService;
  62.     private PersonDegreeService $degreeService;
  63.     private CompanyRepository $companyRepository;
  64.     private SatisfactionSalaryRepository $satisfactionSalaryRepository;
  65.     private PersonDegreeRepository $personDegreeRepository;
  66.     private UserRepository $userRepository;
  67.     private RoleRepository $roleRepository;
  68.     private RegionRepository $regionRepository;
  69.     private CountryRepository $countryRepository;
  70.     private CityRepository $cityRepository;
  71.     private DegreeRepository $degreeRepository;
  72.     private LegalStatusRepository $legalStatusRepository;
  73.     private SectorAreaRepository $sectorAreaRepository;
  74.     private ActivityRepository $activityRepository;
  75.     private UserPasswordHasherInterface $hasher;
  76.     private EmailService $emailService;
  77.     private SchoolRepository $schoolRepository;
  78.     private TokenStorageInterface $tokenStorage;
  79.     private TranslatorInterface $translator;
  80.     public function __construct(
  81.         EntityManagerInterface       $em,
  82.         ActivityService              $activityService,
  83.         SchoolService                $schoolService,
  84.         PersonDegreeService          $degreeService,
  85.         CompanyRepository            $companyRepository,
  86.         UserPasswordHasherInterface  $hasher,
  87.         SatisfactionSalaryRepository $satisfactionSalaryRepository,
  88.         PersonDegreeRepository       $personDegreeRepository,
  89.         UserRepository        $userRepository,
  90.         RoleRepository        $roleRepository,
  91.         RegionRepository      $regionRepository,
  92.         CountryRepository     $countryRepository,
  93.         CityRepository        $cityRepository,
  94.         DegreeRepository      $degreeRepository,
  95.         LegalStatusRepository $legalStatusRepository,
  96.         SectorAreaRepository  $sectorAreaRepository,
  97.         ActivityRepository    $activityRepository,
  98.         EmailService          $emailService,
  99.         SchoolRepository      $schoolRepository,
  100.         TokenStorageInterface $tokenStorage,
  101.         TranslatorInterface $translator
  102.     ) {
  103.         $this->em $em;
  104.         $this->activityService $activityService;
  105.         $this->schoolService $schoolService;
  106.         $this->degreeService $degreeService;
  107.         $this->companyRepository $companyRepository;
  108.         $this->hasher $hasher;
  109.         $this->satisfactionSalaryRepository $satisfactionSalaryRepository;
  110.         $this->personDegreeRepository $personDegreeRepository;
  111.         $this->userRepository $userRepository;
  112.         $this->roleRepository $roleRepository;
  113.         $this->regionRepository $regionRepository;
  114.         $this->countryRepository $countryRepository;
  115.         $this->cityRepository $cityRepository;
  116.         $this->degreeRepository $degreeRepository;
  117.         $this->legalStatusRepository $legalStatusRepository;
  118.         $this->sectorAreaRepository $sectorAreaRepository;
  119.         $this->activityRepository $activityRepository;
  120.         $this->emailService $emailService;
  121.         $this->schoolRepository $schoolRepository;
  122.         $this->tokenStorage $tokenStorage;
  123.         $this->translator $translator;
  124.     }
  125.     #[IsGranted('ROLE_ETABLISSEMENT')]
  126.     #[Route(path'/new'name'front_school_new'methods: ['GET''POST'])]
  127.     public function newAction(Request $request): RedirectResponse|Response {
  128.         $school = new School();
  129.         /** @var User $user */
  130.         $user $this->getUser();
  131.         $school->setEmail($user->getEmail());
  132.         $school->setPhoneStandard($user->getPhone());
  133.         $school->setCountry($user->getCountry());
  134.         $school->setLocationMode(true);
  135.         $form $this->createForm(SchoolType::class, $school);
  136.         $form->handleRequest($request);
  137.         $selectedCountry $this->getUser()->getCountry();
  138.         //adaptation for DBTA
  139.         $selectedRegion null;
  140.         if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY'] == 'true') {
  141.             $selectedRegion $this->getUser()->getRegion();
  142.             $school->setRegion($selectedRegion);
  143.         }
  144.         if ($form->isSubmitted() && $form->isValid()) {
  145.             $agreeRgpd $form->get('agreeRgpd')->getData();
  146.             if ($agreeRgpd) {
  147.                 $school->setCreatedDate(new DateTime());
  148.                 $school->setUpdatedDate(new DateTime());
  149.                 $school->setUser($user);
  150.                 $school->setPhoneStandard($user->getPhone());
  151.                 $this->em->persist($school);
  152.                 $this->em->flush();
  153.                 return $this->redirectToRoute('front_school_show');
  154.             }
  155.         }
  156.         return $this->render('school/new.html.twig', [
  157.             'school' => $school,
  158.             'form' => $form->createView(),
  159.             'allActivities' => $this->activityService->getAllActivities(),
  160.             'selectedCountry' => $selectedCountry,
  161.             'selectedRegion' => $selectedRegion
  162.         ]);
  163.     }
  164.     #[Route(path'/'name'front_school_show'methods: ['GET'])]
  165.     public function showAction(): Response {
  166.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  167.             $school $this->schoolService->getSchool();
  168.             if(!$school) {
  169.                 if($this->getUser()->getPrincipalSchool()) {
  170.                     $school $this->schoolRepository->find($this->getUser()->getPrincipalSchool());
  171.                 }
  172.             }
  173.             if (!$school) {
  174.                 return $this->redirectToRoute('front_school_new');
  175.             }
  176.             return $this->render('school/show.html.twig', ['school' => $school]);
  177.         });
  178.     }
  179.     #[IsGranted('ROLE_ETABLISSEMENT')]
  180.     #[Route(path'/edit'name'front_school_edit'methods: ['GET''POST'])]
  181.     public function editAction(Request $request): RedirectResponse|Response {
  182.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request) {
  183.             $school $this->schoolService->getSchool();
  184.             if (!$school) {
  185.                 return $this->redirectToRoute('front_school_new');
  186.             }
  187.             $createdDate $school->getCreatedDate();
  188.             $editForm $this->createForm(SchoolType::class, $school);
  189.             $editForm->handleRequest($request);
  190.             $selectedCountry $this->getUser()->getCountry();
  191.             //adaptation for DBTA
  192.             $selectedRegion null;
  193.             if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY'] == 'true') {
  194.                 $selectedRegion $this->getUser()->getRegion();
  195.             }
  196.             if ($editForm->isSubmitted() && $editForm->isValid()) {
  197.                 $agreeRgpd $editForm->get('agreeRgpd')->getData();
  198.                 if ($agreeRgpd) {
  199.                     $school->setCreatedDate($createdDate);
  200.                     if ($school->getCreatedDate() == null) {
  201.                         if ($school->getUpdatedDate()) {
  202.                             $school->setCreatedDate($school->getUpdatedDate());
  203.                         } else {
  204.                             $school->setCreatedDate(new DateTime());
  205.                         }
  206.                     }
  207.                     $school->setUpdatedDate(new DateTime());
  208.                     $school->setUser($this->getUser());
  209.                     if (!$this->getUser()->getApiToken()) {
  210.                         $this->getUser()->setApiToken(bin2hex(random_bytes(32)));
  211.                     }
  212.                     $this->em->flush();
  213.                     return $this->redirectToRoute('front_school_show');
  214.                 } else if (count($school->getPersonDegrees()) == 0) {
  215.                     return $this->redirectToRoute('front_school_user_delete_school', array('id' => $school->getId()));
  216.                 }
  217.             }
  218.             return $this->render('school/edit.html.twig', [
  219.                 'school' => $school,
  220.                 'edit_form' => $editForm->createView(),
  221.                 'allActivities' => $this->activityService->getAllActivities(),
  222.                 'selectedCountry' => $selectedCountry,
  223.                 'selectedRegion' => $selectedRegion
  224.             ]);
  225.         });
  226.     }
  227.     #[IsGranted('ROLE_ETABLISSEMENT')]
  228.     #[Route(path'/companies'name'front_school_company_index'methods: ['GET'])]
  229.     public function companiesIndexAction(): Response {
  230.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  231.             $companies $this
  232.                 ->companyRepository
  233.                 ->getBySchool($this->schoolService->getSchool());
  234.             return $this->render('company/index.html.twig', [
  235.                 'companies' => $companies
  236.             ]);
  237.         });
  238.     }
  239.     #[IsGranted('ROLE_ETABLISSEMENT')]
  240.     #[Route(path'/all_companies'name'front_school_all_company_index'methods: ['GET'])]
  241.     public function allCompaniesIndexAction(): Response {
  242.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  243.             $school $this->schoolService->getSchool();
  244.             $allCompanies $this->companyRepository->findByCountry($school->getCountry());
  245.             $selectedCompanies $this->companyRepository->getBySchool($school);
  246.             return $this->render('company/index.html.twig', [
  247.                 'companies' => $allCompanies,
  248.                 'selectedCompanies' => $selectedCompanies,
  249.             ]);
  250.         });
  251.     }
  252.     #[IsGranted('ROLE_ETABLISSEMENT')]
  253.     #[Route(path'/persondegrees_companies'name'front_school_persondegrees_company_index'methods: ['GET'])]
  254.     public function persondegreesCompaniesIndexAction(): Response {
  255.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  256.             $school $this->schoolService->getSchool();
  257.             $allCompanies $this->companyRepository->findByCountry($school->getCountry());
  258.             $satisfactionSalaries $this->satisfactionSalaryRepository->getByCountryAndPersonDegreeSchool($school->getCountry(), $school);
  259.             // creation des entreprises trouvées dans les satisfactions
  260.             $employers = [];
  261.             foreach ($satisfactionSalaries as $satisfactionSalary) {
  262.                 $newEmployer = array();
  263.                 $newEmployer["name"] = $satisfactionSalary->getCompanyName();
  264.                 $newEmployer["city"] = $satisfactionSalary->getCompanyCity();
  265.                 $newEmployer["phone"] = $satisfactionSalary->getCompanyPhone();
  266.                 $newEmployer["NbPersonDegrees"] = 1;
  267.                 // compte les employés de l'entreprise
  268.                 $employerExist false;
  269.                 for ($i 0$i count($employers); $i++) {
  270.                     if (($employers[$i]["name"] == $satisfactionSalary->getCompanyName()) &&
  271.                         ($employers[$i]["city"] == $satisfactionSalary->getCompanyCity()) &&
  272.                         ($employers[$i]["phone"] == $satisfactionSalary->getCompanyPhone())) {
  273.                         $employers[$i]["NbPersonDegrees"]++;
  274.                         $employerExist true;
  275.                     }
  276.                 }
  277.                 if (!$employerExist) {
  278.                     $employers[] = $newEmployer;
  279.                 }
  280.             }
  281.             return $this->render('school/employers.html.twig', [
  282.                 'companies' => $allCompanies,
  283.                 'employers' => $employers,
  284.             ]);
  285.         });
  286.     }
  287.     // #[IsGranted('ROLE_ETABLISSEMENT')]
  288.     // #[Route(path: '/persondegrees', name: 'front_school_persondegree_index', methods: ['GET'])]
  289.     // public function personDegreesIndexAction(Request $request): Response {
  290.     //     return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request) {
  291.     //         $school = $this->schoolService->getSchool();
  292.     //         $schoolId = $school?->getId();
  293.     //         $personDegrees = $this->personDegreeRepository->getAllPersonDegree(
  294.     //             null,
  295.     //             null,
  296.     //             $schoolId
  297.     //         );
  298.     //         $types = $this->degreeService->getTypes();
  299.     //
  300.     //         return $this->render('persondegree/index.html.twig', [
  301.     //             'personDegrees' => $personDegrees,
  302.     //             'types' => $types
  303.     //         ]);
  304.     //     });
  305.     // }
  306.     #[IsGranted('ROLE_ETABLISSEMENT')]
  307.     #[Route(path'/persondegrees'name'front_school_persondegree_index'methods: ['GET''POST'])]
  308.     public function indexDatatableAction(Request $requestPersonDegreeDatatableService $datatableService): Response {
  309.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$datatableService) {
  310.             /** @var User $currentUser */
  311.             $currentUser $this->getUser();
  312.             $school $this->schoolService->getSchool();
  313.             $schoolId $school?->getId();
  314.             $table $datatableService->generateDatatable($request$currentUser$schoolId);
  315.             $table->handleRequest($request);
  316.             if ($table->isCallback()) {
  317.                 return $table->getResponse();
  318.             }
  319.             return $this->render('persondegree/index_datatable.html.twig', [
  320.                 'datatable' => $table,
  321.                 'types' => $this->degreeService->getTypes()
  322.             ]);
  323.         });
  324.     }
  325.     #[IsGranted('ROLE_ETABLISSEMENT')]
  326.     #[Route(path'/persondegreesEnroll'name'front_school_persondegrees_enroll'methods: ['GET'])]
  327.     public function personDegreesEnrollAction(): Response {
  328.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  329.             $school $this->schoolService->getSchool();
  330.             $selectedCountry $this->getUser()->getCountry();
  331.             $regions $this->regionRepository->findByCountry($selectedCountry);
  332.             $personDegrees $this->personDegreeRepository->getBySchoolAndByUnlocked($schooltrue);
  333.             return $this->render('school/personDegreesEnroll.html.twig', [
  334.                 'personDegrees' => $personDegrees,
  335.                 'regions' => $regions,
  336.             ]);
  337.         });
  338.     }
  339.     #[IsGranted('ROLE_ETABLISSEMENT')]
  340.     #[Route(path'/persondegreesEnroll/generate'name'front_school_enroll_generate_template'methods: ['GET'])]
  341.     public function generatePersonDegreeEnrolmentTemplate(
  342.         RegionRepository $regionRepository,
  343.         CityRepository $cityRepository,
  344.         ActivityRepository $activityRepository,
  345.         SectorAreaRepository $sectorAreaRepository,
  346.         EnrollmentTemplateService $enrollmentTemplateService
  347.     ): Response {
  348.         $spreadsheet = new Spreadsheet();
  349.         $sheet $spreadsheet->getActiveSheet();
  350.         $dataSheet $spreadsheet->createSheet();
  351.         $dataSheet->setTitle($worksheetName 'Data');
  352.         /** @var User $currentUser */
  353.         $currentUser $this->getUser();
  354.         /** @var School $school */
  355.         $school $currentUser->getSchool();
  356.         $sheet->setCellValue('A1'$this->translator->trans('js.import_csv_registration'));
  357.         $sheet->setCellValue('B1'$this->translator->trans('js.import_csv_first_name'));
  358.         $sheet->setCellValue('C1'$this->translator->trans('js.import_csv_name'));
  359.         $sheet->setCellValue('D1'$this->translator->trans('js.import_csv_birthday'));
  360.         $sheet->setCellValue('E1'$this->translator->trans('js.import_csv_gender'));
  361.         $sheet->setCellValue('F1'$this->translator->trans('js.import_csv_region'));
  362.         $sheet->setCellValue('G1'$this->translator->trans('js.import_csv_city'));
  363.         $sheet->setCellValue('H1'$this->translator->trans('js.import_csv_mobile_phone'));
  364.         $sheet->setCellValue('I1'$this->translator->trans('js.import_csv_parent_mobile_phone'));
  365.         $sheet->setCellValue('J1'$this->translator->trans('js.import_csv_email'));
  366.         $sheet->setCellValue('K1'$this->translator->trans('js.import_csv_diploma'));
  367.         $sheet->setCellValue('L1'$this->translator->trans('js.import_csv_sector'));
  368.         $sheet->setCellValue('M1'$this->translator->trans('js.import_csv_subsector'));
  369.         $this->setTextColumnFormat($sheet'D');
  370.         $this->setTextColumnFormat($sheet'H');
  371.         $this->setTextColumnFormat($sheet'I');
  372.         $this->setTextColumnFormat($sheet'J');
  373.         $degrees $school->getDegrees()->map(function (Degree $degree) {
  374.             return $this->translator->trans($degree->getName());
  375.         })->toArray();
  376.         // Region & city
  377.         $enrollmentTemplateService->createColumnMappings(
  378.             $spreadsheet,
  379.             $cityRepository,
  380.             $regionRepository,
  381.             'F',
  382.             'G',
  383.             $worksheetName
  384.         );
  385.         // Sector & activity
  386.         $enrollmentTemplateService->createColumnMappings(
  387.             $spreadsheet,
  388.             $activityRepository,
  389.             $sectorAreaRepository,
  390.             'L',
  391.             'M',
  392.             $worksheetName
  393.         );
  394.         $this->_columnTemplateExcelValidation($sheet$dataSheet'E', [$this->translator->trans('menu.a_man'), $this->translator->trans('menu.a_woman')]);
  395.         $this->_columnTemplateExcelValidation($sheet$dataSheet'K'$degrees);
  396.         $response = new StreamedResponse(function () use ($spreadsheet) {
  397.             $writer = new Xlsx($spreadsheet);
  398.             $writer->save('php://output');
  399.         });
  400.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  401.         $response->headers->set('Content-Disposition''attachment;filename="person_degree_enrollment_template.xlsx"');
  402.         $response->headers->set('Cache-Control''max-age=0');
  403.         return $response;
  404.     }
  405.     private function setTextColumnFormat(Worksheet $sheetstring $columnint $startRow 2int $endRow 100): void {
  406.         for ($row $startRow$row <= $endRow$row++) {
  407.             $cell $column $row;
  408.             $sheet->getStyle($cell)->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);
  409.             $sheet->setCellValueExplicit($cell''DataType::TYPE_STRING);
  410.         }
  411.     }
  412.     /**
  413.      * @throws Exception
  414.      */
  415.     #[IsGranted('ROLE_ETABLISSEMENT')]
  416.     #[Route(path'/companiesEnroll/generate'name'front_school_company_enroll_generate_template'methods: ['GET'])]
  417.     public function generateCompanyEnrolmentTemplate(
  418.         CityRepository $cityRepository,
  419.         LegalStatusRepository $legalStatusRepository,
  420.         RegionRepository $regionRepository,
  421.         SectorAreaRepository $sectorAreaRepository,
  422.         EnrollmentTemplateService $enrollmentTemplateService
  423.     ): Response {
  424.         $spreadsheet = new Spreadsheet();
  425.         $sheet $spreadsheet->getActiveSheet();
  426.         $dataSheet $spreadsheet->createSheet();
  427.         $dataSheet->setTitle($worksheetName 'Data');
  428.         /** @var User $currentUser */
  429.         $currentUser $this->getUser();
  430.         /** @var School $school */
  431.         $school $currentUser->getSchool();
  432.         $sheet->setCellValue('A1'$this->translator->trans('js.import_csv_name'));
  433.         $sheet->setCellValue('B1'$this->translator->trans('js.import_csv_region'));
  434.         $sheet->setCellValue('C1'$this->translator->trans('js.import_csv_city'));
  435.         $sheet->setCellValue('D1'$this->translator->trans('js.import_csv_phone'));
  436.         $sheet->setCellValue('E1'$this->translator->trans('js.import_csv_email'));
  437.         $sheet->setCellValue('F1'$this->translator->trans('js.import_csv_sector'));
  438.         $sheet->setCellValue('G1'$this->translator->trans('js.import_csv_legal_status'));
  439.         $this->setTextColumnFormat($sheet'D');
  440.         // Region & city
  441.         $enrollmentTemplateService->createColumnMappings(
  442.             $spreadsheet,
  443.             $cityRepository,
  444.             $regionRepository,
  445.             'B',
  446.             'C',
  447.             $worksheetName
  448.         );
  449.         $this->_columnTemplateExcelValidation($sheet$dataSheet'F'$sectorAreaRepository->getNames());
  450.         $this->_columnTemplateExcelValidation($sheet$dataSheet'G'array_map(function (string $legalStatusName): string {
  451.             return $this->translator->trans($legalStatusName);
  452.         }, $legalStatusRepository->getNames()));
  453.         $response = new StreamedResponse(function () use ($spreadsheet) {
  454.             $writer = new Xlsx($spreadsheet);
  455.             $writer->save('php://output');
  456.         });
  457.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  458.         $response->headers->set('Content-Disposition''attachment;filename="person_degree_enrollment_template.xlsx"');
  459.         $response->headers->set('Cache-Control''max-age=0');
  460.         return $response;
  461.     }
  462.     private function _columnTemplateExcelValidation(
  463.         Worksheet $sheet,
  464.         Worksheet $dataSheet,
  465.         string $columnLetter,
  466.         $values
  467.     ): void {
  468.         $row 1;
  469.         $count count($values);
  470.         // Add list option on DATA sheet
  471.         foreach ($values as $value) {
  472.             $dataSheet->setCellValue($columnLetter $row$value);
  473.             $row++;
  474.         }
  475.         // add options
  476.         $range sprintf('Data!$%s$1:$%s$%s'$columnLetter$columnLetter$count);
  477.         for ($i 2$i <= 200$i++) {
  478.             $cell $columnLetter $i;
  479.             $validation $sheet->getCell($cell)->getDataValidation();
  480.             $validation->setType(DataValidation::TYPE_LIST);
  481.             $validation->setErrorStyle(DataValidation::STYLE_STOP);
  482.             $validation->setAllowBlank(false);
  483.             $validation->setShowDropDown(true);
  484.             $validation->setFormula1($range);
  485.             $validation->setErrorTitle($this->translator->trans('clean.error'));
  486.             $validation->setError('The value entered is not valid.');
  487.             $validation->setPromptTitle('Choisir dans la liste');
  488.             $validation->setPrompt('Veuillez choisir une valeur dans la liste.');
  489.             $sheet->getCell($cell)->setDataValidation(clone $validation);
  490.         }
  491.     }
  492.     #[IsGranted('ROLE_ETABLISSEMENT')]
  493.     #[Route(path'/companiesEnroll'name'front_school_companies_enroll'methods: ['GET'])]
  494.     public function companiesEnrollAction(): Response {
  495.         return $this->schoolService->checkUnCompletedAccountBefore(function () {
  496.             $school $this->schoolService->getSchool();
  497.             $selectedCountry $this->getUser()->getCountry();
  498.             $regions $this->regionRepository->findByCountry($selectedCountry);
  499.             $legalStatus $this->legalStatusRepository->findAll();
  500.             $sectorAreas $this->sectorAreaRepository->findAll();
  501.             $companies $this->companyRepository->getBySchool($school);
  502.             $companiesUnlocked = [];
  503.             foreach ($companies as $company)
  504.                 if ($company->isUnlocked()) {
  505.                     $companiesUnlocked[] = $company;
  506.                 }
  507.             return $this->render('school/companiesEnroll.html.twig', [
  508.                 'companies' => $companiesUnlocked,
  509.                 'selectedCountry' => $selectedCountry,
  510.                 'regions' =>$regions,
  511.                 'sectorAreas' =>$sectorAreas,
  512.                 'legalStatus' =>$legalStatus,
  513.             ]);
  514.         });
  515.     }
  516.     #[IsGranted('ROLE_ETABLISSEMENT')]
  517.     #[Route(path'/user_delete/{id}'name'front_school_user_delete_school'methods: ['GET''POST'])]
  518.     public function deleteUserAction(School $school): RedirectResponse {
  519.         $user $school->getUser();
  520.         // delete Principals users
  521.         $principals $this->userRepository->findByPrincipalSchool($school->getId());
  522.         foreach ($principals as $principal) {
  523.             $this->em->remove($principal);
  524.         }
  525.         if ($user) {
  526.             $this->schoolService->removeRelations($user);
  527.             $this->tokenStorage->setToken(null);
  528.             $this->em->remove($user);
  529.             $this->em->flush();
  530.             $this->addFlash('success'$this->translator->trans('flashbag.the_deletion_is_done_successfully'));
  531.             return $this->redirectToRoute('logout');
  532.         } else {
  533.             $this->addFlash('warning'$this->translator->trans('flashbag.unable_to_delete_account'));
  534.             return $this->redirectToRoute('front_school_new');
  535.         }
  536.     }
  537.     #[IsGranted('ROLE_ETABLISSEMENT')]
  538.     #[Route(path'/persondegrees/{id}/checkPersonDegree'name'front_school_persondegree_check'methods: ['GET'])]
  539.     public function personDegreesCheckAction(PersonDegree $personDegreeRequest $request): JsonResponse {
  540.         // récupération de la variable en get (si en post, utiliser : $request->request->get('checkSchool');)
  541.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($personDegree$request) {
  542.             $checkSchool boolval($request->query->get('checkSchool'));
  543.             $personDegree->setCheckSchool($checkSchool);
  544.             $this->em->persist($personDegree);
  545.             $this->em->flush();
  546.             // renvoi de la réponse
  547.             $responsePersonDegree = [
  548.                 'id' => $personDegree->getId(),
  549.                 'name' => $personDegree->getName(),
  550.                 'check' => $personDegree->isCheckSchool(),
  551.                 'checkSchool' => $checkSchool
  552.             ];
  553.             return new JsonResponse([$responsePersonDegree]);
  554.         });
  555.     }
  556.     #[IsGranted('ROLE_ETABLISSEMENT')]
  557.     #[Route(path'/{id}/personDegreeDelete/'name'front_school_person_degree_delete'methods: ['GET'])]
  558.     public function personDegreeDeleteAction(Request $request,int $id): JsonResponse {
  559.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$id) {
  560.             $res = [];
  561.             $err = [];
  562.             $personDegree $this->personDegreeRepository->find($id);
  563.             if(!$personDegree)
  564.                 $err[] = 'Diplômé inexistant en Base ';
  565.             else {
  566.                 $user $personDegree->getUser();
  567.                 if($user->getPersonDegree()) {
  568.                     foreach ($user->getPersonDegree() as $diplome) {
  569.                         $this->em->remove($diplome);
  570.                     }
  571.                 }
  572.                 $this->em->remove($user);
  573.                 $this->em->flush();
  574.             }
  575.             return new JsonResponse([$res$err]);
  576.         });
  577.     }
  578.     #[IsGranted('ROLE_ETABLISSEMENT')]
  579.     #[Route(path'/{id}/companyDelete/'name'front_school_company_delete'methods: ['GET'])]
  580.     public function companyDeleteAction(Request $request,int $id): JsonResponse {
  581.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$id){
  582.             $res = [];
  583.             $err = [];
  584.             $company $this->companyRepository->find($id);
  585.             if(!$company)
  586.                 $err[] = "Entreprise inexistante en Base ";
  587.             else {
  588.                 $user $company->getUser();
  589.                 if($user->getPersonDegree()) {
  590.                     foreach ($user->getCompany() as $entreprise) {
  591.                         $this->em->remove($entreprise);
  592.                     }
  593.                 }
  594.                 $this->em->remove($user);
  595.                 $this->em->flush();
  596.             }
  597.             return new JsonResponse([$res$err]);
  598.         });
  599.     }
  600.     #[IsGranted('ROLE_ETABLISSEMENT')]
  601.     #[Route(path'/companies/{id}/updateCompany'name'front_school_update_company'methods: ['GET'])]
  602.     public function updateCompanyAction(Company $companyRequest $request): JsonResponse {
  603.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($company$request) {
  604.             // récupération de la variable en get (si en post, utiliser : $request->request->get('isCompany');)
  605.             $isCompany boolval($request->query->get('isCompany'));
  606.             $school $this->schoolService->getSchool();
  607.             if ($isCompany) {
  608.                 $school->addCompany($company);
  609.                 $this->em->persist($school);
  610.                 $this->em->flush();
  611.             } else {
  612.                 $school->removeCompany($company);
  613.                 $this->em->persist($school);
  614.                 $this->em->flush();
  615.             }
  616.             // renvoi de la réponse
  617.             $responseSchool = [
  618.                 'id' => $company->getId(),
  619.                 'name' => $company->getName(),
  620.                 'isCompany' => $isCompany
  621.             ];
  622.             return new JsonResponse([$responseSchool]);
  623.         });
  624.     }
  625.     #[IsGranted('ROLE_ETABLISSEMENT')]
  626.     #[Route(path'/check_logout'name'check_logout_school'methods: ['GET''POST'])]
  627.     public function check_logout(TokenStorageInterface $tokenStorage): RedirectResponse {
  628.         $school $this->schoolService->getSchool();
  629.         $user $this->getUser();
  630.         // suppression du compte si le profil school n'existe pas
  631.         if (!$school) {
  632.             if ($user) {
  633.                 $tokenStorage->setToken(null);
  634.                 $this->schoolService->removeRelations($user);
  635.                 $this->em->remove($user);
  636.                 $this->em->flush();
  637.             } else {
  638.                 $this->addFlash('warning'$this->translator->trans('flashbag.unable_to_delete_account'));
  639.                 return $this->redirectToRoute('front_school_show');
  640.             }
  641.             // update du numéro de téléphone du compte si différente du profil (Attention change de Login)
  642.         } else if ($user->getPhone() != $school->getPhoneStandard()) {
  643.             // verification de la non existance du user par ce numéro de téléphone
  644.             $usrexist $this->userRepository->findByPhone($school->getPhoneStandard());
  645.             if ($usrexist) {
  646.                 $this->addFlash('danger'$this->translator->trans('flashbag.the_login_phone_is_already_used_by_another_account'));
  647.                 return $this->redirectToRoute('front_school_edit');
  648.             }
  649.             // modification du numéro de telephone et sortie
  650.             $this->addFlash('warning'$this->translator->trans('flashbag.the_login_phone_for_your_account_will_be_changed') . '|' $user->getUsername() . '|' $school->getPhoneStandard());
  651.             $user->setUsername($school->getPhoneStandard());
  652.             $user->setPhone($school->getPhoneStandard());
  653.             $this->em->persist($user);
  654.             $this->em->flush();
  655.             //envoi du mail des paramètres de connexion
  656.             if ($user->getEmail()) {
  657.                 if ($this->emailService->sendMailConfirmRegistration($user->getEmail(), $school->getName(),
  658.                     "Paramètres de votre compte InserJeune""Etablissement"$user->getPhone())) {
  659.                     $this->addFlash('success'$this->translator->trans('flashbag.your_connection_parameters_are_sent_by_email'));
  660.                 } else {
  661.                     $this->addFlash('danger'$this->translator->trans('flashbag.error_sending_email'));
  662.                 }
  663.             }
  664.             // update de l'adrese email du compte si différente du profil
  665.         } else if ($user->getEmail() != $school->getEmail()) {
  666.             // verification de la non existance du user par cet email
  667.             $usrexist $this->userRepository->findByEmail($school->getEmail());
  668.             if ($usrexist) {
  669.                 $this->addFlash('danger'$this->translator->trans('flashbag.the_email_address_is_already_used_in_another_account', ['{email}' => $school->getEmail()]));
  670.                 return $this->redirectToRoute('front_school_edit');
  671.             }
  672.             // modification e l'email et sortie
  673.             $user->setEmail($school->getEmail());
  674.             $this->em->persist($user);
  675.             $this->em->flush();
  676.             // envoi du mail des paramètres de connexion
  677.             if ($user->getEmail()) {
  678.                 if ($this->emailService->sendMailConfirmRegistration($user->getEmail(), $school->getName(),
  679.                     "Paramètres de votre compte InserJeune""Etablissement"$user->getPhone())) {
  680.                     $this->addFlash('success'$this->translator->trans('flashbag.your_connection_parameters_are_sent_by_email'));
  681.                 } else {
  682.                     $this->addFlash('danger'$this->translator->trans('flashbag.error_sending_email'));
  683.                 }
  684.             }
  685.         }
  686.         return $this->redirectToRoute('logout');
  687.     }
  688.     #[IsGranted('ROLE_ETABLISSEMENT')]
  689.     #[Route(path'/{id}/enrollPersonDegreeUpdate/'name'front_school_enroll_person_degree_update'methods: ['GET''POST'])]
  690.     public function enrollPersonDegreeUpdateAction(Request $requestint $id): JsonResponse|Response {
  691.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$id) {
  692.             $school $this->schoolService->getSchool();
  693.             $datas $request->query->all();
  694.             $phoneNumber "";
  695.             $res = [];
  696.             $err = [];
  697.             $personDegree $this->personDegreeRepository->find($id);
  698.             if (!$personDegree) {
  699.                 $personDegree = new PersonDegree();
  700.             }
  701.             $actorClass = new ReflectionClass($personDegree);
  702.             //verification de l'indicatif pays
  703.             $selectedCountry null;
  704.             $selectedRegion null;
  705.             if ($datas["selectedCountry"]) {
  706.                 $selectedCountry $this->countryRepository->find($datas["selectedCountry"]);
  707.                 if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  708.                     if($datas["selectedRegion"]) {
  709.                         $selectedRegion $this->regionRepository->find($datas["selectedRegion"]);
  710.                         $personDegree->setRegion($selectedRegion);
  711.                     }
  712.                 } else {
  713.                     $selectedRegion $this->regionRepository->find($datas["Region"]);
  714.                     $personDegree->setRegion($selectedRegion);
  715.                 }
  716.                 $personDegree->setCountry($selectedCountry);
  717.             }
  718.             if (!$selectedCountry)
  719.                 return new JsonResponse (["", ["erreur serveur de country"]]);
  720.             if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  721.                 if (!$selectedRegion)
  722.                     return new JsonResponse(["", ["erreur serveur de region (country DBTA)"]]);
  723.             }
  724.             foreach ($datas as $key => $value) {
  725.                 $setProp "set" ucfirst($key);
  726.                 if (($setProp == "setPhoneMobile1") || ($setProp == "setPhoneMobile2")) {
  727.                     // number phone syntax control
  728.                     $phoneSyntax $this->checkPhoneSyntax($value$selectedCountry$selectedRegion);
  729.                     if (($setProp == "setPhoneMobile2") && ($value == ""))
  730.                         $phoneSyntax "ok";
  731.                     if ($phoneSyntax == "ok") {
  732.                         $personDegree->$setProp($value);
  733.                         $this->em->persist($personDegree);
  734.                         $res[$key] = $value;
  735.                         if ($setProp == "setPhoneMobile1") {
  736.                             $phoneNumber $value;
  737.                         }
  738.                     } else {
  739.                         // $err[] = "Mauvaise syntaxe numéro " . $this->getLitteralPhoneNameForPersonDegree($key) . " : " . $phoneSyntax;
  740.                         $err[] = $this->getLitteralPhoneNameForPersonDegree($key) . " : " $phoneSyntax;
  741.                     }
  742.                 } else if ($setProp == "setBirthDate") {
  743.                     $res[$key] = $value;
  744.                     $birthDate Utils::parseFlexibleDate($value);
  745.                     if ($birthDate) {
  746.                         $personDegree->$setProp($birthDate->format(Utils::FORMAT_FR));
  747.                         $this->em->persist($personDegree);
  748.                     } else {
  749.                         $err[] = "No BirthDate found for Id:" $value;
  750.                     }
  751.                 } else if ($setProp == "setRegion") {
  752.                     $res[$key] = $value;
  753.                     $region $this->regionRepository->find(intval($value));
  754.                     if ($region) {
  755.                         $personDegree->$setProp($region);
  756.                         $this->em->persist($personDegree);
  757.                     } else {
  758.                         $err[] = "No Region found for Id:" $value;
  759.                     }
  760.                 } else if ($setProp == "setAddressCity") {
  761.                     $res[$key] = $value;
  762.                     $city $this->cityRepository->find($value);
  763.                     if ($city) {
  764.                         $personDegree->$setProp($city);
  765.                         $this->em->persist($personDegree);
  766.                     } else {
  767.                         $err[] = "No City found for Id:" $value;
  768.                     }
  769.                 } else if ($setProp == "setDegree") {
  770.                     $res[$key] = $value;
  771.                     $degree $this->degreeRepository->find($value);
  772.                     if ($degree) {
  773.                         $personDegree->$setProp($degree);
  774.                         $this->em->persist($personDegree);
  775.                     } else {
  776.                         $err[] = 'No Degree found for Id:' $value;
  777.                     }
  778.                 } else if ($setProp == "setSectorArea") {
  779.                     $res[$key] = $value;
  780.                     $sectorArea $this->sectorAreaRepository->find($value);
  781.                     if ($sectorArea) {
  782.                         $personDegree->$setProp($sectorArea);
  783.                         $this->em->persist($personDegree);
  784.                     } else {
  785.                         $err[] = 'No SectorArea found for Id:' $value;
  786.                     }
  787.                 } else if ($setProp == "setActivity") {
  788.                     $res[$key] = $value;
  789.                     $activity $this->activityRepository->find($value);
  790.                     if ($activity) {
  791.                         $personDegree->$setProp($activity);
  792.                         $this->em->persist($personDegree);
  793.                     } else {
  794.                         $err[] = 'No Activity found for Id:' $value;
  795.                     }
  796.                 } else if ($setProp == "setSelectedCountry") {
  797.                 } else if ($setProp == "setSelectedRegion") {
  798.                 } else if ($setProp == "setId") {
  799.                 } else {
  800.                     if ($actorClass->hasMethod($setProp)) {
  801.                         $personDegree->$setProp($value);
  802.                         $this->em->persist($personDegree);
  803.                         $res[$key] = $value;
  804.                     } else {
  805.                         $err[] = 'Bad property:' $setProp;
  806.                     }
  807.                 }
  808.             }
  809.             if (count($err) == 0) {
  810.                 /* verification si le user existe */
  811.                 /* ------------------------------ */
  812.                 $user $personDegree->getUser();
  813.                 if (!$user) {
  814.                     $resRegister $this->actorRegister("personDegree"$phoneNumber$selectedCountry$selectedRegion);
  815.                     if (count($resRegister[2]) > 0)
  816.                         $err[] = 'Erreur User: ' $resRegister[2][0];
  817.                     if ($resRegister[1] != "") {
  818.                         $personDegree->setCreatedDate(new DateTime());
  819.                         $personDegree->setUpdatedDate(new DateTime());
  820.                         $personDegree->setType("TYPE_TRAINING");
  821.                         $personDegree->setSchool($school);
  822.                         $personDegree->setCountry($school->getCountry());
  823.                         $personDegree->setUser($resRegister[0]);
  824.                         $personDegree->setTemporaryPasswd($resRegister[1]);
  825.                         $res = ["id" => $personDegree->getId(), "userId" => $resRegister[0]->getId(), "pwd" => $resRegister[1], "err" => $resRegister[2]];
  826.                     } else {
  827.                         $err[] = 'phoneNumber:' $resRegister[1];
  828.                     }
  829.                 }
  830.                 if (count($err) == 0) {
  831.                     $this->em->flush();
  832.                     // Notify student
  833.                     // $this->emailService->sendNotificationEnrollmentDegree($personDegree, $school);
  834.                     $res = [
  835.                         "id" => $personDegree->getId(),
  836.                         "userId" => $personDegree->getUser()->getId(),
  837.                         "pwd" => $personDegree->getTemporaryPasswd()
  838.                     ];
  839.                 }
  840.             }
  841.             return new JsonResponse([$res$err]);
  842.         });
  843.     }
  844.     private function getLitteralPhoneNameForPersonDegree($name) {
  845.         return match ($name) {
  846.             "phoneMobile1" => $this->translator->trans('menu.cell_phone'),
  847.             "phoneMobile2" => $this->translator->trans('menu.parent_cell_phone'),
  848.             default => $name,
  849.         };
  850.     }
  851.     #[IsGranted('ROLE_ETABLISSEMENT')]
  852.     #[Route(path'/{id}/enrollCompanyUpdate/'name'front_school_enroll_company_update'methods: ['GET'])]
  853.     public function enrollCompanyUpdateAction(Request $requestint $id): JsonResponse|Response {
  854.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$id) {
  855.             $school $this->schoolService->getSchool();
  856.             $datas $request->query->all();
  857.             $phoneNumber "";
  858.             $res = [];
  859.             $err = [];
  860.             $company $this->companyRepository->find($id);
  861.             if (!$company)
  862.                 $company = new Company();
  863.             $actorClass = new ReflectionClass($company);
  864.             //verification de l'indicatif pays
  865.             $selectedCountry null;
  866.             $selectedRegion null;
  867.             if ($datas["selectedCountry"]) {
  868.                 $selectedCountry $this->countryRepository->find($datas["selectedCountry"]);
  869.                 if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  870.                     $selectedRegion $this->regionRepository->find($datas["Region"]);
  871.                 }
  872.                 $company->setCountry($selectedCountry);
  873.             }
  874.             if (!$selectedCountry)
  875.                 return (["", ["erreur serveur de country"]]);
  876.             if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  877.                 if($datas["selectedRegion"]) {
  878.                     $selectedRegion $this->regionRepository->find($datas["selectedRegion"]);
  879.                     $company->setRegion($selectedRegion);
  880.                 }
  881.                 if (!$selectedRegion)
  882.                     return (["", ["erreur serveur de region (country DBTA)"]]);
  883.             } else {
  884.                 $selectedRegion $this->regionRepository->find($datas["Region"]);
  885.                 $company->setRegion($selectedRegion);
  886.             }
  887.             foreach ($datas as $key => $value) {
  888.                 $setProp "set" ucfirst($key);
  889.                 if ($setProp == "setPhoneStandard") {
  890.                     // number phone syntax control
  891.                     $phoneSyntax $this->checkPhoneSyntax($value$selectedCountry$selectedRegion);
  892.                     if ($phoneSyntax == "ok") {
  893.                         $company->$setProp($value);
  894.                         $this->em->persist($company);
  895.                         $res[$key] = $value;
  896.                         $phoneNumber $value;
  897.                     } else {
  898.                         $err[] = "bad_syntax" .  $key " : "  $phoneSyntax;
  899.                     }
  900.                 } else if ($setProp == "setRegion") {
  901.                     $res[$key] = $value;
  902.                     $region $this->regionRepository->find($value);
  903.                     if ($region) {
  904.                         $company->$setProp($region);
  905.                         $this->em->persist($company);
  906.                     } else {
  907.                         $err[] = "No Region found for Id:" $value;
  908.                     }
  909.                 } else if ($setProp == "setCity") {
  910.                     $res[$key] = $value;
  911.                     $city $this->cityRepository->find($value);
  912.                     if ($city) {
  913.                         $company->$setProp($city);
  914.                         $this->em->persist($company);
  915.                     } else {
  916.                         $err[] = "No City found for Id:" $value;
  917.                     }
  918.                 } else if ($setProp == "setSectorArea") {
  919.                     $res[$key] = $value;
  920.                     $sectorArea $this->sectorAreaRepository->find($value);
  921.                     if ($sectorArea) {
  922.                         $company->$setProp($sectorArea);
  923.                         $this->em->persist($company);
  924.                     } else {
  925.                         $err[] = "No SectorArea found for Id:" $value;
  926.                     }
  927.                 } else if ($setProp == "setLegalStatus") {
  928.                     $res[$key] = $value;
  929.                     $legalStatus $this->legalStatusRepository->find($value);
  930.                     if ($legalStatus) {
  931.                         $company->$setProp($legalStatus);
  932.                         $this->em->persist($company);
  933.                     } else {
  934.                         $err[] = "No LegalStatus found for Id:" $value;
  935.                     }
  936.                 } else if ($setProp == "setSelectedCountry") {
  937.                 } else if ($setProp == "setId") {
  938.                 } else {
  939.                     if ($actorClass->hasMethod($setProp)) {
  940.                         $company->$setProp($value);
  941.                         $this->em->persist($company);
  942.                         $res[$key] = $value;
  943.                     } else {
  944.                         $err[] = "Bad property:" $setProp;
  945.                     }
  946.                 }
  947.             }
  948.             if (count($err) == 0) {
  949.                 /* verification si le user existe */
  950.                 /* ------------------------------ */
  951.                 $user $company->getUser();
  952.                 if (!$user) {
  953.                     $resRegister $this->actorRegister("company"$phoneNumber$selectedCountry$selectedRegion);
  954.                     if (count($resRegister[2]) > 0)
  955.                         $err[] = "Erreur User: " $resRegister[2][0];
  956.                     if ($resRegister[1] != "") {
  957.                         $company->setCreatedDate(new DateTime());
  958.                         $company->setUpdatedDate(new DateTime());
  959.                         $company->setUser($resRegister[0]);
  960.                         $company->setTemporaryPasswd($resRegister[1]);
  961.                         $school->addCompany($company);
  962.                         $res = ["id" => $company->getId(), "userId" => $resRegister[0]->getId(), "pwd" => $resRegister[1], "err" => $resRegister[2]];
  963.                     } else {
  964.                         $err[] = "phoneNumber:" $resRegister[1];
  965.                     }
  966.                 }
  967.                 if (count($err) == 0) {
  968.                     $this->em->flush();
  969.                     $res = ["id" => $company->getId(), "userId" => $company->getUser()->getId(), "pwd" => $company->getTemporaryPasswd()];
  970.                 }
  971.             }
  972.             return new JsonResponse([$res$err]);
  973.         });
  974.     }
  975.     #[IsGranted('ROLE_ETABLISSEMENT')]
  976.     #[Route(path'/sendNotificationEnrollmentDegree'name'front_school_send_email_enroll_persondegree'methods: ['POST'])]
  977.     public function sendNotificationEnrollmentDegreeAction(Request $requestTranslatorInterface $trans): JsonResponse|Response {
  978.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$trans) {
  979.             $personDegreeIds $request->get('persondegree_ids');
  980.             $school $this->schoolService->getSchool();
  981.             if (count($personDegreeIds)) {
  982.                 $personDegrees $this->personDegreeRepository->getPersonDegreeWithIds($personDegreeIds);
  983.                 foreach ($personDegrees as $personDegree) {
  984.                     $this->emailService->sendNotificationEnrollmentDegree($personDegree$school);
  985.                 }
  986.                 return new JsonResponse([
  987.                     'status' => 'ok',
  988.                     'message' => $trans->trans('js.emails_sent_successfully')
  989.                 ]);
  990.             }
  991.             return new JsonResponse([
  992.                 'status' => 'nok',
  993.                 'message' => $trans->trans('js.error_while_sending_emails')
  994.             ]);
  995.         });
  996.     }
  997.     #[IsGranted('ROLE_ETABLISSEMENT')]
  998.     #[Route(path'/sendNotificationEnrollmentCompanies'name'front_school_send_email_enroll_companies'methods: ['POST'])]
  999.     public function sendNotificationEnrollmentCompaniesAction(Request $requestTranslatorInterface $trans): JsonResponse|Response {
  1000.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($request$trans) {
  1001.             $companyIds $request->get('company_ids');
  1002.             $school $this->schoolService->getSchool();
  1003.             if (count($companyIds)) {
  1004.                 $companies $this->companyRepository->getCompaniesWithIds($companyIds);
  1005.                 foreach ($companies as $personDegree) {
  1006.                     $this->emailService->sendNotificationEnrollmentCompany($personDegree$school);
  1007.                 }
  1008.                 return new JsonResponse([
  1009.                     'status' => 'ok',
  1010.                     'message' => $trans->trans('js.emails_sent_successfully')
  1011.                 ]);
  1012.             }
  1013.             return new JsonResponse([
  1014.                 'status' => 'nok',
  1015.                 'message' => $trans->trans('js.error_while_sending_emails')
  1016.             ]);
  1017.         });
  1018.     }
  1019.     #[IsGranted('ROLE_ETABLISSEMENT')]
  1020.     #[Route(path'/getSchoolsByCoordinates'name'get_schools_by_coordinates'methods: ['GET'])]
  1021.     public function getSchoolsByCoordinates(Request $request): JsonResponse|Response {
  1022.         $currentLatitude floatval($request->get('latitude'));
  1023.         $currentLongitude floatval($request->get('longitude'));
  1024.         $gap floatval($request->get('gap'));
  1025.         $currentSchool $this->schoolService->getSchool();
  1026.         $currentId $currentSchool->getId();
  1027.         $newLatitude null;
  1028.         $newLongitude null;
  1029.         // recherche en base les coordonnées des établissements de la ville
  1030.         $coordinates $this->schoolRepository->getSchoolsByCityForCoordinates($currentSchool->getCity());
  1031.         foreach ($coordinates as $coordinate) {
  1032.             $schoolId intval($coordinate['id']);
  1033.             $schoolLatitude floatval($coordinate['latitude']);
  1034.             $schoolLongitude floatval($coordinate['longitude']);
  1035.             if($schoolId != $currentId) {
  1036.                 if((($schoolLatitude >= $currentLatitude ) && ($schoolLatitude <= $currentLatitude $gap 10)) &&
  1037.                    (($schoolLongitude >= $currentLongitude ) && ($schoolLongitude <= $currentLongitude $gap 10))) {
  1038.                     if($newLatitude $schoolLatitude$newLatitude $schoolLatitude;
  1039.                     if($newLongitude $schoolLongitude$newLongitude $schoolLongitude;
  1040.                 }
  1041.             }
  1042.         }
  1043.         if(($newLatitude == null) || ($newLongitude == null)) {
  1044.             $newCoordinates = ['latitude'=>$currentLatitude'longitude'=>$currentLongitude];
  1045.         } else {
  1046.             $newLongitude += $gap;
  1047.             $newCoordinates = ['latitude' => $newLatitude'longitude' => $newLongitude];
  1048.         }
  1049.         $result = ['school_id'=> $currentId'coordinates' => $newCoordinates];
  1050.         return new JsonResponse($result);
  1051.     }
  1052.     #[Route(path'/{id}/cityByRegion/'name'front_school_city_by_region'methods: ['GET'])]
  1053.     public function cityByRegionAction(int $id): JsonResponse|Response {
  1054.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($id) {
  1055.             $cities $this->cityRepository->getByRegionId($id);
  1056.             return new JsonResponse($cities);
  1057.         });
  1058.     }
  1059.     #[Route(path'/{id}/activityBySchoolSectorArea/'name'front_school_activity_by_school_sector_area'methods: ['GET'])]
  1060.     public function activityBySchoolSectorArea(int $idActivityRepository $activityRepository): JsonResponse|Response {
  1061.         return $this->schoolService->checkUnCompletedAccountBefore(function () use ($id$activityRepository) {
  1062.             return new JsonResponse($activityRepository->getActivitiesOfSector($id));
  1063.         });
  1064.     }
  1065.      public function checkPhoneSyntax(string $phoneNumberCountry $country, ?Region $region): string {
  1066.          $res "ok";
  1067.          //verification de l'indicatif pays
  1068.          $phoneCode '+' $country->getPhoneCode();
  1069.          //Adaptation DBTA
  1070.          if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  1071.              if ($region) {
  1072.                  $phoneCode '+' $region->getPhoneCode();
  1073.              }
  1074.          }
  1075.          $nationalPhone "";
  1076.          $isValidPhone false;
  1077.          //verification du nombre de digits téléphonique du pays
  1078.          $phoneDigit '+' $country->getPhoneDigit();
  1079.          if($_ENV['STRUCT_PROVINCE_COUNTRY_CITY']=="true") {
  1080.              if ($region) {
  1081.                  $phoneDigit '+' $region->getPhoneDigit();
  1082.              }
  1083.          }
  1084.          if (strncmp($phoneCode$phoneNumberstrlen($phoneCode)) === 0) {
  1085.              $nationalPhone substr($phoneNumberstrlen($phoneCode));
  1086.              $isValidPhone true;
  1087.          } else {
  1088.              // $res = "Le numéro doit commencer par " . $phoneCode . "\n";
  1089.              $res $this->translator->trans("menu.number_must_begin_by") . " " $phoneCode "(" $phoneNumber ")""\n";
  1090.          }
  1091.          if ($isValidPhone == true && strlen($nationalPhone) > 0) {
  1092.              // suppression du 0 pour le national
  1093.              if ($nationalPhone[0] == '0') {
  1094.                  $nationalPhone substr($nationalPhone1);
  1095.              }
  1096.              // reconstruit le numéro de téléphone sans le 0 national
  1097.              $validPhone $phoneCode $nationalPhone;
  1098.              if ($validPhone !== $phoneNumber) {
  1099.                  $res $this->translator->trans("menu.suggestion_for_the_number") . " " $validPhone;
  1100.              }
  1101.          }
  1102.          // vérification de la conformité du numéro de téléphone
  1103.          if ($isValidPhone == true) {
  1104.              if (strlen($nationalPhone) != $phoneDigit) {
  1105.                  $isValidPhone false;
  1106.                  $res $this->translator->trans("menu.the_number_without_the_country_code_must_have") . " " . (int)$phoneDigit " chiffres";
  1107.              }
  1108.              if (!ctype_digit($nationalPhone)) {
  1109.                  $res $this->translator->trans("menu.wrong_phone_number_syntax");
  1110.              }
  1111.          }
  1112.          return ($res);
  1113.      }
  1114.     public function actorRegister(string $typePersonstring $phoneNumberCountry $countryRegion $region): array {
  1115.         $existUser $this->userRepository->findOneByPhone($phoneNumber);
  1116.         $user = new User();
  1117.         $err = [];
  1118.         //Création du mot de passe temporaire
  1119.         $comb 'abcdefghijklmnopqrstuvwxyz1234567890';
  1120.         $password "";
  1121.         $combLen strlen($comb) - 1;
  1122.         for ($i 0$i 6$i++) {
  1123.             $n rand(0$combLen);
  1124.             $password .= $comb[$n];
  1125.         }
  1126.          // Mise a jour du Role
  1127.          if (!$existUser) {
  1128.              switch ($typePerson) {
  1129.                  case "company":
  1130.                      {
  1131.                          $role $this->roleRepository->findOneBy(["role" => "ROLE_ENTREPRISE"]);
  1132.                          $user->addProfil($role);
  1133.                      }
  1134.                      break;
  1135.                  case "personDegree":
  1136.                      {
  1137.                          $role $this->roleRepository->findOneBy(["role" => "ROLE_DIPLOME"]);
  1138.                          $user->addProfil($role);
  1139.                      }
  1140.                      break;
  1141.                  default:
  1142.                      throw new NotFoundHttpException($this->translator->trans('flashbag.unable_to_create_an_account'));
  1143.              }
  1144.              // Supprime les espaces du numéro de téléphone
  1145.              $user->setPhone(preg_replace('/\s/'''$phoneNumber));
  1146.              // Encode le password
  1147.              $user->setPassword($this->hasher->hashPassword($user$password));
  1148.              // synchronise le username avec le phone
  1149.              $user->setUsername($phoneNumber);
  1150.              // créé l'adresse mail fictive
  1151.              $user->setEmail($phoneNumber "@domaine.extension");
  1152.              $user->setCountry($country);
  1153.              //adaptation DBTA
  1154.              if($region){
  1155.                  $user->setRegion($region);
  1156.              }
  1157.              // Persistance en base
  1158.              $this->em->persist($user);
  1159.          } else {
  1160.              $err[] = $this->translator->trans('flashbag.this_phone_number_is_already_in_use');
  1161.          }
  1162.          return ([$user$password$err]);
  1163.     }
  1164.     #[Route(path'/changePersonDegreePhoneMobile1'name'change_person_degree_phonemobile1'methods: ['GET'])]
  1165.     public function changePersonDegreePhoneMobile1(Request$request): JsonResponse|Response {
  1166.         $personDegreeId $request->query->get('id');
  1167.         $newPhoneMobile1 $request->query->get('phoneMobile1');
  1168.         $result "";
  1169.         if((!$this->userRepository->findByPhone($newPhoneMobile1))&&
  1170.             (!$this->personDegreeRepository->findByPhoneMobile1($newPhoneMobile1))) {
  1171.             $personDegree $this->personDegreeRepository->find($personDegreeId);
  1172.             if($personDegree) {
  1173.                 $user $this->userRepository->find($personDegree->getUser()->getId());
  1174.                 $user->setPhone($newPhoneMobile1);
  1175.                 $user->setUsername($newPhoneMobile1);
  1176.                 $user->setUsernameCanonical($newPhoneMobile1);
  1177.                 $this->em->persist($user);
  1178.                 $personDegree->setPhoneMobile1($newPhoneMobile1);
  1179.                 $this->em->persist($personDegree);
  1180.                 $this->em->flush();
  1181.                 $result 'OK';
  1182.             }
  1183.         } else {
  1184.             $result 'N° de téléphone déjà utilisé';
  1185.         }
  1186.         return new JsonResponse($result);
  1187.     }
  1188.     #[Route(path'/changePersonDegreeEmail'name'change_person_degree_email'methods: ['GET'])]
  1189.     public function changePersonDegreeEmail(Request$request): JsonResponse|Response {
  1190.         $personDegreeId $request->query->get('id');
  1191.         $newEmail $request->query->get('email');
  1192.         $result "";
  1193.         if((!$this->userRepository->findByEmail($newEmail))&&
  1194.            (!$this->personDegreeRepository->findByEmail($newEmail))) {
  1195.                $personDegree $this->personDegreeRepository->find($personDegreeId);
  1196.                if($personDegree) {
  1197.                    $user $this->userRepository->find($personDegree->getUser()->getId());
  1198.                    $user->setEmail($newEmail);
  1199.                    $this->em->persist($user);
  1200.                    $personDegree->setEmail($newEmail);
  1201.                    $this->em->persist($personDegree);
  1202.                    $this->em->flush();
  1203.                    $result 'OK';
  1204.                }
  1205.         } else {
  1206.             $result 'Email déjà utilisé';
  1207.         }
  1208.         return new JsonResponse($result);
  1209.     }
  1210.     #[Route(path'/changePersonDegreeType'name'change_person_degree_type'methods: ['GET'])]
  1211.     public function changePersonDegreeType(Request$request): JsonResponse|Response {
  1212.         $personDegreeId $request->query->get('id');
  1213.         $newType $request->query->get('type');
  1214.         $month $request->query->get('month');
  1215.         $year $request->query->get('year');
  1216.         $result "";
  1217.         $personDegree $this->personDegreeRepository->find($personDegreeId);
  1218.         if($personDegree) {
  1219.             $personDegree->setType($newType);
  1220.             if($month$personDegree->setLastDegreeMonth(intval($month));
  1221.             if($year$personDegree->setLastDegreeYear(intval($year));
  1222.             $this->em->persist($personDegree);
  1223.             $this->em->flush();
  1224.             $result 'OK';
  1225.         } else {
  1226.             $result 'js.unknown_error_server';
  1227.         }
  1228.         return new JsonResponse($result);
  1229.     }
  1230. }