<?php
namespace App\Controller\Backend;
use App\Entity\EntityStatus;
use App\Entity\Order;
use App\Form\Backend\ChangeOrderStatusType;
use App\Service\OrderPdfExport;
use App\Service\SaleService;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/admin')]
class OrderController extends AbstractController
{
#[Route('/orders/{id}/show', name: 'show_order')]
#[IsGranted('ROLE_USER', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function show(Order $order, Request $request): Response
{
$formChangeStatus = $this->createForm(ChangeOrderStatusType::class, $order, [
'action' => $this->generateUrl('change_status_order', ['id' => $order->getId()])
]);
return $this->renderForm('backend/order/show.html.twig', [
'controller_name' => 'OrderController',
'menu' => 'order',
'order' => $order,
'formChangeStatus' => $formChangeStatus
]);
}
#[Route('/orders/{id}/change-status', name: 'change_status_order')]
#[IsGranted('ROLE_UPDATE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function edit(Order $order, Request $request, EntityManagerInterface $em, SaleService $saleService): RedirectResponse
{
$formChangeStatus = $this->createForm(ChangeOrderStatusType::class, $order);
$formChangeStatus->handleRequest($request);
if ($formChangeStatus->isSubmitted() && $formChangeStatus->isValid()) {
if ($order->getStatus() >= Order::STATUS_PAID && $order->getInvoiceNumber() === null) {
$order
->setInvoiceNumber($saleService->generateInvoiceNumber())
->setInvoiceDate(new DateTimeImmutable())
;
}
$em->persist($order);
$em->flush();
$this->addFlash(
'success',
'Statut mis à jour avec succès'
);
}
return $this->redirectToRoute('show_order', ['id' => $order->getId()]);
}
#[Route('/orders/{id}/download-order', name: 'download_order', methods: ['GET'])]
#[IsGranted('ROLE_USER', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function downloadOrder(Order $order, OrderPdfExport $orderPdfExport): Response
{
$pdfPath = $orderPdfExport->exportOrder($order);
return $this->file($pdfPath, basename($pdfPath));
}
#[Route('/orders/{id}/download-invoice', name: 'download_invoice', methods: ['GET'])]
#[IsGranted('ROLE_USER', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function downloadInvoice(Order $order, OrderPdfExport $orderPdfExport): Response
{
$pdfPath = $orderPdfExport->exportInvoice($order);
return $this->file($pdfPath, basename($pdfPath));
}
#[Route(path: '/orders/{id}/archive', name: 'archive_order', methods: ['DELETE', 'POST'])]
#[IsGranted('ROLE_DELETE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function archive(Order $order, Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
if ($this->isCsrfTokenValid('order_'.$order->getId(), $data['_token'])) {
$order->setStatus(EntityStatus::STATUS_ARCHIVED);
$cotisation = $order->getCotisation();
if($cotisation && $cotisation->getAssocietedOrder() && $cotisation->getAssocietedOrder()->getId() === $order->getId()){
$cotisation->setStatus(EntityStatus::STATUS_ARCHIVED);
$em->persist($cotisation);
}
$em->persist($order);
$em->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Archivage effectuée avec succès'
]);
}
return new JsonResponse([
'status' => 'nok',
'message' => 'Erreur lors de l\'archivage. Merci de contacter un administrateur.'
]);
}
}