<?php
namespace App\Controller;
use App\Entity\CatalogueAsset;
use App\Entity\FamilleJ;
use App\Entity\CategoryJ;
use App\Entity\Catalogue;
use App\Form\CatalogueType;
use App\Entity\CategoryCatalogue;
use App\Form\CategoryCatalogueType;
use App\Entity\SousCategoryCatalogue;
use App\Form\SousCategoryCatalogueType;
use App\Service\CatalogueService;
use App\Service\EmailService;
use Twig\Environment;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Service\TranslationService;
use App\Repository\CatalogueRepository;
class CatalogueController extends AbstractController
{
// Le constructeur prend tous les services en paramètre
public function __construct(
private EntityManagerInterface $em,
private Security $security,
private EmailService $emailService,
private Environment $twig,
private CatalogueService $catalogueService,
private readonly TranslationService $translationService,
private readonly CatalogueRepository $catalogueRepo,
) {}
public function gestionCatalog(Request $request): Response
{
$catalogue = new Catalogue();
$page = $request->query->getInt('page', 1);
$limit = 10;
$search = $request->query->get('search');
$data = $this->catalogueService->getListeCatalogue($page, $limit, $search);
//$data = $this->catalogueService->getListeCatalogue();
$catalogs = $data['catalogs'];
$pagesCount = $data['pagesCount'];
$currentPage = $data['currentPage'];
$searchTerm = $data['searchTerm'];
$form = $this->createForm(CatalogueType::class, $catalogue);
return $this->render('CatalogueVue/catalogue.html.twig', [
'form' => $form->createView(),
'catalogs' => $catalogs,
'pagesCount' => $pagesCount,
'currentPage' => $currentPage,
'searchTerm' => $searchTerm,
]);
}
public function mstopescreerarticle(Request $request): Response {
$catalogue = new Catalogue();
$categarticle=new CategoryCatalogue;
$souscategory=new SousCategoryCatalogue;
$data = $this->catalogueService->getIndexCreerarticle();
$categorys = $data['categorys'];
$souscategorys = $data['souscategorys'];
$form = $this->createForm(CatalogueType::class, $catalogue);
$form1 = $this->createForm(CategoryCatalogueType::class, $categarticle);
$form2 = $this->createForm(SousCategoryCatalogueType::class, $souscategory);
$form->handleRequest($request);
if ($form->isSubmitted() ) {
$type=$form->get('typeArticle')->getData();
if($type=="ASSET"){
$assetArt=new CatalogueAsset;
$assetArt->setCatalogue($catalogue);
$assetArt->setNumeroArticleAsset(1);
$this->em->persist($assetArt);
}
$this->em->persist($catalogue);
//vrif la categorie de l'article type stock
$categ=$catalogue->getCategorycatalogue();
if( $type=="STOCK"){
$categ->setCode(1);
}else $categ->setCode(0);
$this->em->persist($categ);
$this->em->flush();
// ── Traduction automatique FR → EN ────────────────────────────
$this->translationService->traduire(
entityType: 'Catalogue',
entityId: $catalogue->getId(),
fields: [
'designation' => $catalogue->getDesignation() ?? '',
'description' => $catalogue->getDescription() ?? '',
'unite' => $catalogue->getUnite() ?? '',
]
);
return $this->redirectToRoute('mstopes_gestion_catalog');
}
return $this->render('CatalogueVue/mstopescreerarticle.html.twig', [
'souscategorys' => $souscategorys,
'categorys' => $categorys,
'form' => $form->createView(),
'form1' => $form1->createView(),
'form2' => $form2->createView(),
]);
}
public function listcategoryj( Request $request): JsonResponse
{
// Tableau de réponse
$listnum4 = [];
// Récupérer l'id envoyé
$id = $request->request->get('id');
// Récupérer la famille asset
$famille = $this->em->getRepository(FamilleJ::class)->find($id);
// Récupérer les categ asset
$categs = $this->em->getRepository(CategoryJ::class) ->findByFamille($famille);
// Valeur par défaut
$listnum4[0] = 'choisir';
// Remplir le tableau
foreach ($categs as $dem) {
$listnum4[$dem->getId()] = $dem->getLibele().'-'.$dem->getNomequip();
}
// Retour JSON
return new JsonResponse($listnum4);
}
// ─────────────────────────────────────────────────────────────────
// GET : charge le formulaire dans le modal
// URL : /catalogue/{id}/edit
// ─────────────────────────────────────────────────────────────────
#[Route('/{id}/edit', name: 'mstopes_modifier_article', methods: ['GET', 'POST'])]
public function edit(int $id, Request $request): Response
{
$catalogue = $this->catalogueRepo->find($id);
if (!$catalogue) {
return new Response(
'<div class="alert alert-danger m-3">Article introuvable.</div>',
404
);
}
$form = $this->createForm(CatalogueType::class, $catalogue, [
'action' => $this->generateUrl('mstopes_modifier_article', ['id' => $id]),
'method' => 'POST',
]);
$form->handleRequest($request);
if ($form->isSubmitted() ) {
// Mise à jour date de modification
$catalogue->setDateModif(new \DateTimeImmutable());
// Calcul prix TTC si prixHT et taxe sont renseignés
$prixHT = (float)$catalogue->getPrixHT();
$taxe = (float)($catalogue->getTaxe() ?? 0);
if ($prixHT > 0) {
$catalogue->setPrix((string)round($prixHT * (1 + $taxe / 100), 2));
}
//vrif la categorie de l'article type stock
$type = $catalogue->getTypeArticle();
$categ=$catalogue->getCategorycatalogue();
if( $type=="STOCK"){
$categ->setCode(1);
}else $categ->setCode(0);
// Sauvegarde en base
$this->em->persist($catalogue);
$this->em->persist($categ);
$this->em->flush();
// ── Traduction automatique FR → EN ────────────────────────
$this->translationService->traduire(
entityType: 'Catalogue',
entityId: $catalogue->getId(),
fields: [
'designation' => $catalogue->getDesignation() ?? '',
'description' => $catalogue->getDescription() ?? '',
'unite' => $catalogue->getUnite() ?? '',
'typeMRP' => $catalogue->getTypeMRP() ?? '',
]
);
$this->addFlash('success', sprintf(
'Article "%s" modifié avec succès.',
$catalogue->getDesignation()
));
return $this->redirectToRoute('mstopes_gestion_catalog');
}
return $this->render('CatalogueVue/_modal_edit.html.twig', [
'catalogue' => $catalogue,
'form' => $form->createView(),
]);
}
}