src/Controller/DossierController.php line 134

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use App\Entity\Entreprise;
  13. use App\Entity\Dossier;
  14. use App\Entity\StatutDossier;
  15. use App\Entity\DocumentControle;
  16. use App\Entity\DocumentContractuel;
  17. use App\Entity\CommercialEntreprise;
  18. use App\Form\DossierType;
  19. use App\Utils\UtilsService;
  20. /**
  21.  * @Route("/dashboard/dossier")
  22.  */
  23. class DossierController extends AbstractController
  24. {
  25.     /** @var TranslatorInterface */
  26.     private $translator;
  27.     
  28.     private $em;
  29.     private $util;
  30.     
  31.     public function __construct(
  32.         TranslatorInterface $translator,
  33.         EntityManagerInterface $em,
  34.         UtilsService $util
  35.     ) {
  36.         $this->translator $translator;
  37.         $this->em $em;
  38.         $this->util $util;
  39.     }
  40.     /**
  41.      * @Route("/", name="dossier_index", methods={"GET"})
  42.      * @Route("/liste/", name="dossier_index_2", methods={"GET"})
  43.      */
  44.     public function list(Request $request): Response
  45.     {
  46.         return $this->redirectToRoute('dossier_filtre_index', ['statut' => StatutDossier::STATUT_INCOMPLET]);
  47.     }
  48.     /**
  49.      * @Route("/liste/{statut}", name="dossier_filtre_index", methods={"GET"})
  50.      */
  51.     public function listFiltered($statutRequest $request): Response
  52.     {
  53.         $results $this->em->getRepository(Dossier::class)->findByStatut($statut$request->query->getInt('page'1));
  54.        
  55.         return $this->render('dossier/index.html.twig', [
  56.             'results' => $results
  57.         ]);
  58.     }
  59.     /**
  60.      * @Route("/entreprise/{id}", name="dossiers_entreprise", methods={"GET"})
  61.      * @Entity("entreprise", expr="repository.find(id)")
  62.      */
  63.     public function contratsEntreprise(Entreprise $entrepriseRequest $request): Response
  64.     {
  65.         $results $this->em->getRepository(Dossier::class)->findbyEntreprise($entreprise$request->query->getInt('page'1));
  66.         return $this->render('dossier/entreprise.html.twig', [
  67.             'results' => $results,
  68.             'entreprise' => $entreprise
  69.         ]);
  70.     }
  71.     /**
  72.      * @Route("/new/entreprise/{id}", name="dossier_entreprise_new", methods={"GET", "POST"})
  73.      * @Entity("entreprise", expr="repository.find(id)")
  74.      */
  75.     public function entrepriseDossierNew(Request $requestEntreprise $entreprise$id): Response
  76.     {
  77.         $dossier = new Dossier();
  78.         $dossier->setEntreprise($entreprise);
  79.         $statut = new StatutDossier();
  80.         $statut->setStatut(StatutDossier::STATUT_PRIS_EN_CHARGE) ;
  81.         $statut->setDate(new \DateTime());
  82.         $statut->setDossier($dossier);
  83.         $dossier->setStatut(StatutDossier::STATUT_PRIS_EN_CHARGE);
  84.         $commercialEntreprise $this->em->getRepository(CommercialEntreprise::class)->findOneBy(['entreprise' => $entreprise]);
  85.         $form $this->createForm(DossierType::class, $dossier);
  86.         $form->handleRequest($request);
  87.         if ($form->isSubmitted() && $form->isValid()) {
  88.             $documents $dossier->getOffre()->getDocumentContractuels();
  89.             $docs = [];
  90.             foreach($documents as $document) {
  91.                 $docs[$document->getId()] = false;
  92.             }
  93.             
  94.             $dossier->setDocuments($docs);
  95.             $this->em->persist($statut);
  96.             $this->em->persist($dossier);
  97.             $this->em->flush();
  98.             return $this->redirectToRoute('dossiers_entreprise', ['id' => $id], Response::HTTP_SEE_OTHER);
  99.         }
  100.         return $this->renderForm('dossier/new.html.twig', [
  101.             'dossier' => $dossier,
  102.             'form' => $form,
  103.             'entreprise' => $entreprise,
  104.             'commercialEntreprise' => $commercialEntreprise
  105.         ]);
  106.     }
  107.        
  108.     /**
  109.      * @Route("/{id}/edit", name="dossier_edit", methods={"GET", "POST"})
  110.      * @Entity("dossier", expr="repository.find(id)")
  111.      */
  112.     public function edit(Dossier $dossierRequest $request): Response
  113.     {
  114.         $listControles = [];
  115.         /*
  116.             Motifs non attachés aux documents contractuels
  117.             Les variables des templates sont gérées pour l'instant dans le listener
  118.         */
  119.         $listMotifs $this->em->getRepository(DocumentControle::class)->findRegles();
  120.         $motifs = [];
  121.         $vars = [];
  122.         $dossierVars $dossier->getVars();
  123.             
  124.         foreach($listMotifs as $motif) {
  125.             preg_match_all('/{{ (.*?) }}/m'$motif->getRaison(), $varsPREG_SET_ORDER0);
  126.         
  127.             // dédoublonnage des variables + hydratation vars
  128.             $listVars = [];
  129.             foreach($vars as $var) {
  130.                 if (!$this->util->inMultiArray($var[0], $listVars)) {
  131.                     $varValue "";
  132.                     if( 
  133.                         !is_null($dossierVars) &&
  134.                         array_key_exists($motif->getId(), $dossierVars) && 
  135.                         array_key_exists($var[1], $dossierVars[$motif->getId()])
  136.                     ) {
  137.                         $varValue $dossierVars[$motif->getId()][$var[1]];
  138.                     }
  139.                     $var[] = $varValue;
  140.                     $listVars[] = $var
  141.                 }
  142.             }
  143.             
  144.             $motifs[] = [
  145.                 'motif' => $motif,
  146.                 'vars' => $listVars
  147.             ];
  148.         }
  149.         $listControles[] = [
  150.             'id' => null,
  151.             'nom' => "Règles de gestion",
  152.             'motifs' => $motifs,
  153.         ];
  154.         
  155.         /*
  156.             Motifs attachés aux documents contractuels
  157.             Les variables sont gérées pour l'instant dans WorkflowDossierSubscriber
  158.             Attention en cas de changement de nom de variable dans le template ou d'ajout de nouvelle variable
  159.             il faut mettre à jour les variables dans WorkflowDossierSubscriber
  160.         */
  161.         $documentContractuels_1 $dossier->getOffre()->getDocumentContractuels();
  162.         foreach ($documentContractuels_1 as $documentContractuel) {
  163.             $listMotifs $this->em->getRepository(DocumentControle::class)->findByDocumentContractuel($documentContractuel);
  164.             $listControles[] = $this->getControles($documentContractuel$dossier$listMotifs);
  165.         }
  166.         /*
  167.             Documents contractuels selon condition cochée du dossier
  168.             exemple: mandat RIA
  169.             Entité Dossier:  Champs 'ria' => bool
  170.             Entité DocumentContractuel: Champs 'chaùmpsz_option_dossier' => 'ria'
  171.             si dossier.ria est true, alors on ajoute le document contractuel à la liste des documents contractuels
  172.         */
  173.         $documentContractuels_2 = [];
  174.         $options Dossier::FIELDS_OPTIONS;
  175.         foreach ($options as $option) {
  176.             $method 'get' ucfirst($option);
  177.             $optionValue $dossier->{$method}();
  178.             
  179.             if($optionValue) {
  180.                 $documentContractuels_2[] = $this->em->getRepository(DocumentContractuel::class)->findOneByChampOptionDossier($option);
  181.             }
  182.         }
  183.         
  184.         foreach ($documentContractuels_2 as $documentContractuel) {
  185.             $listMotifs $this->em->getRepository(DocumentControle::class)->findByDocumentContractuel($documentContractuel);
  186.             $listControles[] = $this->getControles($documentContractuel$dossier$listMotifs);
  187.         }
  188.         $documentContractuels array_merge($documentContractuels_1->toArray(), $documentContractuels_2);
  189.         
  190.         $form $this->createForm(DossierType::class, $dossier);
  191.         $form->handleRequest($request);
  192.         if ($form->isSubmitted() && $form->isValid()) {
  193.             $this->em->flush();
  194.             return $this->redirectToRoute('dossier_edit', ['id' => $dossier->getId()], Response::HTTP_SEE_OTHER);
  195.         }
  196.         
  197.         return $this->renderForm('dossier/edit.html.twig', [
  198.             'dossier' => $dossier,
  199.             'listControles' => $listControles,
  200.             'documentContractuels' => $documentContractuels,
  201.             'form' => $form,
  202.         ]);
  203.     }
  204.     protected function getControles($documentContractuel$dossier$listMotifs) {
  205.         $motifs = [];
  206.         $vars = [];
  207.         $dossierVars $dossier->getVars();
  208.         foreach ($listMotifs as $motif) {
  209.             preg_match_all('/{{ (.*?) }}/m'$motif->getRaison(), $varsPREG_SET_ORDER0);
  210.             // dédoublonnage des variables + hydratation vars
  211.             $listVars = [];
  212.             foreach($vars as $var) {
  213.                 if (!$this->util->inMultiArray($var[0], $listVars)) {
  214.                     $varValue "";
  215.                     if( 
  216.                         !is_null($dossierVars) &&
  217.                         array_key_exists($motif->getId(), $dossierVars) && 
  218.                         array_key_exists($var[1], $dossierVars[$motif->getId()])
  219.                     ) {
  220.                         $varValue $dossierVars[$motif->getId()][$var[1]];
  221.                     }
  222.                     $var[] = $varValue;
  223.                     $listVars[] = $var
  224.                 }
  225.             }
  226.             $motifs[] = [
  227.                 'motif' => $motif,
  228.                 'vars' => $listVars
  229.             ];
  230.         }
  231.         return [
  232.             'id' => $documentContractuel->getId(),
  233.             'nom' => $documentContractuel->getNom(),
  234.             'motifs' => $motifs
  235.         ];
  236.     }
  237.     /**
  238.      * @Route("/{id}", name="dossier_show", methods={"GET"})
  239.      * @Entity("dossier", expr="repository.find(id)")
  240.      */
  241.     public function show(Dossier $dossier): Response
  242.     {
  243.         return $this->render('dossier/show.html.twig', [
  244.             'dossier' => $dossier,
  245.         ]);
  246.     }
  247.     /**
  248.      * @Route("/{id}", name="dossier_delete", methods={"POST"})
  249.      * @Entity("dossier", expr="repository.find(id)")
  250.      */
  251.     public function delete(Dossier $dossierRequest $request): Response
  252.     {
  253.         if ($this->isCsrfTokenValid('delete'.$dossier->getId(), $request->request->get('_token'))) {
  254.             // On supprime tous les stauts liés au dossier
  255.             $statuts $dossier->getStatutDossiers();
  256.             foreach ($statuts as $statut) {
  257.                 $this->em->remove($statut);
  258.             }
  259.             // On supprime toutes les notifications liés au dossier
  260.             $notifications $dossier->getNotifications();
  261.             foreach ($notifications as $notification) {
  262.                 $dossier->removeNotification($notification);
  263.                 $this->em->remove($notification);
  264.             }
  265.             $this->em->remove($dossier);
  266.             $this->em->flush();
  267.         }
  268.         return $this->redirectToRoute('dossiers_entreprise', ['id' => $dossier->getEntreprise()->getId()], Response::HTTP_SEE_OTHER);
  269.     }
  270.     
  271.     
  272. }