<?php
namespace App\Controller;
use App\Entity\LocalAgence;
use App\Entity\Mouvement;
use App\Entity\Stock;
use App\Form\Type\MouvementFormType;
use App\Manager\RoleManager;
use App\Repository\MouvementRepository;
use App\Repository\StockRepository;
use Doctrine\ORM\EntityManager;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class MouvementController extends AbstractController
{
public function index(MouvementRepository $mouvementRepository): Response
{
return $this->render('mouvement/index.html.twig', [
'mouvements' => $mouvementRepository->findAll(),
]);
}
private function validateStock(Stock $stock, Mouvement $mouvement)
{
$em = $this->container->get('doctrine')->getManager();
$stock->setAgence($mouvement->getAgenceArrivee());
$stock->setLocal(null);
$stock->setNanoReseau(null);
$stock->setClient(null);
$stock->setUtilisateur(null);
if (!is_null($mouvement->getLocalArrivee())) {
$stock->setLocal($mouvement->getLocalArrivee());
}
if (!is_null($mouvement->getNanoReseauArrivee())) {
$stock->setNanoReseau($mouvement->getNanoReseauArrivee());
}
if (!is_null($mouvement->getClientArrivee())) {
$stock->setClient($mouvement->getClientArrivee());
}
if (!is_null($mouvement->getUserArrivee())) {
$stock->setUtilisateur($mouvement->getUserArrivee());
}
$em->persist($stock);
return;
}
public function new(Request $request, MouvementRepository $mouvementRepository, TranslatorInterface $translator, StockRepository $stockRepository, UserPasswordHasherInterface $passwordHasher): Response
{
$mouvement = new Mouvement();
$form = $this->createForm(MouvementFormType::class, $mouvement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$btn = $request->request->get('btn_submit');
if ($btn == '1') {
if (!$passwordHasher->isPasswordValid($mouvement->getGestionnaire(), $mouvement->getCodeSecret())) {
// Password does not match, handle the error (e.g., add a flash message, return an error response)
$this->addFlash('error', 'Code secret incorrect.');
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translator->trans("Création d'un mouvement"),
]);
}
$mouvement->setValide(true);
}
// ⚠️ Validation métier minimale côté serveur
foreach ($mouvement->getMaterielMouvements() as $mm) {
$stock = $mm->getStock();
if (!$stock) {
$this->addFlash('error', 'Stock manquant pour un matériel.');
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translator->trans("Création d'un mouvement"),
]);
}
$qteDispo = $stockRepository->getDisponibleForStockId($stock->getId()); // implémentez une requête rapide
// if ($mm->getQte() > $qteDispo) {
// $this->addFlash('error', sprintf('Quantité demandée (%d) > disponible (%d) pour %s', $mm->getQte(), $qteDispo, $stock->getId()));
// return $this->renderForm('mouvement/form.html.twig', [
// 'mouvement' => $mouvement,
// 'form' => $form,
// 'pageTitle' => $translator->trans("Création d'un mouvement"),
// ]);
// }
if ($request->request->get('btn_submit') == 1) {
$modele = $mm->getModele();
$identifiants = $mm->getIdentifiants();
if (!$modele || !$modele->getProduit()->getCategorie()->isIndividuel()) {
$stocks = $stockRepository->findBy([
'modele' => $modele
]);
for ($i = 0; $i < $mm->getQte(); $i++) {
if (isset($stocks[$i])) {
$stock = $stocks[$i];
}
}
$this->validateStock($stock, $mouvement);
} else {
foreach ($identifiants as $key => $identifiant) {
$stock = $stockRepository->findOneBy([
'identifiant' => $identifiant
]);
if ($stock) {
$this->validateStock($stock, $mouvement);
}
}
}
}
}
$mouvementRepository->add($mouvement);
return $this->redirectToRoute('app.mouvement.list');
}
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translator->trans("Création d'un mouvement"),
]);
}
public function new_old(Request $request, MouvementRepository $mouvementRepository, TranslatorInterface $translatorInterface, StockRepository $stockRepository): Response
{
$mouvement = new Mouvement();
$stock = null;
$stockId = $request->query->get('stock_id');
if ($stockId) {
$stock = $stockRepository->find($stockId);
}
$form = $this->createForm(MouvementFormType::class, $mouvement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->container->get('doctrine')->getManager();
$materiels = $form->get('materielMouvements')->getData();
foreach ($materiels as $mat) {
$mat->setModele($mat->getStock()->getModele());
$em->persist($mat);
if ($request->request->get('btn_submit') == 1) {
$modele = $mat->getModele();
$identifiant = $mat->getIdentifiant();
if (is_null($identifiant)) {
$stocks = $stockRepository->findBy([
'modele' => $modele
]);
for ($i = 0; $i < $mat->getQte(); $i++) {
$stock = $stocks[$i];
}
$this->validateStock($stock, $mouvement);
} else {
$stock = $stockRepository->findOneBy([
'identifiant' => $identifiant
]);
if ($stock) {
$this->validateStock($stock, $mouvement);
}
}
}
}
if ($request->request->get('btn_submit') == 1) {
$mouvement->setValide(true);
}
// dd($materiels);
$mouvementRepository->add($mouvement);
return $this->redirectToRoute('app.mouvement.list', [], Response::HTTP_SEE_OTHER);
} else {
// dump((string) $form->getErrors(true, false));die;
}
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translatorInterface->trans("Création d'un mouvement"),
]);
}
public function show(Mouvement $mouvement): Response
{
return $this->render('mouvement/show.html.twig', [
'mouvement' => $mouvement,
]);
}
public function edit(Request $request, Mouvement $mouvement, MouvementRepository $mouvementRepository, TranslatorInterface $translatorInterface, StockRepository $stockRepository, UserPasswordHasherInterface $passwordHasher): Response
{
$form = $this->createForm(MouvementFormType::class, $mouvement);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && !$mouvement->getValide()) {
$btn = $request->request->get('btn_submit');
if ($btn == '1') {
if (!$passwordHasher->isPasswordValid($mouvement->getGestionnaire(), $mouvement->getCodeSecret())) {
// Password does not match, handle the error (e.g., add a flash message, return an error response)
$this->addFlash('error', 'Code secret incorrect.');
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translatorInterface->trans("Création d'un mouvement"),
]);
}
$mouvement->setValide(true);
}
// ⚠️ Validation métier minimale côté serveur
foreach ($mouvement->getMaterielMouvements() as $mm) {
$stock = $mm->getStock();
if (!$stock) {
$this->addFlash('error', 'Stock manquant pour un matériel.');
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translatorInterface->trans("Création d'un mouvement"),
]);
}
$qteDispo = $stockRepository->getDisponibleForStockId($stock->getId()); // implémentez une requête rapide
// if ($mm->getQte() > $qteDispo) {
// $this->addFlash('error', sprintf('Quantité demandée (%d) > disponible (%d) pour %s', $mm->getQte(), $qteDispo, $stock->getId()));
// return $this->renderForm('mouvement/form.html.twig', [
// 'mouvement' => $mouvement,
// 'form' => $form,
// 'pageTitle' => $translatorInterface->trans("Création d'un mouvement"),
// ]);
// }
if ($request->request->get('btn_submit') == 1) {
$modele = $mm->getModele();
$identifiants = $mm->getIdentifiants();
if (!$modele->getProduit()->getCategorie()->isIndividuel()) {
$stocks = $stockRepository->findBy([
'modele' => $modele
]);
for ($i = 0; $i < $mm->getQte(); $i++) {
$stock = $stocks[$i];
}
$this->validateStock($stock, $mouvement);
} else {
foreach ($identifiants as $key => $identifiant) {
$stock = $stockRepository->findOneBy([
'identifiant' => $identifiant
]);
if ($stock) {
$this->validateStock($stock, $mouvement);
}
}
}
}
}
$mouvementRepository->add($mouvement);
return $this->redirectToRoute('app.mouvement.list', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('mouvement/form.html.twig', [
'mouvement' => $mouvement,
'form' => $form,
'pageTitle' => $translatorInterface->trans("Création d'un mouvement"),
]);
}
public function delete(Request $request, Mouvement $item, MouvementRepository $mouvementRepository, TranslatorInterface $trans): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$this->denyAccessUnlessGranted(RoleManager::ROLE_SUPER_ADMIN, $this->getUser());
try {
$em = $this->container->get('doctrine')->getManager();
$materiels = $item->getMaterielMouvements();
foreach ($materiels as $mat) {
$item->removeMaterielMouvement($mat);
$mat->setMouvement(null);
$em->persist($mat);
}
$mouvementRepository->remove($item);
$em->flush();
$message = $trans->trans('Successfully deleted');
$titre = $trans->trans('Deleted');
$classe = 'success';
} catch (\Exception $e) {
$message = $e->getMessage();
$titre = 'Erreur';
$classe = 'warning';
}
return new JsonResponse([
'message' => $message,
'titre' => $titre,
'classe' => $classe
]);
}
}