<?php
namespace App\Controller\Fournisseurs;
use App\Entity\Fournisseurs\Categorie;
use App\Entity\Fournisseurs\Fournisseur;
use App\Entity\Fournisseurs\FournisseurCategorie;
use App\Form\Fournisseurs\CategorieModalType;
use App\Form\Fournisseurs\CategorieType;
use App\Form\Fournisseurs\SupprimerCategorieType;
use App\Library\Datatable\Util\Datatable;
use App\Security\Voter\EntityVoter;
use App\Service\Utilisateur\ColonneTableauService;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\SerializerBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CategorieController extends AbstractController
{
/**
* @Route("/categories-fournisseur/dupliquer/{id}", name="dtc_categorie_fournisseur_dupliquer")
*/
public function dupliquerAction(Request $request, Categorie $categorie, EntityManagerInterface $em, TranslatorInterface $translator)
{
$categorie_duplique = clone $categorie;
$categorie_duplique->setLibelle("COPIE ".$categorie_duplique->getLibelle());
$em->persist($categorie_duplique);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégorie fournisseur dupliquée avec succès !')
);
return $this->redirectToRoute('dtc_categorie_fournisseur_liste');
}
/**
* @Route("/Categories-fournisseur/nouveau", name="dtc_categorie_fournisseur_ajouter")
*/
public function ajouterAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$categorie = new Categorie;
$user = $this->getUser();
$categorie->setUtilisateur($user);
$form = $this->createForm(CategorieType::class, $categorie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->persist($categorie);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégorie fournisseur ajoutée avec succès !')
);
return $this->redirectToRoute('dtc_categorie_fournisseur_liste');
} else {
$errors = $validator->validate($categorie);
}
}
return $this->render('Fournisseurs/Categorie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
}
/**
* @Route("/categories-fournisseur/supprimer/multiple", name="dtc_categorie_fournisseur_liste_supprimer")
*/
public function supprimerMultipleAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$url = $this->generateUrl('dtc_categorie_fournisseur_liste', []);
return new JsonResponse(['url' => $url, 'valide' => '1']);
$data = $request->get('dataTables');
$ids = $data['actions'];
$repo = $em->getRepository(Categorie::class);
for ($i = 0; $i < count($ids); $i++) {
$v = $repo->find($ids[$i]);
if (is_object($v)) {
$em->remove($v);
}
}
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégories fournisseur supprimées avec succès !')
);
$url = $this->generateUrl('dtc_categorie_fournisseur_liste', []);
return new JsonResponse(['url' => $url, 'valide' => '1']);
}
/*
/**
* @Route("/categories-fournisseur/supprimer/{id}", name="dtc_categorie_fournisseur_supprimer")
public function supprimerAction(Request $request, Categorie $categorie, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator) {
$titre_modal =$translator->trans("Demande de confirmation");
$request = $request;
$user = $this->getUser();
$form = $this->createForm(new SupprimerCategorieType, $categorie);
$errors = "";
$form->handleRequest($request);
$validator = $validator;
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em = $em;
$em->remove($categorie);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégorie fournisseur supprimée avec succès !')
);
$url = $this->generateUrl('dtc_categorie_fournisseur_liste', array());
return new JsonResponse(array('rendu'=>'','valide'=>'1','url'=>$url), 200, array('Content-Type'=>'application/json'));
}
else {
$errors = $validator->validate($categorie);
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$categorie->getId(),'type'=>''));
return new Response(json_encode(array('rendu'=>$rendu,'valide'=>'0','url'=>'','titre'=>$titre_modal)), 200, array('Content-Type'=>'application/json'));
}
}
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'id'=>$categorie->getId(),'type'=>'','errors'=>$errors));
return new Response(json_encode(array('rendu'=>$rendu,'valide'=>'0','url'=>'','titre'=>$titre_modal)), 200, array('Content-Type'=>'application/json'));
}
*/
/**
* @Route("/Categories-fournisseur/modifier/{id}", name="dtc_categorie_fournisseur_modifier")
*/
public function modifierAction(Request $request, Categorie $categorie, EntityManagerInterface $em, TranslatorInterface $translator,
ValidatorInterface $validator, Datatable $datatable
) {
$user = $this->getUser();
$categorie->setUtilisateur($user);
$form = $this->createForm(CategorieType::class, $categorie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
$droit = $this->isGranted(EntityVoter::UPDATE, Categorie::class);
if ( ! $droit) {
return $this->redirectToRoute('dtc_fournisseur_modifier', ["id" => $categorie->getId()]);
}
if ($form->isValid()) {
$em->persist($categorie);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégorie fournisseur sauvegardée avec succès !')
);
return $this->redirectToRoute('dtc_categorie_fournisseur_modifier', ["id" => $categorie->getId()]);
} else {
$errors = $validator->validate($categorie);
}
}
$this->datatableFournisseurs($categorie, $request, $datatable, $translator);
return $this->render('Fournisseurs/Categorie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'categorie' => $categorie]);
}
/**
* @Route("/Categories-fournisseur/", name="dtc_categorie_fournisseur_liste")
*/
public function listerAction(Request $request, EntityManagerInterface $em, ColonneTableauService $serviceColonneTableau, Datatable $datatable, TranslatorInterface $translator)
{
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [0], "visible" => false, "orderable" => false];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [1],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Categorie::class, "id"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_logo",
"targets" => [2],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Categorie::class, "libelle"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_logo",
"targets" => [3],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Categorie::class, "categorieParent"),
];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [4], "visible" => true];
$this->datatable($request, $datatable, $translator);
$categorie_enfants = [];
$repo_categorie_fournisseur = $em->getRepository(Categorie::class);
$categorie_fournisseur = $repo_categorie_fournisseur->findBy(["categorieParent" => null], ['libelle' => 'ASC']);
$param = $request->query->all();
return $this->render('Fournisseurs/Categorie/lister.html.twig', [
'parametres' => $param,
"categorie_parent" => $categorie_fournisseur,
'tableauClassColonne' => $tableau_class_cellule,
]);
//return $this->render('Fournisseurs/Categorie/lister.html.twig', array('tableauClassColonne'=>$tableau_class_cellule));
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable(Request $request, Datatable $datatable, TranslatorInterface $translator)
{
$param = $request->query->all();
$datatable->setEntity(Categorie::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Libellé") => 'x.libelle',
$translator->trans("Catégorie parent") => 'p.libelle',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.categorieParent', 'p', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_categorie_fournisseur_modifier',
],
],
3 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_categorie_fournisseur_modifier',
'dupliquer_route' => 'dtc_categorie_fournisseur_dupliquer',
//'supprimer_route' => 'dtc_categorie_fournisseur_supprimer',
'objet' => Categorie::class,
],
],
]
)
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_categorie_fournisseur_liste_supprimer',
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setSearchFields([1, 2]);
$where = "";
$parameters = [];
if (array_key_exists('parametres', $param)) {
if (array_key_exists('categorie_parent', $param["parametres"]) and $param["parametres"]["categorie_parent"] > 0) {
//echo "AZERTYUI";
//$datatable->addJoin('x.clientCategorie', 'cc', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
//$datatable->addJoin('cc.categorie', 'catC', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["categorie"] = $param["parametres"]["categorie_parent"];
$where .= "x.categorieParent = :categorie";
}
}
if ($where != '') {
//echo $where;
$datatable->setWhere($where, $parameters);
}
return $datatable;
}
/**
* @Route("/categories-fournisseur/grid", name="dtc_categorie_fournisseur_liste_grid")
*/
public function gridAction(Request $request, Datatable $datatable, TranslatorInterface $translator)
{
return $this->datatable($request, $datatable, $translator)->execute();
}
/**
* @Route("/categories-fournisseur/recherche", name="dtc_categorie_fournisseur_recherche")
*/
public function rechercheAction(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator)
{
$q = $request->query->get('q');
$parent = $request->query->get('parent');
$repo = $em->getRepository(Categorie::class);
//$results = $repo->getRechercheMarque($q);
$results = $repo->getRechercheCategorie($q, $parent);
$pagination = $paginator->paginate(
$results, /* query NOT result */
$request->query->getInt('page', 1)/*page number*/,
10/*limit per page*/
);
$pagination_results = $pagination->getItems();
$option_placeholde = ["libelle" => "Choisir", "id" => ""];
array_unshift($pagination_results, $option_placeholde);
$pagination->setItems($pagination_results);
$serializer = SerializerBuilder::create()->build();
return JsonResponse::fromJsonString($serializer->serialize($pagination, 'json'));
}
/**
* @Route("/Categories-fournisseur/fournisseurs/grid/{id}", name="dtc_categorie_fournisseur_fournisseurs_liste_grid")
*/
public function gridFournisseursAction(Request $request, Categorie $categorie, Datatable $datatable, TranslatorInterface $translator)
{
//$this->datatableProduits($categorie);
return $this->datatableFournisseurs($categorie, $request, $datatable, $translator)->execute();
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableFournisseurs($categorie, Request $request, Datatable $datatable, TranslatorInterface $translator)
{
$param = $request->query->all();
$datatable->setEntity(Fournisseur::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Réf") => 'x.reference',
$translator->trans("Libellé") => 'x.libelle',
$translator->trans("Email") => 'x.email',
$translator->trans("Téléphone") => 'x.telephone',
$translator->trans("Fax") => 'x.fax',
$translator->trans("Tva") => 'x.tva',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.fournisseurCategorie', 'fc', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_fournisseur_modifier',
],
],
1 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_fournisseur_modifier',
],
],
6 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_fournisseur_modifier',
'dupliquer_route' => 'dtc_fournisseur_dupliquer',
//'supprimer_route' => 'dtc_fournisseur_supprimer',
'objet' => Fournisseur::class,
],
],
]
)
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_fournisseur_liste_supprimer',
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setSearchFields([0, 1]);
//$datatable->setSearchFields(array(0,2));
$where = "";
$parameters = [];
if (array_key_exists('parametres', $param)) {
if (array_key_exists('categorie_fournisseur', $param["parametres"]) and $param["parametres"]["categorie_fournisseur"] > 0) {
//echo "AZERTYUI";
//$datatable->addJoin('x.clientCategorie', 'cc', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$datatable->addJoin('x.categorie', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["categorie"] = $param["parametres"]["categorie_fournisseur"];
$where .= "c.categorieParent = :categorie";
if (array_key_exists('sous_categorie_fournisseur', $param["parametres"]) and $param["parametres"]["sous_categorie_fournisseur"] > 0) {
//$datatable->addJoin('x.clientCategorie', 'cc2', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
//$datatable->addJoin('cc2.categorie', 'catC2', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["sous_categorie"] = $param["parametres"]["sous_categorie_fournisseur"];
$where .= " and x.categorie = :sous_categorie";
}
}
}
//$datatable->addJoin('x.categorie', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["categorie"] = $categorie->getId();
//print_r($parameters);
if ($where != '') {
$where .= ' and ';
}
//$where .= 'x.parent is null';
$where .= 'fc.categorie = :categorie';
if ($where != '') {
//echo $where;
$datatable->setWhere($where, $parameters);
}
return $datatable;
}
/**
* @Route("", name="")
*/
public function listerCategorieDossierAction(Request $request, $fournisseurId = '', EntityManagerInterface $em)
{
$repo_fournisseur = $em->getRepository(Fournisseur::class);
$repo_categorie = $em->getRepository(Categorie::class);
$repo_fournisseur_categorie = $em->getRepository(FournisseurCategorie::class);
$fournisseur = $repo_fournisseur->find($fournisseurId);
$fournisseurCategories = [];
if (is_object($fournisseur)) {
$categoriesFournisseur = $repo_fournisseur_categorie->findBy(['fournisseur' => $fournisseurId], ['libelle' => 'ASC']);
foreach ($categoriesFournisseur as $categorieFournisseur) {
$fournisseurCategories[] = $categorieFournisseur->getCategorie()->getId();
}
}
//\Doctrine\Common\Util\Debug::dump($fournisseurId);
$categories = $repo_categorie->findBy(['categorieParent' => null], ['libelle' => 'ASC']);//CategorieParent
return $this->render('Fournisseurs/Categorie/lister-dossier.html.twig', [
'nbCategoriesEnfant' => [],
'categories' => $categories,
'fournisseur' => $fournisseur,
'categoriesFournisseur' => $fournisseurCategories,
'mode' => '',
'move' => true,
]);
}
/**
* @Route("/categorie-fournisseur/ajouter/modal", name="dtc_categorie_fournisseur_ajouter_modal")
*/
public function ajouterModalAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$repo_categorie = $em->getRepository(Categorie::class);
$titre_modal = $translator->trans("Créer une nouvelle catégorie");
$errors = "";
$errorsSup = [];
$categorie = new Categorie;
$parentId = $request->query->get('parent');
if ($parentId == '') {
$parentId = null;
}//par defaut le parent est la categorie racine.
if ($parentId != '') {
$parent = $repo_categorie->find($parentId);
if (is_object($parent)) {
$titre_modal .= ' enfant de '.$parent->getLibelle();
$categorie->setCategorieParent($parent);
}
}
$user = $this->getUser();
$categorie->setUtilisateur($user);
$form = $this->createForm(CategorieModalType::class, $categorie);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->persist($categorie);
$em->flush();
$url = $this->generateUrl('dtc_categorie_fournisseur_liste', []);
//$url="";
$this->addFlash('notice', $translator->trans('Categorie ajoutée avec succès !'));
return new JsonResponse(['rendu' => '', 'errorsSup' => $errorsSup, 'valide' => '1', 'url' => $url, 'type' => '', 'libelle' => ''],
200,
['Content-Type' => 'application/json']);
} else {
$errors = $validator->validate($categorie);
}
}
$rendu = $this->renderView(
'Fournisseurs/Categorie/ajouter-modal.html.twig',
['form' => $form->createView(), 'errorsSup' => $errorsSup, 'errors' => $errors, 'errorsSup' => $errorsSup, 'categorie' => $categorie]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("", name="")
*/
public function supprimerAction(Request $request, Categorie $objet, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Demande de confirmation");
$user = $this->getUser();
$message = '';
$errorsSup = [];
//Verifier si la categorie a des produits
if (count($objet->getFournisseurCategorie()) > 0) {
$errorsSup[] = 'La catégorie n\'est pas supprimable car elle contient des fournisseurs.';
}
//Verifier si la categorie a des categories enfantes
if (count($objet->getCategoriesEnfant()) > 0) {
//if ($message != '') $message .= ' ';
$errorsSup[] = 'La catégorie n\'est pas supprimable car elle contient des catégories enfants';
}
$form = $this->createForm(SupprimerCategorieType::class, $objet);
$errors = "";
$form->handleRequest($request);
//if ($form->isSubmitted() && $message != '') {
if ($form->isSubmitted() && count($errorsSup) == 0) {
if ($form->isValid()) {
$em->remove($objet);
$em->flush();
$this->addFlash('notice', $translator->trans('Catégorie supprimée avec succès !'));
$url = $this->generateUrl('dtc_categorie_fournisseur_liste');
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
} else {
$errors = $validator->validate($objet);
$rendu = $this->renderView(
'Fournisseurs/Categorie/supprimer.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'errorsSup' => $errorsSup, 'message' => $message]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Fournisseurs/Categorie/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'errorsSup' => $errorsSup, 'message' => $message]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("", name="")
*/
public function listerCategorieDossierFournisseurAction(Request $request, $fournisseur = null, $mode = "", EntityManagerInterface $em)
{
$repo_fournisseur = $em->getRepository(Fournisseur::class);
$fournisseur = $repo_fournisseur->find($fournisseur);
$repo_categorie = $em->getRepository(Categorie::class);
$repo_fournisseur_categorie = $em->getRepository(FournisseurCategorie::class);
$nbCategoriesEnfant = [];
$fournisseurCategories = [];
if (is_object($fournisseur)) {
//$categoriesFournisseur = $repo_fournisseur_categorie->findByArticle($fournisseurId);
foreach ($fournisseur->getFournisseurCategorie() as $categorieFournisseur) {
$boucler = true;
$fournisseurCategories[] = $categorieFournisseur->getCategorie()->getId();
if (is_object($categorieFournisseur->getCategorie()->getCategorieParent()) and $categorieFournisseur->getCategorie()->getCategorieParent()->getId() > 0) {
$parent = $categorieFournisseur->getCategorie()->getCategorieParent();
while ($boucler) {
if ( ! array_key_exists($parent->getId(), $nbCategoriesEnfant)) {
$nbCategoriesEnfant[$parent->getId()] = 1;
} else {
$nbCategoriesEnfant[$parent->getId()]++;
}
if (is_object($parent->getCategorieParent()) and $parent->getCategorieParent()->getId() > 1) {
$parent = $parent->getCategorieParent();
} else {
$boucler = false;
}
}
}
}
}
$categories = $repo_categorie->findBy(['categorieParent' => null], ['libelle' => 'ASC']);//CategorieParent
return $this->render('Fournisseurs/Categorie/lister-dossier.html.twig', [
'nbCategoriesEnfant' => $nbCategoriesEnfant,
'categories' => $categories,
'fournisseur' => $fournisseur,
'categoriesFournisseur' => $fournisseurCategories,
'mode' => $mode,
]);
}
/**
* @Route("/categorie/charger-tableau/{id}/{type}", name="dtc_categorie_fournisseur_charger_tableau")
*/
public function chargerTableauAction(Request $request, Fournisseur $fournisseur, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$rendu = $this->renderView('Fournisseurs/Categorie/charger_tableau.html.twig', ["fournisseur" => $fournisseur]);
return new JsonResponse(['rendu' => $rendu]);
}
}