src/Controller/DistributionController.php line 386

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Distribution;
  4. use App\Entity\Declinaison;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use App\Form\DistributionType;
  11. use App\Form\SearchBeneficiaireType;
  12. use App\Repository\DistributionRepository;
  13. use App\Repository\DistributionDetailRepository;
  14. use App\Repository\ArticleRepository;
  15. use App\Repository\DeclinaisonRepository;
  16. use App\Repository\CategorieRepository;
  17. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  18. use Knp\Component\Pager\PaginatorInterface;
  19. use Dompdf\Dompdf;
  20. /**
  21.  * @Route("/distribution")
  22.  */
  23. class DistributionController extends AbstractController
  24. {
  25.     
  26.     /**
  27.      * @Route("/", name="app_distribution_index")
  28.      */
  29.     public function index(Request $requestDistributionRepository $distributionRepositoryCategorieRepository $categorieRepository,  PaginatorInterface $paginator): Response
  30.     {
  31.         $beneficiaire "";
  32.         $categories $categorieRepository->findBy(
  33.             [],
  34.             ['libelle' => 'ASC']
  35.         );
  36.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  37.         $structures array_flip($fbbStructures);
  38.         
  39.         $formSearch $this->createForm(SearchBeneficiaireType::class);
  40.         $formSearch->handleRequest($request);
  41.         
  42.         if ($formSearch->isSubmitted() && $formSearch->isValid()) {
  43.             $beneficiaire $formSearch->get('beneficiaire')->getData();
  44.         }
  45.         $distr $distributionRepository->findAll();
  46.         $distributions $paginator->paginate(
  47.             $distr
  48.             $request->query->getInt('page'1), 
  49.             50
  50.         );
  51.         array_splice($structures01);
  52.         return $this->render('distribution/index.html.twig', [
  53.             'distributions' => $distributions,
  54.             'categories' => $categories,
  55.             'fbbStructures' => $fbbStructures,
  56.             'title' => 'VÊTEMENTS : LISTE DES DISTRIBUTIONS',
  57.             'formSearch' => $formSearch->createView(),
  58.             'search' => false,
  59.         ]);
  60.     }
  61.     
  62.     /**
  63.      * @Route("/distribution_beneficiare", name="app_distribution_beneficiaire")
  64.      */
  65.     public function distribution_beneficiaire(Request $requestDistributionRepository $distributionRepositoryCategorieRepository $categorieRepository,  PaginatorInterface $paginator): Response
  66.     {
  67.         $beneficiaire "";
  68.         $categories $categorieRepository->findBy(
  69.             [],
  70.             ['libelle' => 'ASC']
  71.         );
  72.         $nom $request->query->get('nom');
  73.         $prenom $request->query->get('prenom');
  74.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  75.         $structures array_flip($fbbStructures);
  76.         
  77.         $formSearch $this->createForm(SearchBeneficiaireType::class);
  78.         $formSearch->handleRequest($request);
  79.         
  80.         if ($formSearch->isSubmitted() && $formSearch->isValid()) {
  81.             $beneficiaire $formSearch->get('beneficiaire')->getData();
  82.         }
  83.         $distr $distributionRepository->findBy(
  84.             ['nom' => $nom],
  85.             ['date_distribution' => 'ASC']
  86.         );
  87.         $distributions $paginator->paginate(
  88.             $distr,
  89.             $request->query->getInt('page'1), /* numéro de page */
  90.             50 /* limit par page */
  91.         );
  92.         array_splice($structures01);
  93.         return $this->render('distribution/index.html.twig', [
  94.             'distributions' => $distributions,
  95.             'categories' => $categories,
  96.             'fbbStructures' => $fbbStructures,
  97.             'title' => 'VÊTEMENTS : LISTE DES DISTRIBUTIONS PAR BENEFICIAIRE',
  98.             'formSearch' => $formSearch->createView(),
  99.             'search' => true,
  100.             'nom' => strtoupper($nom),
  101.             'prenom' => strtoupper($prenom),
  102.         ]);
  103.     }
  104.     /**
  105.      * @Route("/new", name="app_distribution_new", methods={"GET", "POST"})
  106.      */
  107.     public function new(
  108.         Request $request
  109.         DistributionRepository $distributionRepositoryCategorieRepository $categorieRepository
  110.         SessionInterface $session        
  111.         ): Response
  112.     {
  113.         $distribution = new Distribution();
  114.         $nom $request->query->get('nom');
  115.         $prenom $request->query->get('prenom');
  116.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  117.         $structures array_flip($fbbStructures);
  118.         array_splice($structures01);
  119.         
  120.         $categories $categorieRepository->findBy(
  121.             [],
  122.             ['libelle' => 'ASC']
  123.         );
  124.         $beneficiaire = array('nom' => $nom'prenom' => $prenom);        
  125.         $form $this->createForm(DistributionType::class, $distribution, [
  126.            'structures' => $structures,
  127.            'beneficiaire' => $beneficiaire,
  128.         ]);
  129.         $form->handleRequest($request);
  130.         if ($form->isSubmitted() && $form->isValid()) {
  131.             $datas $form->getData();
  132.             $distribution->setNom(strtoupper($datas->getNom()));
  133.             $distribution->setPrenom(strtoupper($datas->getPrenom()));
  134.             $distributionRepository->add($distributiontrue);
  135.             $session->set('is_distribution'true);
  136.             $session->set('distribution_id'$distribution->getId());
  137.             $session->set('distribution_structure'$distribution->getStructureFbb());
  138.             return $this->redirectToRoute('app_distribution_articles', ['tri' => NULL'asc' => NULL], Response::HTTP_SEE_OTHER);
  139.         }
  140.         return $this->renderForm('distribution/new.html.twig', [
  141.             'form' => $form,
  142.             'categories' => $categories,
  143.             'structures' => $structures,
  144.             'title' => 'Nouvelle distribution',
  145.         ]);
  146.     }
  147.     
  148.     /**
  149.      * @Route("/article/{tri}/{asc}", name="app_distribution_articles")
  150.      */
  151.     public function distribution_articles(ArticleRepository $articleRepositoryDistributionRepository $distributionRepositoryCategorieRepository $categorieRepositorySessionInterface $sessionstring $tri NULLstring $asc NULL): Response
  152.     {
  153.         
  154.         if (!$session->get('is_distribution')) {
  155.             $this->addFlash('warning''Vous ne pouvez plus ajouter de nouveaux articles'); 
  156.             return $this->redirectToRoute('app_distribution_index');
  157.         }
  158.         $session->set('idf'0);
  159.         $session->set('slug''');
  160.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  161.         $structures array_flip($fbbStructures);
  162.         array_splice($structures01);
  163.         $fbbStructure $session->get('distribution_structure');
  164.         //echo $fbbStructure;
  165.         $categories $categorieRepository->findBy(
  166.             [],
  167.             ['libelle' => 'ASC']
  168.         );
  169.         
  170.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  171.         $distribution $distributionRepository->find($session->get('distribution_id'));
  172.         
  173.         $request Request::createFromGlobals();
  174.         $url $request->getPathInfo();
  175.         if ($tri == "") {
  176.             $orderby 'categorie';
  177.         } else {
  178.             $orderby $tri;
  179.         }
  180.         $url substr($url021);
  181.          
  182.         switch ($asc) {
  183.             case "ASC":
  184.                 $asc "DESC";
  185.                 break;
  186.             case "DESC":
  187.                 $asc "ASC";
  188.                 break;
  189.         }
  190.         
  191.         if ($asc == "") {
  192.             $asc "ASC";
  193.         }        
  194.         return $this->render('distribution/articles.html.twig', [
  195.             'articles' => $articleRepository->findByStructure($fbbStructure$orderby$asc),
  196.             'url' => $url,
  197.             'asc' => $asc,
  198.             'categories' => $categories,  
  199.             'title' => 'VÊTEMENTS : distribution ' strtoupper($fbbStructures[$distribution->getStructureFbb()]),            
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route("/recap/{id}", name="app_distribution_show", methods={"GET"})
  204.      */
  205.     public function recap(
  206.         distribution $distribution
  207.         CategorieRepository $categorieRepository,
  208.         distributionDetailRepository $distributionDetailRepository
  209.         ArticleRepository $articleRepository
  210.         distributionRepository $distributionRepository,
  211.         SessionInterface $session
  212.         ): Response
  213.     {
  214.         $categories $categorieRepository->findBy(
  215.             [],
  216.             ['libelle' => 'ASC']
  217.         );
  218.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  219.         $structures array_flip($fbbStructures);
  220.         array_splice($structures01);
  221.         
  222.         /*$tailles = $this->getParameter($categorie->getTaille());
  223.         $tailles = array_flip($tailles);
  224.         array_splice($tailles, 0, 1);
  225.         $taillesFlip = array_flip($tailles);*/
  226.  
  227.         $distribution_detail $distribution->getDistributionDetails();
  228.         
  229.         return $this->render('distribution/edit.html.twig', [
  230.             'distribution' => $distribution,
  231.             'distribution_detail' => $distribution_detail,
  232.             'categories' => $categories,
  233.             'fbbStructures' => $fbbStructures,
  234.             'is_distribution' => $session->get('is_distribution'),
  235.             'structures' => $structures,
  236.             'title' => 'distribution ' strtoupper($fbbStructures[$distribution->getStructureFbb()]) . ' DU ' $distribution->getDatedistribution()->format('d-m-Y'),
  237.         ]);
  238.     }
  239.     
  240.     /**
  241.      * @Route("/compute/{id}", name="app_distribution_compute", methods={"POST"})
  242.      */
  243.     public function compute(Request $requestDistribution $distributionDistributionRepository $distributionRepositoryDeclinaisonRepository $declinaisonRepository,
  244.     DistributionDetailRepository $distributionDetailRepositoryint $idSessionInterface $session): Response
  245.     {
  246.         if ($this->isCsrfTokenValid('compute'.$distribution->getId(), $request->request->get('_token'))) {
  247.             
  248.             $details $distribution->getDistributionDetails();
  249.             foreach ($details as $detail) {
  250.                 $quantite $detail->getQuantite();
  251.                 $article $detail->getArticle();
  252.                 $article_id $detail->getArticle()->getId();
  253.                 $structure_fbb $detail->getStructureFbb();
  254.                 $taille $detail->getTaille();
  255.  
  256.                 //echo $structure_fbb . " " . $taille . " " . $article_id;
  257.                 if ($declinaison $declinaisonRepository->findOneBy(
  258.                 ['article' => $article'structure_fbb' => $structure_fbb'taille' => $taille],
  259.                 [])) 
  260.                 {
  261.                     if ($declinaison->getQuantite() < $quantite) {
  262.                         // il n'y a pas assez de stock
  263.                         $this->addFlash('warning''Produit en quantité insuffisante ! La quantité demandée est supérieure à la quantité disponible en stock'); 
  264.                         return $this->redirectToRoute('app_distribution_detail_new', ['article_id' => $article_id], Response::HTTP_SEE_OTHER);
  265.                         exit();
  266.                         
  267.                     } else {
  268.                         // mise à jour de l'item
  269.                         $nouvelle_quantite $declinaison->getQuantite() - $quantite;
  270.                         $maj $declinaisonRepository->find($declinaison->getId());
  271.                         $maj->setQuantite($nouvelle_quantite);
  272.                         $declinaisonRepository->add($majtrue); 
  273.                     }                    
  274.                     
  275.                 } else {
  276.                     // Ajout de l'item
  277.                     $ajout = new Declinaison();
  278.                     $ajout->setArticle($article);
  279.                     $ajout->setQuantite($quantite);
  280.                     $ajout->setTaille($taille);
  281.                     $ajout->setStructureFbb($structure_fbb);
  282.                     $declinaisonRepository->add($ajouttrue);             
  283.                 }
  284.                 
  285.             } 
  286.             
  287.             $distribution->setTraite(true);
  288.             $distributionRepository->add($distributiontrue);
  289.             $this->addFlash('success''Traitement de la distribution avec mise à jour des stocks réussi'); 
  290.             // supprime les variables de session
  291.             $session->set('is_distribution'false);
  292.             $session->remove('distribution_id');        
  293.         }
  294.         return $this->redirectToRoute('app_distribution_show', ['id' => $id], Response::HTTP_SEE_OTHER);
  295.     }
  296.     
  297.     /**
  298.      * @Route("/delete/{id}", name="app_distribution_delete", methods={"POST"})
  299.      */
  300.     public function delete(Request $requestDistribution $distributionDistributionRepository $distributionRepository,
  301.     DistributionDetailRepository $distributionDetailRepositoryint $id): Response
  302.     {
  303.         if ($this->isCsrfTokenValid('delete'.$distribution->getId(), $request->request->get('_token'))) {
  304.             // on supprime le detail de la distribution
  305.             try {
  306.                $distributionDetailRepository->removeAll($distribution->getId());
  307.             } catch (\Exception $e) {
  308.                 $this->addFlash('warning'$e->getMessage()); 
  309.             } 
  310.             try {         
  311.                 $distributionRepository->remove($distributiontrue);
  312.                 $this->addFlash('success''Suppression réussie'); 
  313.             } catch (\Exception $e) {
  314.                 $this->addFlash('warning'$e->getMessage()); 
  315.             }             
  316.         }
  317.         return $this->redirectToRoute('app_distribution_index', [], Response::HTTP_SEE_OTHER);
  318.     }
  319.     
  320.     /**
  321.      * @Route("/pdf/{id}", name="app_distribution_pdf", methods={"GET"})
  322.      */
  323.     public function generate_pdf(        
  324.         distribution $distribution
  325.         CategorieRepository $categorieRepository,
  326.         distributionDetailRepository $distributionDetailRepository
  327.         ArticleRepository $articleRepository
  328.         distributionRepository $distributionRepository,
  329.         SessionInterface $session
  330.         ): Response
  331.     {
  332.         $categories $categorieRepository->findBy(
  333.             [],
  334.             ['libelle' => 'ASC']
  335.         );
  336.         $fbbStructures $this->getParameter('fbb_structures_vetements');
  337.         $structures array_flip($fbbStructures);
  338.         array_splice($structures01);
  339.         
  340.         $distribution_detail $distribution->getDistributionDetails();
  341.         $commande = array();
  342.         foreach ($distribution_detail as $key => $detail) {       
  343.             $commande[$key]['id'] = $detail->getArticle()->getId();
  344.             $commande[$key]['quantite'] = $detail->getQuantite();
  345.             $commande[$key]['taille'] = $detail->getTailleArticle();
  346.             $commande[$key]['nom'] = $detail->getArticle()->getNom();
  347.             $commande[$key]['colori'] = $detail->getArticle()->getColori();
  348.             $commande[$key]['reference'] = $detail->getArticle()->getReference();
  349.             $commande[$key]['photo'] =  $this->imageToBase64($this->getParameter('photos_vetements') . '/' .$detail->getArticle()->getPhoto());
  350.         }
  351.         
  352.         
  353.         //dd($commande);
  354.         $html $this->renderView('distribution/pdf.html.twig', [
  355.             'distribution' => $distribution,
  356.             'commande' => $commande,
  357.             'categories' => $categories,
  358.             'logoFbb' => $this->imageToBase64($this->getParameter('photos_vetements') . '/fbb-logo.png'),
  359.             'fbbStructures' => $fbbStructures,
  360.             'is_distribution' => $session->get('is_distribution'),
  361.             'structures' => $structures,
  362.             'title' => 'distribution ' strtoupper($fbbStructures[$distribution->getStructureFbb()]) . ' DU ' $distribution->getDatedistribution()->format('d-m-Y'),
  363.         ]);
  364.         
  365.         $dompdf = new Dompdf();
  366.         $dompdf->loadHtml($html);
  367.         $dompdf->render();
  368.         $dompdf->stream('Remise_de_vetement_' $distribution->getId() . ".pdf", [
  369.             "Attachment" => true,
  370.         ]);
  371.         return new Response (
  372.             //$dompdf->stream('resume', ["Attachment" => false]),
  373.             Response::HTTP_OK,
  374.             ['Content-Type' => 'application/pdf']
  375.         );
  376.     }
  377.     
  378.     
  379.     private function imageToBase64($path) {
  380.         $path $path;
  381.         $type pathinfo($pathPATHINFO_EXTENSION);
  382.         $data file_get_contents($path);
  383.         $base64 'data:image/' $type ';base64,' base64_encode($data);
  384.         return $base64;
  385.     }
  386.     
  387.     /**
  388.      * @Route("/beneficiaire/", name="app_ajax_search_beneficiaire", methods={"GET"})
  389.      */
  390.     public function search_beneficiaire(Request $requestDistributionRepository $distribution): Response
  391.     {
  392.         $keyword $request->query->get('keyword');
  393.         if (!$request->isXmlHttpRequest()) {
  394.             die;
  395.             //return $this->render('notaire/search.html.twig', ['query' => $query]);
  396.         }
  397.         $foundBeneficiaires $distribution->findBySearchQuery($keyword);
  398.         $results = [];
  399.         foreach ($foundBeneficiaires as $beneficiaire) {
  400.             $results[] = [
  401.                 'nom' => htmlspecialchars($beneficiaire->getNom(), ENT_COMPAT ENT_HTML5),
  402.                 'prenom' => htmlspecialchars($beneficiaire->getPrenom(), ENT_COMPAT ENT_HTML5),
  403.                 //'link' => $this->generateUrl('app_show_notaire', ['id' => $notaire->getId()]),
  404.             ];
  405.         }
  406.         return new JsonResponse(array('data' => $results),200);   
  407.     }   
  408. }