<?php
namespace App\Controller;
use App\Entity\Distribution;
use App\Entity\Declinaison;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Form\DistributionType;
use App\Form\SearchBeneficiaireType;
use App\Repository\DistributionRepository;
use App\Repository\DistributionDetailRepository;
use App\Repository\ArticleRepository;
use App\Repository\DeclinaisonRepository;
use App\Repository\CategorieRepository;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Knp\Component\Pager\PaginatorInterface;
use Dompdf\Dompdf;
/**
* @Route("/distribution")
*/
class DistributionController extends AbstractController
{
/**
* @Route("/", name="app_distribution_index")
*/
public function index(Request $request, DistributionRepository $distributionRepository, CategorieRepository $categorieRepository, PaginatorInterface $paginator): Response
{
$beneficiaire = "";
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
$formSearch = $this->createForm(SearchBeneficiaireType::class);
$formSearch->handleRequest($request);
if ($formSearch->isSubmitted() && $formSearch->isValid()) {
$beneficiaire = $formSearch->get('beneficiaire')->getData();
}
$distr = $distributionRepository->findAll();
$distributions = $paginator->paginate(
$distr,
$request->query->getInt('page', 1),
50
);
array_splice($structures, 0, 1);
return $this->render('distribution/index.html.twig', [
'distributions' => $distributions,
'categories' => $categories,
'fbbStructures' => $fbbStructures,
'title' => 'VÊTEMENTS : LISTE DES DISTRIBUTIONS',
'formSearch' => $formSearch->createView(),
'search' => false,
]);
}
/**
* @Route("/distribution_beneficiare", name="app_distribution_beneficiaire")
*/
public function distribution_beneficiaire(Request $request, DistributionRepository $distributionRepository, CategorieRepository $categorieRepository, PaginatorInterface $paginator): Response
{
$beneficiaire = "";
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$nom = $request->query->get('nom');
$prenom = $request->query->get('prenom');
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
$formSearch = $this->createForm(SearchBeneficiaireType::class);
$formSearch->handleRequest($request);
if ($formSearch->isSubmitted() && $formSearch->isValid()) {
$beneficiaire = $formSearch->get('beneficiaire')->getData();
}
$distr = $distributionRepository->findBy(
['nom' => $nom],
['date_distribution' => 'ASC']
);
$distributions = $paginator->paginate(
$distr,
$request->query->getInt('page', 1), /* numéro de page */
50 /* limit par page */
);
array_splice($structures, 0, 1);
return $this->render('distribution/index.html.twig', [
'distributions' => $distributions,
'categories' => $categories,
'fbbStructures' => $fbbStructures,
'title' => 'VÊTEMENTS : LISTE DES DISTRIBUTIONS PAR BENEFICIAIRE',
'formSearch' => $formSearch->createView(),
'search' => true,
'nom' => strtoupper($nom),
'prenom' => strtoupper($prenom),
]);
}
/**
* @Route("/new", name="app_distribution_new", methods={"GET", "POST"})
*/
public function new(
Request $request,
DistributionRepository $distributionRepository, CategorieRepository $categorieRepository,
SessionInterface $session
): Response
{
$distribution = new Distribution();
$nom = $request->query->get('nom');
$prenom = $request->query->get('prenom');
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
array_splice($structures, 0, 1);
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$beneficiaire = array('nom' => $nom, 'prenom' => $prenom);
$form = $this->createForm(DistributionType::class, $distribution, [
'structures' => $structures,
'beneficiaire' => $beneficiaire,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$datas = $form->getData();
$distribution->setNom(strtoupper($datas->getNom()));
$distribution->setPrenom(strtoupper($datas->getPrenom()));
$distributionRepository->add($distribution, true);
$session->set('is_distribution', true);
$session->set('distribution_id', $distribution->getId());
$session->set('distribution_structure', $distribution->getStructureFbb());
return $this->redirectToRoute('app_distribution_articles', ['tri' => NULL, 'asc' => NULL], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('distribution/new.html.twig', [
'form' => $form,
'categories' => $categories,
'structures' => $structures,
'title' => 'Nouvelle distribution',
]);
}
/**
* @Route("/article/{tri}/{asc}", name="app_distribution_articles")
*/
public function distribution_articles(ArticleRepository $articleRepository, DistributionRepository $distributionRepository, CategorieRepository $categorieRepository, SessionInterface $session, string $tri = NULL, string $asc = NULL): Response
{
if (!$session->get('is_distribution')) {
$this->addFlash('warning', 'Vous ne pouvez plus ajouter de nouveaux articles');
return $this->redirectToRoute('app_distribution_index');
}
$session->set('idf', 0);
$session->set('slug', '');
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
array_splice($structures, 0, 1);
$fbbStructure = $session->get('distribution_structure');
//echo $fbbStructure;
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$distribution = $distributionRepository->find($session->get('distribution_id'));
$request = Request::createFromGlobals();
$url = $request->getPathInfo();
if ($tri == "") {
$orderby = 'categorie';
} else {
$orderby = $tri;
}
$url = substr($url, 0, 21);
switch ($asc) {
case "ASC":
$asc = "DESC";
break;
case "DESC":
$asc = "ASC";
break;
}
if ($asc == "") {
$asc = "ASC";
}
return $this->render('distribution/articles.html.twig', [
'articles' => $articleRepository->findByStructure($fbbStructure, $orderby, $asc),
'url' => $url,
'asc' => $asc,
'categories' => $categories,
'title' => 'VÊTEMENTS : distribution ' . strtoupper($fbbStructures[$distribution->getStructureFbb()]),
]);
}
/**
* @Route("/recap/{id}", name="app_distribution_show", methods={"GET"})
*/
public function recap(
distribution $distribution,
CategorieRepository $categorieRepository,
distributionDetailRepository $distributionDetailRepository,
ArticleRepository $articleRepository,
distributionRepository $distributionRepository,
SessionInterface $session
): Response
{
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
array_splice($structures, 0, 1);
/*$tailles = $this->getParameter($categorie->getTaille());
$tailles = array_flip($tailles);
array_splice($tailles, 0, 1);
$taillesFlip = array_flip($tailles);*/
$distribution_detail = $distribution->getDistributionDetails();
return $this->render('distribution/edit.html.twig', [
'distribution' => $distribution,
'distribution_detail' => $distribution_detail,
'categories' => $categories,
'fbbStructures' => $fbbStructures,
'is_distribution' => $session->get('is_distribution'),
'structures' => $structures,
'title' => 'distribution ' . strtoupper($fbbStructures[$distribution->getStructureFbb()]) . ' DU ' . $distribution->getDatedistribution()->format('d-m-Y'),
]);
}
/**
* @Route("/compute/{id}", name="app_distribution_compute", methods={"POST"})
*/
public function compute(Request $request, Distribution $distribution, DistributionRepository $distributionRepository, DeclinaisonRepository $declinaisonRepository,
DistributionDetailRepository $distributionDetailRepository, int $id, SessionInterface $session): Response
{
if ($this->isCsrfTokenValid('compute'.$distribution->getId(), $request->request->get('_token'))) {
$details = $distribution->getDistributionDetails();
foreach ($details as $detail) {
$quantite = $detail->getQuantite();
$article = $detail->getArticle();
$article_id = $detail->getArticle()->getId();
$structure_fbb = $detail->getStructureFbb();
$taille = $detail->getTaille();
//echo $structure_fbb . " " . $taille . " " . $article_id;
if ($declinaison = $declinaisonRepository->findOneBy(
['article' => $article, 'structure_fbb' => $structure_fbb, 'taille' => $taille],
[]))
{
if ($declinaison->getQuantite() < $quantite) {
// il n'y a pas assez de stock
$this->addFlash('warning', 'Produit en quantité insuffisante ! La quantité demandée est supérieure à la quantité disponible en stock');
return $this->redirectToRoute('app_distribution_detail_new', ['article_id' => $article_id], Response::HTTP_SEE_OTHER);
exit();
} else {
// mise à jour de l'item
$nouvelle_quantite = $declinaison->getQuantite() - $quantite;
$maj = $declinaisonRepository->find($declinaison->getId());
$maj->setQuantite($nouvelle_quantite);
$declinaisonRepository->add($maj, true);
}
} else {
// Ajout de l'item
$ajout = new Declinaison();
$ajout->setArticle($article);
$ajout->setQuantite($quantite);
$ajout->setTaille($taille);
$ajout->setStructureFbb($structure_fbb);
$declinaisonRepository->add($ajout, true);
}
}
$distribution->setTraite(true);
$distributionRepository->add($distribution, true);
$this->addFlash('success', 'Traitement de la distribution avec mise à jour des stocks réussi');
// supprime les variables de session
$session->set('is_distribution', false);
$session->remove('distribution_id');
}
return $this->redirectToRoute('app_distribution_show', ['id' => $id], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/delete/{id}", name="app_distribution_delete", methods={"POST"})
*/
public function delete(Request $request, Distribution $distribution, DistributionRepository $distributionRepository,
DistributionDetailRepository $distributionDetailRepository, int $id): Response
{
if ($this->isCsrfTokenValid('delete'.$distribution->getId(), $request->request->get('_token'))) {
// on supprime le detail de la distribution
try {
$distributionDetailRepository->removeAll($distribution->getId());
} catch (\Exception $e) {
$this->addFlash('warning', $e->getMessage());
}
try {
$distributionRepository->remove($distribution, true);
$this->addFlash('success', 'Suppression réussie');
} catch (\Exception $e) {
$this->addFlash('warning', $e->getMessage());
}
}
return $this->redirectToRoute('app_distribution_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/pdf/{id}", name="app_distribution_pdf", methods={"GET"})
*/
public function generate_pdf(
distribution $distribution,
CategorieRepository $categorieRepository,
distributionDetailRepository $distributionDetailRepository,
ArticleRepository $articleRepository,
distributionRepository $distributionRepository,
SessionInterface $session
): Response
{
$categories = $categorieRepository->findBy(
[],
['libelle' => 'ASC']
);
$fbbStructures = $this->getParameter('fbb_structures_vetements');
$structures = array_flip($fbbStructures);
array_splice($structures, 0, 1);
$distribution_detail = $distribution->getDistributionDetails();
$commande = array();
foreach ($distribution_detail as $key => $detail) {
$commande[$key]['id'] = $detail->getArticle()->getId();
$commande[$key]['quantite'] = $detail->getQuantite();
$commande[$key]['taille'] = $detail->getTailleArticle();
$commande[$key]['nom'] = $detail->getArticle()->getNom();
$commande[$key]['colori'] = $detail->getArticle()->getColori();
$commande[$key]['reference'] = $detail->getArticle()->getReference();
$commande[$key]['photo'] = $this->imageToBase64($this->getParameter('photos_vetements') . '/' .$detail->getArticle()->getPhoto());
}
//dd($commande);
$html = $this->renderView('distribution/pdf.html.twig', [
'distribution' => $distribution,
'commande' => $commande,
'categories' => $categories,
'logoFbb' => $this->imageToBase64($this->getParameter('photos_vetements') . '/fbb-logo.png'),
'fbbStructures' => $fbbStructures,
'is_distribution' => $session->get('is_distribution'),
'structures' => $structures,
'title' => 'distribution ' . strtoupper($fbbStructures[$distribution->getStructureFbb()]) . ' DU ' . $distribution->getDatedistribution()->format('d-m-Y'),
]);
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream('Remise_de_vetement_' . $distribution->getId() . ".pdf", [
"Attachment" => true,
]);
return new Response (
//$dompdf->stream('resume', ["Attachment" => false]),
Response::HTTP_OK,
['Content-Type' => 'application/pdf']
);
}
private function imageToBase64($path) {
$path = $path;
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
return $base64;
}
/**
* @Route("/beneficiaire/", name="app_ajax_search_beneficiaire", methods={"GET"})
*/
public function search_beneficiaire(Request $request, DistributionRepository $distribution): Response
{
$keyword = $request->query->get('keyword');
if (!$request->isXmlHttpRequest()) {
die;
//return $this->render('notaire/search.html.twig', ['query' => $query]);
}
$foundBeneficiaires = $distribution->findBySearchQuery($keyword);
$results = [];
foreach ($foundBeneficiaires as $beneficiaire) {
$results[] = [
'nom' => htmlspecialchars($beneficiaire->getNom(), ENT_COMPAT | ENT_HTML5),
'prenom' => htmlspecialchars($beneficiaire->getPrenom(), ENT_COMPAT | ENT_HTML5),
//'link' => $this->generateUrl('app_show_notaire', ['id' => $notaire->getId()]),
];
}
return new JsonResponse(array('data' => $results),200);
}
}