<?php
namespace App\Controller;
use App\Entity\MarchePublic;
use App\Form\MarchePublic\CreateType;
use App\Form\MarchePublic\EditType;
use App\Repository\MarchePublicRepository;
use App\Repository\UserRepository;
use App\Service\Converter\ConvertDataToJsonFile;
use App\Service\DataGouvApi\SendToApi;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class MarchePublicController extends AbstractController
{
public function __construct(
private ConvertDataToJsonFile $jsonConverter,
private SendToApi $sendToApi,
){}
#[Route('app/marche_public/creer', name: 'app_marche_public_create', methods: ['GET', 'POST'])]
public function create(Request $request, EntityManagerInterface $entityManager, UserRepository $userRepository): Response
{
$user = $userRepository->findOneBy(['userName'=>$this->getUser()->getUserIdentifier()]);
if(empty($user->getSiret()) || empty($user->getName())){
$this->addFlash('error', 'Merci de remplir vos données professionnelles');
return $this->redirectToRoute('user_info_edit');
}
$marchePublic = new MarchePublic();
$form = $this->createForm(CreateType::class, $marchePublic,[
'attr'=>['id'=>'marche_public_form']
]);
$form->handleRequest($request);
if ($form->isSubmitted()){
if($form->isValid()) {
foreach ($marchePublic->getTitulaire() as $titulaire) {
$titulaire->setMarchePublic($marchePublic);
}
foreach ($marchePublic->getSousTraitance() as $sousTraitance) {
$sousTraitance->setMarchePublic($marchePublic);
}
foreach ($marchePublic->getModificationActeSousTraitance() as $modificationActeSousTraitance) {
$modificationActeSousTraitance->setMarchePublic($marchePublic);
}
foreach ($marchePublic->getModification() as $modification) {
$modification->setMarchePublic($marchePublic);
foreach ($modification->getTitulaire() as $modificationTitulaire) {
$modificationTitulaire->setModification($modification);
}
}
$marchePublic->setUser($this->getUser());
$entityManager->persist($marchePublic);
$entityManager->flush();
$jsonData = $this->jsonConverter->convertMarchePublicToJsonData($marchePublic);
$filePath = $this->jsonConverter->convertJsonDataToJsonFile($jsonData, $marchePublic->getId());
$apiId=$this->sendToApi->sendFileToApiAndGetRemoteId($filePath);
$marchePublic->setApiId($apiId);
$entityManager->persist($marchePublic);
$entityManager->flush();
$this->addFlash('success', 'Le marché public a bien été publié sur data.gouv.fr');
return $this->redirectToRoute('front_marche_public_show',[
'id'=>$marchePublic->getId()
]);
}
}
return $this->render('marche_public/create.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/app/marche_public/edit/{id}', name: 'app_marche_public_edit')]
public function edit(int $id, Request $request, MarchePublicRepository $mpRepository, EntityManagerInterface $entityManager) : Response
{
$mp = $mpRepository->find($id);
if(is_null($mp)){
$this->addFlash('error', 'Cette ressource n\'existe pas');
return $this->redirectToRoute('app_show_all_marches_and_concessions');
}
$form = $this->createForm(EditType::class, $mp, [
'attr' => ['id' => 'marche_public_form']
]);
if($this->getUser()!= $mp->getUser()){
$this->addFlash('error', 'Vous n\'avez pas accès à cette ressource');
return $this->redirectToRoute('app_show_all_marches_and_concessions');
}
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
foreach ($mp->getTitulaire() as $titulaire) {
$titulaire->setMarchePublic($mp);
}
foreach ($mp->getSousTraitance() as $sousTraitance) {
$sousTraitance->setMarchePublic($mp);
}
foreach ($mp->getModificationActeSousTraitance() as $item) {
$item->setMarchePublic($mp);
$entityManager->persist($item);
}
foreach ($mp->getModification() as $modification) {
$modification->setMarchePublic($mp);
$entityManager->persist($modification);
foreach ($modification->getTitulaire() as $titulaire) {
$titulaire->setModification($modification);
$entityManager->persist($titulaire);
}
}
$entityManager->flush();
$entityManager->refresh($mp);
$jsonData =$this->jsonConverter->convertMarchePublicToJsonData($mp);
$filePath = $this->jsonConverter->convertJsonDataToJsonFile($jsonData, $mp->getId(), $mp->getDateMade());
$this->sendToApi->updateDataSentToApi($filePath, $mp);
$this->addFlash('success', 'Les données ont bien été modifiées sur data.gouv.fr');
return $this->redirectToRoute('front_marche_public_show',[
'id'=>$mp->getId()
]);
}
return $this->render('marche_public/edit.html.twig',[
'mp'=>$mp,
'form'=>$form->createView()
]);
}
#[Route('/marche_public/voir/{id?1}', name: 'front_marche_public_show', methods: ['GET'])]
public function show(int $id, MarchePublicRepository $mpRepository) : Response
{
$marchePublic = $mpRepository->find($id);
return $this->render('marche_public/show.html.twig',[
'mp'=>$marchePublic
]);
}
}