src/Controller/admin/SubscriptionController.php line 349

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 $translatorManagerRegistry $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' => 'CREER 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 $requestCompany $companyUpload $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 $requestCompany $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.      * @param Request $request
  236.      * @Security("is_granted('ROLE_RH')")
  237.      * @Route("/api/subscription/info", name="subscription-info", methods={"POST"})
  238.      */
  239.     public function fetchInfo(Request $requestManagerRegistry $managerRegistry,
  240.                               SubscriptionService $subscriptionService,CompletionService $completionServiceFeaturesService $featuresService){
  241.         $companyID $request->request->get('ID');
  242.         $company $managerRegistry->getRepository(Company::class)->find($companyID);
  243.         if(!$company) {
  244.             return new JsonResponse("ko",400);
  245.         }
  246.         $lastConnection $this->managerRegistry->getRepository(Company::class)->getLastConnection($company)['last_login_at'];
  247.         $allUsers $company->getUsers()->getValues();
  248.         $usersRegisteredData $subscriptionService->getActiveUsersData($company,sizeof($allUsers));
  249.         $completionPro $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRO);
  250.         $completionPrivate $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRIVATE);
  251.         $completionAllCompany $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_COMBINED);
  252.         $contacts =[];
  253.         foreach ($allUsers as $user){
  254.             if ($user->getIsContact()){
  255.                 array_push($contacts,$user);
  256.             }
  257.         }
  258.         $content $this->renderView('pages/admin/company/blocks/company.information.html.twig',[
  259.             'company' => $company,
  260.             'lastConnection'=>$lastConnection,
  261.             'licensesCompany'=>$subscriptionService->getLicensesData($company),
  262.             'completionProCompany'=>$completionPro,
  263.             'completionPrivateCompany'=>$completionPrivate,
  264.             'completionAllCompany' => $completionAllCompany,
  265.             'usersRegisteredCompany'=>$usersRegisteredData,
  266.             'contacts'=>$contacts,
  267.             'features'=>$featuresService->getFeatureLabels($company->getFeatures()),
  268.         ]);
  269.         $actions $this->renderView('pages/admin/company/blocks/tab.actions.html.twig',[
  270.             'context'=> 'info',
  271.             'company' => $company
  272.         ]);
  273.         return new JsonResponse(["content"=>$content,"actions"=>$actions]);
  274.     }
  275.     /**
  276.      * List all companies - DATATABLE query
  277.      * @param Request $request
  278.      * @Security("is_granted('ROLE_ADMIN')")
  279.      * @Route("/api/dt/subscription", name="dt-companies", methods={"GET"})
  280.      */
  281.     public function getCompaniesForDT(Request $requestBuilder $dtBuilder)
  282.     {
  283.         $params $request->query->all();
  284.         $query $this->managerRegistry->getRepository(Company::class)->findAndCountUsersQuery();
  285.         $dataTables $dtBuilder
  286.             ->withColumnAliases([
  287.                 'id' => 'c.id',
  288.                 'name' => 'c.name',
  289.                 'status' => 'c.status',
  290.                 'user_limit' => 'c.user_limit',
  291.                 'offer_name' => 'c.offerName',
  292.                 'users' => 'users',
  293.                 'created_at' => 'c.created_at',
  294.                 'last_login_at' => 'last_login_at',
  295.             ])
  296.             ->withIndexColumn('c.id')
  297.             ->withQueryBuilder($query)
  298.             ->withRequestParams($params);
  299.         return new JsonResponse($dataTables->getResponse());
  300.     }
  301.     /**
  302.      * @param Request $request
  303.      * @Security("is_granted('ROLE_ADMIN')")
  304.      * @Route("/api/dt/subscription/delete", name="delete-subscription", methods={"DELETE"})
  305.      */
  306.     public function deleteSubscriptionAction(Request $request)
  307.     {
  308.         $em $this->managerRegistry->getManager();
  309.         $data $request->query->get('ids');
  310.         if (!empty($data)) {
  311.             $company $em->getRepository(Company::class)->findBy(['id' => $data]);
  312.             try {
  313.                 foreach ($company as $comp) {
  314.                     if ($this->getUser()->getCompany()->getId() !== $comp->getId()) {
  315.                         //TODO suppression abonnement > faut-il supprimer tout les comptes OU les archiver
  316.                         $em->remove($comp);
  317.                     }
  318.                 }
  319.                 $em->flush();
  320.             }
  321.             catch (\Exception $exception){
  322.                 return new JsonResponse($exception->getMessage(),400);
  323.             }
  324.         }
  325.         return new JsonResponse($data);
  326.     }
  327.     /**
  328.      * @param Request $request
  329.      * @Security("is_granted('ROLE_ADMIN')")
  330.      * @Route("/api/dt/subscription/toggle-status", name="toggle-status-subscription", methods={"POST"})
  331.      */
  332.     public function toggleStatusAction(Request $requestSubscriptionService $subscriptionService)
  333.     {
  334.         $em $this->managerRegistry->getManager();
  335.         $id $request->request->get('id');
  336.         if ($id) {
  337.             $company $em->getRepository(Company::class)->find($id);
  338.             if($company){
  339.                 //Toggle status
  340.                 if($company->getStatus() === "activated"){
  341.                     $company->setStatus("suspended");
  342.                     $subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_SUSPENDED]);
  343.                 }
  344.                 else{
  345.                     $company->setStatus("activated");
  346.                     $subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_ACTIVATED]);
  347.                 }
  348.             }
  349.             $em->flush();
  350.             $html $this->renderView('pages/admin/company/blocks/abonnement.kebab.content.html.twig',[
  351.                 'company' => $company
  352.             ]);
  353.             return new JsonResponse($html,200);
  354.         }
  355.         return new JsonResponse("ko",400);
  356.     }
  357.     /**
  358.      * @param Request $request
  359.      * @Security("is_granted('ROLE_RH')")
  360.      * @Route("/api/dt/subscription/change-logo", name="change-logo-subscription", methods={"POST"})
  361.      */
  362.     public function changeLogo(Request $requestUpload $uploadManagerRegistry $managerRegistry){
  363.         $logo$request->request->get('filepond-logo');
  364.         if($this->getUser()->hasRole('ROLE_RH')){
  365.             $company $this->getUser()->getCompany();
  366.         }
  367.         else if($this->getUser()->hasRole('ROLE_ADMIN')){
  368.             $ID $request->request->get('ID');
  369.             $company $managerRegistry->getRepository(Company::class)->find($ID);
  370.         }
  371.         $em $managerRegistry->getManager();
  372.         if ($logo) {
  373.             try {
  374.                 $filename $upload->moveTmpFile($logo);
  375.                 if($filename){
  376.                     $company->setLogoFilename($filename[0]['filename']);
  377.                     $em->persist($company);
  378.                     $em->flush();
  379.                 }
  380.             } catch (FileException $e) {
  381.                 return new JsonResponse("Quelque chose s'est mal passé lors de !",400);
  382.             }
  383.         }
  384.         else{
  385.             $company->setLogoFilename(null);
  386.             $em->persist($company);
  387.             $em->flush();
  388.         }
  389.         return new JsonResponse('ok',200);
  390.     }
  391. }