<?php
namespace App\Controller;
use App\Entity\Project;
use App\Entity\QuestionnaireResponse;
use App\Entity\SignatureCharte;
use App\Form\ProjectType;
use App\Repository\AppelAProjetRepository;
use App\Repository\ProjectRepository;
use App\Repository\QuestionnaireRepository;
use App\Repository\QuestionnaireResponseRepository;
use App\Repository\SignatureCharteRepository;
use App\Repository\UserProjectRepository;
use App\Service\ProjectNumberService;
use App\Service\ProjectUserService;
use App\Service\QuestionnaireHandlerService;
use App\Twig\QuestionnaireExtension;
use DateTime;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Snappy\Pdf;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/project")
*/
class ProjectController extends AbstractController
{
/**
* @Route("/{id}", name="project_show", methods={"GET"})
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @return Response
*/
public function show(Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, UserProjectRepository $userProjectRepository): Response
{
$this->denyAccessUnlessGranted('VIEW', $project);
// récupération des formulaires associés à ce projet
$questionnairesResponses = $questionnaireResponseRepository->findByProject($project);
// récupération des personnes associées
$userProject = $userProjectRepository->findOrderedByProject($project);
return $this->render('project/show.html.twig', [
'project' => $project,
'questionnairesResponses' => $questionnairesResponses,
'userProjects' => $userProject,
]);
}
/**
* @Route("/{id}/export", name="project_export", methods={"GET"})
* @param Project $project
* @return void
*/
public function export(Project $project, AppelAProjetRepository $appelAProjetRepository, QuestionnaireRepository $questionnaireRepository, ProjectRepository $projectRepository, Pdf $knpSnappy, QuestionnaireExtension $twig)
{
$this->denyAccessUnlessGranted('VIEW', $project);
$appelAProjet = $appelAProjetRepository->find($project->getAppelAProjet());
if ($appelAProjet->getQuestionnaireRapport()) {
$arrayId[] = $appelAProjet->getQuestionnaireRapport()->getId();
}if ($appelAProjet->getQuestionnaireDocLi()) {
$arrayId[] = $appelAProjet->getQuestionnaireDocLi()->getId();
}if ($appelAProjet->getQuestionnaireEvalCoordo()) {
$arrayId[] = $appelAProjet->getQuestionnaireEvalCoordo()->getId();
}if ($appelAProjet->getQuestionnaireEvalThema()) {
$arrayId[] = $appelAProjet->getQuestionnaireEvalThema()->getId();
}if ($appelAProjet->getQuestionnaireLi()) {
$arrayId[] = $appelAProjet->getQuestionnaireLi()->getId();
}if ($appelAProjet->getQuestionnaireDc()) {
$arrayId[] = $appelAProjet->getQuestionnaireDc()->getId();
}if ($appelAProjet->getQuestionnaireExpert()) {
$arrayId[] = $appelAProjet->getQuestionnaireExpert()->getId();
}if ($appelAProjet->getQuestionnairePreeval()) {
$arrayId[] = $appelAProjet->getQuestionnairePreeval()->getId();
}
$questionnaires = $questionnaireRepository->findForZip($arrayId);
$project = $projectRepository->findOneForZip($project);
if (!is_dir('Export_ZIP')) {
mkdir('Export_ZIP');
}
$pathProject = str_replace(' ', '', 'Export_ZIP/' . $project->getNumber());
$pathZip = str_replace(' ', '', $project->getNumber());
$zipName = str_replace(' ', '', $project->getNumber());
if ($project->getPorteur()) {
$pathProject .= '_' . $project->getPorteur();
$zipName .= '_' . $project->getPorteur();
$pathZip .= '_' . $project->getPorteur();
}
if ($project->getAcronyme()) {
$pathProject .= '_' . $project->getAcronyme();
$zipName .= '_' . $project->getAcronyme();
$pathZip .= '_' . $project->getAcronyme();
}
$zipName .= ".zip";
if (function_exists('iconv')) {
$pathProject = iconv('utf-8', 'us-ascii//TRANSLIT', $pathProject);
$zipName = iconv('utf-8', 'us-ascii//TRANSLIT', $zipName);
$pathZip = iconv('utf-8', 'us-ascii//TRANSLIT', $pathZip);
}
if (!is_dir($pathProject)) {
mkdir($pathProject);
}
$zip = new \ZipArchive();
$zip->open('Export_ZIP/'.$zipName, \ZipArchive::CREATE);
$filenamePrefix = $project->getNumber();
if ($project->getPorteur()) {
$filenamePrefix .= '_' . $project->getPorteur();
}
if ($project->getAcronyme()) {
$filenamePrefix .= '_' . $project->getAcronyme();
}
foreach ($project->getQuestionnaireResponses() as $questionnaireResponse) {
if ($this->isGranted('VIEW', $questionnaireResponse)) {
$filename = str_replace(' ', '', $questionnaireResponse->getQuestionnaireType() . '_' . $filenamePrefix . '_' . $questionnaireResponse->getId() . '.pdf');
if (function_exists('iconv')) {
$filename = iconv('utf-8', 'us-ascii//TRANSLIT', $filename);
}
$arrayQuestionnaire = [];
foreach ($questionnaireResponse->getAnswers() as $answer) {
$arrayQuestionnaire[$answer->getQuestion()->getId()][] = $answer;
if ($answer->getIdFile()) {
//$zip->addFile('../files/responses/'.$answer->getIdFile(), $pathZip.'/'.$questionnaireResponse->getQuestionnaireType().'_'.$questionnaireResponse->getAuthor()->getUserIdentifier().'_'.$answer->getValue());
$zip->addFile('../files/responses/' . $answer->getIdFile(), $pathZip . '/' . $answer->getValue());
}
}
// génération du pdf
// n'utilise pas le même template que l'export individuel car les données ne sont pas récupérées de la même façon de la bdd.
$html = $knpSnappy->getOutputFromHtml(
$this->renderView(
'questionnaire_response/showPdfZip.html.twig',
[
'questionnaireResponse' => $questionnaireResponse,
'questions' => $questionnaireResponse->getQuestionnaire()->getQuestions(),
'arrayQuestionnaire' => $arrayQuestionnaire,
]
),
[
'footer-left' => $twig->dateFormat(new DateTime(), 'long'),
'footer-center' => 'Page [page]/[topage]',
'enable-local-file-access' => true,
]
);
file_put_contents($pathProject . '/' . $filename, $html);
}
}
$dir = opendir($pathProject);
while($file = readdir($dir)) {
if(is_file($pathProject.'/'.$file)) {
$zip->addFile($pathProject.'/'.$file, $pathZip.'/'.$file);
}
}
$zip->close();
$disposition = HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
$zipName
);
$response = new BinaryFileResponse('Export_ZIP/'.$zipName);
$response->deleteFileAfterSend(true);
$response->headers->set('Content-Disposition', $disposition);
$dir = opendir($pathProject);
while($file = readdir($dir)) {
if (is_file($pathProject.'/'.$file)) {
unlink($pathProject . '/' . $file);
}
}
rmdir($pathProject);
return $response;
}
/**
* @Route("/{id}/edit", name="project_edit", methods={"GET","POST"})
* @param Request $request
* @param Project $project
* @param ManagerRegistry $doctrine
* @return Response
*/
public function edit(Request $request, Project $project, ManagerRegistry $doctrine): Response
{
$this->denyAccessUnlessGranted('EDIT', $project);
$form = $this->createForm(ProjectType::class, $project);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em = $doctrine->getManager();
$em->flush();
return $this->redirectToRoute('project_show', ['id' => $project->getId()], Response::HTTP_SEE_OTHER);
} else {
$this->addFlash('error', 'Les données soumises sont invalides');
}
}
return $this->renderForm('project/edit.html.twig', [
'project' => $project,
'form' => $form,
]);
}
/**
* @Route("/{id}/add-files", name="project_add_files", methods={"GET", "POST"})
* @Route("/{id}/add-files/auto", name="project_add_files_auto", methods={"POST"})
*
* @param Request $request
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param QuestionnaireHandlerService $questionnaireHandlerService
* @param ManagerRegistry $doctrine
* @return Response
*/
public function addFiles(Request $request, Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, QuestionnaireHandlerService $questionnaireHandlerService, ManagerRegistry $doctrine): Response
{
$this->denyAccessUnlessGranted('ADD_FILES', $project);
// vérification de l'existance d'un qr
$qr = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_LI_DOC, $project);
if (count($qr) == 1) {
if ($qr[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qr[0]->getId()]);
} else {
$this->addFlash('warning', 'Vous avez déjà soumis ce formulaire, vous ne pouvez plus le modifier');
return $this->redirectToRoute('questionnaire_response_show', ['questionnaireResponse' => $qr[0]->getId()]);
}
}
$form = $questionnaireHandlerService->createForm($project->getAppelAProjet()->getQuestionnaireDocLi());
$form->handleRequest($request);
if ($form->isSubmitted()) {
$return = $questionnaireHandlerService->handleSubmission();
if ($return instanceof Response) {
// cas d'une erreur
return $return;
}
// cas où ça c'est bien passé
$questionnaireResponse = $questionnaireHandlerService->getQuestionnaireResponse();
$em = $doctrine->getManager();
$questionnaireResponse->setQuestionnaireType(QuestionnaireResponse::QR_TYPE_LI_DOC);
$questionnaireResponse->setProject($project);
$em->flush();
if ($request->attributes->get('_route') == 'project_add_files') {
$this->addFlash('success', $return);
if ($questionnaireResponse->getStatus() == QuestionnaireResponse::S_STATUS_SUBMIT) {
$this->addFlash('success', 'Vous êtes invité à soumettre le projet pour terminer le processus de dépôt.');
return new JsonResponse(['url' => $this->generateUrl('project_submit', ['id' => $questionnaireResponse->getProject()->getId()])]);
}
return new JsonResponse(['url' => $this->generateUrl('project_show', ['id' => $project->getId()])]);
} else {
return new JsonResponse(['url' => $this->generateUrl('questionnaire_display_submission', ['questionnaireResponse' => $questionnaireResponse->getId()])]);
}
}
return $questionnaireHandlerService->renderForm($request, $project);
}
/**
* @Route("/{id}/submit-project", name="project_submit", methods={"GET", "POST"})
*
* @param Request $request
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param ProjectNumberService $projectNumberService
* @param ManagerRegistry $doctrine
* @return Response
*/
public function submitProject(Request $request, Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, ProjectNumberService $projectNumberService, ManagerRegistry $doctrine): Response
{
$this->denyAccessUnlessGranted('SUBMIT', $project);
if ($project->getAppelAProjet()->getQuestionnaireLi()) {
$qrLi = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_LI_I, $project)[0];
if ($qrLi->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
$this->addFlash('warning', 'Vous devez soumettre la lettre d\'intention pour pouvoir soumettre le projet');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrLi->getId()]);
}
$qrLiDoc = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_LI_DOC, $project);
if (count($qrLiDoc) == 0) {
$this->addFlash('warning', 'Vous devez déposer les documents associés à la lettre d\'intention pour pouvoir soumettre le projet');
return $this->redirectToRoute('project_add_files', ['id' => $project->getId()]);
}
if ($qrLiDoc[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
$this->addFlash('warning', 'Vous devez soumettre les documents associés à la lettre d\'intention pour pouvoir soumettre le projet');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrLiDoc[0]->getId()]);
}
} else {
$qrDc = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_DC, $project)[0];
if ($qrDc->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
$this->addFlash('warning', 'Vous devez soumettre le dossier complet pour pouvoir soumettre le projet');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrDc->getId()]);
}
}
// formulaire de validation (pour faire un deuxième clic)
if ($request->getMethod() === 'POST') {
if ($this->isCsrfTokenValid('submit'.$project->getId(), $request->request->get('_token'))) {
$entityManager = $doctrine->getManager();
if ($project->getAppelAProjet()->getQuestionnaireLi()) {
$project->setStatus(Project::PROJECT_STATUS_DEPOSE);
} else {
$project->setStatus(Project::PROJECT_STATUS_DC_DEPOSE);
}
$project->setNumber($projectNumberService->generateLeftNumber($project, $project->getStatus()));
$entityManager->flush();
$this->addFlash('success', 'Projet soumis avec succès');
return $this->redirectToRoute('project_show', ['id' => $project->getId()]);
}
$this->addFlash('error', 'Une erreur est survenue, veuillez réessayer');
}
return $this->render('project/submit.html.twig', [
'project' => $project,
'routeName' => 'project_submit',
]);
}
/**
* @Route("/{id}/preevaluation", name="project_preeval", methods={"GET", "POST"})
* @Route("/{id}/preevaluation/auto", name="project_preeval_auto", methods={"POST"})
* @Route("/{id}/preevaluation-thema", name="project_preeval_thema", methods={"GET", "POST"})
* @Route("/{id}/preevaluation-thema/auto", name="project_preeval_thema_auto", methods={"POST"})
* @Route("/{id}/expertise", name="project_expert", methods={"GET", "POST"})
* @Route("/{id}/expertise/auto", name="project_expert_auto", methods={"POST"})
* @Route("/{id}/rapport", name="project_rapport", methods={"GET", "POST"})
* @Route("/{id}/rapport/auto", name="project_rapport_auto", methods={"POST"})
* @Route("/{id}/expert-3", name="project_expert_3", methods={"GET", "POST"})
* @Route("/{id}/expert-3/auto", name="project_expert_3_auto", methods={"POST"})
*
* @param Request $request
* @param Project $project
* @param UserProjectRepository $userProjectRepository
* @param SignatureCharteRepository $signatureCharteRepository
* @param QuestionnaireHandlerService $questionnaireHandlerService
* @param ManagerRegistry $doctrine
* @return JsonResponse|RedirectResponse|Response
* @throws NonUniqueResultException
*/
public function questionnaire(Request $request, Project $project, UserProjectRepository $userProjectRepository, SignatureCharteRepository $signatureCharteRepository, QuestionnaireHandlerService $questionnaireHandlerService, ManagerRegistry $doctrine)
{
switch ($request->attributes->get('_route')) {
case 'project_preeval':
case 'project_preeval_auto':
$this->denyAccessUnlessGranted('PRE_EVAL', $project);
$charte = true;
$urlCharte = 'project_preeval_charte';
$type = QuestionnaireResponse::QR_TYPE_PREEVAL;
$questionnaire = $project->getAppelAProjet()->getQuestionnairePreeval();
break;
case 'project_preeval_thema':
case 'project_preeval_thema_auto':
$this->denyAccessUnlessGranted('THEMA', $project);
$charte = false;
$type = QuestionnaireResponse::QR_TYPE_EVAL_THEMA;
$questionnaire = $project->getAppelAProjet()->getQuestionnaireEvalThema();
break;
case 'project_expert':
case 'project_expert_auto':
$this->denyAccessUnlessGranted('EXPERT', $project);
$charte = true;
$urlCharte = 'project_expert_charte';
$type = QuestionnaireResponse::QR_TYPE_EXPERT;
$questionnaire = $project->getAppelAProjet()->getQuestionnaireExpert();
break;
case 'project_rapport':
case 'project_rapport_auto':
$this->denyAccessUnlessGranted('RAPPORT', $project);
$charte = true;
$urlCharte = 'project_rapport_charte';
$type = QuestionnaireResponse::QR_TYPE_RAPPORT;
$questionnaire = $project->getAppelAProjet()->getQuestionnaireRapport();
break;
case 'project_expert_3':
case 'project_expert_3_auto':
$this->denyAccessUnlessGranted('EXPERT_3', $project);
$charte = true;
$urlCharte = 'project_expert_3_charte';
$type = QuestionnaireResponse::QR_TYPE_EXPERT_3;
$questionnaire = $project->getAppelAProjet()->getQuestionnaireExpert();
break;
}
if ($charte === true) {
// vérification de la signature de la charte
$signature = $signatureCharteRepository->findOneBy(['appelAProjet' => $project->getAppelAProjet(), 'user' => $this->getUser(), 'type' => $type]);
if (!$signature) {
return $this->redirectToRoute($urlCharte, ['id' => $project->getId()]);
}
}
// récupération du userProject
$up = $userProjectRepository->getByTypeByProjectByUser($type, $project, $this->getUser());
if ($up->getQuestionnaireResponse()) {
if ($up->getQuestionnaireResponse()->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $up->getQuestionnaireResponse()->getId()]);
} else {
$this->addFlash('warning', 'Vous avez déjà soumis ce formulaire, vous ne pouvez plus le modifier');
return $this->redirectToRoute('questionnaire_response_show', ['questionnaireResponse' => $up->getQuestionnaireResponse()->getId()]);
}
}
$form = $questionnaireHandlerService->createForm($questionnaire);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$return = $questionnaireHandlerService->handleSubmission();
if ($return instanceof Response) {
// cas d'une erreur
return $return;
}
// cas où ça c'est bien passé
$questionnaireResponse = $questionnaireHandlerService->getQuestionnaireResponse();
$em = $doctrine->getManager();
$questionnaireResponse->setQuestionnaireType($type);
$questionnaireResponse->setProject($project);
$up->setQuestionnaireResponse($questionnaireResponse);
$em->flush();
if (in_array($request->attributes->get('_route'), ['project_preeval_auto', 'project_preeval_thema_auto', 'project_expert_auto', 'project_rapport_auto', 'project_expert_3_auto'])) {
return new JsonResponse(['url' => $this->generateUrl('questionnaire_display_submission', ['questionnaireResponse' => $questionnaireResponse->getId()])]);
} else {
$this->addFlash('success', $return);
return new JsonResponse(['url' => $this->generateUrl('project_show', ['id' => $project->getId()])]);
}
}
return $questionnaireHandlerService->renderForm($request, $project);
}
/**
* @Route("/{id}/preevaluation-charte", name="project_preeval_charte", methods={"GET", "POST"})
* @Route("/{id}/expert-charte", name="project_expert_charte", methods={"GET", "POST"})
* @Route("/{id}/rapport-charte", name="project_rapport_charte", methods={"GET", "POST"})
* @Route("/{id}/expert-3-charte", name="project_expert_3_charte", methods={"GET", "POST"})
*/
public function charte(Request $request, Project $project, SignatureCharteRepository $signatureCharteRepository, ManagerRegistry $doctrine): RedirectResponse|Response
{
switch ($request->attributes->get('_route')) {
case 'project_preeval_charte':
$this->denyAccessUnlessGranted('PRE_EVAL', $project);
$type = QuestionnaireResponse::QR_TYPE_PREEVAL;
$url = 'project_preeval';
$typeCharte = 'chartePreeval';
break;
case 'project_expert_charte':
$this->denyAccessUnlessGranted('EXPERT', $project);
$type = QuestionnaireResponse::QR_TYPE_EXPERT;
$url = 'project_expert';
$typeCharte = 'charteExpert';
break;
case 'project_expert_3_charte':
$this->denyAccessUnlessGranted('EXPERT_3', $project);
$type = QuestionnaireResponse::QR_TYPE_EXPERT_3;
$url = 'project_expert_3';
$typeCharte = 'charteExpert3';
break;
case 'project_rapport_charte':
$this->denyAccessUnlessGranted('RAPPORT', $project);
$type = QuestionnaireResponse::QR_TYPE_RAPPORT;
$url = 'project_rapport';
$typeCharte = 'charteRapport';
break;
default:
throw $this->createAccessDeniedException();
}
// vérification de la signature de la charte
$signature = $signatureCharteRepository->findOneBy(['appelAProjet' => $project->getAppelAProjet(), 'user' => $this->getUser(), 'type' => $type]);
if ($signature) {
$this->addFlash('success', 'Vous avez déjà signé cette charte');
return $this->redirectToRoute($url, ['id' => $project->getId()]);
}
$form = $this->createSignatureCharteForm($request->getRequestUri());
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// enregistrement de la signature
$signature = (new SignatureCharte())
->setAppelAProjet($project->getAppelAProjet())
->setUser($this->getUser())
->setType($type)
;
$em = $doctrine->getManager();
$em->persist($signature);
$em->flush();
$this->addFlash('success', 'Charte signée avec succès');
return $this->redirectToRoute($url, ['id' => $project->getId()]);
}
return $this->render('project/signature_charte.html.twig', [
'form' => $form->createView(),
'appelAProjet' => $project->getAppelAProjet(),
'type' => $typeCharte,
]);
}
/**
* @Route("/{id}/preevaluation-coordo", name="project_preeval_coordo", methods={"GET", "POST"})
* @Route("/{id}/preevaluation-coordo/auto", name="project_preeval_coordo_auto", methods={"POST"})
*
* @param Request $request
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param QuestionnaireHandlerService $questionnaireHandlerService
* @param ManagerRegistry $doctrine
* @return JsonResponse|RedirectResponse|Response
*/
public function preevaluationCoordo(Request $request, Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, QuestionnaireHandlerService $questionnaireHandlerService, ManagerRegistry $doctrine): RedirectResponse|JsonResponse|Response
{
$this->denyAccessUnlessGranted('COORDO', $project);
// récupération du userProject
$qr = $questionnaireResponseRepository->findOneBy(['questionnaireType' => QuestionnaireResponse::QR_TYPE_EVAL_COORDO, 'project' => $project, 'author' => $this->getUser()]);
if ($qr) {
if ($qr->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qr->getId()]);
} else {
$this->addFlash('warning', 'Vous avez déjà soumis ce formulaire, vous ne pouvez plus le modifier');
return $this->redirectToRoute('questionnaire_response_show', ['questionnaireResponse' => $qr->getId()]);
}
}
$form = $questionnaireHandlerService->createForm($project->getAppelAProjet()->getQuestionnaireEvalCoordo());
$form->handleRequest($request);
if ($form->isSubmitted()) {
$return = $questionnaireHandlerService->handleSubmission();
if ($return instanceof Response) {
// cas d'une erreur
return $return;
}
// cas où ça c'est bien passé
$questionnaireResponse = $questionnaireHandlerService->getQuestionnaireResponse();
$em = $doctrine->getManager();
$questionnaireResponse->setQuestionnaireType(QuestionnaireResponse::QR_TYPE_EVAL_COORDO);
$questionnaireResponse->setProject($project);
$em->flush();
if ($request->attributes->get('_route') == 'project_preeval_coordo') {
$this->addFlash('success', $return);
return new JsonResponse(['url' => $this->generateUrl('project_show', ['id' => $project->getId()])]);
} else {
return new JsonResponse(['url' => $this->generateUrl('questionnaire_display_submission', ['questionnaireResponse' => $questionnaireResponse->getId()])]);
}
}
return $questionnaireHandlerService->renderForm($request, $project);
}
/**
* @Route("/{id}/clone-li", name="project_clone_li", methods={"GET", "POST"})
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param ManagerRegistry $doctrine
* @return Response
*/
public function cloneLi(Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, ManagerRegistry $doctrine): Response
{
$this->denyAccessUnlessGranted('CLONE_LI', $project);
// vérification de l'existance d'une LI clone
$qrs = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_LI_R, $project);
if (count($qrs) == 1) {
if ($qrs[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrs[0]->getId()]);
} else {
$this->addFlash('warning', 'Vous avez déjà soumis la LI clone, vous ne pouvez plus la modifier');
return $this->redirectToRoute('questionnaire_response_show', ['questionnaireResponse' => $qrs[0]->getId()]);
}
}
$em = $doctrine->getManager();
// récupération de la LI initiale et clonage
$qrs = $questionnaireResponseRepository->getByTypeByProjectWithResponse(QuestionnaireResponse::QR_TYPE_LI_I, $project);
$li2 = clone $qrs[0];
$li2->setAuthor($this->getUser());
$li2->setQuestionnaireType(QuestionnaireResponse::QR_TYPE_LI_R);
$answers2 = [];
foreach ($qrs[0]->getAnswers() as $key => $answer) {
$answers2[$key] = clone $answer;
$li2->addAnswer($answers2[$key]);
}
$em->persist($li2);
$em->flush();
$this->addFlash('success', 'Lettre d\'intention clonée avec succès. Vous pouvez maintenant la modifier');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $li2->getId()]);
}
/**
* @Route("/{id}/dossier-complet", name="project_dossier_complet", methods={"GET", "POST"})
* @Route("/{id}/dossier-complet/auto", name="project_dossier_complet_auto", methods={"GET", "POST"})
*
* @param Request $request
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param ManagerRegistry $doctrine
* @param QuestionnaireHandlerService $questionnaireHandlerService
* @return Response
*/
public function dossierComplet(Request $request, Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, ManagerRegistry $doctrine, QuestionnaireHandlerService $questionnaireHandlerService): Response
{
$this->denyAccessUnlessGranted('ADD_DC', $project);
// récupération du questionnaire response
$qr = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_DC, $project);
if (count($qr) > 0) {
if ($qr[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qr[0]->getId()]);
} else {
$this->addFlash('warning', 'Vous avez déjà soumis ce formulaire, vous ne pouvez plus le modifier');
return $this->redirectToRoute('questionnaire_response_show', ['questionnaireResponse' => $qr[0]->getId()]);
}
}
$form = $questionnaireHandlerService->createForm($project->getAppelAProjet()->getQuestionnaireDc());
$form->handleRequest($request);
if ($form->isSubmitted()) {
$return = $questionnaireHandlerService->handleSubmission();
if ($return instanceof Response) {
// cas d'une erreur
return $return;
}
// cas où ça c'est bien passé
$questionnaireResponse = $questionnaireHandlerService->getQuestionnaireResponse();
$em = $doctrine->getManager();
$questionnaireResponse->setQuestionnaireType(QuestionnaireResponse::QR_TYPE_DC);
$questionnaireResponse->setProject($project);
$em->flush();
if ($request->attributes->get('_route') == 'project_dossier_complet') {
$this->addFlash('success', $return);
return new JsonResponse(['url' => $this->generateUrl('project_show', ['id' => $project->getId()])]);
} else {
return new JsonResponse(['url' => $this->generateUrl('questionnaire_display_submission', ['questionnaireResponse' => $questionnaireResponse->getId()])]);
}
}
return $questionnaireHandlerService->renderForm($request, $project);
}
/**
* @Route("/{id}/submit-dossier-complet", name="project_submit_dossier_complet", methods={"GET", "POST"})
*
* @param Request $request
* @param Project $project
* @param QuestionnaireResponseRepository $questionnaireResponseRepository
* @param ProjectNumberService $projectNumberService
* @param ManagerRegistry $doctrine
* @return Response
*/
public function submitDossierComplet(Request $request, Project $project, QuestionnaireResponseRepository $questionnaireResponseRepository, ProjectNumberService $projectNumberService, ManagerRegistry $doctrine): Response
{
$this->denyAccessUnlessGranted('DC_SUBMIT', $project);
$qrLi2 = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_LI_R, $project);
if (count($qrLi2) > 0 && $qrLi2[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
$this->addFlash('warning', 'Vous devez soumettre la lettre d\'intention pour pouvoir soumettre le projet');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrLi2[0]->getId()]);
}
// todo : est-ce que le clone de la li est obligatoire ? si non, si il n'y en a pas, est-ce que je met un rappel ?
$qrDc = $questionnaireResponseRepository->getByTypeByProject(QuestionnaireResponse::QR_TYPE_DC, $project);
if (count($qrDc) == 0) {
$this->addFlash('warning', 'Vous devez déposer le dossier pour pouvoir soumettre le projet');
return $this->redirectToRoute('project_dossier_complet', ['id' => $project->getId()]);
}
if ($qrDc[0]->getStatus() == QuestionnaireResponse::S_STATUS_DRAFT) {
$this->addFlash('warning', 'Vous devez soumettre le dossier complet pour pouvoir soumettre le projet');
return $this->redirectToRoute('questionnaire_display_submission', ['questionnaireResponse' => $qrDc[0]->getId()]);
}
// formulaire de validation (pour faire un deuxième clic)
if ($request->getMethod() === 'POST') {
if ($this->isCsrfTokenValid('submit'.$project->getId(), $request->request->get('_token'))) {
$entityManager = $doctrine->getManager();
$project->setStatus(Project::PROJECT_STATUS_DC_DEPOSE);
$entityManager->flush();
$this->addFlash('success', 'Dossier complet soumis avec succès');
return $this->redirectToRoute('project_show', ['id' => $project->getId()]);
}
$this->addFlash('error', 'Une erreur est survenue, veuillez réessayer');
}
return $this->render('project/submit.html.twig', [
'project' => $project,
'routeName' => 'project_submit_dossier_complet',
]);
}
/**
* @param $url
* @return FormInterface
*/
private function createSignatureCharteForm($url): FormInterface
{
return $this->createFormBuilder()
->setAction($url)
->setMethod('POST')
->getForm()
;
}
}