<?php
namespace App\Controller\Articles;
use App\Entity\Articles\Article;
use App\Entity\Articles\ArticleAssocie;
use App\Form\Articles\ArticleAssocieQteType;
use App\Form\Articles\ArticleAssocieType;
use App\Form\Articles\SupprimerArticleAssocieType;
use App\Library\Datatable\Util\Datatable;
use App\Security\Voter\EntityVoter;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ArticleAssocieController extends AbstractController
{
private function verifierArticleComposeNeSeContientPasLuiMeme(ArticleAssocie $articleAssocie, $article, $retour = '')
{
if ($articleAssocie->getEnfant()->getId() == $article) {
//return true;
$retour = 'true';
} else {
//$retour .= 'art'.$articleAssocie->getEnfant()->getId().'/';
$articlesAssocies = $articleAssocie->getEnfant()->getArticlesAssociesParent();
foreach ($articlesAssocies as $compo) {
$retour = $this->verifierArticleComposeNeSeContientPasLuiMeme($compo, $article, $retour);
}
}
//return false;
return $retour;
}
/**
* @Route("/article-associe/nouveau/article/{id}", name="dtc_article_associe_ajouter")
*/
public function ajouterAction(Request $request, $id, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$get = $request->query->all();
$titre_modal = $translator->trans("Nouvel article associé");
$articleAssocie = new ArticleAssocie;
$articleAssocie->setQuantite(1);
$user = $this->getUser();
$articleAssocie->setUtilisateur($user);
$form = $this->createForm(ArticleAssocieType::class, $articleAssocie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
//dump($articleAssocie);
$error = $this->verifierArticleComposeNeSeContientPasLuiMeme($articleAssocie, $id);
if ($error == 'true') {
$this->addFlash(
'warning',
'Impossible d\'ajouter cet article, il est déjà associé.'
);
} else {
$repo_objet = $em->getRepository(Article::class);
$objet = $repo_objet->find($id);
if (is_object($objet)) {
$repo_articleAssocie = $em->getRepository(ArticleAssocie::class);
$nbComposants = count($repo_articleAssocie->findByParent($objet));
$nbComposants++;
$articleAssocie->setOrdre($nbComposants);
$articleAssocie->setParent($objet);
$em->persist($objet);
}
$url = $this->generateUrl('dtc_article_modifier', ['id' => $objet->getId(), 'tab' => 'associes']);//,'test'=>$error
$em = $em;
$em->persist($articleAssocie);
$em->flush();
/*
$this->addFlash(
'notice',
$translator->trans('Composant ajouté avec succès !')
);
*
*/
//$rendu = $this->renderView('Articles/ArticleAssocie/lister-by-article.html.twig', array('articlesAssocies'=>array($articleAssocie),'quantite'=>1,'article'=>$objet));
$rendu = '';
if (!empty($get["table"])) {
return new JsonResponse(
['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]],
200,
['Content-Type' => 'application/json']
);
} else {
return new JsonResponse(
['rendu' => $rendu, 'valide' => '1', 'url' => $url, 'type' => 'ajoutArticleAssocieSurArticle'],
200,
['Content-Type' => 'application/json']
);
}
}
} else {
$errors = $validator->validate($articleAssocie);
$rendu = $this->renderView('Articles/ArticleAssocie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Articles/ArticleAssocie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/article-associe/modifier/{id}", name="dtc_article_associe_modifier")
*/
public function modifierAction(Request $request, ArticleAssocie $articleAssocie, EntityManagerInterface $em, ValidatorInterface $validator, TranslatorInterface $translator)
{
$titre_modal = $translator->trans("Modifier l'article associé");
$id = $request->query->get('article');
$get = $request->query->all();
$user = $this->getUser();
$articleAssocie->setUtilisateur($user);
$form = $this->createForm(ArticleAssocieQteType::class, $articleAssocie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$droit = $this->isGranted(EntityVoter::UPDATE, ArticleAssocie::class);
if (!$droit) {
$rendu = $this->renderView(
'Articles/ArticleAssocie/modifier.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'objet' => $objet]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
if ($form->isValid()) {
$url = $this->generateUrl('dtc_article_modifier', ['id' => $articleAssocie->getParent()->getId(), 'tab' => 'associes']);
$em->persist($articleAssocie);
$em->flush();
if (!empty($get["table"])) {
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]],
200,
['Content-Type' => 'application/json']
);
} else {
$this->addFlash(
'notice',
$translator->trans('Article associé modifié avec succès !')
);
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($articleAssocie);
$rendu = $this->renderView('Articles/ArticleAssocie/modifier.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Articles/ArticleAssocie/modifier.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/article-associe/supprimer/{id}", name="dtc_article_associe_supprimer")
*/
public function supprimerAction(Request $request, ArticleAssocie $objet, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$id = $request->query->get('article');
$get = $request->query->all();
$titre_modal = $translator->trans("Demande de confirmation");
$articleAssocie = $objet;
$form = $this->createForm(SupprimerArticleAssocieType::class, $articleAssocie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->remove($objet);
$em->flush();
/*
$this->addFlash(
'notice',
$translator->trans('Composant supprimé avec succès !')
);*/
$url = $this->generateUrl('dtc_article_modifier', ['id' => $objet->getParent()->getId(), 'tab' => 'associes']);
if (!empty($get["table"])) {
return new Response(
json_encode(['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]]),
200,
['Content-Type' => 'application/json']
);
} else {
return new Response(
json_encode(['rendu' => '', 'valide' => '1', 'url' => $url, 'id' => $articleAssocie->getEnfant()->getId(), 'type' => 'supprimerComposantSurArticle']),
200,
['Content-Type' => 'application/json']
);
}
} else {
$errors = $validator->validate($articleAssocie);
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'objet' => $objet]);
return new Response(json_encode(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]));
}
}
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'objet' => $objet]);
return new Response(json_encode(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]));
}
/**
* @Route("/article-associe/liste", name="dtc_article_associe_liste")
*/
public function listerAction($id, $type, $page = 1, TranslatorInterface $translator, Datatable $datatable)
{
//$tableau_class_cellule[]=array("className"=>"visible_export colonne_id","targets"=>array(1),"visible"=>$serviceColonneTableau->getColonneUtilisateur("DTCArticlesBundle:ArticleAutomatique","id"));
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [0], "visible" => false, "orderable" => false];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [1], "visible" => false, "orderable" => false];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [2], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [3], "visible" => true, "orderable" => true];
$tableau_class_cellule[] = ["className" => "colonne_id text-center", "targets" => [4], "visible" => true, "orderable" => true];
$parametres = [
'id' => $id,
'type' => $type,
];
$this->datatable([], $translator, $datatable);
return $this->render('Articles/ArticleAssocie/lister.html.twig', ['name' => 'articleAssocie', 'tableauClassColonne' => $tableau_class_cellule, 'parametres' => $parametres]);
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable($parametres = [], TranslatorInterface $translator, Datatable $datatable)
{
//if(count($parametres)) dump($parametres);
$where = 'x.dateSuppression IS NULL';
$parameters = [];
if (!empty($parametres['id'])) {
$parameters['id'] = $parametres['id'];
$where .= ' and x.parent = :id';
}
$datatable->setDatatableId('dta-article-associe')
->setEntity(ArticleAssocie::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Réf article") => 'a.reference',
$translator->trans("Libellé article") => 'a.libelle',
$translator->trans("Quantité") => 'x.quantite',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.enfant', 'a', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('x.client', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setRenderers(
[
1 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
'typeDocument' => 'enfant',
],
],
4 => [
'view' => 'FO/DataTable/actions_modal.html.twig',
'params' => [
'edit_route' => 'dtc_article_associe_modifier',
'supprimer_route' => 'dtc_article_associe_supprimer',
'type' => "",
'entite' => 'articleAssocie',
'table' => 'dta-article-associe',
'tableau' => 'dta-article-associe',
'objet' => ArticleAssocie::class
,
'width_modal' => 800,
],
],
]
)
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_article_associe_liste',
],
]
)
->setWhere($where, $parameters)
->setOrder("x.id", "asc")
->setSearch(true)
->setSearchFields([1]);
//$datatable->setSearchFields(array(0,2));
return $datatable;
}
/**
* @Route("/article-associe/grid", name="dtc_article_associe_liste_grid")
*/
public function gridAction(Request $request, TranslatorInterface $translator, Datatable $datatable)
{
$parametres = $request->query->all();
return $this->datatable($parametres, $translator, $datatable)->execute();
}
/**
* @Route("/article-associe/charger-tableau", name="dtc_article_associe_charger_tableau")
*/
public function chargerTableauAction(Request $request)
{ //,$id="0",$type="a"
$parametres = $request->query->all();
$rendu = $this->renderView('Articles/ArticleAssocie/charger_tableau.html.twig', [
'parametres' => $parametres,
]);
return new JsonResponse(['rendu' => $rendu]);
}
/*
public function listerByArticleAction(Request $request, Article $article){
$ajax = $request->query->get('ajax');
$articlesAssocies = $article->getArticlesAssocies();
$quantite = $request->query->get('quantite');
if($quantite = "") $quantite=1;
$retour = array();
$articlesAssociesAvecArborescence = $this->getArticlesAssocies($article, $retour, $quantite);
//\Doctrine\Common\Util\Debug::dump($articlesAssocies);
//\Doctrine\Common\Util\Debug::dump($articlesAssociesAvecArborescence);
if($ajax == true){
$rendu = $this->renderView('Articles/ArticleAssocie/lister-by-article-json.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'quantite' => $request->query->get('quantite'),
));
$response = new JsonResponse();
$response->setData(array(
'retour' => $rendu
));
return $response;
} else {
return $this->render('Articles/ArticleAssocie/lister-by-article.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
));
}
}
private function getArticlesAssocies(Article $article, $retour, $quantite=1){
$articlesComposants = $article->getArticlesAssocies();
$quantiteComposant = $article->getStockReserve();
foreach($articlesComposants as $articleAssocie)
{
$quantiteComposant = $articleAssocie->getQuantite() * $quantite;
$ssArticle = $articleAssocie->getEnfant();
if(count($ssArticle->getArticlesAssocies()) > 0)
$retour = $this->getArticlesAssocies($ssArticle, $retour, $quantiteComposant);
else
{
$articleAssocie->setQuantite($quantiteComposant);
$retour[] = $articleAssocie;
}
}
return $retour;
}
public function listerAction(Request $request, Article $article, $quantite=1){
$articlesAssocies = $article->getArticlesAssocies();
//$quantite = $request->query->get('quantite');
$ajax = $request->query->get('ajax');
$fabricationMultiple = $request->query->get('fabricationMultiple');
$donnees = array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'class' => $request->query->get('class'),
'quantite' => $quantite,
'ajax' => $ajax,
'afficherArticle' => $request->query->get('afficherArticle'),
'dataId' => $request->query->get('dataId'),
'dataParent' => $request->query->get('dataParent'),
'dataMultiple' => $request->query->get('dataMultiple'),
'dataNiveau' => $request->query->get('dataNiveau'),
);
$donnees['fabId'] = $request->query->get('fabrication');
if ($ajax === false || $ajax == 'false' || $ajax == ''){
$donnees['quantite'] = $quantite;
return $this->render('Articles/ArticleAssocie/lister-avec-arbo-2.html.twig', $donnees);
} else {
$donnees['quantite'] = $request->query->get('quantite');
$donnees['quantiteFabrication'] = $request->query->get('quantiteFabrication');
$rendu = $this->renderView('Articles/ArticleAssocie/lister-avec-arbo-2.html.twig', $donnees);
$response = new JsonResponse();
$response->setData(array(
'retour' => $rendu
));
return $response;
}
}
public function listerSousComposantAction(Request $request, Article $article){
$articlesAssocies = $article->getArticlesAssocies();
$rendu = $this->renderView('Articles/ArticleAssocie/lister-sous-articleAssocie.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'niveau' => $request->query->get('niveau'),
'class' => $request->query->get('class'),
'quantite' => $request->query->get('quantite'),
));
$response = new JsonResponse();
$response->setData(array(
'trs' => $rendu
));
return $response;
}
public function listerSousComposantCarnetAction(Request $request, Article $article){
$articlesAssocies = $article->getArticlesAssocies();
$rendu = $this->renderView('Articles/ArticleAssocie/lister-sous-articleAssocie-carnet.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'niveau' => $request->query->get('niveau'),
'class' => $request->query->get('class'),
'quantite' => $request->query->get('quantite'),
));
$response = new JsonResponse();
$response->setData(array(
'trs' => $rendu
));
return $response;
}
public function fabricationMultiplelisterAction(Request $request, Fabrication $fabrication){
$quantite = $fabrication->getQuantite();
$article = $fabrication->getArticle();
$articlesAssocies = $article->getArticlesAssocies();
//$quantite = $request->query->get('quantite');
$ajax = $request->query->get('ajax');
if ($ajax === false || $ajax == 'false' || $ajax == ''){
//\Doctrine\Common\Util\Debug::dump($article->getId());
return $this->render('Articles/ArticleAssocie/lister-avec-arbo-2.html.twig', array(
//return $this->render('GestionComerciale/ArticleCommande/lister-avec-arbo-2.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'class' => $request->query->get('class'),
'quantite' => $quantite,
'ajax' => $ajax,
'afficherArticle' => $request->query->get('afficherArticle'),
'dataId' => $request->query->get('dataId'),
'dataParent' => $request->query->get('dataParent'),
'dataMultiple' => $request->query->get('dataMultiple'),
'dataNiveau' => $request->query->get('dataNiveau'),
'fabrication' => $fabrication
));
} else {
$rendu = $this->renderView('Articles/ArticleAssocie/lister-avec-arbo-2.html.twig', array(
//return $this->render('GestionComerciale/ArticleCommande/lister-avec-arbo-2.html.twig', array(
'articlesAssocies' => $articlesAssocies,
'article' => $article,
'class' => $request->query->get('class'),
'quantite' => $request->query->get('quantite'),
'ajax' => $ajax,
'afficherArticle' => $request->query->get('afficherArticle'),
'dataId' => $request->query->get('dataId'),
'dataParent' => $request->query->get('dataParent'),
'dataMultiple' => $request->query->get('dataMultiple'),
'dataNiveau' => $request->query->get('dataNiveau'),
'quantiteFabrication' => $request->query->get('quantiteFabrication'),
'fabrication' => $fabrication
));
$response = new JsonResponse();
$response->setData(array(
'retour' => $rendu
));
return $response;
}
}
public function modifierOrdreAction(ArticleAssocie $articleAssocie, $ordre){
$articleAssocie->setOrdre($ordre);
$em = $em;
$em->persist($articleAssocie);
$em->flush();
$response = new JsonResponse();
$response->setData(array(
'retour' => 1
));
return $response;
}
*/
}