src/Controller/App/OrderController.php line 37

  1. <?php
  2. namespace App\Controller\App;
  3. use App\Form\OrderpaymentType;
  4. use App\Repository\AbonnementRepository;
  5. use App\Repository\CouponRepository;
  6. use App\Service\FileUploader;
  7. use App\Service\NotificationService;
  8. use DateTime;
  9. use App\Entity\Order;
  10. use App\Form\OrderType;
  11. use App\Entity\Abonnement;
  12. use App\Entity\enums\OrderStatus;
  13. use App\Repository\OrderRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\SecurityBundle\Security;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. #[Route('/app/order')]
  23. // #[IsGranted('ROLE_SUPER_ADMIN')]
  24. class OrderController extends AbstractController
  25. {
  26.     private NotificationService $notificationService;
  27.     public function __construct(private TranslatorInterface $translator
  28.      NotificationService $notificationService)
  29.     {
  30.         $this->notificationService $notificationService;
  31.     }
  32.     #[Route('/'name'app_order_index'methods: ['GET'])]
  33.     public function index(OrderRepository $orderRepositorySecurity $security): Response
  34.     {
  35.         if ($security->isGranted('ROLE_SUPER_ADMIN')) {
  36.             return $this->render('app/order/admin.html.twig', [
  37.                 'orders' => $orderRepository->findAll(),
  38.             ]);
  39.         }
  40.         return $this->render('app/order/index.html.twig', [
  41.             'orders' => $orderRepository->findAll(),
  42.         ]);
  43.     }
  44.     #[Route('/new'name'app_order_new'methods: ['GET''POST'])]
  45.     public function new(Request $requestEntityManagerInterface $entityManager): Response
  46.     {
  47.         $order = new Order();
  48.         $form $this->createForm(OrderType::class, $order);
  49.         $form->handleRequest($request);
  50.         if ($form->isSubmitted() && $form->isValid()) {
  51.             $entityManager->persist($order);
  52.             $price $order->getProduct()->getPrice();
  53.             $total $order->getQuantity() * $price;
  54.             if ($order->getCoupon()) {
  55.                 $total $total - ($total $order->getCoupon()->getAmount() / 100);
  56.             }
  57.             $order->setName(
  58.                 $order->getProduct()->getName() . " " $order->getProduct()->getDuration()
  59.                 . " jours X " $order->getQuantity()
  60.             );
  61.             $order->setPrice($price)
  62.                 ->setTotal($total);
  63.             $order->setCustomer($this->getUser());
  64.             $entityManager->flush();
  65.             $this->addFlash('success'$this->translator->trans('Succès !!'));
  66.             return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  67.         }
  68.         return $this->renderForm('app/order/new.html.twig', [
  69.             'order' => $order,
  70.             'form' => $form,
  71.         ]);
  72.     }
  73.     #[Route('/{id}'name'app_order_show'methods: ['GET'])]
  74.     public function show(Order $order): Response
  75.     {
  76.         return $this->render('app/order/show.html.twig', [
  77.             'order' => $order,
  78.         ]);
  79.     }
  80.     #[Route('/{id}/edit'name'app_order_edit'methods: ['GET''POST'])]
  81.     public function edit(Request $requestOrder $orderEntityManagerInterface $entityManager): Response
  82.     {
  83.         $form $this->createForm(OrderType::class, $order);
  84.         $form->handleRequest($request);
  85.         if ($form->isSubmitted() && $form->isValid()) {
  86.             if ($order->getStatus() === OrderStatus::ACCEPTED) {
  87.                 $abonnement = new Abonnement();
  88.                 $abonnement
  89.                     ->setProduct($order->getProduct())
  90.                     ->setOwner($order->getCustomer()->getCompany())
  91.                     ->setStartDate(new DateTime())
  92.                     ->setExpireDate(new DateTime('+' $order->getProduct()->getDuration() . ' days'));
  93.                 $entityManager->persist($abonnement);
  94.             }
  95.             $entityManager->flush();
  96.             $this->addFlash('success'$this->translator->trans('Succès !!'));
  97.             return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  98.         }
  99.         return $this->renderForm('app/order/edit.html.twig', [
  100.             'order' => $order,
  101.             'form' => $form,
  102.         ]);
  103.     }
  104.     #[Route('/{id}/confirme'name'app_order_confirme'methods: ['GET''POST'])]
  105.     public function confirme(Request $requestOrder $orderOrderRepository $orderRepositoryCouponRepository $couponRepository): Response
  106.     {
  107.         $order->setStatus(OrderStatus::CONFIRMED);
  108.         $orderRepository->save($ordertrue);
  109.         $coupon $order->getCoupon();
  110.         if ($coupon) {
  111.             $coupon->setUsageCount($coupon->getUsageCount() + 1);
  112.             $couponRepository->save($coupontrue);
  113.         }
  114.         $user $this->getUser();
  115.         $company_name $user->getCompany()->getName();
  116.         $this->notificationService->orderConfirmed($company_name$user$order);
  117.         $this->addFlash('success'$this->translator->trans('Succès !!'));
  118.         return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  119.     }
  120.     #[Route('/{id}/pay'name'app_order_pay'methods: ['GET''POST'])]
  121.     public function pay(Request $requestOrder $orderOrderRepository $orderRepositoryCouponRepository $couponRepositoryFileUploader $fileUploader): Response
  122.     {
  123.         $form $this->createForm(OrderpaymentType::class, $order);
  124.         $form->handleRequest($request);
  125.         if ($form->isSubmitted() && $form->isValid()) {
  126.             $recipe $form->get('recipe')->getData();
  127.             if ($recipe) {
  128.                 $uploadedFileName $fileUploader->upload($recipe'recipes_dir');
  129.                 $order->setRecipe($uploadedFileName);
  130.                 $order->setStatus(OrderStatus::PENDING);
  131.                 $orderRepository->save($ordertrue);
  132.                 $this->addFlash('success''Payment whaiting for validation !!');
  133.             } else {
  134.                 $this->addFlash('error''An error has been produced !!');
  135.             }
  136.             return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  137.         }
  138.         return $this->render('app/buy/payment.html.twig', [
  139.             'controller_name' => 'BuyController',
  140.             'order' => $order,
  141.             'form' => $form->createView(),
  142.         ]);
  143.     }
  144.     #[Route('/{id}/accept'name'app_order_accept'methods: ['GET'])]
  145.     public function accept(Request $requestOrder $orderOrderRepository $orderRepositoryAbonnementRepository $abonnementRepositoryFileUploader $fileUploader): Response
  146.     {
  147.         $order->setStatus(OrderStatus::ACCEPTED);
  148.         $order->setIsPayed(true);
  149.         $abonnement = new Abonnement();
  150.         $abonnement
  151.             ->setProduct($order->getProduct())
  152.             ->setOwner($order->getCustomer()->getCompany())
  153.             ->setStartDate(new DateTime())
  154.             ->setExpireDate(new DateTime('+' $order->getProduct()->getDuration() . ' days'));
  155.         $orderRepository->save($orderfalse);
  156.         $abonnementRepository->save($abonnementtrue);
  157.         $abonnement->setOwner($order->getOwner());
  158.         $abonnementRepository->save($abonnementtrue);
  159.         $this->addFlash('success'$this->translator->trans('Votre Licence a été bien activé !!'));
  160.         //TODO: send email to customer 
  161.         return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  162.     }
  163.     #[Route('/{id}'name'app_order_delete'methods: ['POST'])]
  164.     public function delete(Request $requestOrder $orderEntityManagerInterface $entityManager): Response
  165.     {
  166.         if ($this->isCsrfTokenValid('delete' $order->getId(), $request->request->get('_token'))) {
  167.             try {
  168.                 $entityManager->remove($order);
  169.                 $entityManager->flush();
  170.                 $this->addFlash('success'$this->translator->trans('Succès !!'));
  171.             } catch (\Exception $e) {
  172.                 $errorMessage $e->getMessage();
  173.                 $result explode(':'$errorMessage);
  174.                 $this->addFlash('error'$result[0]);
  175.             }
  176.         }
  177.         return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
  178.     }
  179. }