<?php
namespace App\Controller;
use App\Entity\Archivearticle;
use App\Entity\Famillesdarticles;
use App\Form\FamillesdarticlesType;
use App\Repository\ArchivearticleRepository;
use App\Repository\FamillesdarticlesRepository;
use Cocur\Slugify\Slugify;
use DateTime;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/famillesdarticles')]
class FamillesdarticlesController extends AbstractController
{
// src/Controller/ArchivearticleController.php
#[Route('/filter/archive/article', name: 'app_filter_archive_article', methods: ['POST'])]
public function filterArchiveArticle(Request $request, ArchivearticleRepository $archivearticleRepository): Response
{
$nomclientfour = trim($request->request->get('nomclientfour'));
$dateRangePicker = $request->request->get('dateRangePicker');
$idarticle = $request->request->get('idarticle');
// Construire les critères de recherche
$criteria = [];
if (!empty($nomclientfour)) {
$criteria['fourclient'] = $nomclientfour;
}
if (!empty($dateRangePicker)) {
// Convertir la plage de dates si nécessaire
$dateRange = explode(' - ', $dateRangePicker);
if (count($dateRange) === 2) {
$startDate = \DateTime::createFromFormat('d/m/Y', trim($dateRange[0]));
$endDate = \DateTime::createFromFormat('d/m/Y', trim($dateRange[1]));
if ($startDate && $endDate) {
$criteria['startDate'] = $startDate;
$criteria['endDate'] = $endDate;
}
}
}
if (!empty($idarticle)) {
$criteria['famillesdarticles'] = (int) $idarticle;
// Si vous avez une relation avec l'article, ajoutez le critère
// $criteria['article'] = $idarticle;
}
// Récupérer les archives filtrées
$archivearticles = $archivearticleRepository->findByCriteria($criteria);
// Retourner le template avec les résultats
return $this->render('famillesdarticles/_table_archive.html.twig', [
'archivearticles' => $archivearticles
]);
}
// #[Route('/archives/filter', name: 'app_archives_filter', methods: ['POST'])]
// public function filterarchive(Request $request, ArchivearticleRepository $repo): JsonResponse
// {
// // 1) Inputs
// $idArticle = $request->request->get('idarticle');
// $nom = trim((string) $request->request->get('nomclientfour', ''));
// $range = trim((string) $request->request->get('dateRangePicker', ''));
//
// // 2) Parse plage de dates (tout-en-un, sans méthodes privées)
// $start = $end = null;
// if ($range !== '') {
// // normaliser séparateurs & espaces
// $normalized = strtolower($range);
// $normalized = str_replace([' au ', ' to ', '–', '—'], ' - ', $normalized);
// $normalized = preg_replace('/\s+/', ' ', $normalized);
// $normalized = trim($normalized);
//
// // on split sur " - "
// $parts = array_map('trim', preg_split('/\s-\s| - |-/', $normalized));
//
// // fonction locale pour parser une date dans plusieurs formats
// $parse = function (string $s): ?DateTime {
// foreach (['d-m-Y', 'd/m/Y', 'Y-m-d'] as $fmt) {
// $dt = DateTime::createFromFormat($fmt, $s);
// if ($dt instanceof DateTime) {
// $dt->setTime(0, 0, 0);
// return $dt;
// }
// }
// return null;
// };
//
// if (count($parts) >= 2) {
// $start = $parse($parts[0]);
// $end = $parse($parts[1]);
// } else {
// // une seule date => start = end
// $start = $parse($parts[0]);
// $end = $start;
// }
//
// // sécurités: si end < start, on swap
// if ($start && $end && $end < $start) {
// [$start, $end] = [$end, $start];
// }
// // fin de journée pour end
// if ($end) {
// $end->setTime(23, 59, 59);
// }
// }
//
// // 3) Construction de la requête (dans cette fonction)
// $qb = $repo->createQueryBuilder('a')
// ->orderBy('a.datearchive', 'DESC');
//
// // si idarticle doit pointer vers une relation (ex: a.article = :idArticle), adapte ici
// if (!empty($idArticle)) {
// // Exemples au choix (décommente celui qui convient) :
// // $qb->andWhere('a.id = :idArticle'); // si Archivearticle.id
// // $qb->andWhere('a.article = :idArticle'); // si relation ManyToOne Article
// // $qb->andWhere('IDENTITY(a.article) = :idArticle'); // autre écriture
// $qb->andWhere('a.id = :idArticle')
// ->setParameter('idArticle', (int) $idArticle);
// }
//
// if ($nom !== '') {
// $qb->andWhere('a.fourclient LIKE :nom')
// ->setParameter('nom', '%'.$nom.'%');
// }
//
// if ($start) {
// $qb->andWhere('a.datearchive >= :start')
// ->setParameter('start', $start);
// }
// if ($end) {
// $qb->andWhere('a.datearchive <= :end')
// ->setParameter('end', $end);
// }
//
// $rows = $qb->getQuery()->getResult();
//
// // 4) Rendu du partiel
// $html = $this->renderView('famillesdarticles/_table_archive.html.twig', [
// 'archivearticles' => $rows,
// ]);
//
// return new JsonResponse(['html' => $html]);
// }
// #[Route('/filter_article', name: 'app_famillesdarticles_filter')]
// public function filter(Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
// {
// $nomprenom = $request->query->get('nomprenom');
// $page = $request->query->getInt('page', 1);
// $limit = 9;
//// dump($nomprenom);
// // Créer le queryBuilder avec jointure sur le fournisseur
// $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
// ->leftJoin('f.fournisseur', 'fou') // jointure avec l'entité fournisseur
// ->addSelect('fou'); // facultatif, si tu veux accéder aux données du fournisseur directement
//
// if (!empty($nomprenom)) {
// $queryBuilder->andWhere('f.reference LIKE :search OR fou.raisonsocial LIKE :search')
// ->setParameter('search', '%' . $nomprenom . '%');
// }
//
// $queryBuilder->orderBy('f.id', 'DESC');
//
// // Paginer
// $query = $queryBuilder->getQuery();
// $paginator = new Paginator($query);
// $totalItems = count($paginator);
// $totalPages = ceil($totalItems / $limit);
//
// $paginator
// ->getQuery()
// ->setFirstResult($limit * ($page - 1))
// ->setMaxResults($limit);
//
// $famillesdarticles = iterator_to_array($paginator);
//// dd($totalPages);
//
// return $this->render('famillesdarticles/recherche.html.twig', [
// 'famillesdarticles' => $famillesdarticles,
// 'currentPage' => $page,
// 'totalPages' => $totalPages,
// 'nomprenom' => $nomprenom,
// ]);
// }
#[Route('/filter_article', name: 'app_famillesdarticles_filter')]
public function filter(Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$nomprenom = $request->query->get('nomprenom');
// Créer le queryBuilder avec jointure sur le fournisseur
$queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
->leftJoin('f.fournisseur', 'fou') // jointure avec l'entité fournisseur
->addSelect('fou'); // pour pouvoir accéder aux données du fournisseur
if (!empty($nomprenom)) {
$queryBuilder->andWhere('f.reference LIKE :search OR fou.raisonsocial LIKE :search')
->setParameter('search', '%' . $nomprenom . '%');
}
$queryBuilder->orderBy('f.id', 'DESC');
$famillesdarticles = $queryBuilder->getQuery()->getResult();
return $this->render('famillesdarticles/recherche.html.twig', [
'famillesdarticles' => $famillesdarticles,
'nomprenom' => $nomprenom,
]);
}
#[Route('/', name: 'app_famillesdarticles_index', methods: ['GET'])]
public function index(Request $request,FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
// Configuration de la pagination
// $page = $request->query->getInt('page', 1);
// $limit = 10;
//
// // Construction de la requête pour la pagination
// $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
//// ->where('p.IsArchive = false')
// ->orderBy('f.id', 'DESC');
//
//
// // Application de la pagination
// $paginator = new Paginator($queryBuilder);
// $famillesdarticles = $paginator->getQuery()
// ->setFirstResult($limit * ($page - 1))
// ->setMaxResults($limit)
// ->getResult();
$test = $famillesdarticlesRepository->findBy([], ['id' => 'DESC']);
// dd($test);
return $this->render('famillesdarticles/index.html.twig', [
'famillesdarticles' => $famillesdarticlesRepository->findBy([], ['id' => 'DESC']),
// 'currentPage' => $page,
// 'totalPages' => ceil(count($paginator) / $limit),
]);
}
//
// #[Route('/', name: 'app_famillesdarticles_index', methods: ['GET'])]
// public function index(Request $request,FamillesdarticlesRepository $famillesdarticlesRepository): Response
// {
// // Configuration de la pagination
// $page = $request->query->getInt('page', 1);
// $limit = 10;
//
// // Construction de la requête pour la pagination
// $queryBuilder = $famillesdarticlesRepository->createQueryBuilder('f')
//// ->where('p.IsArchive = false')
// ->orderBy('f.id', 'DESC');
//
//
// // Application de la pagination
// $paginator = new Paginator($queryBuilder);
// $famillesdarticles = $paginator->getQuery()
// ->setFirstResult($limit * ($page - 1))
// ->setMaxResults($limit)
// ->getResult();
//
// return $this->render('famillesdarticles/index.html.twig', [
// 'famillesdarticles' => $famillesdarticles,
// 'currentPage' => $page,
// 'totalPages' => ceil(count($paginator) / $limit),
// ]);
// }
//
#[Route('/new', name: 'app_famillesdarticles_new', methods: ['GET', 'POST'])]
public function new(Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$famillesdarticle = new Famillesdarticles();
$form = $this->createForm(FamillesdarticlesType::class, $famillesdarticle);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$newref = $form->get('reference')->getData();
$logo = $form->get('logo')->getData();
if ( $logo) {
$originalLogoname = pathinfo( $logo->getClientOriginalName(), PATHINFO_FILENAME);
$slugify = new Slugify();
$a= $slugify->slugify($originalLogoname, ['separator' => '-']);
$newLogoname = $a.'-'.uniqid().'.'.$logo->guessExtension();
// Move the file to the directory where brochures are stored
try {
$logo->move(
$this->getParameter('article_directory'),
$newLogoname
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
$famillesdarticle->setLogo($newLogoname);
}
// Vérifiez si la nouvelle référence existe déjà
$existingArticle = $famillesdarticlesRepository->findOneBy(['reference' => $newref]);
if ($existingArticle) {
// La nouvelle référence existe déjà, affichez une alerte
$this->addFlash('danger', 'La référence existe déjà.');
} else {
// La nouvelle référence est unique, continuez avec l'enregistrement
$operateur = $request->request->get('operateur');
$famillesdarticle->setOperateur($operateur);
$famillesdarticlesRepository->save($famillesdarticle, true);
return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('famillesdarticles/new.html.twig', [
'famillesdarticle' => $famillesdarticle,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_famillesdarticles_show', methods: ['GET'])]
public function show(Famillesdarticles $famillesdarticle,ArchivearticleRepository $archivearticleRepository): Response
{
$archivearticle = $archivearticleRepository->findByFamiliesExcludingType($famillesdarticle);
// $archivearticle = $archivearticleRepository->findBy(['famillesdarticles' => $famillesdarticle]);
// dd($archivearticle);
return $this->render('famillesdarticles/show.html.twig', [
'arcticle' => $famillesdarticle,
'archivearticles' => $archivearticle,
]);
}
#[Route('/{id}/edit', name: 'app_famillesdarticles_edit', methods: ['GET', 'POST'])]
public function edit(ArchivearticleRepository $archivearticleRepository,Request $request, Famillesdarticles $famillesdarticle, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$img = $famillesdarticle->getLogo();
$prixachtaoriginal = $famillesdarticle->getPrixachat();
$qteoriginal = $famillesdarticle->getQunatity();
$form = $this->createForm(FamillesdarticlesType::class, $famillesdarticle);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$operateur = $request->request->get('operateur');
$famillesdarticle->setOperateur($operateur);
$logo = $form->get('logo')->getData();
if ( $logo) {
$originalLogoname = pathinfo( $logo->getClientOriginalName(), PATHINFO_FILENAME);
$slugify = new Slugify();
$a= $slugify->slugify($originalLogoname, ['separator' => '-']);
$newLogoname = $a.'-'.uniqid().'.'.$logo->guessExtension();
// Move the file to the directory where brochures are stored
try {
$logo->move(
$this->getParameter('article_directory'),
$newLogoname
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
$famillesdarticle->setLogo($newLogoname);
}
elseif ($logo === null) {
$famillesdarticle->setLogo($img);
}
$famillesdarticlesRepository->save($famillesdarticle, true);
// dump($famillesdarticle->getPrixachat(),$prixachtaoriginal);
if ($famillesdarticle->getPrixachat() !== $prixachtaoriginal || $famillesdarticle->getQunatity() !== $qteoriginal){
// dd($famillesdarticle->getPrixachat(),$prixachtaoriginal, 'd5al');
$archiveArticle = new Archivearticle();
if ($famillesdarticle->getPrixachat() !== $prixachtaoriginal)
{
$archiveArticle->setTypearchive('prixachat');
}
elseif ($famillesdarticle->getQunatity() !== $qteoriginal)
{
$archiveArticle->setTypearchive('qte');
}
$archiveArticle->setDesignation($famillesdarticle->getDesignation());
$archiveArticle->setTva($famillesdarticle->getTva());
$archiveArticle->setFournisseur($famillesdarticle->getFournisseur());
$archiveArticle->setReference($famillesdarticle->getReference());
$archiveArticle->setCoefficient($famillesdarticle->getCoefficient());
$archiveArticle->setOperateur($famillesdarticle->getOperateur());
$archiveArticle->setFamilles($famillesdarticle->getFamilles());
$archiveArticle->setPrixachat($prixachtaoriginal);
$archiveArticle->setPrixvente($famillesdarticle->getPrixvente());
$archiveArticle->setUnite($famillesdarticle->getUnite());
$archiveArticle->setQuantity($famillesdarticle->getQunatity());
$archiveArticle->setFamillesdarticles($famillesdarticle);
$archiveArticle->setDatearchive(new DateTime());
$archivearticleRepository->save($archiveArticle, true);
$this->addFlash('success', 'Vous avez modifié le prix d\'achat !');
}
// $famillesdarticlesRepository->save($famillesdarticle, true);
return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('famillesdarticles/edit.html.twig', [
'famillesdarticle' => $famillesdarticle,
'form' => $form,
]);
}
#[Route('/delete/{id}', name: 'app_famillesdarticles_delete')]
public function delete(Request $request, Famillesdarticles $famillesdarticle, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
// if ($this->isCsrfTokenValid('delete'.$famillesdarticle->getId(), $request->request->get('_token'))) {
$famillesdarticlesRepository->remove($famillesdarticle, true);
// }
return $this->redirectToRoute('app_famillesdarticles_index', [], Response::HTTP_SEE_OTHER);
}
}