<?php
namespace App\Controller\Admin;
use App\Entity\Missions;
use App\Form\StatutType;
use App\Form\MissionType;
use App\Entity\Competences;
use App\Form\CompetencesType;
use App\Repository\MissionsRepository;
use App\Repository\ReponsesAORepository;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class MissionController extends AbstractController
{
#[Route('/admin/mission', name: 'app_admin_mission')]
public function listeMission(MissionsRepository $repo, PaginatorInterface $paginator, Request $request): Response
{
// Récupération des critères de filtrage depuis la requête
$titre = $request->query->get('titre');
$budget_min = $request->query->get('budget_min');
$budget_max = $request->query->get('budget_max');
$ville = $request->query->get('ville');
$duree = $request->query->get('duree');
$entrepriseConcernee = $request->query->get('entreprise_concernee');
// Création des critères de filtrage
$criteria = [];
if ($titre) {
$criteria['titre'] = $titre;
}
if ($budget_min) {
$criteria['budget_min'] = $budget_min;
}
if ($budget_max) {
$criteria['budget_max'] = $budget_max;
}
if ($ville) {
$criteria['ville'] = $ville;
}
if ($duree) {
$criteria['duree'] = $duree;
}
if ($entrepriseConcernee) { // Vérification et ajout du nouveau critère
$criteria['entreprise_concernee'] = $entrepriseConcernee;
}
// Pagination des résultats filtrés
$queryBuilder = $repo->findByCriteria($criteria);
$Missions = $paginator->paginate(
$queryBuilder,
$request->query->getInt('page', 1), // Numéro de page
16 // Limite par page
);
return $this->render('admin/mission/listeMission.html.twig',
[
'lesMissions'=>$Missions
]);
}
#[Route('/admin/mission/add', name: 'app_admin_mission_add', methods: ['POST','GET'] )]
public function ajoutMission(Request $request, EntityManagerInterface $manager,Security $security): Response
{
$mission = new Missions();
$user = $security->getUser();
$form = $this->createForm(MissionType::class, $mission, [
'user' => $user,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Générer une valeur auto-incrémentée pour `reference_mission`
$lastMission = $manager->getRepository(Missions::class)->findOneBy([], ['reference_mission' => 'desc']);
$lastReference = $lastMission ? $lastMission->getReferenceMission() : 0;
$mission->setReferenceMission($lastReference + 1);
//Persister les compétences
foreach ($mission->getCompetence() as $competence) {
$manager->persist($competence);
}
$manager->persist($mission);
$manager->flush();
return $this->redirectToRoute('app_admin_mission');
}
return $this->render('admin/mission/formAjoutMission.html.twig', [
'formMissions' => $form->createView(),
]);
}
#[Route('/admin/mission/suppr/{id}', name: 'app_admin_mission_suppr', methods: ['GET'])]
public function supprMission(
Missions $mission,
EntityManagerInterface $manager,
ReponsesAORepository $reponsesAORepository
): Response {
// Récupérer toutes les réponses associées à la mission
$reponsesAOs = $reponsesAORepository->findBy(['mission' => $mission]);
// Supprimer chaque réponse associée
foreach ($reponsesAOs as $reponseAO) {
$manager->remove($reponseAO);
}
// Supprimer la mission
$manager->remove($mission);
$manager->flush();
return $this->redirectToRoute('app_admin_mission');
}
#[Route('/admin/mission/{id}', name: 'app_admin_mission_details')]
public function detailMission(Missions $mission, ReponsesAORepository $reponsesAORepository, Request $request, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(StatutType::class, $mission);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($mission);
$entityManager->flush();
$this->addFlash('success', 'Mission mise à jour avec succès.');
return $this->redirectToRoute('app_admin_mission_details', ['id' => $mission->getId()]);
}
// Récupère toutes les réponses d'appel d'offres pour cette mission
$reponsesAO = $reponsesAORepository->findByMission($mission->getId());
// Optionnel : Extraire les consultants associés à ces réponses
$consultants = array_map(fn($reponse) => $reponse->getConsultant(), $reponsesAO);
$competence = $mission->getCompetence();
return $this->render('admin/mission/detailMission.html.twig', [
'laMission' => $mission,
'reponsesAO' => $reponsesAO,
'consultants' => $consultants,
'form' => $form->createView(),
'competences' => $competence,
]);
}
#[Route('/admin/mission/modif/{id}', name: 'app_admin_mission_modif', methods: ['POST','GET'] )]
public function modifMission(Missions $mission, Request $request, EntityManagerInterface $manager): Response
{
$form=$this->createForm(MissionType::class,$mission);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
// Dans votre contrôleur ou service
foreach ($mission->getCompetence() as $competence) {
$manager->persist($competence);
}
$manager->persist($mission);
$manager->flush();
return $this->redirectToRoute('app_admin_mission');
}
return $this->render('admin/mission/formModifMission.html.twig',
[
'formMissions'=>$form->createView()
]);
}
}