<?php
declare(strict_types=1);
namespace App\Controller\Blo;
use App\Entity\Blo\Order;
use App\Repository\Blo\OrderRepository;
use App\Service\Blo\CountriesHelper;
use App\Service\Blo\PaymentService;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/orders')]
class OrderController extends AbstractController
{
public function __construct(
private readonly OrderRepository $orderRepository,
private readonly PaginatorInterface $paginator,
private readonly PaymentService $paymentService,
) {
}
#[Route('', name: 'blo_orders', methods: ['GET'])]
public function index(Request $request): Response
{
$this->denyAccessUnlessGranted('ROLE_USER');
$user = $this->getUser();
$orders = $this->paginator->paginate(
$this->orderRepository->createQueryBuilder('o')
->where('o.customer = :user')
->setParameter('user', $user)
->orderBy('o.createdAt', 'DESC'),
$request->query->getInt('page', 1),
20
);
return $this->render('blo/order/index.html.twig', [
'orders' => $orders,
]);
}
#[Route('/{id}', name: 'blo_order_show', methods: ['GET'], requirements: ['id' => '\d+'])]
public function show(Order $order): Response
{
$this->denyAccessUnlessGranted('blo_order_view', $order);
return $this->render('blo/order/show.html.twig', [
'order' => $order,
'countryLabel' => CountriesHelper::getLabel($order->getShippingCountry()),
'paymentMethods' => $this->paymentService->getRegistry()->getAvailableGateways(),
]);
}
#[Route('/{id}/pay', name: 'blo_order_pay', methods: ['GET', 'POST'], requirements: ['id' => '\d+'])]
public function pay(Order $order, Request $request): Response
{
$this->denyAccessUnlessGranted('blo_order_view', $order);
if ($order->getPaymentStatus() === Order::PAYMENT_PAID) {
$this->addFlash('info', 'Cette commande est déjà payée.');
return $this->redirectToRoute('blo_order_show', ['id' => $order->getId()]);
}
if ($request->isMethod('POST')) {
if (!$this->isCsrfTokenValid('blo_order_pay_' . $order->getId(), $request->request->get('_csrf_token'))) {
$this->addFlash('error', 'Jeton de sécurité invalide.');
return $this->redirectToRoute('blo_order_pay', ['id' => $order->getId()]);
}
$method = $request->request->get('payment_method', 'dummy');
$result = $this->paymentService->initPayment($order, $method);
if ($result->success && $result->redirectUrl) {
return $this->redirect($result->redirectUrl);
}
if ($result->success && $result->clientSecret && $result->publishableKey) {
$confirmUrl = $this->generateUrl('blo_checkout_confirm', ['ref' => $result->paymentRef], \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL);
return $this->render('blo/order/pay_stripe.html.twig', [
'order' => $order,
'stripeClientSecret' => $result->clientSecret,
'stripePublishableKey' => $result->publishableKey,
'confirmUrl' => $confirmUrl,
]);
}
$this->addFlash('error', $result->errorMessage ?? 'Impossible d\'initier le paiement.');
return $this->redirectToRoute('blo_order_pay', ['id' => $order->getId()]);
}
return $this->render('blo/order/pay.html.twig', [
'order' => $order,
'paymentMethods' => $this->paymentService->getRegistry()->getAvailableGateways(),
]);
}
}