src/Controller/App/SubscriptionController.php line 35
<?php
namespace App\Controller\App;
use DateTime;
use DateInterval;
use App\Entity\Child;
use App\Entity\Payment;
use App\Entity\Section;
use App\Entity\Service;
use App\Form\PaymentType;
use App\Entity\Subscription;
use App\Form\SubscriptionType;
use App\Entity\enums\SubscriptionStatus;
use App\Form\SubscriptionTypeBasic;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\SubscriptionRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/app/subscription')]
class SubscriptionController extends AbstractController
{
public function __construct(private TranslatorInterface $translator)
{
}
#[Route('/', name: 'app_subscription_index', methods: ['GET', 'POST'])]
public function index(Request $request, SubscriptionRepository $subscriptionRepository, EntityManagerInterface $manager): Response
{
if ($request->isXmlHttpRequest()) {
if ($this->isCsrfTokenValid('subscription_type_basic', $_POST['subscription_type_basic']['_token'])) {
$subscription = new Subscription();
$form = $this->createForm(SubscriptionTypeBasic::class, $subscription);
$child = $manager->getRepository(Child::class)->find($_POST['subscription_type_basic']['child']);
$service = $manager->getRepository(Service::class)->find($_POST['subscription_type_basic']['service']);
$start_date = new DateTime($_POST['subscription_type_basic']['start_date']);
$expire_date = $start_date->add(new DateInterval('P' . $service->getDuration() . 'D'));
$subscription
->setChild($child)
->setService($service)
->setDescription($_POST['subscription_type_basic']['description'])
->setTotal(floatval($service->getPrice()))
->setDiscount($_POST['subscription_type_basic']['discount'])
->setStartDate(new DateTime($_POST['subscription_type_basic']['start_date']))
->setExpireDate($expire_date)
->setCreatedBy($this->getUser());
$subscriptionRepository->add($subscription, true);
return new JsonResponse(['status' => 'ok', 'data' => $subscription->getId(), 'msg' => $this->translator->trans('Abonnement crée !!')]);
} else {
return new JsonResponse(['status' => 'no', 'data' => null, 'msg' => $this->translator->trans('token invalid !')]);
}
}
$subscription = new Subscription();
$form = $this->createForm(SubscriptionTypeBasic::class, $subscription);
$edit_form = $this->createForm(SubscriptionTypeBasic::class, $subscription, [
'action' => $this->generateUrl('app_subscription_edit_ajax', ['id' => '1']),
'method' => 'POST',
'attr' => ['name' => 'subscription_type_basic_edit']
]);
return $this->render('app/subscription/index.html.twig', [
'subscriptions' => $subscriptionRepository->findAll(),
'form' => $form->createView(),
'edit_form' => $edit_form->createView()
]);
}
#[Route('/new', name: 'app_subscription_new', methods: ['GET', 'POST'])]
public function new(Request $request, SubscriptionRepository $subscriptionRepository): Response
{
return $this->redirectToRoute('app_subscription_index', [], Response::HTTP_SEE_OTHER);
// $subscription = new Subscription();
// $form = $this->createForm(SubscriptionType::class, $subscription);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// /** @var $user App\Entity\User */
// $user = $this->getUser();
// $subscription
// ->setCreatedBy($this->getUser());
// $this->addFlash('success', $this->translator->trans('Succès !!'));
// $subscriptionRepository->add($subscription, true);
// return $this->redirectToRoute('app_subscription_index', [], Response::HTTP_SEE_OTHER);
// }
// return $this->renderForm('app/subscription/new.html.twig', [
// 'subscription' => $subscription,
// 'form' => $form,
// ]);
}
#[Route('/{id}', name: 'app_subscription_show', methods: ['GET'])]
public function show(Subscription $subscription): Response
{
return $this->redirectToRoute('app_subscription_index', [], Response::HTTP_SEE_OTHER);
// return $this->render('app/subscription/show.html.twig', [
// 'subscription' => $subscription,
// ]);
}
#[Route('/ajax/{id}', name: 'app_subscription_show_ajax', methods: ['GET'])]
public function show_ajax(Subscription $subscription, SerializerInterface $serializer): Response
{
$json = $serializer->serialize($subscription, 'json', ['groups' => ['read:subscription:basic', 'read:child:basic', 'read:service:basic']]);
return $this->json(json_decode($json));
}
#[Route('/{id}/edit', name: 'app_subscription_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Subscription $subscription, SubscriptionRepository $subscriptionRepository, FormFactoryInterface $formFactory): Response
{
$form = $this->createForm(SubscriptionTypeBasic::class, $subscription);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var $start_date DateTime */
$start_date = $subscription->getStartDate();
$expire_date = $start_date->add(new DateInterval('P' . $subscription->getService()->getDuration() . 'D'));
$subscription
->setTotal(floatval($subscription->getService()->getPrice()))
->setStartDate(new DateTime($_POST['subscription_type_basic']['start_date']))
->setExpireDate($expire_date);
$subscriptionRepository->add($subscription, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_subscription_edit', ['id' => $subscription->getId()], Response::HTTP_SEE_OTHER);
}
$payment = new Payment();
$edit_form = $formFactory->createNamed('payment_type_edit', PaymentType::class, $payment);
return $this->renderForm('app/subscription/edit.html.twig', [
'subscription' => $subscription,
'form' => $form,
'edit_form' => $edit_form
]);
}
#[Route('/{id?}/edit/ajax', name: 'app_subscription_edit_ajax', methods: ['GET', 'POST'])]
public function edit_ajax(Request $request, Subscription $subscription, SubscriptionRepository $subscriptionRepository, EntityManagerInterface $manager): Response
{
if ($request->isXmlHttpRequest()) {
if ($this->isCsrfTokenValid('edit_subscription', $_POST['subscription_type_basic']['_token'])) {
$child = $manager->getRepository(Child::class)->find($_POST['subscription_type_basic']['child']);
$service = $manager->getRepository(Service::class)->find($_POST['subscription_type_basic']['service']);
$form = $this->createForm(SubscriptionTypeBasic::class, $subscription);
$start_date = new DateTime($_POST['subscription_type_basic']['start_date']);
$expire_date = $start_date->add(new DateInterval('P' . $service->getDuration() . 'D'));
$subscription
->setDescription($_POST['subscription_type_basic']['description'])
->setChild($child)
->setService($service)
->setStartDate(new DateTime($_POST['subscription_type_basic']['start_date']))
->setExpireDate($expire_date)
->setDiscount($_POST['subscription_type_basic']['discount']);
$form->handleRequest($request);
$subscriptionRepository->add($subscription, true);
return new JsonResponse(['status' => 'ok', 'data' => $subscription->getId(), 'msg' => $this->translator->trans('Abonnement mis à jour !!')]);
} else {
return new JsonResponse(['status' => 'no', 'data' => null, 'msg' => $this->translator->trans('token invalid !')]);
}
}
}
#[Route('/{id}', name: 'app_subscription_delete', methods: ['POST'])]
public function delete(Request $request, Subscription $subscription, SubscriptionRepository $subscriptionRepository): Response
{
if ($this->isCsrfTokenValid('delete' . $subscription->getId(), $request->request->get('_token'))) {
try {
$subscriptionRepository->remove($subscription, true);
$this->addFlash('success', $this->translator->trans('Succès !!'));
} catch (\Exception $e) {
$errorMessage = $e->getMessage();
$result = explode(':', $errorMessage);
$this->addFlash('error', $result[0]);
}
}
return $this->redirectToRoute('app_subscription_index', [], Response::HTTP_SEE_OTHER);
}
}