<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Entreprise;
use App\Entity\Dossier;
use App\Entity\StatutDossier;
use App\Entity\DocumentControle;
use App\Entity\DocumentContractuel;
use App\Entity\CommercialEntreprise;
use App\Form\DossierType;
use App\Utils\UtilsService;
/**
* @Route("/dashboard/dossier")
*/
class DossierController extends AbstractController
{
/** @var TranslatorInterface */
private $translator;
private $em;
private $util;
public function __construct(
TranslatorInterface $translator,
EntityManagerInterface $em,
UtilsService $util
) {
$this->translator = $translator;
$this->em = $em;
$this->util = $util;
}
/**
* @Route("/", name="dossier_index", methods={"GET"})
* @Route("/liste/", name="dossier_index_2", methods={"GET"})
*/
public function list(Request $request): Response
{
return $this->redirectToRoute('dossier_filtre_index', ['statut' => StatutDossier::STATUT_INCOMPLET]);
}
/**
* @Route("/liste/{statut}", name="dossier_filtre_index", methods={"GET"})
*/
public function listFiltered($statut, Request $request): Response
{
$results = $this->em->getRepository(Dossier::class)->findByStatut($statut, $request->query->getInt('page', 1));
return $this->render('dossier/index.html.twig', [
'results' => $results
]);
}
/**
* @Route("/entreprise/{id}", name="dossiers_entreprise", methods={"GET"})
* @Entity("entreprise", expr="repository.find(id)")
*/
public function contratsEntreprise(Entreprise $entreprise, Request $request): Response
{
$results = $this->em->getRepository(Dossier::class)->findbyEntreprise($entreprise, $request->query->getInt('page', 1));
return $this->render('dossier/entreprise.html.twig', [
'results' => $results,
'entreprise' => $entreprise
]);
}
/**
* @Route("/new/entreprise/{id}", name="dossier_entreprise_new", methods={"GET", "POST"})
* @Entity("entreprise", expr="repository.find(id)")
*/
public function entrepriseDossierNew(Request $request, Entreprise $entreprise, $id): Response
{
$dossier = new Dossier();
$dossier->setEntreprise($entreprise);
$statut = new StatutDossier();
$statut->setStatut(StatutDossier::STATUT_PRIS_EN_CHARGE) ;
$statut->setDate(new \DateTime());
$statut->setDossier($dossier);
$dossier->setStatut(StatutDossier::STATUT_PRIS_EN_CHARGE);
$commercialEntreprise = $this->em->getRepository(CommercialEntreprise::class)->findOneBy(['entreprise' => $entreprise]);
$form = $this->createForm(DossierType::class, $dossier);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$documents = $dossier->getOffre()->getDocumentContractuels();
$docs = [];
foreach($documents as $document) {
$docs[$document->getId()] = false;
}
$dossier->setDocuments($docs);
$this->em->persist($statut);
$this->em->persist($dossier);
$this->em->flush();
return $this->redirectToRoute('dossiers_entreprise', ['id' => $id], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('dossier/new.html.twig', [
'dossier' => $dossier,
'form' => $form,
'entreprise' => $entreprise,
'commercialEntreprise' => $commercialEntreprise
]);
}
/**
* @Route("/{id}/edit", name="dossier_edit", methods={"GET", "POST"})
* @Entity("dossier", expr="repository.find(id)")
*/
public function edit(Dossier $dossier, Request $request): Response
{
$listControles = [];
/*
Motifs non attachés aux documents contractuels
Les variables des templates sont gérées pour l'instant dans le listener
*/
$listMotifs = $this->em->getRepository(DocumentControle::class)->findRegles();
$motifs = [];
$vars = [];
$dossierVars = $dossier->getVars();
foreach($listMotifs as $motif) {
preg_match_all('/{{ (.*?) }}/m', $motif->getRaison(), $vars, PREG_SET_ORDER, 0);
// dédoublonnage des variables + hydratation vars
$listVars = [];
foreach($vars as $var) {
if (!$this->util->inMultiArray($var[0], $listVars)) {
$varValue = "";
if(
!is_null($dossierVars) &&
array_key_exists($motif->getId(), $dossierVars) &&
array_key_exists($var[1], $dossierVars[$motif->getId()])
) {
$varValue = $dossierVars[$motif->getId()][$var[1]];
}
$var[] = $varValue;
$listVars[] = $var;
}
}
$motifs[] = [
'motif' => $motif,
'vars' => $listVars
];
}
$listControles[] = [
'id' => null,
'nom' => "Règles de gestion",
'motifs' => $motifs,
];
/*
Motifs attachés aux documents contractuels
Les variables sont gérées pour l'instant dans WorkflowDossierSubscriber
Attention en cas de changement de nom de variable dans le template ou d'ajout de nouvelle variable
il faut mettre à jour les variables dans WorkflowDossierSubscriber
*/
$documentContractuels_1 = $dossier->getOffre()->getDocumentContractuels();
foreach ($documentContractuels_1 as $documentContractuel) {
$listMotifs = $this->em->getRepository(DocumentControle::class)->findByDocumentContractuel($documentContractuel);
$listControles[] = $this->getControles($documentContractuel, $dossier, $listMotifs);
}
/*
Documents contractuels selon condition cochée du dossier
exemple: mandat RIA
Entité Dossier: Champs 'ria' => bool
Entité DocumentContractuel: Champs 'chaùmpsz_option_dossier' => 'ria'
si dossier.ria est true, alors on ajoute le document contractuel à la liste des documents contractuels
*/
$documentContractuels_2 = [];
$options = Dossier::FIELDS_OPTIONS;
foreach ($options as $option) {
$method = 'get' . ucfirst($option);
$optionValue = $dossier->{$method}();
if($optionValue) {
$documentContractuels_2[] = $this->em->getRepository(DocumentContractuel::class)->findOneByChampOptionDossier($option);
}
}
foreach ($documentContractuels_2 as $documentContractuel) {
$listMotifs = $this->em->getRepository(DocumentControle::class)->findByDocumentContractuel($documentContractuel);
$listControles[] = $this->getControles($documentContractuel, $dossier, $listMotifs);
}
$documentContractuels = array_merge($documentContractuels_1->toArray(), $documentContractuels_2);
$form = $this->createForm(DossierType::class, $dossier);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->em->flush();
return $this->redirectToRoute('dossier_edit', ['id' => $dossier->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('dossier/edit.html.twig', [
'dossier' => $dossier,
'listControles' => $listControles,
'documentContractuels' => $documentContractuels,
'form' => $form,
]);
}
protected function getControles($documentContractuel, $dossier, $listMotifs) {
$motifs = [];
$vars = [];
$dossierVars = $dossier->getVars();
foreach ($listMotifs as $motif) {
preg_match_all('/{{ (.*?) }}/m', $motif->getRaison(), $vars, PREG_SET_ORDER, 0);
// dédoublonnage des variables + hydratation vars
$listVars = [];
foreach($vars as $var) {
if (!$this->util->inMultiArray($var[0], $listVars)) {
$varValue = "";
if(
!is_null($dossierVars) &&
array_key_exists($motif->getId(), $dossierVars) &&
array_key_exists($var[1], $dossierVars[$motif->getId()])
) {
$varValue = $dossierVars[$motif->getId()][$var[1]];
}
$var[] = $varValue;
$listVars[] = $var;
}
}
$motifs[] = [
'motif' => $motif,
'vars' => $listVars
];
}
return [
'id' => $documentContractuel->getId(),
'nom' => $documentContractuel->getNom(),
'motifs' => $motifs
];
}
/**
* @Route("/{id}", name="dossier_show", methods={"GET"})
* @Entity("dossier", expr="repository.find(id)")
*/
public function show(Dossier $dossier): Response
{
return $this->render('dossier/show.html.twig', [
'dossier' => $dossier,
]);
}
/**
* @Route("/{id}", name="dossier_delete", methods={"POST"})
* @Entity("dossier", expr="repository.find(id)")
*/
public function delete(Dossier $dossier, Request $request): Response
{
if ($this->isCsrfTokenValid('delete'.$dossier->getId(), $request->request->get('_token'))) {
// On supprime tous les stauts liés au dossier
$statuts = $dossier->getStatutDossiers();
foreach ($statuts as $statut) {
$this->em->remove($statut);
}
// On supprime toutes les notifications liés au dossier
$notifications = $dossier->getNotifications();
foreach ($notifications as $notification) {
$dossier->removeNotification($notification);
$this->em->remove($notification);
}
$this->em->remove($dossier);
$this->em->flush();
}
return $this->redirectToRoute('dossiers_entreprise', ['id' => $dossier->getEntreprise()->getId()], Response::HTTP_SEE_OTHER);
}
}