<?php
namespace App\Controller\Articles;
use App\Entity\Articles\Article;
use App\Entity\Articles\AttributArticle;
use App\Entity\Articles\Declinaison;
use App\Entity\Articles\DeclinaisonValeurAttributArticle;
use App\Entity\Articles\Image;
use App\Entity\Articles\ValeurAttributArticle;
use App\Entity\FO\Parametrage;
use App\Form\Articles\DeclinaisonType;
use App\Form\Articles\DetacherArticleDeclinaisonType;
use App\Form\Articles\RattacherArticleDeclinaisonType;
use App\Library\Datatable\Util\Datatable;
use App\Service\Articles\ArticleService;
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 DeclinaisonController extends AbstractController
{
/**
* @Route("/article/declinaisons/ajouter-image/multiple", name="dtc_declinaison_ajouter_image_multiple")
*/
public function ajouterImagesMultipleAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator)
{
$post = $request->request->all();
$titre_modal = $translator->trans("Nouvelle image");
$page = $request->query->get('page');
$get = $request->query->all();
$errors = [];
$tokenPicture = sprintf('%09d', mt_rand(0, 1999999999));
$photosExistantes = "";
$objet = "";
$dossier = "";
$entite = "";
$photos = '';
//$rendu = $this->renderView('Articles/Declinaison/ajouter_image_multiple.html.twig', array('errors'=>$errors));
//$rendu = $this->renderView('Articles/Image/content-upload-multiple.html.twig', array('errors'=>$errors));
$rendu = $this->renderView(
'Articles/Image/content-upload-multiple.html.twig',
[
'enfants' => $post["articles"],
'entite' => $entite,
'objet' => $objet,
'dossier' => $dossier,
'photos' => $photosExistantes,
'tokenPicture' => $tokenPicture,
'photos2' => $photos,
]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
//return new JsonResponse(array('valide'=>'1'), 200, array('Content-Type'=>'application/json'));
}
/**
* @Route("/article/declinaisons/supprimer-image/multiple", name="dtc_declinaison_supprimer_image_multiple")
*/
public function supprimerImagesMultipleAction(Request $request, EntityManagerInterface $em)
{
$url = "";
$post = $request->request->all();
$repo_image = $em->getRepository(Image::class);
if (array_key_exists('images', $post) && count($post["images"]) > 0) {
foreach ($post["images"] as $img) {
$image = $repo_image->find($img);
if (is_object($image)) {
$article = $image->getArticle();
$article->removeImage($image);
$em->persist($article);
//Suppression physique des images dans les diférrents dossiers
$dossiers = ['thumbnails', 'small', 'originals', 'medium', 'large'];
foreach ($dossiers as $dossier) {
$urlAsupprimer = $image->getUploadDir().'/'.$article->getId().'/'.$dossier.'/'.$image->getUrl();
unlink($urlAsupprimer);
}
$em->remove($image);
}
}
$em->flush();
}
return new JsonResponse(['url' => $url, 'valide' => '1']);
}
/**
* @Route("/article/declinaisons/appliquer-regles/multiple", name="dtc_declinaison_appliquer_regle_multiple")
*/
public function appliquerRegleDeclinaisonMultipleAction(Request $request, EntityManagerInterface $em, ArticleService $articleService, TranslatorInterface $translator)
{
$url = "";
$repo_article = $em->getRepository(Article::class);
$data = $request->get('dataTables');
$ids = $data['actions'];
$article_parent = null;
//print_r($ids);
if (count($ids) > 0) {
foreach ($ids as $id) {
if ( ! is_object($article_parent)) {
$article_obj = $repo_article->find($id);
if (is_object($article_obj) && is_object($article_obj->getArticleDeclinaisonParent())) {
$article_parent = $article_obj->getArticleDeclinaisonParent();
}
}
if (is_object($article_parent)) {
$articleService->majDeclinaison($id, $article_parent);
}
}
}
$this->addFlash('notice', $translator->trans('Déclinaisons mis à jours avec succès !'));
return new JsonResponse(['url' => $url, 'valide' => '1']);
}
/**
* @Route("/article/check/reference", name="dtc_article_reference_libre")
*/
public function referenceArticleLibreAction(Request $request, ArticleService $articleService)
{
$get = $request->query->all();
$retour = false;
if ( ! $articleService->testReferenceArticleExiste($get["reference"])) {
$retour = true;
}
return new JsonResponse(['rendu' => '', 'valide' => $retour]);
}
/**
* @Route("/declinaison/nouveau/{id}/{type}", name="dtc_declinaison_article_ajouter")
*/
public function ajouterAction(Request $request, $id, $type = "", EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Nouvelle déclinaison");
$repo_objet = $em->getRepository(Article::class);
$get = $request->query->all();
$declinaison = new Declinaison();
$objet = $repo_objet->find($id);
if (is_object($objet)) {
$declinaison->setArticle($objet);
//$declinaison->setLibelle($objet->getLibelle());
}
$user = $this->getUser();
//$declinaison->setUtilisateur($user);
$form = $this->createForm(DeclinaisonType::class, $declinaison);
$repo_attribut = $em->getRepository(AttributArticle::class);
$attributs = $repo_attribut->findAll();
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$post = $request->request->all();
if ($type == 'article') {
$repo_objet = $em->getRepository(Article::class);
$objet = $repo_objet->find($id);
$url = $this->generateUrl('dtc_article_modifier', ['id' => $objet->getId(), 'tab' => 'condVente']);
}
if (array_key_exists('attr_val', $post) && $post["attr_val"]) {
$valeur_tab = explode(",", $post["attr_val"]);
if (count($valeur_tab) > 0) {
$repo_valeur_attribut = $em->getRepository(ValeurAttributArticle::class);
foreach ($valeur_tab as $vt) {
$id_valeur = $vt;
$id_valeur = str_replace("val_", "", $id_valeur);
$id_valeur = str_replace("_val", "", $id_valeur);
$valeur_obj = $repo_valeur_attribut->find($id_valeur);
if (is_object($valeur_obj)) {
$declinaisonValeurAttributArticle = new DeclinaisonValeurAttributArticle();
$declinaisonValeurAttributArticle->setDeclinaison($declinaison);
$declinaisonValeurAttributArticle->setValeurAttributArticle($valeur_obj);
$em->persist($declinaisonValeurAttributArticle);
}
}
}
}
$em->persist($declinaison);
$em->persist($objet);
$em->flush();
if (array_key_exists('table', $get) && $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('Déclinaison ajoutée avec succès !'));
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($declinaison);
$rendu = $this->renderView(
'Articles/Declinaison/ajouter.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'declinaison' => $declinaison, 'attributs' => $attributs]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView(
'Articles/Declinaison/ajouter.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'declinaison' => $declinaison, 'attributs' => $attributs]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
//return $this->render('Articles/Declinaison/ajouter.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type));
}
/**
* @Route("/declinaison/charger-tableau-image/{id}/{type}", name="dtc_declinaison_article_charger_tableau_image")
*/
public function chargerTableauImageAction(Request $request, $id = "0", $type = "", EntityManagerInterface $em)
{
$repo_objet = $em->getRepository(Article::class);
$article = $repo_objet->find($id);
$rendu = $this->renderView('Articles/Declinaison/charger_tableau_image.html.twig', ["id" => $id, "type" => $type, "article" => $article,]);
return new JsonResponse(['rendu' => $rendu]);
}
/**
* @Route("/declinaison/charger-tableau/{id}/{type}", name="dtc_declinaison_article_charger_tableau")
*/
public function chargerTableauAction(Request $request, $id = "0", $type = "", EntityManagerInterface $em)
{
$repo_objet = $em->getRepository(Article::class);
$article = $repo_objet->find($id);
$rendu = $this->renderView('Articles/Declinaison/charger_tableau.html.twig', ["id" => $id, "type" => $type, "article" => $article,]);
return new JsonResponse(['rendu' => $rendu]);
}
/**
* @Route("/declinaison", name="dtc_declinaison_article_liste")
*/
public function listerAction(Request $request, $id = "0", $type = "a", $enfant = "", EntityManagerInterface $em, TranslatorInterface $translator, Datatable $datatable)
{
$tableau_class_cellule = [];
$modal = $request->query->get('modal');
$articleId = $request->query->get('id');
$qte = $request->query->get('qte');
$repo_objet = $em->getRepository(Article::class);
$attributs = $em->getRepository(AttributArticle::class)->findAll();
$objet = $repo_objet->find($id);
if ($articleId != '') {
$article = $repo_objet->find($articleId);
if ($modal == 1 && is_object($article)) {
$titre_modal = $translator->trans('Déclinaison');
$this->datatableArticle($request, $article, $type, $em, $datatable, $translator);
$rendu = $this->renderView('Articles/Declinaison/lister.html.twig', ['tableauClassColonne' => $tableau_class_cellule, "id" => $articleId, "type" => $type, 'qte' => $qte]
);
//$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type,'objet'=>$objet));
return new Response(json_encode(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]));
}
}
if (is_object($objet)) {
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["searchable" => true, "className" => "visible_export colonne_id ", "targets" => [0], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = ["searchable" => true, "className" => "visible_export colonne_id ", "targets" => [1], "visible" => true];
$tableau_class_cellule[] = ["searchable" => true, "className" => "visible_export colonne_id", "targets" => [2], "visible" => true];
$tableau_class_cellule[] = ["orderable" => false, "searchable" => true, "className" => "visible_export colonne_id text-right", "targets" => [3], "visible" => true];
$tableau_class_cellule[] = ["searchable" => true, "className" => "visible_export colonne_id text-right ", "targets" => [4], "visible" => true];
$tableau_class_cellule[] = ["orderable" => false, "searchable" => false, "className" => "colonne_id text-center", "targets" => [5], "visible" => true];
$tableau_class_cellule[] = ["orderable" => false, "searchable" => false, "className" => "colonne_id", "targets" => [6], "visible" => true];
$this->datatableArticle( $request, $objet, $type, $em, $datatable, $translator);
return $this->render(
'Articles/Declinaison/lister.html.twig',
['tableauClassColonne' => $tableau_class_cellule, "id" => $id, "type" => $type, "attributs" => $attributs, "article" => $objet, "enfant" => $enfant]
);
}
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableArticle(Request $request, $objet, $type = "", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$param = $request->query->all();
$conn = $em->getConnection();
$conn->getConfiguration()->setSQLLogger(null);
$qb = $em->createQueryBuilder();
$qb->select(
"
x.id as x_id,
x.archive as x_archive,
x.libelle as x_libelle,
x.reference as x_reference,
x.descriptionCourte as x_descriptionCourte,
x.prixVente as x_prixVente,
x.tauxMarge as x_tauxMarge,
x.cpump as x_cpump,
x.stock as x_stock,
x.statut as x_statut,
m.libelle as m_libelle,
m.id as m_id,
t.libelle as t_libelle,
t.id as t_id,
r.id as r_id,
r.tauxDefaut as r_tauxDefaut
"
)
->orderBy('x.id', 'DESC')
->from(Article::class, "x")
->leftJoin('x.marque', 'm')
->leftJoin('x.type', 't')
->leftJoin('x.regleTaxe', 'r', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);;
$where = "(x.archive = 0 or x.archive is null)";
$where = "";
//$qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
//$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null AND '.$where);
$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null');
$parametres['articleDeclinaisonParent'] = $objet;
//echo $where;
if (count($parametres) > 0) {
$qb->setParameters($parametres);
}
//$type_jointure = 'x.'.$type;
$datatable->setDatatableId('dta-declinaisons')
//->setEntity("DTCArticlesBundle:Article", "x")
->setFields(
[
$translator->trans("Référence") => 'x.reference',
$translator->trans("Libellé") => 'x.libelle',
$translator->trans("Prix HT") => 'x.prixVente',
$translator->trans("Prix TTC") => 'x.prixVente',
$translator->trans("Stock") => 'x.stock',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
//->addJoin('x.pays', 'p', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('f.devise', 'd', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('x.uniteMesure', 'u', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
/*->setWhere(
$type_jointure.' = :objet',
array('objet' => $objet)
)
*/
->setWhere(
'x.articleDeclinaisonParent = :objet',
['objet' => $objet]
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
1 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
2 => [
'view' => 'FO/DataTable/article_prixSuivi.html.twig',
'params' => [
'surveillance' => false,
],
],
3 => [
'view' => 'FO/DataTable/article_prix_article_ttc.html.twig',
],
5 => [
'view' => 'FO/DataTable/article_actions.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
'detacher_route' => 'dtc_declinaison_detacher_article',
'objet' => Article::class,
'table' => "dta-declinaisons",
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setMultiple(
[
'regles' => [
'title' => 'Appliquer les régles de propagation',
'route' => 'dtc_declinaison_appliquer_regle_multiple' // path to multiple delete route
],
]
);//->setSearchFields(array(1,2))
;
$datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
return $datatable;
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/declinaison/grid/{id}/{type}", name="dtc_declinaison_article_liste_grid")
*/
public function gridAction($id = "", $type = "", Request $request, EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$repo_objet = $em->getRepository(Article::class);
$objet = $repo_objet->find($id);
if (is_object($objet)) {
return $this->datatableArticle( $request, $objet, $type , $em, $datatable, $translator)->execute();
}
}
/**
* @Route("/declinaison/defaut/{id}", name="dtc_declinaison_article_statut")
*/
public function changeDefautAction(Declinaison $declinaison, EntityManagerInterface $em)
{
if ($declinaison->getDefaut() == 1) {
$declinaison->setDefaut(0);
} else {
$declinaison->setDefaut(1);
}
$em->persist($declinaison);
$em->flush();
$em->refresh($declinaison);
$headers = ['Content-Type' => 'application/json', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Methods' => 'POST'];
return new JsonResponse(['data' => '1'], 200, $headers);
}
/**
* @Route("/declinaison/attribut/supprimer/{id}/{article}", name="dtc_declinaison_supprimer_attribut_article")
*/
public function supprimerAttributArticleAction(AttributArticle $attributArticle, Article $article, EntityManagerInterface $em)
{
$valide = 1;
$repo_declinaison = $em->getRepository(Declinaison::class);
$valeurs = $repo_declinaison->findBy(["article" => $article, "attributArticle" => $attributArticle]);
if (count($valeurs) > 0) {
foreach ($valeurs as $v) {
$em->remove($v);
}
$em->flush();
}
$headers = ['Content-Type' => 'application/json', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Methods' => 'POST'];
return new JsonResponse(['valide' => $valide], 200, $headers);
}
/**
* @Route("/declinaison/rattacher/{id}", name="dtc_declinaison_rattacher_article")
*/
public function rattacherArticleAction(Request $request, Article $article, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$get = $request->query->all();
$titre_modal = $translator->trans("Rattacher un article existant");
$user = $this->getUser();
$form = $this->createForm(RattacherArticleDeclinaisonType::class, $article);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$url = "";
$entity = $form->getData();
$enfant = $form->get('enfant')->getData();
if (is_object($enfant)) {
$enfant->setArticleDeclinaisonParent($article);
$em->persist($enfant);
$em->flush();
}
$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' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($article);
$rendu = $this->renderView('Articles/Declinaison/rattacher.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'article' => $article]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Articles/Declinaison/rattacher.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'article' => $article]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/declinaison/valeur/ajouter/{id}/{article}", name="dtc_declinaison_ajouter_valeur_article")
*/
public function ajouterValeursArticleAction(Request $request, AttributArticle $attributArticle, Article $article, EntityManagerInterface $em)
{
$valide = 0;
$get = $request->query->all();
if (array_key_exists('valeur', $get) && $get["valeur"] != "" && array_key_exists('nouveau', $get) && $get["nouveau"] != "") {
$repo_declinaison = $em->getRepository(Declinaison::class);
$repo_valeur_attribut = $em->getRepository(ValeurAttributArticle::class);
if (is_object($article->getarticleDeclinaisonParent())) {
$caracteritiques_article = $repo_declinaison->findBy(["article" => $article, "attributArticle" => $attributArticle]);
if (count($caracteritiques_article) > 0) {
foreach ($caracteritiques_article as $v) {
$em->remove($v);
}
}
}
if ($get["nouveau"] == "false") {
$valeur_obj = $repo_valeur_attribut->find($get["valeur"]);
$declinaison_obj = $repo_declinaison->findOneBy(["article" => $article, "attributArticle" => $attributArticle, "valeurAttributArticle" => $valeur_obj]);
if ( ! is_object($declinaison_obj)) {
$declinaison = new Declinaison;
$declinaison->setArticle($article);
$declinaison->setAttributArticle($attributArticle);
$declinaison->setValeurAttributArticle($valeur_obj);
$em->persist($declinaison);
$em->flush();
} else {
$em->remove($declinaison_obj);
$em->flush();
}
} else {
$valeur_obj = $repo_valeur_attribut->findOneBy(["libelle" => $get["valeur"], "attributArticle" => $attributArticle]);
if ( ! is_object($valeur_obj)) {
$valeurAttributArticle = new ValeurAttributArticle;
$valeurAttributArticle->setLibelle($get["valeur"]);
$valeurAttributArticle->setAttributArticle($attributArticle);
$em->persist($valeurAttributArticle);
$em->flush();
$em->refresh($valeurAttributArticle);
$declinaison = new Declinaison;
$declinaison->setArticle($article);
$declinaison->setAttributArticle($attributArticle);
$declinaison->setValeurAttributArticle($valeurAttributArticle);
$em->persist($declinaison);
$em->flush();
} else {
$declinaison_obj = $repo_declinaison->findOneBy(["article" => $article, "attributArticle" => $attributArticle, "valeurAttributArticle" => $valeur_obj]);
if ( ! is_object($declinaison_obj)) {
$declinaison = new Declinaison;
$declinaison->setArticle($article);
$declinaison->setAttributArticle($attributArticle);
$declinaison->setValeurAttributArticle($valeur_obj);
$em->persist($declinaison);
$em->flush();
} else {
$em->remove($declinaison_obj);
$em->flush();
}
}
}
}
$headers = [
'Content-Type' => 'application/json',
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST',
];
return new JsonResponse(['valide' => $valide], 200, $headers);
}
/**
* @Route("/declinaison/valeur/charger/{id}/{article}", name="dtc_declinaison_charger_valeurs")
*/
public function chargerValeursAction(AttributArticle $attribut, Article $article, EntityManagerInterface $em)
{
$repo_valeurs = $em->getRepository(ValeurAttributArticle::class);
$valeurs = $repo_valeurs->findBy(["attributArticle" => $attribut]);
$options_valeurs = "";
if (is_object($article->getarticleDeclinaisonParent())) {
$rendu = $this->renderView('Articles/Declinaison/ajouter_caracteristique.html.twig', ['attribut' => $attribut, 'valeurs' => $valeurs, 'article' => $article]);
} else {
$rendu = $this->renderView('Articles/Declinaison/ajouter_variante.html.twig', ['attribut' => $attribut, 'valeurs' => $valeurs, 'article' => $article]);
}
if (count($valeurs) > 0) {
foreach ($valeurs as $v) {
$options_valeurs .= "<option data-attribut='".$attribut->getId()."' value='".$v->getId()."' >".$v->getLibelle()."</option>";
}
}
$headers = [
'Content-Type' => 'application/json',
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST',
];
//return new JsonResponse(array('valeurs' => $options_valeurs), 200, $headers);
return new JsonResponse(['rendu' => $rendu], 200, $headers);
}
/**
* @Route("/declinaison/detacher/{id}", name="dtc_declinaison_detacher_article")
*/
public function detacherArticleAction(Request $request, Article $article, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Demande de confirmation");
$get = $request->query->all();
$form = $this->createForm(DetacherArticleDeclinaisonType::class, $article);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$article->setArticleDeclinaisonParent(null);
$em->persist($article);
$em->flush();
$url = "";
if (array_key_exists('table', $get) && $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' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($article);
$rendu = $this->renderView('Articles/Declinaison/detacher.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Articles/Declinaison/detacher.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
public function get_combinations($arrays)
{
$result = [[]];
foreach ($arrays as $property => $property_values) {
$tmp = [];
foreach ($result as $result_item) {
foreach ($property_values as $property_value) {
$tmp[] = array_merge($result_item, [$property => $property_value]);
}
}
$result = $tmp;
}
return $result;
}
public function declinaisonExiste($parent, $caracteristiques = [], EntityManagerInterface $em)
{
$repo_articles = $em->getRepository(Article::class);
$repo_declinaisons = $em->getRepository(Declinaison::class);
$totalCarac = count($caracteristiques);
$tab_carac_test = [];
if (count($caracteristiques) > 0) {
$tab_carac_test = [];
foreach ($caracteristiques as $valeur) {
$tab_carac_test[] = $valeur["id"];
}
if (count($tab_carac_test) > 0) {
$articles_enfants = $repo_articles->findBy(["articleDeclinaisonParent" => $parent]);
if (count($articles_enfants) > 0) {
foreach ($articles_enfants as $ae) {
$tab_carac_test = [];
foreach ($caracteristiques as $valeur) {
$tab_carac_test[] = $valeur["id"];
}
$declinaisons = $repo_declinaisons->findBy(["article" => $ae]);
if (count($declinaisons) == $totalCarac) {
foreach ($declinaisons as $d) {
if (is_object($d->getValeurAttributArticle()) && in_array($d->getValeurAttributArticle()->getId(), $tab_carac_test)) {
if (($key = array_search($d->getValeurAttributArticle()->getId(), $tab_carac_test)) !== false) {
unset($tab_carac_test[$key]);
}
}
}
}
if (count($tab_carac_test) == 0) {
return true;
}
}
}
}
}
return false;
}
/**
* @Route("/declinaison/generer/{id}", name="dtc_declinaison_article_generer")
*/
public function genererArticleAction(Request $request, Article $article, EntityManagerInterface $em, ArticleService $articleService, TranslatorInterface $translator,
ValidatorInterface $validator
) {
$get = $request->query->all();
$titre_modal = $translator->trans("Générer les déclinaisons");
$user = $this->getUser();
$form = $this->createForm(RattacherArticleDeclinaisonType::class, $article);
$errors = "";
$articles_declinaisons = [];
$repo_parametrage = $em->getRepository(Parametrage::class);
$parametrage = $repo_parametrage->find(1);
$repo_declinaisons = $em->getRepository(Declinaison::class);
$declinaisons = $repo_declinaisons->findBy(["article" => $article]);
$tabTemp = [];
$tabCle = [];
$tableau_valeurs = [];
$tableau_valeurs_id = [];
$tableau_caracteritiques = [];
$tableau_caracteritiques_libelle = [];
//echo count($declinaisons)."<br/>";
if (count($declinaisons) > 0) {
foreach ($declinaisons as $d) {
$tableau_caracteritiques[$d->getattributArticle()->getId()] = $d->getattributArticle()->getLibelle();
$tableau_valeurs_id[$d->getValeurAttributArticle()->getId()] = $d->getValeurAttributArticle()->getLibelle();
if ( ! array_key_exists($d->getattributArticle()->getId(), $tableau_valeurs)) {
$tableau_valeurs[$d->getattributArticle()->getId()] = [$d->getValeurAttributArticle()->getId()];
} else {
$tableau_valeurs[$d->getattributArticle()->getId()][] = $d->getValeurAttributArticle()->getId();
}
if ( ! array_key_exists($d->getattributArticle()->getId(), $tableau_caracteritiques_libelle)) {
$tableau_caracteritiques_libelle[$d->getattributArticle()->getId()] = [
"libelle" => $d->getattributArticle()->getLibelle(),
"valeurs" => [$d->getValeurAttributArticle()->getId()],
];
} else {
//$tableau_caracteritiques_libelle[$d->getattributArticle()->getId()][]=$d->getattributArticle()->getLibelle();
$tableau_caracteritiques_libelle[$d->getattributArticle()->getId()]["valeurs"][] = $d->getValeurAttributArticle()->getId();
}
}
}
//print_r($tableau_valeurs);
//echo "<hr/><br/>";
$combinations = [];
$combinations = $this->get_combinations($tableau_valeurs);
//print_r($combinations);
//exit;
$regles = [];
$regle_libelle = "";
if (is_object($parametrage)) {
$regles = $parametrage->getReglesDeclinaisonUnserialize();
if (is_array($regles)) {
if (array_key_exists('diffusion_libelle', $regles) && $regles["diffusion_libelle"] != "") {
$regle_libelle = $regles["diffusion_libelle"];
}
}
}
$compteur_libelle = 1;
$compteur_reference = 1;
$combinations_final = [];
if (count($combinations) > 0) {
for ($i = 0; $i < count($combinations); $i++) {
$libelle = $article->getLibelle();
$libelle_valeur = "";
$libelle_libelle_valeur = "";
$caracteritiques = [];
$temp = ["reference" => "", "libelle" => "", "caracteristiques" => []];
foreach ($combinations[$i] as $v) {
//print_r($combinations[$i]);
//print_r($tableau_caracteritiques);
$libelle_valeur .= $tableau_valeurs_id[$v]." ";
if (count($tableau_caracteritiques_libelle) > 0) {
foreach ($tableau_caracteritiques_libelle as $key => $valeur) {
//print_r($valeur);
//echo "<br/>";
if (in_array(trim($v), $valeur["valeurs"])) {
//echo "<div><b>".$valeur["libelle"]."</b></div>";
$chaine = $valeur["libelle"];
$libelle_libelle_valeur .= $valeur["libelle"]." ";
}
}
}
$libelle_libelle_valeur .= $tableau_valeurs_id[$v]." ";
$caracteritiques[] = ["id" => $v, "libelle" => $tableau_valeurs_id[$v]];
//echo "<br/>".$tableau_valeurs_id[$v]." (".$v.")<br/><br/>";
}
//echo "<br/>libelle(".$libelle_libelle_valeur.")<br/><br/>";
switch ($regle_libelle) {
case 1:
//Copier le libellé de l'article principal du groupe
$libelle = $article->getLibelle();
break;
case 2:
//Ajout de la valeur des critères de déclinaison
$libelle = $article->getLibelle()." ".$libelle_valeur;
break;
case 3:
//Ajout du libellé et de la valeur des critères de déclinaison
$libelle = $article->getLibelle()." ".$libelle_libelle_valeur;
break;
case 4:
//Libellé de l'article parent puis nombre incrémenté
$libelle = $article->getLibelle()."-".$compteur_libelle;
break;
}
$compteur_libelle++;
$reference_libre = false;
while ( ! $reference_libre) {
$reference_construit = $article->getReference()."-".$compteur_reference;
if ( ! $articleService->testReferenceArticleExiste($reference_construit)) {
$reference_libre = true;
$compteur_reference++;
} else {
$compteur_reference++;
}
}
$temp["libelle"] = trim($libelle);
$temp["reference"] = trim($reference_construit);
$temp["caracteristiques"] = $caracteritiques;
if ( ! $this->declinaisonExiste($article, $caracteritiques, $em)) {
$combinations_final[] = $temp;
}
//echo "<hr/>";
}
}
//exit;
$form->handleRequest($request);
if ($form->isSubmitted()) {
$auMoinsUnArticle = false;
$post = $request->request->all();
//print_r($post);
//exit;
if (array_key_exists('choix', $post) && count($post["choix"]) > 0) {
$auMoinsUnArticle = true;
}
if ($form->isValid() and $auMoinsUnArticle) {
$url = "";
if (array_key_exists('choix', $post) && count($post["choix"]) > 0) {
for ($i = 0; $i < count($post["choix"]); $i++) {
$carac_declinaison = [];
$cle = $post["choix"][$i];
if (count($post["caracteritiques"][$cle]) > 0) {
foreach ($post["caracteritiques"][$cle] as $valeur) {
$carac_declinaison[] = $valeur;
}
}
$tab_declinaison = [];
$tab_declinaison["libelle"] = $post["libelle"][$cle];
$tab_declinaison["reference"] = $post["reference"][$cle];
$tab_declinaison["caracteritiques"] = $carac_declinaison;
$articleService->creerDeclinaison($tab_declinaison, $post, $article);
}
}
$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' => '', 'valide' => '1', 'url' => $url]);
}
} else {
if ( ! $auMoinsUnArticle) {
$errorsSup[] = 'Merci de cocher au moins une ligne';
}
$errors = $validator->validate($article);
$rendu = $this->renderView(
'Articles/Declinaison/generer.html.twig',
[
'form' => $form->createView(),
'errors' => $errors,
'article' => $article,
'errorsSup' => $errorsSup,
'combinations_final' => $combinations_final,
'carac' => $tableau_caracteritiques,
]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView(
'Articles/Declinaison/generer.html.twig',
[
'form' => $form->createView(),
'errors' => $errors,
'article' => $article,
'combinations_final' => $combinations_final,
'carac' => $tableau_caracteritiques,
]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("", name="")
*/
public function listerImageAction(Request $request, $id = "0", $type = "a", $enfant = "", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$tableau_class_cellule = [];
$modal = $request->query->get('modal');
$articleId = $request->query->get('id');
$qte = $request->query->get('qte');
$repo_objet = $em->getRepository(Article::class);
$attributs = $em->getRepository(AttributArticle::class)->findAll();
$objet = $repo_objet->find($id);
if ($articleId != '') {
$article = $repo_objet->find($articleId);
if ($modal == 1 && is_object($article)) {
$titre_modal = $translator->trans('Déclinaison');
$this->datatableArticleImages($article, $type, $request, $datatable, $em, $translator);
$rendu = $this->renderView('Articles/Declinaison/lister.html.twig', ['tableauClassColonne' => $tableau_class_cellule, "id" => $articleId, "type" => $type, 'qte' => $qte]
);
//$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type,'objet'=>$objet));
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
if (is_object($objet)) {
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["searchable" => true, "className" => "visible_export colonne_id ", "targets" => [0], "visible" => true, "orderable" => false];
$this->datatableArticleImages($objet, $type, $request, $datatable, $em, $translator);
return $this->render(
'Articles/Declinaison/lister_images.html.twig',
['tableauClassColonne' => $tableau_class_cellule, "id" => $id, "type" => $type, "attributs" => $attributs, "article" => $objet, "enfant" => $enfant]
);
}
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableArticleImages($objet, $type = "", Request $request, Datatable $datatable, EntityManagerInterface $em, TranslatorInterface $translator)
{
$param = $request->query->all();
$conn = $em->getConnection();
$conn->getConfiguration()->setSQLLogger(null);
$qb = $em->createQueryBuilder();
$qb->select(
"
x.id as x_id,
x.archive as x_archive,
x.libelle as x_libelle,
x.reference as x_reference,
x.descriptionCourte as x_descriptionCourte,
x.prixVente as x_prixVente,
x.tauxMarge as x_tauxMarge,
x.cpump as x_cpump,
x.stock as x_stock,
x.statut as x_statut,
m.libelle as m_libelle,
m.id as m_id,
t.libelle as t_libelle,
t.id as t_id,
r.id as r_id,
r.tauxDefaut as r_tauxDefaut
"
)
->orderBy('x.id', 'DESC')
->from(Article::class, "x")
->leftJoin('x.marque', 'm')
->leftJoin('x.type', 't')
->leftJoin('x.regleTaxe', 'r', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);;
$where = "(x.archive = 0 or x.archive is null)";
$where = "";
//$qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
//$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null AND '.$where);
$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null');
$parametres['articleDeclinaisonParent'] = $objet;
//echo $where;
if (count($parametres) > 0) {
$qb->setParameters($parametres);
}
//$type_jointure = 'x.'.$type;
$datatable->setDatatableId('dta-declinaisons-images')
//->setEntity("DTCArticlesBundle:Article", "x")
->setFields(
[
$translator->trans("Référence") => 'x.reference',
$translator->trans("Libellé") => 'x.libelle',
$translator->trans("Images") => 'x.id',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
//->addJoin('x.pays', 'p', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('f.devise', 'd', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('x.uniteMesure', 'u', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
/*->setWhere(
$type_jointure.' = :objet',
array('objet' => $objet)
)
*/
->setWhere(
'x.articleDeclinaisonParent = :objet',
['objet' => $objet]
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
1 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
2 => [
'view' => 'FO/DataTable/images_declinaisons.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
3 => [
'view' => 'FO/DataTable/article_actions.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
'objet' => Article::class,
'table' => "dta-declinaisons-images",
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setMultiple(
[
'regles' => [
'title' => 'Ajouter une image',
'route' => 'dtc_declinaison_ajouter_image_multiple' // path to multiple delete route
],
]
);//->setSearchFields(array(1,2))
;
$datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
return $datatable;
}
/**
* @Route("/declinaison/grid-images/{id}/{type}", name="dtc_declinaison_article_liste_image_grid")
*/
public function gridImagesAction($id = "", $type = "", Request $request, Datatable $datatable, EntityManagerInterface $em, TranslatorInterface $translator)
{
$repo_objet = $em->getRepository(Article::class);
$objet = $repo_objet->find($id);
if (is_object($objet)) {
return $this->datatableArticleImages($objet, $type, $request, $datatable, $em, $translator)->execute();
}
}
}