src/Controller/admin/SubscriptionController.php line 373

Open in your IDE?
  1. <?php
  2. namespace App\Controller\admin;
  3. use App\Entity\Company;
  4. use App\Entity\User;
  5. use App\Events\Events;
  6. use App\Form\CompanyType;
  7. use App\Service\completion\CompletionService;
  8. use App\Service\datatable\Builder;
  9. use App\Service\subscription\FeaturesService;
  10. use App\Service\subscription\SubscriptionService;
  11. use App\Service\Utils\Constante\AbonnementConst;
  12. use App\Service\Utils\Constante\JWPConst;
  13. use App\Service\Utils\Upload;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  19. use Symfony\Component\Form\FormError;
  20. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\String\Slugger\SluggerInterface;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. class SubscriptionController extends AbstractController
  27. {
  28.     /**
  29.      * @var TranslatorInterface
  30.      */
  31.     private $translator;
  32.     private ManagerRegistry $managerRegistry;
  33.     /**
  34.      * UserDashboardController constructor.
  35.      */
  36.     public function __construct(TranslatorInterface $translator, ManagerRegistry $managerRegistry)
  37.     {
  38.         $this->translator = $translator;
  39.         $this->managerRegistry = $managerRegistry;
  40.     }
  41.     /**
  42.      * List all subscription - only ADMIN
  43.      * @Security("is_granted('ROLE_ADMIN')")
  44.      * @Route("/admin/subscription", name="admin-subscription")
  45.      */
  46.     public function subscription()
  47.     {
  48.         return $this->render('pages/admin/subscription.html.twig', [
  49.             'title_page' => $this->translator->trans('Abonnements'),
  50.         ]);
  51.     }
  52.     /**
  53.      * Ajout d'un abonnement
  54.      * @Security("is_granted('ROLE_ADMIN')")
  55.      * @Route("/admin/add/company", name="admin-add-company")
  56.      */
  57.     public function addCompany(Request $request,Upload $upload,SluggerInterface $slugger,FeaturesService $featuresService)
  58.     {
  59.         $company = new Company();
  60.         $form = $this->createForm(CompanyType::class, $company,["features"=>$featuresService->featuresToChoice()])
  61.             ->add('update', SubmitType::class, ['label' => 'Créer le compte']);
  62.         $form->handleRequest($request);
  63.         if ($form->isSubmitted() && $form->isValid()) {
  64.             $logo= $request->request->get('filepond-logo');
  65.             $logoJWP= $request->request->get('filepond-jwp_logo');
  66.             $documents= $request->request->get('filepond-doc');
  67.             if ($logo) {
  68.                 try {
  69.                     $filename = $upload->moveTmpFile($logo);
  70.                     $company->setLogoFilename($filename[0]['filename']);
  71.                 } catch (FileException $e) {
  72.                     // ... handle exception if something happens during file upload
  73.                     $this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
  74.                 }
  75.             }
  76.             if ($logoJWP) {
  77.                 try {
  78.                     $filename = $upload->moveTmpFile($logoJWP);
  79.                     $company->setJwpLogoFilename($filename[0]['filename']);
  80.                 } catch (FileException $e) {
  81.                     // ... handle exception if something happens during file upload
  82.                     $this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
  83.                 }
  84.             }
  85.             if($documents and !empty($documents)){
  86.                 $docs=[];
  87.                 try {
  88.                     foreach ($documents as $doc){
  89.                         $filename = $upload->moveTmpFile($doc,'doc');
  90.                         array_push($docs,$filename[0]);
  91.                     }
  92.                     $company->setDocuments($docs);
  93.                 } catch (FileException $e) {
  94.                     // ... handle exception if something happens during file upload
  95.                     $this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
  96.                 }
  97.             }
  98.             //set slug
  99.             $company->setSlug($slugger->slug($company->getName()));
  100.             //expiration
  101.             if($company->getOfferName() === "Illimité"){
  102.                 $company->setExpiredAt(null);
  103.             }
  104.             $em = $this->managerRegistry->getManager();
  105.             $em->persist($company);
  106.             $em->flush();
  107.             $this->addFlash('notice-success', 'L\'abonnement a bien été créé');
  108.             return $this->redirectToRoute('admin-subscription');
  109.         }
  110.         else{
  111.             $logo= $request->request->get('filepond-logo');
  112.             $documents= $request->request->get('filepond-doc');
  113.             if($logo){
  114.                 $tmpFileLogo = $logo;
  115.             }
  116.             if($documents){
  117.                 $tmpFileDoc = $documents;
  118.             }
  119.         }
  120.         return $this->render('pages/admin/company/add.company.html.twig', [
  121.             'title_page' => $this->translator->trans('Abonnements'),
  122.             'form' => $form->createView(),
  123.             'tmpFileLogoID'=>isset($tmpFileLogo) ? $tmpFileLogo : null,
  124.             'tmpFileDocIDS'=>isset($tmpFileDoc) ? $tmpFileDoc : null,
  125.         ]);
  126.     }
  127.     /**
  128.      * Mise à jour d'un abonnement
  129.      * @Security("is_granted('ROLE_ADMIN')")
  130.      * @Route("/admin/update/company/{id}", name="admin-update-subscription")
  131.      */
  132.     public function updateCompany(Request $request, Company $company, Upload $upload,SluggerInterface $slugger,FeaturesService $featuresService)
  133.     {
  134.         $form = $this->createForm(CompanyType::class, $company,["features"=>$featuresService->featuresToChoice()])
  135.             ->add('update', SubmitType::class, ['label' => 'Modifier']);
  136.         $form->handleRequest($request);
  137.         if ($form->isSubmitted() && $form->isValid()) {
  138.             $logo= $request->request->get('filepond-logo');
  139.             $logoJWP = $request->request->get('filepond-jwp_logo');
  140.             $documents= $request->request->get('filepond-doc');
  141.             $now = new \DateTime();
  142.             if ($company->getExpiredAt() < $now && $company->getOfferName() !== "Illimité"){
  143.                 $form->get('expiredAt')->addError(new FormError("La date est antérieure à aujourd'hui"));
  144.             }
  145.             else{
  146.                 if ($logo) {
  147.                     try {
  148.                         $filename = $upload->moveTmpFile($logo);
  149.                         if($filename){
  150.                             $company->setLogoFilename($filename[0]['filename']);
  151.                         }
  152.                     } catch (FileException $e) {
  153.                         // ... handle exception if something happens during file upload
  154.                         $this->addFlash('notice-warning', $e->getMessage());
  155.                     }
  156.                 }
  157.                 else{
  158.                     $company->setLogoFilename(null);
  159.                 }
  160.                 if ($logoJWP) {
  161.                     try {
  162.                         $filename = $upload->moveTmpFile($logoJWP);
  163.                         if($filename){
  164.                             $company->setJwpLogoFilename($filename[0]['filename']);
  165.                         }
  166.                     } catch (FileException $e) {
  167.                         // ... handle exception if something happens during file upload
  168.                         $this->addFlash('notice-warning', $e->getMessage());
  169.                     }
  170.                 }
  171.                 else{
  172.                     $company->setJwpLogoFilename(null);
  173.                 }
  174.                 if($documents and !empty($documents)){
  175.                     $docs = !empty($company->getDocuments()) ? $company->getDocuments(): [];
  176.                     $docs = array_filter($docs,function ($item) use($documents){
  177.                         return in_array($item['filename'],$documents);
  178.                     });
  179.                     try {
  180.                         foreach ($documents as $doc){
  181.                             $filename = $upload->moveTmpFile($doc,'doc');
  182.                             if($filename){
  183.                                 array_push($docs,$filename[0]);
  184.                             }
  185.                         }
  186.                         $company->setDocuments($docs);
  187.                     } catch (FileException $e) {
  188.                         // ... handle exception if something happens during file upload
  189.                         $this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
  190.                     }
  191.                 }
  192.                 //vider doc
  193.                 elseif (empty($documents) and !empty($company->getDocuments()) ){
  194.                     $company->setDocuments([]);
  195.                 }
  196.                 $company->setSlug($slugger->slug($company->getName()));
  197.                 //expiration
  198.                 if($company->getOfferName() === "Illimité"){
  199.                     $company->setExpiredAt(null);
  200.                 }
  201.                 $em = $this->managerRegistry->getManager();
  202.                 $em->persist($company);
  203.                 $em->flush();
  204.                 $this->addFlash('notice-success', 'L\'abonnement a bien été modifié');
  205.                 return $this->redirectToRoute('admin-subscription-company',['slug'=>$company->getSlug()]);
  206.             }
  207.         }
  208.         return $this->render('pages/admin/company/update.company.html.twig', [
  209.             'title_page' => $this->translator->trans('Abonnements'),
  210.             'company'=>$company,
  211.             'form' => $form->createView(),
  212.         ]);
  213.     }
  214.     /**
  215.      * show subscription
  216.      * @Security("is_granted('ROLE_RH')")
  217.      * @Route("/admin/subscription/{slug}", name="admin-subscription-company")
  218.      * @ParamConverter("company", options={"mapping": {"slug": "slug"}})
  219.      */
  220.     public function showCompany(Request $request, Company $company)
  221.     {
  222.         if(!$company){
  223.             return  $this->redirectToRoute('admin-subscription');
  224.         }
  225.         /* @see CompanyVoter */
  226.         $this->denyAccessUnlessGranted('COMPANY_SHOW',$company);
  227.         return $this->render('pages/admin/company/show.html.twig', [
  228.             'title_page' => $this->getUser()->hasRole('ROLE_RH') ? "Gérer l'abonnement" : "Abonnements" ,
  229.             'company' => $company,
  230.             "context"=>$request->query->has('tab') ? $request->query->get('tab') : 'info'
  231.         ]);
  232.     }
  233.     /*AJAX ACTION*/
  234.     /**
  235.      * @Security("is_granted('ROLE_ADMIN')")
  236.      * @Route("/api/subscription/publications", name="subscription-publications", methods={"POST"})
  237.      */
  238.     public function fetchPublications(Request $request): JsonResponse
  239.     {
  240.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  241.         $company = $this->managerRegistry->getRepository(Company::class)->find($request->request->get('ID'));
  242.         if (!$company) {
  243.             throw $this->createNotFoundException('Entreprise introuvable');
  244.         }
  245.         return new JsonResponse([
  246.             'content' => $this->renderView('pages/admin/company/blocks/company.publications.html.twig', [
  247.                 'company' => $company,
  248.             ]),
  249.             'actions' => $this->renderView('pages/admin/company/blocks/tab.actions.html.twig', [
  250.                 'context' => 'publications',
  251.                 'company' => $company,
  252.             ]),
  253.         ]);
  254.     }
  255.     /**
  256.      * @param Request $request
  257.      * @Security("is_granted('ROLE_RH')")
  258.      * @Route("/api/subscription/info", name="subscription-info", methods={"POST"})
  259.      */
  260.     public function fetchInfo(Request $request, ManagerRegistry $managerRegistry,
  261.                               SubscriptionService $subscriptionService,CompletionService $completionService, FeaturesService $featuresService){
  262.         $companyID = $request->request->get('ID');
  263.         $company = $managerRegistry->getRepository(Company::class)->find($companyID);
  264.         if(!$company) {
  265.             return new JsonResponse("ko",400);
  266.         }
  267.         $lastConnection = $this->managerRegistry->getRepository(Company::class)->getLastConnection($company)['last_login_at'];
  268.         $allUsers = $company->getUsers()->getValues();
  269.         $usersRegisteredData = $subscriptionService->getActiveUsersData($company,sizeof($allUsers));
  270.         $completionPro = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRO);
  271.         $completionPrivate = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRIVATE);
  272.         $completionAllCompany = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_COMBINED);
  273.         $contacts =[];
  274.         foreach ($allUsers as $user){
  275.             if ($user->getIsContact()){
  276.                 array_push($contacts,$user);
  277.             }
  278.         }
  279.         $content = $this->renderView('pages/admin/company/blocks/company.information.html.twig',[
  280.             'company' => $company,
  281.             'lastConnection'=>$lastConnection,
  282.             'licensesCompany'=>$subscriptionService->getLicensesData($company),
  283.             'completionProCompany'=>$completionPro,
  284.             'completionPrivateCompany'=>$completionPrivate,
  285.             'completionAllCompany' => $completionAllCompany,
  286.             'usersRegisteredCompany'=>$usersRegisteredData,
  287.             'contacts'=>$contacts,
  288.             'features'=>$featuresService->getFeatureLabels($company->getFeatures()),
  289.         ]);
  290.         $actions = $this->renderView('pages/admin/company/blocks/tab.actions.html.twig',[
  291.             'context'=> 'info',
  292.             'company' => $company
  293.         ]);
  294.         return new JsonResponse(["content"=>$content,"actions"=>$actions]);
  295.     }
  296.     /**
  297.      * List all companies - DATATABLE query
  298.      * @param Request $request
  299.      * @Security("is_granted('ROLE_ADMIN')")
  300.      * @Route("/api/dt/subscription", name="dt-companies", methods={"GET"})
  301.      */
  302.     public function getCompaniesForDT(Request $request, Builder $dtBuilder)
  303.     {
  304.         $params = $request->query->all();
  305.         $query = $this->managerRegistry->getRepository(Company::class)->findAndCountUsersQuery();
  306.         $dataTables = $dtBuilder
  307.             ->withColumnAliases([
  308.                 'id' => 'c.id',
  309.                 'name' => 'c.name',
  310.                 'status' => 'c.status',
  311.                 'user_limit' => 'c.user_limit',
  312.                 'offer_name' => 'c.offerName',
  313.                 'users' => 'users',
  314.                 'created_at' => 'c.created_at',
  315.                 'last_login_at' => 'last_login_at',
  316.             ])
  317.             ->withIndexColumn('c.id')
  318.             ->withQueryBuilder($query)
  319.             ->withRequestParams($params);
  320.         return new JsonResponse($dataTables->getResponse());
  321.     }
  322.     /**
  323.      * @param Request $request
  324.      * @Security("is_granted('ROLE_ADMIN')")
  325.      * @Route("/api/dt/subscription/delete", name="delete-subscription", methods={"DELETE"})
  326.      */
  327.     public function deleteSubscriptionAction(Request $request)
  328.     {
  329.         $em = $this->managerRegistry->getManager();
  330.         $data = $request->query->get('ids');
  331.         if (!empty($data)) {
  332.             $company = $em->getRepository(Company::class)->findBy(['id' => $data]);
  333.             try {
  334.                 foreach ($company as $comp) {
  335.                     if ($this->getUser()->getCompany()->getId() !== $comp->getId()) {
  336.                         //TODO suppression abonnement > faut-il supprimer tout les comptes OU les archiver
  337.                         $em->remove($comp);
  338.                     }
  339.                 }
  340.                 $em->flush();
  341.             }
  342.             catch (\Exception $exception){
  343.                 return new JsonResponse($exception->getMessage(),400);
  344.             }
  345.         }
  346.         return new JsonResponse($data);
  347.     }
  348.     /**
  349.      * @param Request $request
  350.      * @Security("is_granted('ROLE_ADMIN')")
  351.      * @Route("/api/dt/subscription/toggle-status", name="toggle-status-subscription", methods={"POST"})
  352.      */
  353.     public function toggleStatusAction(Request $request, SubscriptionService $subscriptionService)
  354.     {
  355.         $em = $this->managerRegistry->getManager();
  356.         $id = $request->request->get('id');
  357.         if ($id) {
  358.             $company = $em->getRepository(Company::class)->find($id);
  359.             if($company){
  360.                 //Toggle status
  361.                 if($company->getStatus() === "activated"){
  362.                     $company->setStatus("suspended");
  363.                     $subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_SUSPENDED]);
  364.                 }
  365.                 else{
  366.                     $company->setStatus("activated");
  367.                     $subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_ACTIVATED]);
  368.                 }
  369.             }
  370.             $em->flush();
  371.             $html = $this->renderView('pages/admin/company/blocks/abonnement.kebab.content.html.twig',[
  372.                 'company' => $company
  373.             ]);
  374.             return new JsonResponse($html,200);
  375.         }
  376.         return new JsonResponse("ko",400);
  377.     }
  378.     /**
  379.      * @param Request $request
  380.      * @Security("is_granted('ROLE_RH')")
  381.      * @Route("/api/dt/subscription/change-logo", name="change-logo-subscription", methods={"POST"})
  382.      */
  383.     public function changeLogo(Request $request, Upload $upload, ManagerRegistry $managerRegistry){
  384.         $logo= $request->request->get('filepond-logo');
  385.         if($this->getUser()->hasRole('ROLE_RH')){
  386.             $company = $this->getUser()->getCompany();
  387.         }
  388.         else if($this->getUser()->hasRole('ROLE_ADMIN')){
  389.             $ID = $request->request->get('ID');
  390.             $company = $managerRegistry->getRepository(Company::class)->find($ID);
  391.         }
  392.         $em = $managerRegistry->getManager();
  393.         if ($logo) {
  394.             try {
  395.                 $filename = $upload->moveTmpFile($logo);
  396.                 if($filename){
  397.                     $company->setLogoFilename($filename[0]['filename']);
  398.                     $em->persist($company);
  399.                     $em->flush();
  400.                 }
  401.             } catch (FileException $e) {
  402.                 return new JsonResponse("Quelque chose s'est mal passé lors de !",400);
  403.             }
  404.         }
  405.         else{
  406.             $company->setLogoFilename(null);
  407.             $em->persist($company);
  408.             $em->flush();
  409.         }
  410.         return new JsonResponse('ok',200);
  411.     }
  412. }