src/Controller/Bo/CompanyController.php line 102

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Bo;
  3. use App\Entity\ClaimingRequest;
  4. use App\Entity\Club;
  5. use App\Entity\ClubManager;
  6. use App\Entity\Collaborator;
  7. use App\Entity\Company;
  8. use App\Entity\Keyword;
  9. use App\Entity\Membership;
  10. use App\Entity\User;
  11. use App\Form\Bo\AddCollaboratorType;
  12. use App\Form\Bo\AddNewUserCollaboratorType;
  13. use App\Form\Bo\AddUserCollaboratorType;
  14. use App\Form\Bo\ClaimingRequestFormType;
  15. use App\Form\Bo\CompanyType;
  16. use App\Form\Bo\MembershipType;
  17. use App\Form\Bo\NewCompanyType;
  18. use App\Form\EditRoleCollaboratorType;
  19. use App\Repository\CollaboratorRepository;
  20. use App\Repository\CompanyRepository;
  21. use App\Repository\DealRepository;
  22. use App\Repository\KeywordRepository;
  23. use App\Repository\MembershipRepository;
  24. use App\Repository\UserRepository;
  25. use App\Service\ClubHandler;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  28. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Symfony\Component\String\Slugger\SluggerInterface;
  34. #[Route('/bo/company'name'bo_company_')]
  35. class CompanyController extends AbstractController
  36. {
  37.     public function __construct(
  38.         private readonly EntityManagerInterface      $em,
  39.         private readonly ClubHandler                 $clubHandler,
  40.         private readonly UserPasswordHasherInterface $passwordHasher,
  41.         private readonly SluggerInterface            $slugger,
  42.     )
  43.     {
  44.     }
  45.     #[Route('/'name'index')]
  46.     public function index(Request $requestCollaboratorRepository $collaboratorRepository): Response
  47.     {
  48.         $club $this->clubHandler->getCurrentBoClub();
  49.         $company = new Company();
  50.         $form $this->createForm(NewCompanyType::class, $company);
  51.         $form->handleRequest($request);
  52.         if ($form->isSubmitted() && $form->isValid()) {
  53.             $this->em->persist($company);
  54.             $membership = new Membership();
  55.             $membership->setCompany($company);
  56.             $membership->setClub($club);
  57.             $membership->setStatus(Membership::STATUS_ACTIVE);
  58.             $this->em->persist($membership);
  59.             $this->em->flush();
  60.             return $this->redirectToRoute('bo_company_show', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  61.         }
  62.         $status = [Company::STATUS_NEW,Company::STATUS_CLAIMED,Company::STATUS_VALIDATED];
  63.         if ($request->query->get('q') && in_array($request->query->get('q'), $statustrue)) {
  64.             $companies $this->em->getRepository(Company::class)->getCompaniesFromClubForBo($club,$request->query->get('q') );
  65.         } else {
  66.             $companies $this->em->getRepository(Company::class)->getCompaniesFromClubForBo($club);
  67.         }
  68.         return $this->render('bo/company/index.html.twig', [
  69.             'club' => $club,
  70.             'companies' => $companies,
  71.             'form' => $form->createView(),
  72.         ]);
  73.     }
  74.     #[Route('/{id}/edit'name'edit'methods: ['GET''POST'])]
  75.     public function edit(Request $requestCompany $companyCompanyRepository $companyRepository): Response
  76.     {
  77.         $form $this->createForm(CompanyType::class, $company);
  78.         $form->handleRequest($request);
  79.         if ($form->isSubmitted() && $form->isValid()) {
  80.             $companyRepository->save($companytrue);
  81.             return $this->redirectToRoute('bo_company_show', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  82.         }
  83.         return $this->renderForm('bo/company/edit.html.twig', [
  84.             'company' => $company,
  85.             'form' => $form,
  86.         ]);
  87.     }
  88.     #[Route('/{id}/gallery'name'gallery'methods: ['GET''POST'])]
  89.     public function gallery(Company $company): Response
  90.     {
  91.         return $this->render('bo/company/gallery.html.twig', [
  92.             'company' => $company,
  93.         ]);
  94.     }
  95.     #[Route('/{id}/collaborators'name'collaborators')]
  96.     public function collaborators(Request $requestCompany $companyCollaboratorRepository $collaboratorRepository): Response
  97.     {
  98.         $collaborator = new Collaborator();
  99.         $form $this->createForm(AddNewUserCollaboratorType::class, $collaborator);
  100.         $form->handleRequest($request);
  101.         $addUserCollaborator = new Collaborator();
  102.         $addUserCollaboratorform $this->createForm(AddUserCollaboratorType::class, $addUserCollaborator);
  103.         $addUserCollaboratorform->handleRequest($request);
  104.         if ($addUserCollaboratorform->isSubmitted() && $addUserCollaboratorform->isValid()) {
  105.             $addUserCollaborator->setCompany($company);
  106.             $collaboratorRepository->save($addUserCollaboratortrue);
  107.             return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  108.         }
  109.         if ($form->isSubmitted() && $form->isValid()) {
  110.             $user $form->getData()->getUser();
  111.             $hashedPassword $this->passwordHasher->hashPassword($user$user->getPassword());
  112.             $form->getData()->getUser()->setPassword($hashedPassword);
  113.             $form->getData()->setCompany($company);
  114.             $collaboratorRepository->save($form->getData(), true);
  115.             return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  116.         }
  117.         return $this->renderForm('bo/company/collaborators.html.twig', [
  118.             'company' => $company,
  119.             'form' => $form,
  120.             'addUserForm' => $addUserCollaboratorform,
  121.         ]);
  122.     }
  123.     #[Route('/{id}/collaborator/{collaboratorId}/edit'name'edit_collaborator')]
  124.     #[ParamConverter('collaborator'options: ['mapping' => ['collaboratorId' => 'id']])]
  125.     public function editCollaborator(Request $requestCompany $companyCollaboratorRepository $collaboratorRepositoryCollaborator $collaborator): Response
  126.     {
  127.         $form $this->createForm(EditRoleCollaboratorType::class, $collaborator);
  128.         $form->handleRequest($request);
  129.         if ($form->isSubmitted() && $form->isValid()) {
  130.             $collaboratorRepository->save($form->getData(), true);
  131.             return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  132.         }
  133.         return $this->renderForm('bo/company/edit_collaborator.html.twig', [
  134.             'company' => $company,
  135.             'form' => $form,
  136.         ]);
  137.     }
  138.     #[Route('/{companyId}/fetch-for-select2-collaborators'name'fetch_for_select2_collaborators'options: ['expose' => true])]
  139.     #[ParamConverter('company'options: ['mapping' => ['companyId' => 'id']])]
  140.     public function fetchForSelect2Collaborators(Request $requestCompany $companyUserRepository $userRepository): Response
  141.     {
  142.         $keyword $request->query->get('q');
  143.         $companyUsers = [];
  144.         foreach ($company->getCollaborators()->getValues() as $collaborator) {
  145.             $companyUsers[] = $collaborator->getUser();
  146.         }
  147.         $users array_diff($userRepository->findByMailNameFirstname($keyword), $companyUsers);
  148.         $data = [];
  149.         foreach ($users as $user) {
  150.             $data[] = [
  151.                 'id' => $user->getId(),
  152.                 'text' => $user->getFullName() . " (" $user->getEmail() . ")",
  153.             ];
  154.         }
  155.         return $this->json([
  156.             'data' => $data,
  157.         ]);
  158.     }
  159.     #[Route('/{id}/membership'name'membership')]
  160.     public function membership(Request $requestCompany $companyMembershipRepository $membershipRepository): Response
  161.     {
  162.         $club $this->clubHandler->getCurrentBoClub();
  163.         $membership $this->em->getRepository(Membership::class)->findOneBy([
  164.             'club' => $club,
  165.             'company' => $company,
  166.         ]);
  167.         $form $this->createForm(MembershipType::class, $membership);
  168.         $form->handleRequest($request);
  169.         if ($form->isSubmitted() && $form->isValid()) {
  170.             $membershipRepository->save($membershiptrue);
  171.             return $this->redirectToRoute('bo_company_membership', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  172.         }
  173.         return $this->renderForm('bo/company/membership.html.twig', [
  174.             'company' => $company,
  175.             'membership' => $membership,
  176.             'form' => $form,
  177.         ]);
  178.     }
  179.     #[Route('/{id}/ownership'name'ownership')]
  180.     public function ownership(Company $companyRequest $requestUserRepository $userRepository): Response
  181.     {
  182.         $club $this->clubHandler->getCurrentBoClub();
  183.         $claimingRequest = new ClaimingRequest();
  184.         $form $this->createForm(ClaimingRequestFormType::class, $claimingRequest);
  185.         $form->handleRequest($request);
  186.         if ($form->isSubmitted() && $form->isValid()) {
  187.             $claimingRequest->setCompany($company);
  188.             $claimingRequest->setUpdatedAt(new \DateTime());
  189.             $claimingRequest->setCreatedAt(new \DateTime());
  190.             $this->em->persist($claimingRequest);
  191.             $this->em->flush();
  192.             return $this->redirectToRoute('bo_company_ownership', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
  193.         }
  194.         return $this->renderForm('bo/company/ownership.html.twig', [
  195.             'company' => $company,
  196.             'club' => $club,
  197.             'form' => $form
  198.         ]);
  199.     }
  200.     #[Route('/{id}/fetch-ownership'name'fetch_ownership'options: ['expose' => true])]
  201.     public function fetchOwnership(UserRepository $userRepositoryRequest $request): Response
  202.     {
  203.         $users $userRepository->findByMailNameFirstname($request->query->get('q'));
  204.         $data = [];
  205.         foreach ($users as $user) {
  206.             $data[] = [
  207.                 'id' => $user->getId(),
  208.                 'text' => $user->getFullName() . " " $user->getEmail()
  209.             ];
  210.         }
  211.         return $this->json([
  212.             'data' => $data
  213.         ]);
  214.     }
  215.     #[Route('/{id}/delete'name'delete'options: ['expose' => true], methods: ['POST'])]
  216.     public function delete(Company $companyMembershipRepository $membershipRepository): Response
  217.     {
  218.         $club $this->clubHandler->getCurrentBoClub();
  219.         $membership $membershipRepository->findOneBy(['club' => $club'company' => $company]);
  220.         if ($membership) {
  221.             $membershipRepository->remove($membershiptrue);
  222.             return $this->json([
  223.                 'success' => true,
  224.             ]);
  225.         }
  226.         return $this->json([
  227.             'success' => false,
  228.         ]);
  229.     }
  230.     #[Route('/fetch-for-select2'name'fetch_for_select2'options: ['expose' => true])]
  231.     public function fetchForSelect2(Request $requestCompanyRepository $companyRepository): Response
  232.     {
  233.         $keyword $request->query->get('q');
  234.         $companies $companyRepository->findByFti($keyword);
  235.         $data = [];
  236.         foreach ($companies as $company) {
  237.             $data[] = [
  238.                 'id' => $company->getId(),
  239.                 'text' => $company->getName(),
  240.             ];
  241.         }
  242.         return $this->json([
  243.             'data' => $data,
  244.         ]);
  245.     }
  246.     #[Route('/fetch-for-select2-data-company'name'fetch_for_select2_data_company'options: ['expose' => true])]
  247.     public function fetchForSelect2DataCompany(Request $requestCompanyRepository $companyRepository): Response
  248.     {
  249.         $club $this->clubHandler->getCurrentBoClub();
  250.         $keyword $request->query->get('q');
  251.         $companies $companyRepository->findAllByFti($keyword$club);
  252.         $data = [];
  253.         foreach ($companies as $company) {
  254.             $data[] = [
  255.                 'id' => $company->getId(),
  256.                 'text' => $company->getName(),
  257.             ];
  258.         }
  259.         return $this->json([
  260.             'data' => $data,
  261.         ]);
  262.     }
  263.     #[Route('/fetch-for-select2-data-user'name'fetch_for_select2_data_user'options: ['expose' => true])]
  264.     public function fetchForSelect2DataUser(Request $requestUserRepository $userRepository): Response
  265.     {
  266.         $club $this->clubHandler->getCurrentBoClub();
  267.         $keyword $request->query->get('q');
  268.         $users $userRepository->findByMailNameFirstname($keyword$club);
  269.         $data = [];
  270.         foreach ($users as $user) {
  271.             $data[] = [
  272.                 'id' => $user->getId(),
  273.                 'text' => $user->getFullName() . " (" $user->getEmail() . ")",
  274.             ];
  275.         }
  276.         return $this->json([
  277.             'data' => $data,
  278.         ]);
  279.     }
  280.     #[Route('/fetch-for-select2-data-admin'name'fetch_for_select2_data_admin'options: ['expose' => true])]
  281.     public function fetchForSelect2DataAdmin(Request $requestUserRepository $userRepository): Response
  282.     {
  283.         $club $this->clubHandler->getCurrentBoClub();
  284.         $keyword $request->query->get('q');
  285.         $users $userRepository->findAllByClub($club$keyword);
  286.         $clubManagers $this->em->getRepository(ClubManager::class)->findBy(['club' => $club]);
  287.         $notManagerUsers array_diff($usersarray_map(fn($cm) => $cm->getUser(), $clubManagers));
  288.         $data = [];
  289.         foreach ($notManagerUsers as $user) {
  290.             $data[] = [
  291.                 'id' => $user->getId(),
  292.                 'text' => $user->getFullName() . " (" $user->getEmail() . ")",
  293.             ];
  294.         }
  295.         return $this->json([
  296.             'data' => $data,
  297.         ]);
  298.     }
  299.     #[Route('/{id}/add-membership/{clubId}'name'add_membership'options: ['expose' => true])]
  300.     #[ParamConverter('club'options: ['mapping' => ['clubId' => 'id']])]
  301.     public function addMembership(Company $companyClub $club): Response
  302.     {
  303.         $membership = new Membership();
  304.         $membership->setCompany($company);
  305.         $membership->setClub($club);
  306.         $membership->setStatus(Membership::STATUS_ACTIVE);
  307.         $this->em->persist($membership);
  308.         $this->em->flush();
  309.         return $this->json([
  310.             'success' => true,
  311.         ]);
  312.     }
  313.     #[Route('/{id}/keywords'name'keywords')]
  314.     public function keywords(Company $company): Response
  315.     {
  316.         return $this->renderForm('bo/company/keywords.html.twig', [
  317.             'company' => $company,
  318.         ]);
  319.     }
  320.     #[Route('/{id}/get-keywords'name'get_keywords'options: ['expose' => true])]
  321.     public function getKeywords(Company $company): Response
  322.     {
  323.         $keywords $company->getKeywords();
  324.         return $this->json([
  325.             'data' => $keywords,
  326.         ]);
  327.     }
  328.     #[Route('/{id}/delete-keywords-association/{companyId}'name'delete_keyword_association'options: ['expose' => true])]
  329.     #[ParamConverter('company'options: ['mapping' => ['companyId' => 'id']])]
  330.     public function deleteKeywordAssociation(Keyword $keywordCompany $company): Response
  331.     {
  332.         $company->removeKeyword($keyword);
  333.         $this->em->persist($company);
  334.         $this->em->flush();
  335.         return $this->json([
  336.             'success' => true,
  337.         ]);
  338.     }
  339.     #[Route('/fetch-for-select2-data-keyword'name'fetch_for_select2_data_keyword'options: ['expose' => true])]
  340.     public function fetchForSelect2DataKeyword(Request $requestKeywordRepository $keywordRepository): Response
  341.     {
  342.         $keyword $request->query->get('q');
  343.         $keywords $keywordRepository->findByKeywordName($keyword);
  344.         $data = [];
  345.         foreach ($keywords as $keyword) {
  346.             $data[] = [
  347.                 'id' => $keyword->getId(),
  348.                 'text' => str_replace('-'' 'ucfirst($keyword->getName())),
  349.             ];
  350.         }
  351.         return $this->json([
  352.             'data' => $data,
  353.         ]);
  354.     }
  355.     #[Route('/add-keyword/{companyId}'name'add_keyword'options: ['expose' => true])]
  356.     #[ParamConverter('company'options: ['mapping' => ['companyId' => 'id']])]
  357.     public function addKeyword(Company $companyKeywordRepository $keywordRepositoryRequest $request): Response
  358.     {
  359.         $data $request->getContent();
  360.         if (is_numeric($data)) {
  361.             $keyword $keywordRepository->find($data);
  362.             $company->addKeyword($keyword);
  363.             $this->em->persist($company);
  364.         } else {
  365.             if ($keywordRepository->findOneBy(['name' => $data]) !== null) {
  366.                 $keyword $keywordRepository->findOneBy(['name' => $data]);
  367.                 $company->addKeyword($keyword);
  368.                 $this->em->persist($company);
  369.             } else {
  370.                 $keyword = new Keyword();
  371.                 $keyword->setName($this->slugger->slug($data)->lower()->toString());
  372.                 $company->addKeyword($keyword);
  373.                 $this->em->persist($company);
  374.             }
  375.         }
  376.         $this->em->flush();
  377.         return $this->json([
  378.             'success' => true,
  379.         ]);
  380.     }
  381.     #[Route('/{id}'name'show')]
  382.     public function show(Company $company): Response
  383.     {
  384.         $club $this->clubHandler->getCurrentBoClub();
  385.         $membership $this->em->getRepository(Membership::class)->findOneBy([
  386.             'club' => $club,
  387.             'company' => $company,
  388.         ]);
  389.         return $this->render('bo/company/show.html.twig', [
  390.             'company' => $company,
  391.             'membership' => $membership,
  392.         ]);
  393.     }
  394.     #[Route('/{id}/deals'name'deals')]
  395.     public function deals(Company $companyDealRepository $dealRepository): Response
  396.     {
  397.         $deals $dealRepository->findBy(['company' => $company->getId()]);
  398.         return $this->render('bo/company/deals.html.twig', [
  399.             'company' => $company,
  400.             'deals' => $deals
  401.         ]);
  402.     }
  403. }