src/Controller/App/OrderController.php line 37
<?php
namespace App\Controller\App;
use App\Form\OrderpaymentType;
use App\Repository\AbonnementRepository;
use App\Repository\CouponRepository;
use App\Service\FileUploader;
use App\Service\NotificationService;
use DateTime;
use App\Entity\Order;
use App\Form\OrderType;
use App\Entity\Abonnement;
use App\Entity\enums\OrderStatus;
use App\Repository\OrderRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/app/order')]
// #[IsGranted('ROLE_SUPER_ADMIN')]
class OrderController extends AbstractController
{
private NotificationService $notificationService;
public function __construct(private TranslatorInterface $translator,
NotificationService $notificationService)
{
$this->notificationService = $notificationService;
}
#[Route('/', name: 'app_order_index', methods: ['GET'])]
public function index(OrderRepository $orderRepository, Security $security): Response
{
if ($security->isGranted('ROLE_SUPER_ADMIN')) {
return $this->render('app/order/admin.html.twig', [
'orders' => $orderRepository->findAll(),
]);
}
return $this->render('app/order/index.html.twig', [
'orders' => $orderRepository->findAll(),
]);
}
#[Route('/new', name: 'app_order_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$order = new Order();
$form = $this->createForm(OrderType::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($order);
$price = $order->getProduct()->getPrice();
$total = $order->getQuantity() * $price;
if ($order->getCoupon()) {
$total = $total - ($total * $order->getCoupon()->getAmount() / 100);
}
$order->setName(
$order->getProduct()->getName() . " " . $order->getProduct()->getDuration()
. " jours X " . $order->getQuantity()
);
$order->setPrice($price)
->setTotal($total);
$order->setCustomer($this->getUser());
$entityManager->flush();
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('app/order/new.html.twig', [
'order' => $order,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_order_show', methods: ['GET'])]
public function show(Order $order): Response
{
return $this->render('app/order/show.html.twig', [
'order' => $order,
]);
}
#[Route('/{id}/edit', name: 'app_order_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Order $order, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(OrderType::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($order->getStatus() === OrderStatus::ACCEPTED) {
$abonnement = new Abonnement();
$abonnement
->setProduct($order->getProduct())
->setOwner($order->getCustomer()->getCompany())
->setStartDate(new DateTime())
->setExpireDate(new DateTime('+' . $order->getProduct()->getDuration() . ' days'));
$entityManager->persist($abonnement);
}
$entityManager->flush();
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('app/order/edit.html.twig', [
'order' => $order,
'form' => $form,
]);
}
#[Route('/{id}/confirme', name: 'app_order_confirme', methods: ['GET', 'POST'])]
public function confirme(Request $request, Order $order, OrderRepository $orderRepository, CouponRepository $couponRepository): Response
{
$order->setStatus(OrderStatus::CONFIRMED);
$orderRepository->save($order, true);
$coupon = $order->getCoupon();
if ($coupon) {
$coupon->setUsageCount($coupon->getUsageCount() + 1);
$couponRepository->save($coupon, true);
}
$user = $this->getUser();
$company_name = $user->getCompany()->getName();
$this->notificationService->orderConfirmed($company_name, $user, $order);
$this->addFlash('success', $this->translator->trans('Succès !!'));
return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/{id}/pay', name: 'app_order_pay', methods: ['GET', 'POST'])]
public function pay(Request $request, Order $order, OrderRepository $orderRepository, CouponRepository $couponRepository, FileUploader $fileUploader): Response
{
$form = $this->createForm(OrderpaymentType::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$recipe = $form->get('recipe')->getData();
if ($recipe) {
$uploadedFileName = $fileUploader->upload($recipe, 'recipes_dir');
$order->setRecipe($uploadedFileName);
$order->setStatus(OrderStatus::PENDING);
$orderRepository->save($order, true);
$this->addFlash('success', 'Payment whaiting for validation !!');
} else {
$this->addFlash('error', 'An error has been produced !!');
}
return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('app/buy/payment.html.twig', [
'controller_name' => 'BuyController',
'order' => $order,
'form' => $form->createView(),
]);
}
#[Route('/{id}/accept', name: 'app_order_accept', methods: ['GET'])]
public function accept(Request $request, Order $order, OrderRepository $orderRepository, AbonnementRepository $abonnementRepository, FileUploader $fileUploader): Response
{
$order->setStatus(OrderStatus::ACCEPTED);
$order->setIsPayed(true);
$abonnement = new Abonnement();
$abonnement
->setProduct($order->getProduct())
->setOwner($order->getCustomer()->getCompany())
->setStartDate(new DateTime())
->setExpireDate(new DateTime('+' . $order->getProduct()->getDuration() . ' days'));
$orderRepository->save($order, false);
$abonnementRepository->save($abonnement, true);
$abonnement->setOwner($order->getOwner());
$abonnementRepository->save($abonnement, true);
$this->addFlash('success', $this->translator->trans('Votre Licence a été bien activé !!'));
//TODO: send email to customer
return $this->redirectToRoute('app_order_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/{id}', name: 'app_order_delete', methods: ['POST'])]
public function delete(Request $request, Order $order, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete' . $order->getId(), $request->request->get('_token'))) {
try {
$entityManager->remove($order);
$entityManager->flush();
$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_order_index', [], Response::HTTP_SEE_OTHER);
}
}