<?php
namespace App\Controller;
use App\Entity\Stock;
use App\Entity\User;
use App\Form\StockType;
use App\Repository\StockRepository;
use App\Service\InventaireService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/stock")
*/
class StockController extends AbstractController
{
// /**
// * @Route("/", name="app_stock_index", methods={"GET"})
// */
// public function index(StockRepository $stockRepository): Response
// {
// $user = $this->getUser();
// if ($user) {
// return $this->render('stock/index.html.twig', [
// 'stocks' => $stockRepository->findStockByUser($user),
// ]);
// }else{
// return $this->redirectToRoute('app_produit_new', [], Response::HTTP_SEE_OTHER);
// }
// }
// /**
// * @Route("/new", name="app_stock_new", methods={"GET", "POST"})
// */
// public function new(Request $request, StockRepository $stockRepository): Response
// {
// $stock = new Stock();
// $form = $this->createForm(StockType::class, $stock);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// $stockRepository->add($stock);
// return $this->redirectToRoute('app_stock_index', [], Response::HTTP_SEE_OTHER);
// }
// return $this->renderForm('stock/new.html.twig', [
// 'stock' => $stock,
// 'form' => $form,
// ]);
// }
// /**
// * @Route("/{id}", name="app_stock_show", methods={"GET"})
// */
// public function show(Stock $stock): Response
// {
// return $this->render('stock/show.html.twig', [
// 'stock' => $stock,
// ]);
// }
// /**
// * @Route("/{id}/edit", name="app_stock_edit", methods={"GET", "POST"})
// */
// public function edit(Request $request, Stock $stock, StockRepository $stockRepository): Response
// {
// $form = $this->createForm(StockType::class, $stock);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// $stockRepository->add($stock);
// return $this->redirectToRoute('app_stock_index', [], Response::HTTP_SEE_OTHER);
// }
// return $this->renderForm('stock/edit.html.twig', [
// 'stock' => $stock,
// 'form' => $form,
// ]);
// }
// /**
// * @Route("/{id}", name="app_stock_delete", methods={"POST"})
// */
// public function delete(Request $request, Stock $stock, StockRepository $stockRepository): Response
// {
// if ($this->isCsrfTokenValid('delete'.$stock->getId(), $request->request->get('_token'))) {
// $stockRepository->remove($stock);
// }
// return $this->redirectToRoute('app_stock_index', [], Response::HTTP_SEE_OTHER);
// }
/**
* @Route("/", name="app_stock_index", methods={"GET"})
*/
public function index(StockRepository $stockRepository): Response
{
$user = $this->getUser();
if ($user) {
return $this->render('stock/index.html.twig', [
'stocks' => $stockRepository->findStockByUser($user),
]);
} else {
return $this->redirectToRoute('app_produit_new', [], Response::HTTP_SEE_OTHER);
}
}
/**
* @Route("/new", name="app_stock_new", methods={"GET", "POST"})
*/
public function new(Request $request, StockRepository $stockRepository): Response
{
$stock = new Stock();
$form = $this->createForm(StockType::class, $stock);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$stockRepository->add($stock);
return $this->redirectToRoute('app_stock_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('stock/new.html.twig', [
'stock' => $stock,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_stock_show", methods={"GET"})
*/
public function show(Stock $stock): Response
{
return $this->render('stock/show.html.twig', [
'stock' => $stock,
]);
}
/**
* @Route("/{id}/edit", name="app_stock_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, Stock $stock, StockRepository $stockRepository, InventaireService $inventaireService): Response
{
$quantiteAvant = $stock->getQuantite();
$form = $this->createForm(StockType::class, $stock);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$stockRepository->add($stock);
$user = $this->getUser();
if ($user instanceof User) {
$inventaireService->enregistrerModificationQuantite($user, $stock, $quantiteAvant, $stock->getQuantite());
}
return $this->redirectToRoute('app_stock_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('stock/edit.html.twig', [
'stock' => $stock,
'form' => $form,
]);
}
/**
* Vérifier si un stock peut être supprimé (AJAX)
* @Route("/check-delete/{id}", name="app_stock_check_delete", methods={"GET"}, options={"expose"=true})
*/
public function checkDelete(int $id, StockRepository $stockRepository): JsonResponse
{
$result = $stockRepository->canBeDeleted($id);
if ($result['stock'] && $result['stock']->getIdProduit()) {
// Vérification supplémentaire si nécessaire
}
return $this->json([
'success' => true,
'canDelete' => $result['canDelete'],
'message' => $result['message'],
'stockName' => $result['produit'] ?? 'Stock #' . $id,
'reference' => $result['produit'] ?? 'N/A'
]);
}
/**
* Supprimer un stock
* @Route("/{id}/delete", name="app_stock_delete", methods={"POST"}, options={"expose"=true})
*/
public function delete(Request $request, Stock $stock, StockRepository $stockRepository): JsonResponse
{
// Token CSRF
$token = $request->request->get('_token');
if (!$this->isCsrfTokenValid('delete_stock', $token)) {
return $this->json([
'success' => false,
'message' => 'Token CSRF invalide'
], 403);
}
// Vérification des associations via le repository
$result = $stockRepository->canBeDeleted($stock->getId());
if (!$result['canDelete']) {
return $this->json([
'success' => false,
'message' => $result['message']
], 400);
}
try {
$stockRepository->remove($stock, true);
return $this->json([
'success' => true,
'message' => 'Stock supprimé avec succès'
]);
} catch (\Exception $e) {
return $this->json([
'success' => false,
'message' => 'Erreur lors de la suppression : ' . $e->getMessage()
], 500);
}
}
}