<?php
namespace App\Controller\admin;
use App\Entity\Company;
use App\Entity\User;
use App\Events\Events;
use App\Form\CompanyType;
use App\Service\completion\CompletionService;
use App\Service\datatable\Builder;
use App\Service\subscription\FeaturesService;
use App\Service\subscription\SubscriptionService;
use App\Service\Utils\Constante\AbonnementConst;
use App\Service\Utils\Constante\JWPConst;
use App\Service\Utils\Upload;
use Doctrine\Persistence\ManagerRegistry;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class SubscriptionController extends AbstractController
{
/**
* @var TranslatorInterface
*/
private $translator;
private ManagerRegistry $managerRegistry;
/**
* UserDashboardController constructor.
*/
public function __construct(TranslatorInterface $translator, ManagerRegistry $managerRegistry)
{
$this->translator = $translator;
$this->managerRegistry = $managerRegistry;
}
/**
* List all subscription - only ADMIN
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/admin/subscription", name="admin-subscription")
*/
public function subscription()
{
return $this->render('pages/admin/subscription.html.twig', [
'title_page' => $this->translator->trans('Abonnements'),
]);
}
/**
* Ajout d'un abonnement
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/admin/add/company", name="admin-add-company")
*/
public function addCompany(Request $request,Upload $upload,SluggerInterface $slugger,FeaturesService $featuresService)
{
$company = new Company();
$form = $this->createForm(CompanyType::class, $company,["features"=>$featuresService->featuresToChoice()])
->add('update', SubmitType::class, ['label' => 'CREER LE COMPTE']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$logo= $request->request->get('filepond-logo');
$logoJWP= $request->request->get('filepond-jwp_logo');
$documents= $request->request->get('filepond-doc');
if ($logo) {
try {
$filename = $upload->moveTmpFile($logo);
$company->setLogoFilename($filename[0]['filename']);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
}
}
if ($logoJWP) {
try {
$filename = $upload->moveTmpFile($logoJWP);
$company->setJwpLogoFilename($filename[0]['filename']);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
}
}
if($documents and !empty($documents)){
$docs=[];
try {
foreach ($documents as $doc){
$filename = $upload->moveTmpFile($doc,'doc');
array_push($docs,$filename[0]);
}
$company->setDocuments($docs);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
}
}
//set slug
$company->setSlug($slugger->slug($company->getName()));
//expiration
if($company->getOfferName() === "Illimité"){
$company->setExpiredAt(null);
}
$em = $this->managerRegistry->getManager();
$em->persist($company);
$em->flush();
$this->addFlash('notice-success', 'L\'abonnement a bien été créé');
return $this->redirectToRoute('admin-subscription');
}
else{
$logo= $request->request->get('filepond-logo');
$documents= $request->request->get('filepond-doc');
if($logo){
$tmpFileLogo = $logo;
}
if($documents){
$tmpFileDoc = $documents;
}
}
return $this->render('pages/admin/company/add.company.html.twig', [
'title_page' => $this->translator->trans('Abonnements'),
'form' => $form->createView(),
'tmpFileLogoID'=>isset($tmpFileLogo) ? $tmpFileLogo : null,
'tmpFileDocIDS'=>isset($tmpFileDoc) ? $tmpFileDoc : null,
]);
}
/**
* Mise à jour d'un abonnement
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/admin/update/company/{id}", name="admin-update-subscription")
*/
public function updateCompany(Request $request, Company $company, Upload $upload,SluggerInterface $slugger,FeaturesService $featuresService)
{
$form = $this->createForm(CompanyType::class, $company,["features"=>$featuresService->featuresToChoice()])
->add('update', SubmitType::class, ['label' => 'Modifier']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$logo= $request->request->get('filepond-logo');
$logoJWP = $request->request->get('filepond-jwp_logo');
$documents= $request->request->get('filepond-doc');
$now = new \DateTime();
if ($company->getExpiredAt() < $now && $company->getOfferName() !== "Illimité"){
$form->get('expiredAt')->addError(new FormError("La date est antérieure à aujourd'hui"));
}
else{
if ($logo) {
try {
$filename = $upload->moveTmpFile($logo);
if($filename){
$company->setLogoFilename($filename[0]['filename']);
}
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', $e->getMessage());
}
}
else{
$company->setLogoFilename(null);
}
if ($logoJWP) {
try {
$filename = $upload->moveTmpFile($logoJWP);
if($filename){
$company->setJwpLogoFilename($filename[0]['filename']);
}
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', $e->getMessage());
}
}
else{
$company->setJwpLogoFilename(null);
}
if($documents and !empty($documents)){
$docs = !empty($company->getDocuments()) ? $company->getDocuments(): [];
$docs = array_filter($docs,function ($item) use($documents){
return in_array($item['filename'],$documents);
});
try {
foreach ($documents as $doc){
$filename = $upload->moveTmpFile($doc,'doc');
if($filename){
array_push($docs,$filename[0]);
}
}
$company->setDocuments($docs);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
$this->addFlash('notice-warning', 'Quelque chose s\'est mal passé !!');
}
}
//vider doc
elseif (empty($documents) and !empty($company->getDocuments()) ){
$company->setDocuments([]);
}
$company->setSlug($slugger->slug($company->getName()));
//expiration
if($company->getOfferName() === "Illimité"){
$company->setExpiredAt(null);
}
$em = $this->managerRegistry->getManager();
$em->persist($company);
$em->flush();
$this->addFlash('notice-success', 'L\'abonnement a bien été modifié');
return $this->redirectToRoute('admin-subscription-company',['slug'=>$company->getSlug()]);
}
}
return $this->render('pages/admin/company/update.company.html.twig', [
'title_page' => $this->translator->trans('Abonnements'),
'company'=>$company,
'form' => $form->createView(),
]);
}
/**
* show subscription
* @Security("is_granted('ROLE_RH')")
* @Route("/admin/subscription/{slug}", name="admin-subscription-company")
* @ParamConverter("company", options={"mapping": {"slug": "slug"}})
*/
public function showCompany(Request $request, Company $company)
{
if(!$company){
return $this->redirectToRoute('admin-subscription');
}
/* @see CompanyVoter */
$this->denyAccessUnlessGranted('COMPANY_SHOW',$company);
return $this->render('pages/admin/company/show.html.twig', [
'title_page' => $this->getUser()->hasRole('ROLE_RH') ? "Gérer l'abonnement" : "Abonnements" ,
'company' => $company,
"context"=>$request->query->has('tab') ? $request->query->get('tab') : 'info'
]);
}
/*AJAX ACTION*/
/**
* @param Request $request
* @Security("is_granted('ROLE_RH')")
* @Route("/api/subscription/info", name="subscription-info", methods={"POST"})
*/
public function fetchInfo(Request $request, ManagerRegistry $managerRegistry,
SubscriptionService $subscriptionService,CompletionService $completionService, FeaturesService $featuresService){
$companyID = $request->request->get('ID');
$company = $managerRegistry->getRepository(Company::class)->find($companyID);
if(!$company) {
return new JsonResponse("ko",400);
}
$lastConnection = $this->managerRegistry->getRepository(Company::class)->getLastConnection($company)['last_login_at'];
$allUsers = $company->getUsers()->getValues();
$usersRegisteredData = $subscriptionService->getActiveUsersData($company,sizeof($allUsers));
$completionPro = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRO);
$completionPrivate = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_PRIVATE);
$completionAllCompany = $completionService->getFullCompletionForAllUsersCompany($usersRegisteredData['users'],JWPConst::PROFILE_COMBINED);
$contacts =[];
foreach ($allUsers as $user){
if ($user->getIsContact()){
array_push($contacts,$user);
}
}
$content = $this->renderView('pages/admin/company/blocks/company.information.html.twig',[
'company' => $company,
'lastConnection'=>$lastConnection,
'licensesCompany'=>$subscriptionService->getLicensesData($company),
'completionProCompany'=>$completionPro,
'completionPrivateCompany'=>$completionPrivate,
'completionAllCompany' => $completionAllCompany,
'usersRegisteredCompany'=>$usersRegisteredData,
'contacts'=>$contacts,
'features'=>$featuresService->getFeatureLabels($company->getFeatures()),
]);
$actions = $this->renderView('pages/admin/company/blocks/tab.actions.html.twig',[
'context'=> 'info',
'company' => $company
]);
return new JsonResponse(["content"=>$content,"actions"=>$actions]);
}
/**
* List all companies - DATATABLE query
* @param Request $request
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/api/dt/subscription", name="dt-companies", methods={"GET"})
*/
public function getCompaniesForDT(Request $request, Builder $dtBuilder)
{
$params = $request->query->all();
$query = $this->managerRegistry->getRepository(Company::class)->findAndCountUsersQuery();
$dataTables = $dtBuilder
->withColumnAliases([
'id' => 'c.id',
'name' => 'c.name',
'status' => 'c.status',
'user_limit' => 'c.user_limit',
'offer_name' => 'c.offerName',
'users' => 'users',
'created_at' => 'c.created_at',
'last_login_at' => 'last_login_at',
])
->withIndexColumn('c.id')
->withQueryBuilder($query)
->withRequestParams($params);
return new JsonResponse($dataTables->getResponse());
}
/**
* @param Request $request
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/api/dt/subscription/delete", name="delete-subscription", methods={"DELETE"})
*/
public function deleteSubscriptionAction(Request $request)
{
$em = $this->managerRegistry->getManager();
$data = $request->query->get('ids');
if (!empty($data)) {
$company = $em->getRepository(Company::class)->findBy(['id' => $data]);
try {
foreach ($company as $comp) {
if ($this->getUser()->getCompany()->getId() !== $comp->getId()) {
//TODO suppression abonnement > faut-il supprimer tout les comptes OU les archiver
$em->remove($comp);
}
}
$em->flush();
}
catch (\Exception $exception){
return new JsonResponse($exception->getMessage(),400);
}
}
return new JsonResponse($data);
}
/**
* @param Request $request
* @Security("is_granted('ROLE_ADMIN')")
* @Route("/api/dt/subscription/toggle-status", name="toggle-status-subscription", methods={"POST"})
*/
public function toggleStatusAction(Request $request, SubscriptionService $subscriptionService)
{
$em = $this->managerRegistry->getManager();
$id = $request->request->get('id');
if ($id) {
$company = $em->getRepository(Company::class)->find($id);
if($company){
//Toggle status
if($company->getStatus() === "activated"){
$company->setStatus("suspended");
$subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_SUSPENDED]);
}
else{
$company->setStatus("activated");
$subscriptionService->notifyAllContact($company,Events::COMPANY_STATUS_CHANGE,["status"=>AbonnementConst::STATUS_ACTIVATED]);
}
}
$em->flush();
$html = $this->renderView('pages/admin/company/blocks/abonnement.kebab.content.html.twig',[
'company' => $company
]);
return new JsonResponse($html,200);
}
return new JsonResponse("ko",400);
}
/**
* @param Request $request
* @Security("is_granted('ROLE_RH')")
* @Route("/api/dt/subscription/change-logo", name="change-logo-subscription", methods={"POST"})
*/
public function changeLogo(Request $request, Upload $upload, ManagerRegistry $managerRegistry){
$logo= $request->request->get('filepond-logo');
if($this->getUser()->hasRole('ROLE_RH')){
$company = $this->getUser()->getCompany();
}
else if($this->getUser()->hasRole('ROLE_ADMIN')){
$ID = $request->request->get('ID');
$company = $managerRegistry->getRepository(Company::class)->find($ID);
}
$em = $managerRegistry->getManager();
if ($logo) {
try {
$filename = $upload->moveTmpFile($logo);
if($filename){
$company->setLogoFilename($filename[0]['filename']);
$em->persist($company);
$em->flush();
}
} catch (FileException $e) {
return new JsonResponse("Quelque chose s'est mal passé lors de !",400);
}
}
else{
$company->setLogoFilename(null);
$em->persist($company);
$em->flush();
}
return new JsonResponse('ok',200);
}
}