src/Controller/FamillesdarticlesController.php line 201

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Archivearticle;
  4. use App\Entity\Famillesdarticles;
  5. use App\Form\FamillesdarticlesType;
  6. use App\Repository\ArchivearticleRepository;
  7. use App\Repository\FamillesdarticlesRepository;
  8. use Cocur\Slugify\Slugify;
  9. use DateTime;
  10. use Doctrine\ORM\Tools\Pagination\Paginator;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. #[Route('/famillesdarticles')]
  18. class FamillesdarticlesController extends AbstractController
  19. {
  20.     // src/Controller/ArchivearticleController.php
  21.     #[Route('/filter/archive/article'name'app_filter_archive_article'methods: ['POST'])]
  22.     public function filterArchiveArticle(Request $requestArchivearticleRepository $archivearticleRepository): Response
  23.     {
  24.         $nomclientfour trim($request->request->get('nomclientfour'));
  25.         $dateRangePicker $request->request->get('dateRangePicker');
  26.         $idarticle $request->request->get('idarticle');
  27.         // Construire les critères de recherche
  28.         $criteria = [];
  29.         if (!empty($nomclientfour)) {
  30.             $criteria['fourclient'] = $nomclientfour;
  31.         }
  32.         if (!empty($dateRangePicker)) {
  33.             // Convertir la plage de dates si nécessaire
  34.             $dateRange explode(' - '$dateRangePicker);
  35.             if (count($dateRange) === 2) {
  36.                 $startDate \DateTime::createFromFormat('d/m/Y'trim($dateRange[0]));
  37.                 $endDate \DateTime::createFromFormat('d/m/Y'trim($dateRange[1]));
  38.                 if ($startDate && $endDate) {
  39.                     $criteria['startDate'] = $startDate;
  40.                     $criteria['endDate'] = $endDate;
  41.                 }
  42.             }
  43.         }
  44.         if (!empty($idarticle)) {
  45.             $criteria['famillesdarticles'] = (int) $idarticle;
  46.             // Si vous avez une relation avec l'article, ajoutez le critère
  47.             // $criteria['article'] = $idarticle;
  48.         }
  49.         // Récupérer les archives filtrées
  50.         $archivearticles $archivearticleRepository->findByCriteria($criteria);
  51.         // Retourner le template avec les résultats
  52.         return $this->render('famillesdarticles/_table_archive.html.twig', [
  53.             'archivearticles' => $archivearticles
  54.         ]);
  55.     }
  56. //    #[Route('/archives/filter', name: 'app_archives_filter', methods: ['POST'])]
  57. //    public function filterarchive(Request $request, ArchivearticleRepository $repo): JsonResponse
  58. //    {
  59. //        // 1) Inputs
  60. //        $idArticle = $request->request->get('idarticle');
  61. //        $nom       = trim((string) $request->request->get('nomclientfour', ''));
  62. //        $range     = trim((string) $request->request->get('dateRangePicker', ''));
  63. //
  64. //        // 2) Parse plage de dates (tout-en-un, sans méthodes privées)
  65. //        $start = $end = null;
  66. //        if ($range !== '') {
  67. //            // normaliser séparateurs & espaces
  68. //            $normalized = strtolower($range);
  69. //            $normalized = str_replace([' au ', ' to ', '–', '—'], ' - ', $normalized);
  70. //            $normalized = preg_replace('/\s+/', ' ', $normalized);
  71. //            $normalized = trim($normalized);
  72. //
  73. //            // on split sur " - "
  74. //            $parts = array_map('trim', preg_split('/\s-\s| - |-/', $normalized));
  75. //
  76. //            // fonction locale pour parser une date dans plusieurs formats
  77. //            $parse = function (string $s): ?DateTime {
  78. //                foreach (['d-m-Y', 'd/m/Y', 'Y-m-d'] as $fmt) {
  79. //                    $dt = DateTime::createFromFormat($fmt, $s);
  80. //                    if ($dt instanceof DateTime) {
  81. //                        $dt->setTime(0, 0, 0);
  82. //                        return $dt;
  83. //                    }
  84. //                }
  85. //                return null;
  86. //            };
  87. //
  88. //            if (count($parts) >= 2) {
  89. //                $start = $parse($parts[0]);
  90. //                $end   = $parse($parts[1]);
  91. //            } else {
  92. //                // une seule date => start = end
  93. //                $start = $parse($parts[0]);
  94. //                $end   = $start;
  95. //            }
  96. //
  97. //            // sécurités: si end < start, on swap
  98. //            if ($start && $end && $end < $start) {
  99. //                [$start, $end] = [$end, $start];
  100. //            }
  101. //            // fin de journée pour end
  102. //            if ($end) {
  103. //                $end->setTime(23, 59, 59);
  104. //            }
  105. //        }
  106. //
  107. //        // 3) Construction de la requête (dans cette fonction)
  108. //        $qb = $repo->createQueryBuilder('a')
  109. //            ->orderBy('a.datearchive', 'DESC');
  110. //
  111. //        // si idarticle doit pointer vers une relation (ex: a.article = :idArticle), adapte ici
  112. //        if (!empty($idArticle)) {
  113. //            // Exemples au choix (décommente celui qui convient) :
  114. //            // $qb->andWhere('a.id = :idArticle');                     // si Archivearticle.id
  115. //            // $qb->andWhere('a.article = :idArticle');                // si relation ManyToOne Article
  116. //            // $qb->andWhere('IDENTITY(a.article) = :idArticle');      // autre écriture
  117. //            $qb->andWhere('a.id = :idArticle')
  118. //                ->setParameter('idArticle', (int) $idArticle);
  119. //        }
  120. //
  121. //        if ($nom !== '') {
  122. //            $qb->andWhere('a.fourclient LIKE :nom')
  123. //                ->setParameter('nom', '%'.$nom.'%');
  124. //        }
  125. //
  126. //        if ($start) {
  127. //            $qb->andWhere('a.datearchive >= :start')
  128. //                ->setParameter('start', $start);
  129. //        }
  130. //        if ($end) {
  131. //            $qb->andWhere('a.datearchive <= :end')
  132. //                ->setParameter('end', $end);
  133. //        }
  134. //
  135. //        $rows = $qb->getQuery()->getResult();
  136. //
  137. //        // 4) Rendu du partiel
  138. //        $html = $this->renderView('famillesdarticles/_table_archive.html.twig', [
  139. //            'archivearticles' => $rows,
  140. //        ]);
  141. //
  142. //        return new JsonResponse(['html' => $html]);
  143. //    }
  144. //    #[Route('/filter_article', name: 'app_famillesdarticles_filter')]
  145. //    public function filter(Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  146. //    {
  147. //        $nomprenom = $request->query->get('nomprenom');
  148. //        $page = $request->query->getInt('page', 1);
  149. //        $limit = 9;
  150. ////        dump($nomprenom);
  151. //        // Créer le queryBuilder avec jointure sur le fournisseur
  152. //        $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
  153. //            ->leftJoin('f.fournisseur', 'fou') // jointure avec l'entité fournisseur
  154. //            ->addSelect('fou'); // facultatif, si tu veux accéder aux données du fournisseur directement
  155. //
  156. //        if (!empty($nomprenom)) {
  157. //            $queryBuilder->andWhere('f.reference LIKE :search OR fou.raisonsocial LIKE :search')
  158. //                ->setParameter('search', '%' . $nomprenom . '%');
  159. //        }
  160. //
  161. //        $queryBuilder->orderBy('f.id', 'DESC');
  162. //
  163. //        // Paginer
  164. //        $query = $queryBuilder->getQuery();
  165. //        $paginator = new Paginator($query);
  166. //        $totalItems = count($paginator);
  167. //        $totalPages = ceil($totalItems / $limit);
  168. //
  169. //        $paginator
  170. //            ->getQuery()
  171. //            ->setFirstResult($limit * ($page - 1))
  172. //            ->setMaxResults($limit);
  173. //
  174. //        $famillesdarticles = iterator_to_array($paginator);
  175. ////        dd($totalPages);
  176. //
  177. //        return $this->render('famillesdarticles/recherche.html.twig', [
  178. //            'famillesdarticles' => $famillesdarticles,
  179. //            'currentPage' => $page,
  180. //            'totalPages' => $totalPages,
  181. //            'nomprenom' => $nomprenom,
  182. //        ]);
  183. //    }
  184.     #[Route('/filter_article'name'app_famillesdarticles_filter')]
  185.     public function filter(Request $requestFamillesdarticlesRepository $famillesdarticlesRepository): Response
  186.     {
  187.         $nomprenom $request->query->get('nomprenom');
  188.         // Créer le queryBuilder avec jointure sur le fournisseur
  189.         $queryBuilder $famillesdarticlesRepository->createQueryBuilder('f')
  190.             ->leftJoin('f.fournisseur''fou'// jointure avec l'entité fournisseur
  191.             ->addSelect('fou'); // pour pouvoir accéder aux données du fournisseur
  192.         if (!empty($nomprenom)) {
  193.             $queryBuilder->andWhere('f.reference LIKE :search OR fou.raisonsocial LIKE :search')
  194.                 ->setParameter('search''%' $nomprenom '%');
  195.         }
  196.         $queryBuilder->orderBy('f.id''DESC');
  197.         $famillesdarticles $queryBuilder->getQuery()->getResult();
  198.         return $this->render('famillesdarticles/recherche.html.twig', [
  199.             'famillesdarticles' => $famillesdarticles,
  200.             'nomprenom' => $nomprenom,
  201.         ]);
  202.     }
  203.     #[Route('/'name'app_famillesdarticles_index'methods: ['GET'])]
  204.     public function index(Request $request,FamillesdarticlesRepository $famillesdarticlesRepository): Response
  205.     {
  206.         // Configuration de la pagination
  207. //        $page = $request->query->getInt('page', 1);
  208. //        $limit = 10;
  209. //
  210. //        // Construction de la requête pour la pagination
  211. //        $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
  212. ////            ->where('p.IsArchive = false')
  213. //            ->orderBy('f.id', 'DESC');
  214. //
  215. //
  216. //        // Application de la pagination
  217. //        $paginator = new Paginator($queryBuilder);
  218. //        $famillesdarticles = $paginator->getQuery()
  219. //            ->setFirstResult($limit * ($page - 1))
  220. //            ->setMaxResults($limit)
  221. //            ->getResult();
  222.         $test =  $famillesdarticlesRepository->findBy([], ['id' => 'DESC']);
  223. //        dd($test);
  224.         return $this->render('famillesdarticles/index.html.twig', [
  225.             'famillesdarticles' => $famillesdarticlesRepository->findBy([], ['id' => 'DESC']),
  226. //            'currentPage' => $page,
  227. //            'totalPages' => ceil(count($paginator) / $limit),
  228.         ]);
  229.     }
  230. //
  231. //    #[Route('/', name: 'app_famillesdarticles_index', methods: ['GET'])]
  232. //    public function index(Request $request,FamillesdarticlesRepository $famillesdarticlesRepository): Response
  233. //    {
  234. //        // Configuration de la pagination
  235. //        $page = $request->query->getInt('page', 1);
  236. //        $limit = 10;
  237. //
  238. //        // Construction de la requête pour la pagination
  239. //        $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
  240. ////            ->where('p.IsArchive = false')
  241. //            ->orderBy('f.id', 'DESC');
  242. //
  243. //
  244. //        // Application de la pagination
  245. //        $paginator = new Paginator($queryBuilder);
  246. //        $famillesdarticles = $paginator->getQuery()
  247. //            ->setFirstResult($limit * ($page - 1))
  248. //            ->setMaxResults($limit)
  249. //            ->getResult();
  250. //
  251. //        return $this->render('famillesdarticles/index.html.twig', [
  252. //            'famillesdarticles' => $famillesdarticles,
  253. //            'currentPage' => $page,
  254. //            'totalPages' => ceil(count($paginator) / $limit),
  255. //        ]);
  256. //    }
  257. //
  258.     #[Route('/new'name'app_famillesdarticles_new'methods: ['GET''POST'])]
  259.     public function new(Request $requestFamillesdarticlesRepository $famillesdarticlesRepository): Response
  260.     {
  261.         $famillesdarticle = new Famillesdarticles();
  262.         $form $this->createForm(FamillesdarticlesType::class, $famillesdarticle);
  263.         $form->handleRequest($request);
  264.         if ($form->isSubmitted() && $form->isValid()) {
  265.             $newref $form->get('reference')->getData();
  266.             $logo $form->get('logo')->getData();
  267.             if ( $logo) {
  268.                 $originalLogoname pathinfo$logo->getClientOriginalName(), PATHINFO_FILENAME);
  269.                 $slugify = new Slugify();
  270.                 $a=  $slugify->slugify($originalLogoname, ['separator' => '-']);
  271.                 $newLogoname =  $a.'-'.uniqid().'.'.$logo->guessExtension();
  272.                 // Move the file to the directory where brochures are stored
  273.                 try {
  274.                     $logo->move(
  275.                         $this->getParameter('article_directory'),
  276.                         $newLogoname
  277.                     );
  278.                 } catch (FileException $e) {
  279.                     // ... handle exception if something happens during file upload
  280.                 }
  281.                 $famillesdarticle->setLogo($newLogoname);
  282.             }
  283.             // Vérifiez si la nouvelle référence existe déjà
  284.             $existingArticle $famillesdarticlesRepository->findOneBy(['reference' => $newref]);
  285.             if ($existingArticle) {
  286.                 // La nouvelle référence existe déjà, affichez une alerte
  287.                 $this->addFlash('danger''La référence existe déjà.');
  288.             } else {
  289.                 // La nouvelle référence est unique, continuez avec l'enregistrement
  290.                 $operateur $request->request->get('operateur');
  291.                 $famillesdarticle->setOperateur($operateur);
  292.                 $famillesdarticlesRepository->save($famillesdarticletrue);
  293.                 return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
  294.             }
  295.         }
  296.         return $this->renderForm('famillesdarticles/new.html.twig', [
  297.             'famillesdarticle' => $famillesdarticle,
  298.             'form' => $form,
  299.         ]);
  300.     }
  301.     #[Route('/{id}'name'app_famillesdarticles_show'methods: ['GET'])]
  302.     public function show(Famillesdarticles $famillesdarticle,ArchivearticleRepository $archivearticleRepository): Response
  303.     {
  304.         $archivearticle $archivearticleRepository->findByFamiliesExcludingType($famillesdarticle);
  305. //        $archivearticle = $archivearticleRepository->findBy(['famillesdarticles' => $famillesdarticle]);
  306. //        dd($archivearticle);
  307.         return $this->render('famillesdarticles/show.html.twig', [
  308.             'arcticle' => $famillesdarticle,
  309.             'archivearticles' => $archivearticle,
  310.         ]);
  311.     }
  312.     #[Route('/{id}/edit'name'app_famillesdarticles_edit'methods: ['GET''POST'])]
  313.     public function edit(ArchivearticleRepository $archivearticleRepository,Request $requestFamillesdarticles $famillesdarticleFamillesdarticlesRepository $famillesdarticlesRepository): Response
  314.     {
  315.         $img $famillesdarticle->getLogo();
  316.         $prixachtaoriginal $famillesdarticle->getPrixachat();
  317.         $qteoriginal $famillesdarticle->getQunatity();
  318.         $form $this->createForm(FamillesdarticlesType::class, $famillesdarticle);
  319.         $form->handleRequest($request);
  320.         if ($form->isSubmitted() && $form->isValid()) {
  321.             $operateur $request->request->get('operateur');
  322.             $famillesdarticle->setOperateur($operateur);
  323.             $logo $form->get('logo')->getData();
  324.             if ( $logo) {
  325.                 $originalLogoname pathinfo$logo->getClientOriginalName(), PATHINFO_FILENAME);
  326.                 $slugify = new Slugify();
  327.                 $a=  $slugify->slugify($originalLogoname, ['separator' => '-']);
  328.                 $newLogoname =  $a.'-'.uniqid().'.'.$logo->guessExtension();
  329.                 // Move the file to the directory where brochures are stored
  330.                 try {
  331.                     $logo->move(
  332.                         $this->getParameter('article_directory'),
  333.                         $newLogoname
  334.                     );
  335.                 } catch (FileException $e) {
  336.                     // ... handle exception if something happens during file upload
  337.                 }
  338.                 $famillesdarticle->setLogo($newLogoname);
  339.             }
  340.             elseif ($logo === null) {
  341.                 $famillesdarticle->setLogo($img);
  342.             }
  343.             $famillesdarticlesRepository->save($famillesdarticletrue);
  344. //            dump($famillesdarticle->getPrixachat(),$prixachtaoriginal);
  345.             if ($famillesdarticle->getPrixachat() !== $prixachtaoriginal || $famillesdarticle->getQunatity() !== $qteoriginal){
  346. //                dd($famillesdarticle->getPrixachat(),$prixachtaoriginal, 'd5al');
  347.                 $archiveArticle = new Archivearticle();
  348.                 if ($famillesdarticle->getPrixachat() !== $prixachtaoriginal)
  349.                 {
  350.                     $archiveArticle->setTypearchive('prixachat');
  351.                 }
  352.                 elseif ($famillesdarticle->getQunatity() !== $qteoriginal)
  353.                 {
  354.                     $archiveArticle->setTypearchive('qte');
  355.                 }
  356.                     $archiveArticle->setDesignation($famillesdarticle->getDesignation());
  357.                 $archiveArticle->setTva($famillesdarticle->getTva());
  358.                 $archiveArticle->setFournisseur($famillesdarticle->getFournisseur());
  359.                 $archiveArticle->setReference($famillesdarticle->getReference());
  360.                 $archiveArticle->setCoefficient($famillesdarticle->getCoefficient());
  361.                 $archiveArticle->setOperateur($famillesdarticle->getOperateur());
  362.                 $archiveArticle->setFamilles($famillesdarticle->getFamilles());
  363.                 $archiveArticle->setPrixachat($prixachtaoriginal);
  364.                 $archiveArticle->setPrixvente($famillesdarticle->getPrixvente());
  365.                 $archiveArticle->setUnite($famillesdarticle->getUnite());
  366.                 $archiveArticle->setQuantity($famillesdarticle->getQunatity());
  367.                 $archiveArticle->setFamillesdarticles($famillesdarticle);
  368.                 $archiveArticle->setDatearchive(new DateTime());
  369.                 $archivearticleRepository->save($archiveArticletrue);
  370.                 $this->addFlash('success''Vous avez modifié le prix d\'achat !');
  371.             }
  372. //            $famillesdarticlesRepository->save($famillesdarticle, true);
  373.             return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
  374.         }
  375.         return $this->renderForm('famillesdarticles/edit.html.twig', [
  376.             'famillesdarticle' => $famillesdarticle,
  377.             'form' => $form,
  378.         ]);
  379.     }
  380.     #[Route('/delete/{id}'name'app_famillesdarticles_delete')]
  381.     public function delete(Request $requestFamillesdarticles $famillesdarticleFamillesdarticlesRepository $famillesdarticlesRepository): Response
  382.     {
  383. //        if ($this->isCsrfTokenValid('delete'.$famillesdarticle->getId(), $request->request->get('_token'))) {
  384.             $famillesdarticlesRepository->remove($famillesdarticletrue);
  385. //        }
  386.         return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
  387.     }
  388. }