<?php
namespace App\Controller\Bo;
use App\Entity\ClaimingRequest;
use App\Entity\Club;
use App\Entity\ClubManager;
use App\Entity\Collaborator;
use App\Entity\Company;
use App\Entity\Keyword;
use App\Entity\Membership;
use App\Entity\User;
use App\Form\Bo\AddCollaboratorType;
use App\Form\Bo\AddNewUserCollaboratorType;
use App\Form\Bo\AddUserCollaboratorType;
use App\Form\Bo\ClaimingRequestFormType;
use App\Form\Bo\CompanyType;
use App\Form\Bo\MembershipType;
use App\Form\Bo\NewCompanyType;
use App\Form\EditRoleCollaboratorType;
use App\Repository\CollaboratorRepository;
use App\Repository\CompanyRepository;
use App\Repository\DealRepository;
use App\Repository\KeywordRepository;
use App\Repository\MembershipRepository;
use App\Repository\UserRepository;
use App\Service\ClubHandler;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
#[Route('/bo/company', name: 'bo_company_')]
class CompanyController extends AbstractController
{
public function __construct(
private readonly EntityManagerInterface $em,
private readonly ClubHandler $clubHandler,
private readonly UserPasswordHasherInterface $passwordHasher,
private readonly SluggerInterface $slugger,
)
{
}
#[Route('/', name: 'index')]
public function index(Request $request, CollaboratorRepository $collaboratorRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$company = new Company();
$form = $this->createForm(NewCompanyType::class, $company);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->em->persist($company);
$membership = new Membership();
$membership->setCompany($company);
$membership->setClub($club);
$membership->setStatus(Membership::STATUS_ACTIVE);
$this->em->persist($membership);
$this->em->flush();
return $this->redirectToRoute('bo_company_show', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
$status = [Company::STATUS_NEW,Company::STATUS_CLAIMED,Company::STATUS_VALIDATED];
if ($request->query->get('q') && in_array($request->query->get('q'), $status, true)) {
$companies = $this->em->getRepository(Company::class)->getCompaniesFromClubForBo($club,$request->query->get('q') );
} else {
$companies = $this->em->getRepository(Company::class)->getCompaniesFromClubForBo($club);
}
return $this->render('bo/company/index.html.twig', [
'club' => $club,
'companies' => $companies,
'form' => $form->createView(),
]);
}
#[Route('/{id}/edit', name: 'edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Company $company, CompanyRepository $companyRepository): Response
{
$form = $this->createForm(CompanyType::class, $company);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$companyRepository->save($company, true);
return $this->redirectToRoute('bo_company_show', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('bo/company/edit.html.twig', [
'company' => $company,
'form' => $form,
]);
}
#[Route('/{id}/gallery', name: 'gallery', methods: ['GET', 'POST'])]
public function gallery(Company $company): Response
{
return $this->render('bo/company/gallery.html.twig', [
'company' => $company,
]);
}
#[Route('/{id}/collaborators', name: 'collaborators')]
public function collaborators(Request $request, Company $company, CollaboratorRepository $collaboratorRepository): Response
{
$collaborator = new Collaborator();
$form = $this->createForm(AddNewUserCollaboratorType::class, $collaborator);
$form->handleRequest($request);
$addUserCollaborator = new Collaborator();
$addUserCollaboratorform = $this->createForm(AddUserCollaboratorType::class, $addUserCollaborator);
$addUserCollaboratorform->handleRequest($request);
if ($addUserCollaboratorform->isSubmitted() && $addUserCollaboratorform->isValid()) {
$addUserCollaborator->setCompany($company);
$collaboratorRepository->save($addUserCollaborator, true);
return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData()->getUser();
$hashedPassword = $this->passwordHasher->hashPassword($user, $user->getPassword());
$form->getData()->getUser()->setPassword($hashedPassword);
$form->getData()->setCompany($company);
$collaboratorRepository->save($form->getData(), true);
return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('bo/company/collaborators.html.twig', [
'company' => $company,
'form' => $form,
'addUserForm' => $addUserCollaboratorform,
]);
}
#[Route('/{id}/collaborator/{collaboratorId}/edit', name: 'edit_collaborator')]
#[ParamConverter('collaborator', options: ['mapping' => ['collaboratorId' => 'id']])]
public function editCollaborator(Request $request, Company $company, CollaboratorRepository $collaboratorRepository, Collaborator $collaborator): Response
{
$form = $this->createForm(EditRoleCollaboratorType::class, $collaborator);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$collaboratorRepository->save($form->getData(), true);
return $this->redirectToRoute('bo_company_collaborators', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('bo/company/edit_collaborator.html.twig', [
'company' => $company,
'form' => $form,
]);
}
#[Route('/{companyId}/fetch-for-select2-collaborators', name: 'fetch_for_select2_collaborators', options: ['expose' => true])]
#[ParamConverter('company', options: ['mapping' => ['companyId' => 'id']])]
public function fetchForSelect2Collaborators(Request $request, Company $company, UserRepository $userRepository): Response
{
$keyword = $request->query->get('q');
$companyUsers = [];
foreach ($company->getCollaborators()->getValues() as $collaborator) {
$companyUsers[] = $collaborator->getUser();
}
$users = array_diff($userRepository->findByMailNameFirstname($keyword), $companyUsers);
$data = [];
foreach ($users as $user) {
$data[] = [
'id' => $user->getId(),
'text' => $user->getFullName() . " (" . $user->getEmail() . ")",
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/{id}/membership', name: 'membership')]
public function membership(Request $request, Company $company, MembershipRepository $membershipRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$membership = $this->em->getRepository(Membership::class)->findOneBy([
'club' => $club,
'company' => $company,
]);
$form = $this->createForm(MembershipType::class, $membership);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$membershipRepository->save($membership, true);
return $this->redirectToRoute('bo_company_membership', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('bo/company/membership.html.twig', [
'company' => $company,
'membership' => $membership,
'form' => $form,
]);
}
#[Route('/{id}/ownership', name: 'ownership')]
public function ownership(Company $company, Request $request, UserRepository $userRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$claimingRequest = new ClaimingRequest();
$form = $this->createForm(ClaimingRequestFormType::class, $claimingRequest);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$claimingRequest->setCompany($company);
$claimingRequest->setUpdatedAt(new \DateTime());
$claimingRequest->setCreatedAt(new \DateTime());
$this->em->persist($claimingRequest);
$this->em->flush();
return $this->redirectToRoute('bo_company_ownership', ['id' => $company->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('bo/company/ownership.html.twig', [
'company' => $company,
'club' => $club,
'form' => $form
]);
}
#[Route('/{id}/fetch-ownership', name: 'fetch_ownership', options: ['expose' => true])]
public function fetchOwnership(UserRepository $userRepository, Request $request): Response
{
$users = $userRepository->findByMailNameFirstname($request->query->get('q'));
$data = [];
foreach ($users as $user) {
$data[] = [
'id' => $user->getId(),
'text' => $user->getFullName() . " " . $user->getEmail()
];
}
return $this->json([
'data' => $data
]);
}
#[Route('/{id}/delete', name: 'delete', options: ['expose' => true], methods: ['POST'])]
public function delete(Company $company, MembershipRepository $membershipRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$membership = $membershipRepository->findOneBy(['club' => $club, 'company' => $company]);
if ($membership) {
$membershipRepository->remove($membership, true);
return $this->json([
'success' => true,
]);
}
return $this->json([
'success' => false,
]);
}
#[Route('/fetch-for-select2', name: 'fetch_for_select2', options: ['expose' => true])]
public function fetchForSelect2(Request $request, CompanyRepository $companyRepository): Response
{
$keyword = $request->query->get('q');
$companies = $companyRepository->findByFti($keyword);
$data = [];
foreach ($companies as $company) {
$data[] = [
'id' => $company->getId(),
'text' => $company->getName(),
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/fetch-for-select2-data-company', name: 'fetch_for_select2_data_company', options: ['expose' => true])]
public function fetchForSelect2DataCompany(Request $request, CompanyRepository $companyRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$keyword = $request->query->get('q');
$companies = $companyRepository->findAllByFti($keyword, $club);
$data = [];
foreach ($companies as $company) {
$data[] = [
'id' => $company->getId(),
'text' => $company->getName(),
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/fetch-for-select2-data-user', name: 'fetch_for_select2_data_user', options: ['expose' => true])]
public function fetchForSelect2DataUser(Request $request, UserRepository $userRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$keyword = $request->query->get('q');
$users = $userRepository->findByMailNameFirstname($keyword, $club);
$data = [];
foreach ($users as $user) {
$data[] = [
'id' => $user->getId(),
'text' => $user->getFullName() . " (" . $user->getEmail() . ")",
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/fetch-for-select2-data-admin', name: 'fetch_for_select2_data_admin', options: ['expose' => true])]
public function fetchForSelect2DataAdmin(Request $request, UserRepository $userRepository): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$keyword = $request->query->get('q');
$users = $userRepository->findAllByClub($club, $keyword);
$clubManagers = $this->em->getRepository(ClubManager::class)->findBy(['club' => $club]);
$notManagerUsers = array_diff($users, array_map(fn($cm) => $cm->getUser(), $clubManagers));
$data = [];
foreach ($notManagerUsers as $user) {
$data[] = [
'id' => $user->getId(),
'text' => $user->getFullName() . " (" . $user->getEmail() . ")",
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/{id}/add-membership/{clubId}', name: 'add_membership', options: ['expose' => true])]
#[ParamConverter('club', options: ['mapping' => ['clubId' => 'id']])]
public function addMembership(Company $company, Club $club): Response
{
$membership = new Membership();
$membership->setCompany($company);
$membership->setClub($club);
$membership->setStatus(Membership::STATUS_ACTIVE);
$this->em->persist($membership);
$this->em->flush();
return $this->json([
'success' => true,
]);
}
#[Route('/{id}/keywords', name: 'keywords')]
public function keywords(Company $company): Response
{
return $this->renderForm('bo/company/keywords.html.twig', [
'company' => $company,
]);
}
#[Route('/{id}/get-keywords', name: 'get_keywords', options: ['expose' => true])]
public function getKeywords(Company $company): Response
{
$keywords = $company->getKeywords();
return $this->json([
'data' => $keywords,
]);
}
#[Route('/{id}/delete-keywords-association/{companyId}', name: 'delete_keyword_association', options: ['expose' => true])]
#[ParamConverter('company', options: ['mapping' => ['companyId' => 'id']])]
public function deleteKeywordAssociation(Keyword $keyword, Company $company): Response
{
$company->removeKeyword($keyword);
$this->em->persist($company);
$this->em->flush();
return $this->json([
'success' => true,
]);
}
#[Route('/fetch-for-select2-data-keyword', name: 'fetch_for_select2_data_keyword', options: ['expose' => true])]
public function fetchForSelect2DataKeyword(Request $request, KeywordRepository $keywordRepository): Response
{
$keyword = $request->query->get('q');
$keywords = $keywordRepository->findByKeywordName($keyword);
$data = [];
foreach ($keywords as $keyword) {
$data[] = [
'id' => $keyword->getId(),
'text' => str_replace('-', ' ', ucfirst($keyword->getName())),
];
}
return $this->json([
'data' => $data,
]);
}
#[Route('/add-keyword/{companyId}', name: 'add_keyword', options: ['expose' => true])]
#[ParamConverter('company', options: ['mapping' => ['companyId' => 'id']])]
public function addKeyword(Company $company, KeywordRepository $keywordRepository, Request $request): Response
{
$data = $request->getContent();
if (is_numeric($data)) {
$keyword = $keywordRepository->find($data);
$company->addKeyword($keyword);
$this->em->persist($company);
} else {
if ($keywordRepository->findOneBy(['name' => $data]) !== null) {
$keyword = $keywordRepository->findOneBy(['name' => $data]);
$company->addKeyword($keyword);
$this->em->persist($company);
} else {
$keyword = new Keyword();
$keyword->setName($this->slugger->slug($data)->lower()->toString());
$company->addKeyword($keyword);
$this->em->persist($company);
}
}
$this->em->flush();
return $this->json([
'success' => true,
]);
}
#[Route('/{id}', name: 'show')]
public function show(Company $company): Response
{
$club = $this->clubHandler->getCurrentBoClub();
$membership = $this->em->getRepository(Membership::class)->findOneBy([
'club' => $club,
'company' => $company,
]);
return $this->render('bo/company/show.html.twig', [
'company' => $company,
'membership' => $membership,
]);
}
#[Route('/{id}/deals', name: 'deals')]
public function deals(Company $company, DealRepository $dealRepository): Response
{
$deals = $dealRepository->findBy(['company' => $company->getId()]);
return $this->render('bo/company/deals.html.twig', [
'company' => $company,
'deals' => $deals
]);
}
}