<?php
namespace Acme\SudcmsBundle\Controller\Admin;
use Acme\SudcmsBundle\Controller\AdminEcommerce\Exception;
use Acme\SudcmsBundle\Entity\EcoAttributes;
use Acme\SudcmsBundle\Entity\EcoAttributesModels;
use Acme\SudcmsBundle\Entity\EcoAttributesReferences;
use Acme\SudcmsBundle\Entity\EcoCategories;
use Acme\SudcmsBundle\Entity\EcoLabels;
use Acme\SudcmsBundle\Entity\EcoMarks;
use Acme\SudcmsBundle\Entity\EcoProducts;
use Acme\SudcmsBundle\Entity\EcoProductsBlocks;
use Acme\SudcmsBundle\Entity\EcoProductsBlocksMedias;
use Acme\SudcmsBundle\Entity\EcoProductsBundle;
use Acme\SudcmsBundle\Entity\EcoProductsCategories;
use Acme\SudcmsBundle\Entity\EcoProductsCombination;
use Acme\SudcmsBundle\Entity\EcoProductsLabels;
use Acme\SudcmsBundle\Entity\EcoProductsMedias;
use Acme\SudcmsBundle\Entity\EcoProductsReferences;
use Acme\SudcmsBundle\Entity\EcoProviders;
use Acme\SudcmsBundle\Entity\Site;
use Acme\SudcmsBundle\Form\Ecommerce\ProductReferenceType;
use Acme\SudcmsBundle\Form\Ecommerce\ProductType;
use Acme\SudcmsBundle\Repository\EcoAttributesModelsRepository;
use Acme\SudcmsBundle\Repository\EcoAttributesReferencesRepository;
use Acme\SudcmsBundle\Repository\EcoAttributesRepository;
use Acme\SudcmsBundle\Repository\EcoCategoriesRepository;
use Acme\SudcmsBundle\Repository\EcoCustomersFavoritesProdRepository;
use Acme\SudcmsBundle\Repository\EcoLabelsRepository;
use Acme\SudcmsBundle\Repository\EcoMarksRepository;
use Acme\SudcmsBundle\Repository\EcoOrdersRepository;
use Acme\SudcmsBundle\Repository\EcoProductsBlocksMediasRepository;
use Acme\SudcmsBundle\Repository\EcoProductsBlocksRepository;
use Acme\SudcmsBundle\Repository\EcoProductsBundleRepository;
use Acme\SudcmsBundle\Repository\EcoProductsCategoriesRepository;
use Acme\SudcmsBundle\Repository\EcoProductsCombinationRepository;
use Acme\SudcmsBundle\Repository\EcoProductsLabelsRepository;
use Acme\SudcmsBundle\Repository\EcoProductsReferencesRepository;
use Acme\SudcmsBundle\Repository\EcoProductsRepository;
use Acme\SudcmsBundle\Repository\EcoProvidersRepository;
use Acme\SudcmsBundle\Repository\EcoSettingsRepository;
use Acme\SudcmsBundle\Repository\OptionsRepository;
use Acme\SudcmsBundle\Service\ApiService;
use Acme\SudcmsBundle\Service\FileService;
use Acme\SudcmsBundle\Service\FlashNotificationAjax;
use Acme\SudcmsBundle\Service\OtideaUtils;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;
class AdminProductsController extends AbstractController
{
private $session;
private $entityManager;
private $filesystem;
private $postMaxSize;
private $autorizedImages = ['jpg', 'jpeg', 'png'];
private $autorizedFiles = ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'];
private $pathFiles = 'public/medias_front/products'; // chemin vers les fichiers uploadés
private $monthList = [
1 => 'Janvier',
2 => 'Février',
3 => 'Mars',
4 => 'Avril',
5 => 'Mai',
6 => 'Juin',
7 => 'Juillet',
8 => 'Août',
9 => 'Septembre',
10 => 'Octobre',
11 => 'Novembre',
12 => 'Décembre'
];
private $maxFileSize; // taille fichier max - 30 * 1024 * 1024
private $twig = null;
private $fileService;
public function __construct(
private ApiService $apiService,
EntityManagerInterface $entityManager,
KernelInterface $appKernel,
OptionsRepository $repoOpt,
Environment $twig,
FileService $fileService,
Filesystem $filesystem
)
{
if (!IS_ECOMMERCE) {
header('Location: ' . WEBSITEROOT . '/admin');
exit;
}
$this->session = new Session();
$this->entityManager = $entityManager;
$site = $this->entityManager->getRepository(Site::class)->find($this->session->get('admin_site_uid'));
$this->pathFiles = $this->session->get('admin_site_uid') > 1 ? '../' . $site->getProjectDirectory() . '/public/medias_front/products' : 'public/medias_front/products';
$this->maxFileSize = substr(ini_get('post_max_size'), 0, -1) * 1024 * 1024;
$this->fileService = $fileService;
$this->filesystem = $filesystem;
$this->twig = $twig;
$this->postMaxSize = substr(ini_get('post_max_size'), 0, -1);
$this->moduleName = "admin_products";
$optionsModule = $repoOpt->findBy(['option_name' => $this->moduleName], ['option_order' => 'ASC']);
$this->twig->addGlobal("optionsModule", $optionsModule);
//Création des dossiers dossier pour l'upload des médias du module
$directory[] = $appKernel->getProjectDir() . '/' . $this->pathFiles . '/';
$directory[] = $appKernel->getProjectDir() . '/' . $this->pathFiles . '/tmpFiles';
foreach ($directory as $dir) {
if (!file_exists($dir)) {
mkdir($dir, 755);
}
}
}
#[Route(path: '/admin/products/list', name: 'admin_products')]
public function index(
Request $request,
EcoProductsRepository $repoProduct,
EcoCategoriesRepository $repoCategs,
EcoProductsReferencesRepository $repoRef,
PaginatorInterface $paginator,
EcoSettingsRepository $ecoSettingsRepository
)
{
$ecoSettings = $ecoSettingsRepository->findOneBy(['siteId' => CURRENT_SITE_ID]);
$products = $repoProduct->findBy(
['siteId' => $this->session->get('admin_site_uid')],
['id' => 'DESC']
);
return $this->render('admin/admin_products/index.html.twig', [
'productsList' => $products,
'stockManagement' => $ecoSettings->getStockManagement(),
'referencesList' => $repoRef->findAll(),
'categsList' => $repoCategs->findByEcoCategories($this->session->get('admin_site_uid')),
]);
}
#[Route(path: '/admin/product_editing/{prod_id}', name: 'admin_product_edit', defaults: ['prod_id' => 0])]
public function product_editing(
Request $request,
EcoProductsRepository $repoProduct,
EcoCategoriesRepository $repoCateg,
EcoMarksRepository $repoMarks,
EcoProvidersRepository $repoProviders,
EcoLabelsRepository $repoLabels,
EcoProductsLabelsRepository $repoProdLabels,
EcoProductsReferencesRepository $referencesRepository,
$prod_id
)
{
$categList = $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')]);
$markList = $repoMarks->findBy(['siteId' => $this->session->get('admin_site_uid')]);
$labels = $repoLabels->findAll();
$productLabels = null;
$references = $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
['product_id' => $prod_id],
['ref_sequence' => 'ASC']
);
if ($categList == null || $markList == null) {
$this->addFlash('danger', "Il doit exister au moins une catégorie et une marque pour ajouter un produit.");
return $this->redirectToRoute('admin_products');
}
$product = new EcoProducts;
$picture = null;
if ($prod_id > 0) {
$product = $repoProduct->find($prod_id);
$picture = $product->getProdPicture();
$productLabels = $repoProdLabels->findBy(['product_id' => $prod_id]);
}
//Récupération du nombre de références du produit pour savoir si c'est un produit multiple ou single
$refProd = $referencesRepository->findBy(['product_id' => $product->getId()]);
$form = $this->createForm(ProductType::class, $product, [
'categoriesList' => $categList,
'marksList' => $markList,
'labels' => $labels,
'productLabels' => $productLabels,
'providersList' => $repoProviders->findBy(['siteId' => $this->session->get('admin_site_uid')]),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($prod_id == 0) {
$product->setProdCreationDate(new \DateTime());
}
$product->setSiteId($this->session->get('admin_site_uid'));
//Récupération des anciens labels du produit
$oldLabels = $repoProdLabels->findBy(['product_id' => $prod_id]);
//On supprime tous les anciens labels avant d'enregistrer les nouveaux
foreach ($oldLabels as $label) {
$this->entityManager->remove($label);
}
//On enregistre les nouveaux labels si il y en a
if (isset($request->get('product')['label_id'])) {
foreach ($request->get('product')['label_id'] as $labelGet) {
$label = new EcoProductsLabels;
$label->setLabelId($labelGet);
$label->setProductId($prod_id);
$this->entityManager->persist($label);
}
}
if ($references) {
if ($references[0]->getTypeOdyssee() == 'soin' && $product->getIsDeliverable() == 'sur-place') {
$this->addFlash('danger', 'Un type de soin ne peut pas inclure le retrait sur place.');
return $this->redirectToRoute('admin_product_edit', array('prod_id' => $product->getId()));
}
}
foreach ($request->files->get('product')['prod_picture'] as $key => $file) {
// upload du fichier
if ($file !== null && $key < 4) {
$upload = $this->fileService->startUpload(
[
"fileData" => $file,
"oldFileName" => $picture,
"fileDestination" => $this->getParameter(
"upload_products_" . $this->session->get('admin_site_uid')
),
"autorizedExtensions" => $this->autorizedImages,
"createWebp" => true
]
);
// upload OK
if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
$upload['filename']
)) {
if ($key == 0) {
$product->setProdPicture($upload['filename']);
}
$media = new EcoProductsMedias();
$media->setMediaName($upload['filename']);
$product->addMedia($media);
$this->entityManager->persist($media);
//$this->entityManager->flush();
} // upload KO avec message perso
elseif (isset($upload['error_msg'])) {
$product->setProdPicture($picture);
$errorMsg = $upload['error_msg'];
} // upload KO avec message générique
else {
$product->setProdPicture($picture);
$errorMsg = "Une erreur s'est produite lors de l'enregistrement du fichier";
}
}
}
//On récupère le radio PROD-TYPE qui a été rendu manuellement dans le template
// $product->setProdType($request->request->get('prod_type'));
$product->setProdType('single');
$product->setProdPriceType('vente');
$product->setprovider($repoProviders->find($request->get('product')['provider_id']));
try {
$this->entityManager->persist($product);
$this->entityManager->flush();
} catch (Exception $e) {
$errorMsg = "Une erreur s'est produite lors de l'enregistrement";
}
// il y a eu une erreur
if (isset($errorMsg)) {
$this->addFlash('danger', $errorMsg);
} // pas d'erreur
else {
$this->addFlash('success', "enregistré avec succès");
}
return $this->redirectToRoute('admin_product_edit', array('prod_id' => $product->getId()));
}
$this->checkOdysseePrice($product->getId());
return $this->render('admin/admin_products/product_editing.html.twig', [
'form' => $form->createView(),
'product' => $repoProduct->find($prod_id),
'product_id' => $prod_id,
'autorizedImages' => $this->autorizedImages,
'nbRefProd' => sizeof($refProd),
'typeProdut' => $product->getProdType(),
'referencesList' => $references
]);
}
private function checkOdysseePrice($prodId): void
{
if ($prodId > 0) {
if ($this->apiService->testConnexion()) {
$reference = $this->entityManager->getRepository(EcoProductsReferences::class)->findOneBy(
['product_id' => $prodId]
);
if ($reference) {
$priceUpdated = false;
if ($reference) {
$priceUpdated = false;
if ($reference->getTypeOdyssee() == 'soin') {
$odysseeProduct = $this->apiService->rechSoinResaSpaParCodeProduit(
$reference->getRefReference()
);
if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit_Soin'}) {
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit_Soin'});
$priceUpdated = true;
}
} elseif ($reference->getTypeOdyssee() == 'produit') {
$odysseeProduct = ODYSSEE_TYPE == 'CURE' ? $this->apiService->rechProduitResaCureParCode(
$reference->getRefReference()
) : $this->apiService->rechProduitResaSpaParCode($reference->getRefReference());
if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit'}) {
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
$priceUpdated = true;
}
} elseif ($reference->getTypeOdyssee() == 'bkdo') {
$odysseeProduct = $this->apiService->rechProduitBkdoParCode($reference->getRefReference());
if ($reference->getRefReferencePrice() != $odysseeProduct[0]->{'Prixttc_Produit'}) {
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
$priceUpdated = true;
}
}
if ($priceUpdated) {
try {
$prod = $this->entityManager->getRepository(EcoProducts::class)->find($prodId);
$prod->setProdSellingPrice($reference->getRefSellingPrice());
$prod->setProdReferencePrice($reference->getRefReferencePrice());
$reference->setRefLastupdateDate(new \DateTime());
$this->entityManager->persist($reference);
$this->entityManager->persist($prod);
$this->entityManager->flush();
$this->addFlash('success', "Le prix a été mis à jour avec Odyssée");
} catch (Exception $e) {
$this->addFlash(
'danger',
"Une erreur s'est produite lors de la récupération du prix sur Odyssée"
);
}
}
}
} else {
$this->addFlash('danger', 'Une erreur est survenue avec l\'API<br>Mise à jour avec Odyssée impossible');
}
}
}
}
#[Route(path: '/admin/products/remove-picture/{id}', name: 'admin_product_remove_picture', defaults: ['id' => ''])]
public function removePicture($id)
{
if ($id > 0) {
try {
$product = $this->entityManager->getRepository(EcoProducts::class)->find($id);
$filename = $product->getProdPicture();
$product->setProdPicture(null);
$medias = $this->entityManager->getRepository(EcoProductsMedias::class)->findBy(['product' => $id]);
foreach ($medias as $media) {
$mediaName = $media->getMediaName();
if ($mediaName != null && $mediaName != "" && is_string($mediaName) && $this->filesystem->exists(
$file = $this->getParameter(
'upload_products_' . $this->session->get('admin_site_uid')
) . "/" . $mediaName
)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter(
'upload_products_' . $this->session->get('admin_site_uid')
),
"filename" => $mediaName,
]);
}
$product->removeMedia($media);
$this->entityManager->persist($product);
}
$this->entityManager->persist($product);
$this->entityManager->flush();
if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
$file = $this->getParameter(
'upload_products_' . $this->session->get('admin_site_uid')
) . "/" . $filename
)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_products_' . $this->session->get('admin_site_uid')),
"filename" => $filename,
]);
}
$this->addFlash('success', "Les illustrations ont été supprimées avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression de l'illustration");
}
}
return $this->redirectToRoute('admin_product_edit', ['prod_id' => $id]);
}
#[Route(path: '/admin/products/axDisplayCategories', options: ['expose' => true])]
public function axDisplayCategories(
Request $request,
EcoCategoriesRepository $repoCateg,
EcoProductsCategoriesRepository $repoLinkCateg,
EcoProductsRepository $repoProduct
)
{
if ($request->isXmlHttpRequest()) {
$renderModale = $this->renderView('admin/admin_products/tpl_categories.html.twig', [
'modalTitle' => "Sélection des catégories secondaires",
'categList' => $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')],
['categ_parent_id' => 'ASC', 'categ_sequence' => 'ASC']),
'linkCategList' => $repoLinkCateg->findBy(['product_id' => $request->get('prod_id')]),
'product' => $repoProduct->find($request->get('prod_id')),
'prod_id' => $request->get('prod_id')
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/axCheckCategory', options: ['expose' => true])]
public function axCheckCategory(Request $request, EcoProductsCategoriesRepository $repoLinkCateg)
{
if ($request->isXmlHttpRequest()) {
if ($request->get('prod_id') && $request->get('categ_id')) {
$categ = $repoLinkCateg->findBy([
'category_id' => $request->get('categ_id'),
'product_id' => $request->get('prod_id')
]);
if (isset($categ[0]) && $categ[0]->getId() !== null) {
$this->entityManager->remove($categ[0]);
} else {
$categ = new EcoProductsCategories;
$categ->setCategoryId($request->get('categ_id'));
$categ->setProductId($request->get('prod_id'));
$this->entityManager->persist($categ);
}
try {
$this->entityManager->flush();
return new JsonResponse([
'status' => true,
]);
} catch (Exception $e) {
return new JsonResponse([
'status' => false,
]);
}
}
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/product_references/{prod_id}', name: 'admin_product_references', defaults: ['prod_id' => 0])]
public function product_references(
Request $request,
EcoProductsRepository $repoProduct,
EcoProductsReferencesRepository $repoRef,
EcoAttributesRepository $repoAttributes,
EcoAttributesModelsRepository $repoModels,
EcoAttributesReferencesRepository $repoLink,
$prod_id
)
{
//Gestion des attributs
if ($request->get('attributs')) {
//Liste des combinaisons
$combinations = $this->getAttributesCombination($request->get('attributs'));
//Générer les références
$this->generateReferences(
$prod_id,
$combinations,
$repoAttributes->findAll(),
$repoLink->findByLinkAttributesByProduct($prod_id)
);
}
$this->checkOdysseePrice($prod_id);
return $this->render('admin/admin_products/product_references.html.twig', [
'product_id' => $prod_id,
'product' => $repoProduct->find($prod_id),
'referencesList' => $repoRef->findBy(['product_id' => $prod_id], ['ref_sequence' => 'ASC']),
'attributesList' => $repoAttributes->findAll(),
'attributesModelsList' => $repoModels->findAll(),
]);
}
private function generateReferences($product_id, $combinationArray, $attributesList, $linkAttributesRef)
{
if (is_array($combinationArray) && sizeof($combinationArray) > 0) {
foreach ($combinationArray as $combinations) {
//Sans combinaison
if (!is_array($combinations)) {
$this->setSimpleCombination($product_id, $combinations, $linkAttributesRef, $attributesList);
//Combinaison d'attribut
} else {
$this->setMultipleCombination($product_id, $combinations, $linkAttributesRef, $attributesList);
}
}
}
}
private function setMultipleCombination($product_id, $combinations, $linkAttributesRef, $attributesList)
{
foreach ($combinations as $combination) {
//Si la combinaison existe déjà on passe à la suivante
$validateDuplication = $this->validateDuplicateCombination($combination, $linkAttributesRef);
if (!$validateDuplication) {
continue;
}
//Générer l'intitulé de la référence
$attributs = explode('-', $combination);
$entitled = $refReference = '';
foreach ($attributs as $attr_id) {
foreach ($attributesList as $elmt) {
if ($elmt->getId() == $attr_id) {
$entitled .= $elmt->getAttribute() . ' ';
$refReference .= $elmt->getAttribute() . '-';
}
}
}
//Création de la référence
$reference = new EcoProductsReferences;
$reference->setProductId($product_id);
$reference->setRefEntitled($entitled);
$reference->setRefReference(substr(uniqid() . '-' . $refReference, 0, -1));
$reference->setRefReferencePrice(0);
$reference->setRefBuyingPrice(0);
$reference->setRefSellingPrice(0);
$reference->setRefTva(1.20);
$reference->setIsReservable(false);
$reference->setRefOutOfOrder(false);
$reference->setRefLastupdateDate(new \DateTime());
$this->entityManager->persist($reference);
$this->entityManager->flush();
$prod = $this->entityManager->getRepository(EcoProducts::class)->find($reference->getProductId());
$nbRef = $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
['product_id' => $prod->getId()]
);
if (count($nbRef) <= 1) {
$prod->setProdType('single');
$this->entityManager->flush($prod);
} else {
$prod->setProdType('multiple');
$this->entityManager->flush($prod);
}
//liaisons des combinaisons d'attributs
$attributs = explode('-', $combination);
foreach ($attributs as $attr_id) {
$link = new EcoAttributesReferences;
$link->setAttributeId($attr_id);
$link->setReferenceId($reference->getId());
$this->entityManager->persist($link);
}
$this->entityManager->flush();
}
}
private function setSimpleCombination($product_id, $attr_id, $linkAttributesRef, $attributesList)
{
$validateDuplication = $this->validateDuplicateCombination($attr_id, $linkAttributesRef);
if ($validateDuplication) {
//Générer l'intitulé de la référence
$entitled = '';
foreach ($attributesList as $elmt) {
if ($elmt->getId() == $attr_id) {
$entitled = $elmt->getAttribute() . ' ';
}
}
//Création de la référence
$reference = new EcoProductsReferences;
$reference->setProductId($product_id);
$reference->setRefEntitled($entitled);
$reference->setRefReference(substr(uniqid() . '-' . $entitled, 0, -1));
$reference->setRefReferencePrice(0);
$reference->setRefBuyingPrice(0);
$reference->setRefSellingPrice(0);
$reference->setRefTva(1.20);
$reference->setIsReservable(false);
$reference->setRefOutOfOrder(false);
$reference->setRefLastupdateDate(new \DateTime());
$this->entityManager->persist($reference);
$this->entityManager->flush();
$prod = $this->entityManager->getRepository(EcoProducts::class)->find($reference->getProductId());
$nbRef = $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
['product_id' => $prod->getId()]
);
if (count($nbRef) <= 1) {
$prod->setProdType('single');
$this->entityManager->flush($prod);
} else {
$prod->setProdType('multiple');
$this->entityManager->flush($prod);
}
//liaisons des combinaisons d'attributs
$link = new EcoAttributesReferences;
$link->setAttributeId($attr_id);
$link->setReferenceId($reference->getId());
$this->entityManager->persist($link);
$this->entityManager->flush();
}
}
/**
* Retourne vrai si la combinaison n'existe pas
* @param string $combination
* @param array $bdd
*/
private function validateDuplicateCombination($combination, $bdd)
{
$attributes = explode('-', $combination);
$attributesCount = sizeof($attributes);
foreach ($bdd as $combinationBdd) {
$count = 0;
foreach ($combinationBdd as $attr_id) {
if (in_array($attr_id, $attributes)) {
$count++;
}
}
if ($count == $attributesCount) {
return false;
}
}
return true;
}
/**
* Retourne la liste des combinaisons à générer
* @param array $attributes
*/
private function getAttributesCombination($attributes)
{
//Liste des modèles
$models = array();
foreach ($attributes as $attribut) {
list($model_id, $attribute_id) = explode('-', $attribut);
$models[] = $model_id;
}
//Liste des modèles uniques
$models_unique = array_unique($models);
$attributesModelsList = array();
$resultCombination = '';
$results = array();
//Tableau des attributs segmenté par modèle
foreach ($models_unique as $model_id) {
$attributesModelsList[] = $this->getAttributesSelectedByModel($model_id, $attributes);
}
$attrSize = sizeof($attributesModelsList);
foreach ($attributesModelsList[0] as $key => $attr_id) { //liste array
$resultCombination .= $attr_id;
for ($i = 1; $i < $attrSize; $i++) {
$resultCombination = $this->recursiveAttributes($attributesModelsList[$i], $resultCombination);
}
$results[] = $resultCombination;
$resultCombination = '';
}
// dd($attributes, $models_unique, $attributesModelsList, $results);
return $results;
}
/**
* Retourne les combinaisons d'attributs de façon récursice
* @param array $attributesList
* @param array $resultCombination
* @return array
*/
private function recursiveAttributes($attributesList, $resultCombination)
{
$result = array();
if (is_array($resultCombination)) {
foreach ($resultCombination as $combinaison) {
foreach ($attributesList as $attr2_id) {
$result[] = $combinaison . '-' . $attr2_id;
}
}
} else {
foreach ($attributesList as $attr2_id) {
$result[] = $resultCombination . '-' . $attr2_id;
}
}
return $result;
}
/**
* Retourne la liste des attributs par modèle
* @param int $modelId
* @param array $attributs
* @return array
*/
private function getAttributesSelectedByModel($modelId, $attributs)
{
$result = array();
foreach ($attributs as $attribut) {
list($model_id, $attribute_id) = explode('-', $attribut);
if ($model_id == $modelId) {
$result[] = $attribute_id;
}
}
return $result;
}
#[Route(path: '/admin/product/reference_remove/{id}', name: 'admin_reference_remove', defaults: ['id' => 0])]
public function remove_reference(
Request $request,
EcoProductsReferencesRepository $repoReference,
EcoAttributesReferencesRepository $ecoAttributesReferencesRepository,
EcoProductsRepository $repoProduct,
$id
)
{
$reference = new EcoProductsReferences;
if ($id > 0) {
$reference = $repoReference->find($id);
try {
$attrRef = $ecoAttributesReferencesRepository->findBy(['reference_id' => $reference->getId()]);
foreach ($attrRef as $ref) {
$this->entityManager->remove($ref);
}
$this->entityManager->remove($reference);
$this->entityManager->flush();
$prod = $repoProduct->find($reference->getProductId());
$nbRef = $repoReference->findBy(['product_id' => $prod->getId()]);
if (count($nbRef) <= 1) {
$prod->setProdType('single');
$this->entityManager->flush($prod);
} else {
$prod->setProdType('multiple');
$this->entityManager->flush($prod);
}
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_product_references', array('prod_id' => $reference->getProductId()));
}
#[Route(path: '/admin/product_reference_type_odyssee/axRefOdyssee', name: 'admin_ax_ref_odyssee')]
public function axRefOdyssee(Request $request, ApiService $apiService): JsonResponse
{
if ($request->isXmlHttpRequest() && in_array($request->get('type'), ['produit', 'soin', 'bkdo', 'bkdovalue'])) {
$type = $request->get('type');
$result = [];
if (ODYSSEE_TYPE == 'CURE' || $type == 'produit') {
if (ODYSSEE_TYPE == 'CURE') {
$datas = $apiService->listerProduitResaCure();
} else {
$vente = $apiService->listerProduitVenteSpa();
$resa = $apiService->listerProduitResaSpa();
$datas = array_unique(array_merge($vente, $resa), SORT_REGULAR); // Elimine les doublons
}
foreach ($datas as $data) {
$result[] = [
'id' => $data->{'Code_Produit'},
'name' => $data->{'Libelle_Produit'}
];
}
} elseif ($type == 'soin') {
$vente = $apiService->listerSoinVenteSpa();
$resa = $apiService->listerSoinResaSpa();
$datas = array_unique(array_merge($vente, $resa), SORT_REGULAR); // Elimine les doublons
foreach ($datas as $data) {
$result[] = [
'id' => $data->{'Code_Produit_Soin'},
'name' => $data->{'Libelle_Produit_Soin'}
];
}
} elseif ($type == 'bkdo') {
$datas = $apiService->listerProduitBkdo();
foreach ($datas as $data) {
$result[] = [
'id' => $data->{'Code_Produit'},
'name' => $data->{'Libelle_Produit'}
];
}
} elseif ($type == 'bkdovalue') {
$result = $type;
}
return new JsonResponse(
[
'status' => true,
'result' => $result
]
);
}
return new JsonResponse(
[
'status' => false
]
);
}
#[Route(path: '/admin/product_reference_edit/{prod_id}/{ref_id}', name: 'admin_product_reference_edit', defaults: [
'prod_id' => 0,
'ref_id' => 0
])]
public function product_reference_edit(
Request $request,
EcoProductsReferencesRepository $repoReference,
EcoProductsRepository $repoProduct,
EcoSettingsRepository $ecoSettingsRepository,
$prod_id = 0,
$ref_id = 0
)
{
$reference = new EcoProductsReferences;
if ($ref_id > 0) {
$reference = $repoReference->find($ref_id);
}
$ecoSettings = $ecoSettingsRepository->findOneBy(['siteId' => CURRENT_SITE_ID]);
$stockManagement = $ecoSettings->getStockManagement();
$prod = $repoProduct->find($prod_id);
$form = $this->createForm(ProductReferenceType::class, $reference, [
'stockManagement' => $stockManagement
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($ref_id == 0) {
$reference->setProductId($prod_id);
}
// Récupère les informations de l'API Odyssée pour le prix et la TVA en fonction du type
if ($reference->getTypeOdyssee() == 'produit') {
$odysseeProduct = ODYSSEE_TYPE == 'CURE' ? $this->apiService->rechProduitResaCureParCode(
$request->request->get('reference')
) : $this->apiService->rechProduitResaSpaParCode($request->request->get('reference'));
if (!$odysseeProduct) {
$this->addFlash(
'danger',
"Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
);
return $this->redirectToRoute(
'admin_product_reference_edit',
array('prod_id' => $prod_id, 'ref_id' => $reference->getId())
);
}
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
$reference->setRefEntitled(
$odysseeProduct[0]->{'Libelle_Produit'}
); // L'intitulé du produit de base est automatiquement repris
$reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
} elseif ($reference->getTypeOdyssee() == 'soin') {
$odysseeProduct = $this->apiService->rechSoinResaSpaParCodeProduit($request->request->get('reference'));
if (!$odysseeProduct) {
$this->addFlash(
'danger',
"Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
);
return $this->redirectToRoute(
'admin_product_reference_edit',
array('prod_id' => $prod_id, 'ref_id' => $reference->getId())
);
}
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit_Soin'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit_Soin'});
$reference->setRefEntitled(
$odysseeProduct[0]->{'Libelle_Produit_Soin'}
); // L'intitulé du produit de base est automatiquement repris
$reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
// $reference->setMaxByOrder(1);
} elseif ($reference->getTypeOdyssee() == 'bkdo') {
$odysseeProduct = $this->apiService->rechProduitBkdoParCode($request->request->get('reference'));
if (!$odysseeProduct) {
$this->addFlash(
'danger',
"Un problème a été détecté sur ce produit. Veuillez vérifier dans Odyssée qu'aucun autre problème n'est présent."
);
return $this->redirectToRoute(
'admin_product_reference_edit',
array('prod_id' => $prod_id, 'ref_id' => $reference->getId())
);
}
$reference->setRefReferencePrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefSellingPrice($odysseeProduct[0]->{'Prixttc_Produit'});
$reference->setRefTva($odysseeProduct[0]->{'Tva_Produit'});
$reference->setRefEntitled(
$odysseeProduct[0]->{'Libelle_Produit'}
); // L'intitulé du produit de base est automatiquement repris
$reference->setRefReference($request->request->get('reference')); // Récupère la référence Odyssée
} elseif ($reference->getTypeOdyssee() == 'bkdovalue') {
$reference->setRefReferencePrice(0);
$reference->setRefSellingPrice(0);
$reference->setRefTva(20);
$reference->setRefEntitled('BON CADEAU VALEUR');
$reference->setRefReference('bkdovalue'); // Récupère la référence Odyssée
// $reference->setMaxByOrder(1);
$reference->setRefQuantity(null);
}
// $referenceType = $this->getReferencePrice($reference->getRefSellingPrice(), $reference->getRefPromoPrice(),
// $reference->getRefSoldePrice());
// $reference->setRefReferencePrice($referenceType['reference_price']);
// $reference->setRefPriceType($referenceType['price_type']);
$reference->setRefPriceType('vente');
$reference->setRefLastupdateDate(new \DateTime());
$reference->setRefOutOfOrder(false);
if ($ecoSettings->getUnavailableProductNoStock() && ($form->get('ref_quantity')->getData() == 0 || $form->get('ref_quantity')->getData() == null)) {
$reference->setRefOutOfOrder(true);
} else {
if ($ecoSettings->getUnavailableProductNoStock() && $form->get('ref_quantity')->getData() > 0) {
$reference->setRefOutOfOrder(false);
}
}
$prod->setProdSellingPrice($reference->getRefReferencePrice());
$prod->setProdReferencePrice($reference->getRefReferencePrice());
$ref = $reference->getTypeOdyssee() == 'bkdovalue' ? $reference->getTypeOdyssee() : $request->request->get(
'reference'
);
//Vérification sur la duplication de la référence
$resultReferences = $repoReference->findBy(['ref_reference' => $ref]);
// Si la référence précédemment enregistrée est contenue dans le tableau des références, on l'enlève
if (is_array($resultReferences) && sizeof($resultReferences) >= 1 && in_array(
$reference,
$resultReferences
)) {
$key = array_search($reference, $resultReferences);
unset($resultReferences[$key]);
}
// Si la référence existe déjà sur un autre article, on affiche un message d'erreur
if (is_array($resultReferences) && sizeof($resultReferences) >= 1 && $reference->getRefReference()) {
$product = $this->entityManager->getRepository(EcoProducts::class)->find(
$resultReferences[0]->getProductId()
);
if ($product && $product->getSiteId() == $this->session->get('admin_site_uid')) {
$this->addFlash('danger', "Cette référence existe déjà sur un autre article");
return $this->redirectToRoute(
'admin_product_reference_edit',
array('prod_id' => $prod_id, 'ref_id' => $reference->getId())
);
}
}
try {
$reference->setIsReservable(
$request->request->get('product_reference')['isReservable'] == '0' ? false : true
);
$this->entityManager->persist($reference);
$this->entityManager->persist($prod);
$this->entityManager->flush();
$nbRef = $repoReference->findBy(['product_id' => $prod_id]);
if (count($nbRef) <= 1) {
$prod->setProdType('single');
} else {
$prod->setProdType('multiple');
}
$this->entityManager->flush($prod);
//Enregistrement du tarif sur le produit
// $this->setProductReferencesPrices($repoProduct, $prod_id,
// $repoReference->findByProductWithReferencesPrices($prod_id));
$this->addFlash('success', "enregistré avec succès");
} catch (Exception $ex) {
$this->addFlash('danger', "Une erreur s'est produite lors de l'enregistrement");
}
return $this->redirectToRoute(
'admin_product_reference_edit',
array('prod_id' => $prod_id, 'ref_id' => $reference->getId())
);
}
$this->checkOdysseePrice($prod_id);
return $this->render('admin/admin_products/product_reference_edit.html.twig', [
'stockManagement' => $stockManagement,
'product_id' => $prod_id,
'reference' => $repoReference->find($ref_id),
'form' => $form->createView(),
'product' => $prod,
'referencesList' => [$reference]
]);
}
/**
* Retourne le prix de vente réel
* @param double $selling_price
* @param double $promo_price
* @param double $solde_price
* @return array
*/
private function getReferencePrice($selling_price, $promo_price, $solde_price)
{
if ($solde_price > 0) {
return [
'reference_price' => $solde_price,
'price_type' => 'solde',
];
} elseif ($promo_price > 0) {
return [
'reference_price' => $promo_price,
'price_type' => 'promo',
];
}
return [
'reference_price' => $selling_price,
'price_type' => 'vente',
];
}
/**
* Enregistre le prix d'un produit en fonction de ses références
* @param array $references
* @return array
*/
private function setProductReferencesPrices($repoProduct, $prod_id, $references)
{
$product = $repoProduct->find($prod_id);
$product->setProdPriceType($references['ref_price_type']);
$product->setProdReferencePrice($references['ref_reference_price']);
$product->setProdSellingPrice($references['ref_selling_price']);
$this->entityManager->persist($product);
$this->entityManager->flush();
}
#[Route(path: '/admin/products/categories/{parent_id}', name: 'admin_products_categories', defaults: ['parent_id' => 0])]
public function categories(Request $request, EcoCategoriesRepository $repoCateg, $parent_id)
{
if ($request->get('categ_entitled')) {
if ($request->get('categ_id') > 0) {
$categ = $repoCateg->find($request->get('categ_id'));
$oldBandeau = $categ->getCategHeadband();
} else {
$oldBandeau = null;
$categ = new EcoCategories();
}
$categ->setCategEntitled($request->get('categ_entitled'));
// $categ->setCategParentId($request->get('categ_parent_id'));
$categ->setCategParentId(0);
$categ->setCategDescription($request->get('categ_description'));
$categ->setCategSequence(0);
// $categ->setCategIsonline($request->get('categ_isonline'));
$categ->setCategIsonline(true);
$categ->setSiteId($this->session->get('admin_site_uid'));
// upload du fichier
if ($request->files->get("categ_headband") !== null) {
$upload = $this->fileService->startUpload(
[
"fileData" => $request->files->get("categ_headband"),
"oldFileName" => $oldBandeau,
"fileDestination" => $this->getParameter(
"upload_products_" . $this->session->get('admin_site_uid')
),
"autorizedExtensions" => $this->autorizedImages,
"createWebp" => true
]
);
// upload OK
if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
$upload['filename']
)) {
$categ->setCategHeadband($upload['filename']);
} // upload KO avec message perso
elseif (isset($upload['error_msg'])) {
$categ->setCategHeadband($oldBandeau);
$errorMsg = $upload['error_msg'];
} // upload KO avec message générique
else {
$categ->setCategHeadband($oldBandeau);
$errorMsg = "Une erreur s'est produite lors de l'enregistrement du fichier";
}
}
try {
$this->entityManager->persist($categ);
$this->entityManager->flush();
} catch (Exception $e) {
$errorMsg = "Une erreur s'est produite lors de l'enregistrement de la catégorie";
}
// il y a eu une erreur
if (isset($errorMsg)) {
$this->addFlash('danger', $errorMsg);
} // pas d'erreur
else {
$this->addFlash('success', "La catégorie a bien été enregistrée");
}
}
return $this->render('admin/admin_products/products_categories.html.twig', [
'parent_id' => $parent_id,
'mainCateg' => $repoCateg->find($parent_id),
'categList' => $repoCateg->findBy([
'siteId' => $this->session->get('admin_site_uid'),
'categ_parent_id' => $parent_id
], ['categ_sequence' => 'ASC']),
'allCategList' => $repoCateg->findBy(['siteId' => $this->session->get('admin_site_uid')])
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormCategory', options: ['expose' => true])]
public function axDisplayFormCategory(Request $request, EcoCategoriesRepository $repoCateg)
{
if ($request->isXmlHttpRequest()) {
$category = new EcoCategories;
if ($request->get('categ_id') > 0) {
$category = $repoCateg->find($request->get('categ_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_category.html.twig', [
'modalTitle' => 'Catégorie',
'categ_id' => $request->get('categ_id'),
'categ' => $category,
'categList' => $repoCateg->findBy([
'siteId' => $this->session->get('admin_site_uid'),
'categ_parent_id' => 0
], ['categ_sequence' => 'ASC']),
'autorizedMedias' => $this->autorizedImages,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/category/remove/{id}', name: 'admin_products_category_remove', defaults: ['id' => 0])]
public function remove_category(
Request $request,
EcoCategoriesRepository $repoCateg,
EcoProductsRepository $ecoProductsRepository,
$id
)
{
$category = new EcoCategories;
if ($id > 0) {
$category = $repoCateg->find($id);
$productInCateg = $ecoProductsRepository->findBy(['category_id' => $category->getId()]);
if ($productInCateg != null) {
$this->addFlash('danger', "Impossible de supprimer une catégorie possédant des produits");
return $this->redirectToRoute('admin_products_categories');
}
try {
$this->entityManager->remove($category);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_categories');
}
#[Route(path: '/admin/products/axDisplayOrderCateg', options: ['expose' => true])]
public function axDisplayOrderCateg(Request $request, EcoCategoriesRepository $repoCateg)
{
if ($request->isXmlHttpRequest()) {
$renderModale = $this->renderView('admin/admin_products/tpl_reordonner_categories.html.twig', [
'modalTitle' => 'Ordonner les catégories',
'categ_parent' => $request->get('categ_parent'),
'categList' => $repoCateg->findBy([
'siteId' => $this->session->get('admin_site_uid'),
'categ_parent_id' => $request->get('categ_parent')
],
['categ_sequence' => 'ASC'])
]);
$script = '';
$script .= " initSortableCategories(); ";
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
'script' => $script,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axUpdateOrderCategorie', options: ['expose' => true])]
public function axUpdateOrderCategorie(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('sorted')) {
$liste = explode('&', $request->get('sorted'));
$i = 1;
foreach ($liste as $ligne) {
$id = str_replace('sort=', '', $ligne);
$categ = $this->entityManager->getRepository(EcoCategories::class)->find($id);
$categ->setCategSequence($i);
$this->entityManager->flush();
$i++;
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axRemoveCategBandeau', options: ['expose' => true])]
public function axRemoveCategBandeau(
Request $request,
EcoCategoriesRepository $repo,
FlashNotificationAjax $flash
)
{
$script = "";
if ($request->isXmlHttpRequest()) {
$categ = new EcoCategories;
if ($request->request->get("categ_id") > 0) {
$categ = $repo->find($request->request->get("categ_id"));
}
if ($categ->getId() > 0) {
$filename = $categ->getCategHeadband();
if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
$file = $this->getParameter(
'upload_products_' . $this->session->get('admin_site_uid')
) . "/" . $filename
)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_products_' . $this->session->get('admin_site_uid')),
"filename" => $filename,
]);
$categ->setCategHeadband(null);
try {
$this->entityManager->persist($categ);
$this->entityManager->flush();
$msg = "Le bandeau de la catégorie <b>" . $categ->getCategEntitled() . "</b> a été supprimé";
$type = "success";
} catch (Exception $e) {
$msg = "Le bandeau de la catégorie <b>" . $categ->getCategEntitled() . "</b> n'a pas été supprimé";
$type = "danger";
}
return new JsonResponse([
'status' => true,
'script' => $script,
'flashMessage' => $flash->notification($type, $msg),
]);
}
}
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/attributes_models', name: 'admin_products_attributes_models')]
public function attributes_models(Request $request, EcoAttributesModelsRepository $repoModel)
{
if ($request->get('model')) {
if ($request->get('model_id') > 0) {
$model = $repoModel->find($request->get('model_id'));
} else {
$model = new EcoAttributesModels();
}
$model->setModel($request->get('model'));
$model->setModelType($request->get('model_type'));
try {
$this->entityManager->persist($model);
$this->entityManager->flush();
$this->addFlash('success', "Le modèle d'attribut a bien été enregistrée");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de l'enregistrement du modèle.");
}
}
return $this->render('admin/admin_products/products_attributes_models.html.twig', [
'modelsList' => $repoModel->findBy([], ['model' => 'ASC']),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormAttributeModel', options: ['expose' => true])]
public function axDisplayFormAttributeModel(Request $request, EcoAttributesModelsRepository $repoModel)
{
if ($request->isXmlHttpRequest()) {
$model = new EcoAttributesModels;
if ($request->get('model_id') > 0) {
$model = $repoModel->find($request->get('model_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_attribute_model.html.twig', [
'modalTitle' => "Modèle d'attribut",
'model_id' => $request->get('model_id'),
'model' => $model,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormAttribute', options: ['expose' => true])]
public function axDisplayFormAttribute(Request $request, EcoAttributesRepository $repoAttr)
{
if ($request->isXmlHttpRequest()) {
$attribut = new EcoAttributesModels;
if ($request->get('attr_id') > 0) {
$attribut = $repoAttr->find($request->get('attr_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_attribute.html.twig', [
'modalTitle' => 'Attributs',
'attribut' => $attribut,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/attribute_model/remove/{id}', name: 'admin_products_attribute_model_remove', defaults: ['id' => 0])]
public function remove_model(
Request $request,
EcoAttributesModelsRepository $repoModel,
EcoProductsReferencesRepository $ecoProductsReferencesRepository,
EcoAttributesRepository $ecoAttributesRepository,
$id
)
{
$model = new EcoCategories;
if ($id > 0) {
$model = $repoModel->find($id);
$productInModel = $ecoProductsReferencesRepository->findByProductsContainRef($model->getId());
if ($productInModel != null) {
$this->addFlash('danger', "Impossible de supprimer un modèle possédant des produits");
return $this->redirectToRoute('admin_products_attributes_models');
}
try {
$attrOfModel = $ecoAttributesRepository->findBy(['model_id' => $model->getId()]);
foreach ($attrOfModel as $attribute) {
$this->entityManager->remove($attribute);
}
$this->entityManager->remove($model);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_attributes_models');
}
#[Route(path: '/admin/products/attributs/{model_id}', name: 'admin_products_attributes', defaults: ['model_id' => ''])]
public function attributes(
$model_id,
Request $request,
EcoAttributesModelsRepository $repoModel,
EcoAttributesRepository $repoAttr
)
{
if ($request->get('attributes')) {
$attributs = explode(',', $request->get('attributes'));
if (is_array($attributs) && sizeof($attributs) > 0) {
foreach ($attributs as $attribut) {
$attr = new EcoAttributes;
$attr->setModelId($model_id);
$attr->setAttribute($attribut);
$this->entityManager->persist($attr);
}
}
try {
$this->entityManager->flush();
$this->addFlash('success', "enregistré avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de l'enregistrement");
}
}
return $this->render('admin/admin_products/products_attributes.html.twig', [
'model' => $repoModel->find($model_id),
'attributesList' => $repoAttr->findBy(['model_id' => $model_id], ['attribute' => 'ASC']),
]);
}
#[Route(path: '/admin/products/attributes_remove/{id}', name: 'admin_products_attribute_remove', defaults: ['id' => 0])]
public function remove_attributes(
Request $request,
EcoAttributesRepository $repoAttr,
EcoProductsReferencesRepository $ecoProductsReferencesRepository,
$id
)
{
$attr = new EcoAttributes;
if ($id > 0) {
$attr = $repoAttr->find($id);
$productInModel = $ecoProductsReferencesRepository->findByProductsContainAttr($attr->getId());
if ($productInModel != null) {
$this->addFlash('danger', "Impossible de supprimer un attribut associé à des produits");
return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
}
try {
$this->entityManager->remove($attr);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
}
#[Route(path: '/admin/products/save_attribute', name: 'admin_products_save_attribute')]
public function save_attribute(Request $request, EcoAttributesRepository $repoAttr)
{
$attr = new EcoAttributes;
if ($request->get('attr_id') > 0) {
$attr = $repoAttr->find($request->get('attr_id'));
$attr->setAttribute($request->get('attribute'));
try {
$this->entityManager->persist($attr);
$this->entityManager->flush();
$this->addFlash('success', "enregistré avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de l'enregistrement");
}
}
return $this->redirectToRoute('admin_products_attributes', ['model_id' => $attr->getModelId()]);
}
#[Route(path: '/admin/product_presentation/{prod_id}', name: 'admin_product_presentation', defaults: ['prdo_id' => 0])]
public function product_presentation(
Request $request,
EcoProductsRepository $repoProduct,
EcoCategoriesRepository $repoCateg,
EcoMarksRepository $repoMarks,
$prod_id
)
{
return $this->render('admin/admin_products/product_presentation.html.twig', [
'product_id' => $prod_id,
'product' => $repoProduct->find($prod_id),
'referencesList' => $this->entityManager->getRepository(EcoProductsReferences::class)->findBy(
['product_id' => $prod_id],
['ref_sequence' => 'ASC']
),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axAddBlock', options: ['expose' => true])]
public function axAddBlock(Request $request)
{
if ($request->isXmlHttpRequest()) {
//Insérer un bloc
$bloc = new EcoProductsBlocks;
$bloc->setProductId($request->get('prod_id'));
$bloc->setProdBlockType($request->get('bloc_type'));
$this->entityManager->persist($bloc);
$this->entityManager->flush();
if ($bloc->getId() > 0) {
$html = $this->renderView('admin/admin_products/bloc_' . $request->get('bloc_type') . '.html.twig', [
'bloc' => $bloc,
]);
$script = '';
//Init éditeur de texte
if (in_array($bloc->getProdBlockType(), array('text', 'text_picture', 'text_slider'))) {
$script .= " startEditor('#editeur_texte" . $bloc->getId() . "'); ";
}
$script .= "addObserver(" . $bloc->getId() . ");";
$script .= " $('html, body').animate({ scrollTop:$('#env" . $bloc->getId() . "').offset().top }, 'slow'); ";
}
return new JsonResponse([
'status' => true,
'html' => html_entity_decode($html),
'script' => $script
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axUpdateBlock', options: ['expose' => true])]
public function axUpdateBlock(Request $request, FlashNotificationAjax $flash)
{
if ($request->isXmlHttpRequest() && $request->get('bloc_id')) {
$entityManager = $this->getDoctrine()->getManager();
$bloc = $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
if (!$bloc) {
throw $this->createNotFoundException(
'Aucun bloc trouvé pour identifiant : ' . $request->get('bloc_id')
);
}
parse_str($request->get('data'), $datas);
$bloc->setProdBlockTextPicture(
isset($datas['prod_block_text_picture']) ? $datas['prod_block_text_picture'] : null
);
$bloc->setProdBlockTitle(isset($datas['prod_block_title']) ? $datas['prod_block_title'] : null);
$bloc->setProdBlockSubtitle(isset($datas['prod_block_subtitle']) ? $datas['prod_block_subtitle'] : null);
$bloc->setProdBlockText(isset($datas['prod_block_text']) ? $datas['prod_block_text'] : null);
$bloc->setProdBlockEmbed(isset($datas['prod_block_embed']) ? $datas['prod_block_embed'] : null);
$bloc->setProdBlockMulticolumn(
isset($datas['prod_block_multicolumn']) ? $datas['prod_block_multicolumn'] : null
);
$bloc->setProdBlockAlignment(isset($datas['prod_block_alignment']) ? $datas['prod_block_alignment'] : null);
$bloc->setProdBlockMarginTop(
isset($datas['prod_block_margin_top']) && $datas['prod_block_margin_top'] != "" ? $datas['prod_block_margin_top'] : null
);
$bloc->setProdBlockMarginBottom(
isset($datas['prod_block_margin_bottom']) && $datas['prod_block_margin_bottom'] != "" ? $datas['prod_block_margin_bottom'] : null
);
//Enregistrement du titre des médias
if (isset($datas['media_ids']) && is_array($datas['media_ids'])) {
foreach ($datas['media_ids'] as $media_id) {
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($media_id);
$media->setProdMediaAlt($datas['prod_media_alt' . $media_id]);
}
}
$entityManager->flush();
return new JsonResponse([
'status' => true,
'flashMessage' => $flash->notification('success', 'enregistré avec succès'),
]);
} else {
return new JsonResponse([
'status' => false,
]);
}
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayBlocs', options: ['expose' => true])]
public function axDisplayBlocs(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('prod_id') > 0) {
$result = $this->displayBlocs($request->get('prod_id'));
return new JsonResponse([
'status' => true,
'script' => $result['script'],
'renderBloc' => $result['html'],
]);
}
return new JsonResponse([
'status' => false,
]);
}
private function displayBlocs($prod_id)
{
$repository = $this->getDoctrine()->getRepository(EcoProductsBlocks::class);
$blocs = $repository->findBy(array('product_id' => $prod_id), array('prod_block_sequence' => 'ASC'));
if (is_array($blocs) && sizeof($blocs) > 0) {
$html = $script = "";
$i = 0;
foreach ($blocs as $bloc) {
$resultMedias = $this->displayMedias($bloc->getId(), $bloc->getProdBlockType());
$html .= $this->renderView('admin/admin_products/bloc_' . $bloc->getProdBlockType() . '.html.twig', [
'bloc' => $bloc,
'srcImage' => $resultMedias['srcImage'],
'listeImages' => $resultMedias['listeImages'],
'listeDocuments' => $resultMedias['listeDocuments'],
'imageRub' => $resultMedias['imageRub'],
'idImage' => $resultMedias['idImage']
]);
$script .= " addObserver(" . $bloc->getId() . "); ";
if (in_array($bloc->getProdBlockType(), array('gallery'))) {
$script .= " initSortableImages('" . $bloc->getId() . "'); ";
}
//Init éditeur de texte
if (in_array($bloc->getProdBlockType(), array('text', 'text_picture', 'text_slider'))) {
$script .= " startEditor('#editeur_texte" . $bloc->getId() . "'); ";
}
$i++;
}
return [
'html' => $html,
'script' => $script,
];
}
return [
'html' => null,
'script' => null,
];
}
private function displayMedias($bloc_id, $bloc_type)
{
$srcImage = $listeImages = $listeDocuments = $imageRub = $idImage = null;
$repository = $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
if ($bloc_type == 'document') {
$listeDocuments = $repository->findByMediasByBloc($bloc_id, 'file');
} elseif (in_array($bloc_type, array('text_picture', 'picture'))) {
$images = $repository->findByMediasByBloc($bloc_id, 'picture');
if (isset($images[0]['prod_media_file'])) {
$imageRub = $images[0];
$srcImage = $images[0]['prod_media_file'];
$idImage = $images[0]['id'];
}
} elseif (in_array($bloc_type, array('gallery'))) {
$images = $repository->findByMediasByBlocGalerie($bloc_id);
if (is_array($images) && sizeof($images) > 0) {
$listeImages = $images;
}
} else {
$images = $repository->findByMediasByBloc($bloc_id, 'picture');
if (is_array($images) && sizeof($images) > 0) {
$listeImages = $images;
}
}
return array(
'srcImage' => $srcImage,
'listeImages' => $listeImages,
'listeDocuments' => $listeDocuments,
'imageRub' => $imageRub,
'idImage' => $idImage,
);
}
#[Route(path: '/admin/products/upload-media', options: ['expose' => true])]
public function uploadStreamMedias(Request $request, OtideaUtils $utils)
{
$output = 'ok';
$bloc_id = $request->query->get('bloc_id');
$fileName = $request->query->get('filename');
$fileSize = $request->query->get('filesize');
$infosFile = pathinfo($fileName);
$typeMedias = $utils->getTypeMedia($infosFile["extension"], $isEnglishVersion = true);
if ($typeMedias == null) {
$output = 'extension';
} elseif ($fileSize > $this->maxFileSize) {
$output = 'size';
} else {
$this->currentFileName = date('his') . $utils->nettoyer_nom(urldecode($fileName));
$this->idAuteur = $bloc_id > 0 ? $bloc_id : null;
$tmpFilePath = $this->getParameter(
'kernel.project_dir'
) . '/' . $this->pathFiles . '/tmpFiles/' . $fileName;
$inputHandler = fopen('php://input', "r");
// create a temp file where to save data from the input stream
$fileHandler = fopen($tmpFilePath, "w+");
// save data from the input stream
while (true) {
$buffer = fgets($inputHandler, 4096);
if (strlen($buffer) == 0) {
fclose($inputHandler);
fclose($fileHandler);
break;
}
fwrite($fileHandler, $buffer);
}
rename(
$tmpFilePath,
$this->getParameter('kernel.project_dir') . '/' . $this->pathFiles . '/' . $this->currentFileName
);
//WEBP
$this->fileService->saveWebP([
"fileDestination" => $this->getParameter('kernel.project_dir') . '/' . $this->pathFiles,
"filename" => $this->currentFileName
]);
//SAUVEGARDE DU MEDIA
$entityManager = $this->getDoctrine()->getManager();
$bloc = $entityManager->getRepository(EcoProductsBlocks::class)->find($request->query->get('bloc_id'));
//Dans le cas d'un bloc image on supprime l'ancienne image avant de mettre la nouvelle
if (in_array($bloc->getProdBlockType(), array('picture', 'text_picture'))) {
$entityManager = $this->getDoctrine()->getManager();
$mediasDB = $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
$medias = $mediasDB->findBy(array('block_id' => $bloc_id));
if (is_array($medias) && sizeof($medias) > 0) {
foreach ($medias as $media) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('kernel.project_dir') . '/' . $this->pathFiles,
"filename" => $media->getProdMediaFile(),
]);
$entityManager->remove($media);
}
}
$entityManager->flush();
}
//Sauvegarder le media
$this->saveMedia($bloc_id, $this->currentFileName, $typeMedias);
}
return new Response(
$output, Response::HTTP_OK, ['content-type' => 'text/plain']
);
}
private function saveMedia($bloc_id, $fileName, $typeMedias)
{
$entityManager = $this->getDoctrine()->getManager();
$media = new EcoProductsBlocksMedias();
$media->setBlockId($bloc_id);
$media->setProdMediaAlt(null);
$media->setProdMediaFile($fileName);
$media->setProdMediaType($typeMedias);
$media->setProdMediaSequence(
$entityManager->getRepository(EcoProductsBlocksMedias::class)->findOneByMaxMediaOrdre(
$bloc_id
)['mediaCount']
);
// $media->setProdMediaLink('');
// $media->setProdMediaIsblank(0);
$entityManager->persist($media);
$entityManager->flush();
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDeleteBlock', options: ['expose' => true])]
public function axDeleteBlock(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('bloc_id')) {
$entityManager = $this->getDoctrine()->getManager();
$bloc = $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
$entityManager->remove($bloc);
$entityManager->flush();
//Suppression des médias
$mediasDB = $this->getDoctrine()->getRepository(EcoProductsBlocksMedias::class);
$medias = $mediasDB->findBy(array('block_id' => $request->get('bloc_id')));
if (is_array($medias)) {
foreach ($medias as $media) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_products_' . $this->session->get('admin_site_uid')),
"filename" => $media->getProdMediaFile(),
]);
$entityManager->remove($media);
}
}
$entityManager->flush();
$script = '';
$script .= " $('#env" . $request->get('bloc_id') . "').slideUp('slow', function(){ $('#env" . $request->get(
'bloc_id'
) . "').remove(); }); ";
return new JsonResponse([
'status' => true,
'bloc_id' => $request->get('bloc_id'),
'script' => $script
]);
} else {
return new JsonResponse([
'status' => false,
]);
}
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDeletePhoto', options: ['expose' => true])]
public function axDeletePhoto(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('media_id') > 0) {
$fileName = '';
$bloc_id = 0;
try {
$entityManager = $this->getDoctrine()->getManager();
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
$fileName = $media->getProdMediaFile();
$bloc_id = $media->getBlockId();
$entityManager->remove($media);
$entityManager->flush();
} catch (Exception $ex) {
echo "Exception Found - " . $ex->getMessage() . "<br/>";
}
$pathFile = $this->getParameter('kernel.project_dir') . '/' . $this->pathFiles . '/' . $fileName;
if (file_exists($pathFile)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('kernel.project_dir') . '/' . $this->pathFiles,
"filename" => $fileName,
]);
}
$script = '';
if (in_array($request->get('bloc_type'), array('document'))) {
$script .= " $('#file_" . $request->get('media_id') . "').remove(); ";
} elseif (in_array($request->get('bloc_type'), array('picture', 'text_picture'))) {
$script .= " $('#img" . $bloc_id . "').attr('src','" . $request->getSchemeAndHttpHost() . "/medias_admin/upload-image.png'); ";
$script .= " $('#del" . $bloc_id . "').hide(); ";
$script .= " $('#lienGalerie" . $bloc_id . "').hide(); ";
} else {
$script .= " $('#galerie-img-" . $request->get('media_id') . "').remove(); ";
}
return new JsonResponse([
'status' => true,
'script' => $script,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayMedias', options: ['expose' => true])]
public function axDisplayMedias(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('bloc_id') > 0) {
$script = '';
$renderGalerie = $renderDocument = null;
$entityManager = $this->getDoctrine()->getManager();
$bloc = $entityManager->getRepository(EcoProductsBlocks::class)->find($request->get('bloc_id'));
if ($bloc->getProdBlockType() == 'document') {
$documents = $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBloc(
$request->get('bloc_id'),
'file'
);
$blocArray['id'] = $request->get('bloc_id');
$blocArray['prodBlockType'] = $bloc->getProdBlockType();
$renderDocument = $this->renderView('admin/admin_products/tpl_document_liste.html.twig', [
'bloc' => $blocArray,
'listeDocuments' => $documents,
]);
//Une seule image à afficher
} elseif (in_array($bloc->getProdBlockType(), array('text_picture', 'picture'))) {
// $images = $entityManager->getRepository(Pages::class)->findByImagesByBloc($request->get('bloc_id'));
$images = $entityManager->getRepository(EcoProductsBlocksMedias::class)->findBy(
[
'block_id' => $request->get('bloc_id'),
'prod_media_type' => 'picture'
],
['prod_media_sequence' => 'ASC']
);
$src = $request->getSchemeAndHttpHost() . '/medias_front/products/' . $images[0]->getProdMediaFile();
$script .= ' $("#img' . $bloc->getId() . '").attr("src","' . $src . '"); ';
$script .= " $('#del" . $bloc->getId() . "').attr('onclick','deletePhoto(" . $images[0]->getId() . ", \'" . $bloc->getProdBlockType() . "\');'); ";
$script .= " $('#del" . $bloc->getId() . "').show(); ";
$script .= " $('#lienGalerie" . $bloc->getId() . "').attr('onclick','displayModalMedia(" . $images[0]->getId() . ", \'" . $bloc->getProdBlockType() . "\');'); ";
$script .= " $('#lienGalerie" . $bloc->getId() . "').show(); ";
$script .= " $('.progress').width('0%'); ";
//Plusieurs images à afficher
} elseif (in_array($bloc->getProdBlockType(), array('gallery'))) {
$images = $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBlocGalerie(
$request->get('bloc_id')
);
$blocArray['id'] = $request->get('bloc_id');
$renderGalerie = $this->renderView('admin/admin_products/tpl_galerie_images.html.twig', [
'bloc' => $blocArray,
'listeImages' => $images,
]);
$script .= " initSortableImages('" . $request->get('bloc_id') . "'); ";
} else {
$images = $entityManager->getRepository(EcoProductsBlocksMedias::class)->findByMediasByBloc(
$request->get('bloc_id'),
'picture'
);
$blocArray['id'] = $request->get('bloc_id');
$renderGalerie = $this->renderView('admin/admin_products/tpl_galerie_images.html.twig', [
'bloc' => $blocArray,
'listeImages' => $images,
]);
$script .= " initSortableImages('" . $request->get('bloc_id') . "'); ";
}
$script .= ' $("#img' . $bloc->getId() . '").css("zIndex",2); ';
return new JsonResponse([
'status' => true,
'script' => $script,
'renderGalerie' => $renderGalerie,
'renderDocument' => $renderDocument,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axEmbedGalerie', options: ['expose' => true])]
public function axEmbedGalerie(Request $request)
{
if ($request->isXmlHttpRequest()) {
$entityManager = $this->getDoctrine()->getManager();
$ActualiteBlocsDB = $entityManager->getRepository(EcoProductsBlocks::class);
//insert neoMedia type embed
$entityManager = $this->getDoctrine()->getManager();
$bloc_id = $request->get('id_bloc');
$media = new EcoProductsBlocksMedias();
$media->setBlockId($bloc_id);
$media->setProdMediaAlt('');
$media->setProdMediaFile('');
$media->setProdMediaType('embed');
$media->setProdMediaSequence(
$entityManager->getRepository(EcoProductsBlocksMedias::class)->findOneByMaxMediaOrdre(
$bloc_id
)['mediaCount']
);
$media->setProdMediaLink('');
$media->setProdMediaIsblank(0);
$entityManager->persist($media);
$entityManager->flush();
if ($media->getBlockId() > 0) {
$script = '';
$script .= "displayMedias(" . $bloc_id . ");";
return new JsonResponse([
'status' => true,
'script' => $script
]);
}
} else {
return new JsonResponse([
'status' => false,
]);
}
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayModalEmbed', options: ['expose' => true])]
public function axDisplayModalEmbed(Request $request)
{
if ($request->isXmlHttpRequest()) {
$entityManager = $this->getDoctrine()->getManager();
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
$renderModale = $this->renderView('admin/admin_products/tpl_modal_media_embed.html.twig', [
'modalTitle' => 'Gestion embed',
'media_id' => $request->get('media_id'),
'media' => $media,
]);
}
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axSaveMediaAlt', options: ['expose' => true])]
public function axSaveMediaAlt(Request $request, FlashNotificationAjax $flash)
{
if ($request->isXmlHttpRequest()) {
$params = array();
parse_str($request->get('form'), $params);
try {
$entityManager = $this->getDoctrine()->getManager();
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($params['media_id']);
$media->setProdMediaAlt($params['prod_media_alt']);
if ($params['prod_media_type'] == 'embed') {
$media->setProdMediaFile($params['prod_media_file']);
}
$media->setProdMediaDisplayAlt($params['prod_media_display_alt']);
$media->setProdMediaLink($params['prod_media_link']);
$media->setProdMediaIsblank($params['prod_media_isblank']);
$entityManager->flush();
$script = '';
$script .= "displayMedias(" . $params['block_id'] . ");";
return new JsonResponse([
'status' => true,
'script' => $script,
'flashMessage' => $flash->notification(
'success',
'enregistré avec succès'
),
]);
} catch (Exception $e) {
return new JsonResponse([
'status' => false,
'flashMessage' => $flash->notification(
'danger',
"Une erreur s'est produite lors de l'enregistrement"
),
]);
}
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axUpdateOrderMedias', options: ['expose' => true])]
public function axUpdateOrderMedias(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('sorted')) {
$liste = explode('&', $request->get('sorted'));
$i = 1;
$entityManager = $this->getDoctrine()->getManager();
foreach ($liste as $ligne) {
$id = str_replace('sort=', '', $ligne);
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($id);
$media->setProdMediaSequence($i);
$entityManager->flush();
$i++;
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayModalMedia', options: ['expose' => true])]
public function axDisplayModalMedia(Request $request)
{
if ($request->isXmlHttpRequest()) {
$entityManager = $this->getDoctrine()->getManager();
$media = $entityManager->getRepository(EcoProductsBlocksMedias::class)->find($request->get('media_id'));
$renderModale = $this->renderView('admin/admin_products/tpl_modal_media.html.twig', [
'modalTitle' => 'Texte alternatif',
'media_id' => $request->get('media_id'),
'media' => $media,
]);
}
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayReorderBlocs', options: ['expose' => true])]
public function axDisplayReorderBlocs(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('prod_id')) {
$entityManager = $this->getDoctrine()->getManager();
$blocs = $entityManager->getRepository(EcoProductsBlocks::class)->findBy(
['product_id' => $request->get('prod_id')],
['prod_block_sequence' => 'ASC']
);
$renderModale = $this->renderView('admin/admin_products/tpl_reordonner_blocs.html.twig', [
'modalTitle' => 'Ordonner les blocs',
'prod_id' => $request->get('prod_id'),
'blocs' => $blocs
]);
$script = '';
$script .= " initSortableBlocs(); ";
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
'script' => $script,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axUpdateOrderBlocs', options: ['expose' => true])]
public function axUpdateOrderBlocs(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('sorted')) {
$liste = explode('&', $request->get('sorted'));
$i = 1;
$entityManager = $this->getDoctrine()->getManager();
foreach ($liste as $ligne) {
$uid = str_replace('sort=', '', $ligne);
$bloc = $entityManager->getRepository(EcoProductsBlocks::class)->find($uid);
$bloc->setProdBlockSequence($i);
$entityManager->flush();
$i++;
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axCloseReorderBlocs', options: ['expose' => true])]
public function axCloseReorderBlocs(Request $request)
{
if ($request->isXmlHttpRequest()) {
$script = '';
$script .= " window.location = window.location; ";
return new JsonResponse([
'status' => true,
'script' => $script,
]);
}
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axUpdateOrderReferences', options: ['expose' => true])]
public function axUpdateOrderReferences(Request $request)
{
if ($request->isXmlHttpRequest() && $request->get('sorted')) {
$liste = explode('&', $request->get('sorted'));
$i = 1;
$entityManager = $this->getDoctrine()->getManager();
foreach ($liste as $ligne) {
$uid = str_replace('sort=', '', $ligne);
$bloc = $entityManager->getRepository(EcoProductsReferences::class)->find($uid);
$bloc->setRefSequence($i);
$entityManager->flush();
$i++;
}
return new JsonResponse([
'status' => true,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axRemoveProduct', options: ['expose' => true])]
public function axRemoveProduct(
Request $request,
EcoProductsRepository $repoProduct,
EcoCustomersFavoritesProdRepository $repoFavProd,
EcoProductsBlocksRepository $repoProdBlock,
EcoProductsBlocksMediasRepository $repoProdBlockMedias,
EcoProductsReferencesRepository $repoReferences,
EcoAttributesReferencesRepository $repoAttr
)
{
if ($request->isXmlHttpRequest()) {
//SUPPRESSION BLOCS & MEDIAS
$blocs = $repoProdBlock->findBy(['product_id' => $request->get('product_id')]);
if (is_array($blocs) && sizeof($blocs) > 0) {
foreach ($blocs as $bloc) {
$medias = $repoProdBlockMedias->findBy(['block_id' => $bloc->getId()]);
$this->removeMedias($medias);
}
$this->entityManager->remove($bloc);
}
//SUPPRESSION REFERENCES
$references = $repoReferences->findBy(['product_id' => $request->get('product_id')]);
if (is_array($references) && sizeof($references) > 0) {
foreach ($references as $reference) {
//SUPPRESSION ATTRIBUTS
$attributesLinks = $repoAttr->findBy(['reference_id' => $reference->getId()]);
if (is_array($attributesLinks) && sizeof($attributesLinks) > 0) {
foreach ($attributesLinks as $link) {
$this->entityManager->remove($link);
}
}
$this->entityManager->remove($reference);
}
}
//SUPPRESION DES FAVORIS CLIENTS
$favsProds = $repoFavProd->findBy(['productId' => $request->get('product_id')]);
foreach ($favsProds as $favProd) {
$this->entityManager->remove($favProd);
}
//SUPPRESSION PRODUIT
$product = $repoProduct->find($request->get('product_id'));
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_products_' . $this->session->get('admin_site_uid')),
"filename" => $product->getProdPicture(),
]);
$this->entityManager->remove($product);
$this->entityManager->flush();
$script = " $('#row" . $request->get('product_id') . "').remove(); ";
return new JsonResponse([
'status' => true,
'script' => $script,
]);
}
return new JsonResponse([
'status' => false,
]);
}
/**
* Suppression des médias d'un bloc présentation
* @param array $medias
*/
private function removeMedias($medias)
{
if (is_array($medias)) {
foreach ($medias as $media) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_products_' . $this->session->get('admin_site_uid')),
"filename" => $media->getProdMediaFile(),
]);
$this->entityManager->remove($media);
}
}
$this->entityManager->flush();
}
/**
* @param Request $request
* TUTORIEL : https://ourcodeworld.com/articles/read/798/how-to-create-an-excel-file-with-php-in-symfony-4
*/
#[Route(path: '/admin/export-articles', name: 'admin_excel_export_products')]
public function excelExportProducts(Request $request, EcoProductsRepository $repoProducts)
{
$products = $repoProducts->findByProducts();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$headCols = [
'Date de création',
'Modèle',
'Désignation',
'Référence',
'Référence perso',
'Code barre',
'Prix achat',
'Prix de vente',
'Prix promo',
'Prix solde',
'TVA',
'Quantité'
];
//1er ligne - Intitulé des colonnes
$column = 'A';
$row = 1;
foreach ($headCols as $col) {
$sheet->setCellValue($column . $row, $col);
$column++;
}
//Données
$row++;
foreach ($products as $prod) {
$column = 'A';
$sheet->setCellValue($column . $row, date('d/m/Y', strtotime($prod['prod_creation_date'])));
$column++;
$sheet->setCellValue($column . $row, $prod['prod_model']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_entitled']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_reference']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_reference_perso']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_barcode']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_buying_price']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_selling_price']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_promo_price']);
$column++;
$sheet->setCellValue($column . $row, $prod['ref_solde_price']);
$column++;
$sheet->setCellValue($column . $row, (($prod['ref_tva'] * 100) - 100) . '%');
$column++;
$sheet->setCellValue($column . $row, $prod['ref_quantity'] > 0 ? $prod['ref_quantity'] : 0);
$column++;
$row++;
}
$sheet->setTitle("Export produits du " . date('d-m-Y'));
$writer = new Xlsx($spreadsheet);
$fileName = 'export-produits-' . date('dmY') . '.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Create the file
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
#[Route(path: '/admin/product-statistics/{prod_id}', name: 'admin_product_statistics', defaults: ['prod_id' => 0])]
public function product_statistics(
Request $request,
EcoOrdersRepository $repoOrders,
EcoProductsReferencesRepository $repoProdRef,
EcoProductsRepository $repoProduct,
$prod_id = 0
)
{
$year = $request->get('year') ? $request->get('year') : date('Y');
//Année de début
$firstYear = $repoOrders->findByFirstYearProduct($prod_id);
$firstYear = $firstYear > 0 ? $firstYear : date('Y');
//Liste des années disponibles en fonction des commandes du site
$yearOrderList = $this->getYearOrderList($firstYear);
//Données de ventes
$datas = [];
$references = $repoProdRef->findBy(['product_id' => $prod_id]);
foreach ($references as $key => $ref) {
$stats = $repoOrders->findByReferenceOrderByMonth($year, $ref->getId());
foreach ($this->monthList as $keyMonth => $month) {
$datas[$ref->getId()][$keyMonth] = 0;
foreach ($stats as $stat) {
if ($keyMonth == $stat['month']) {
$datas[$ref->getId()][$keyMonth] = $stat['nbSales'];
}
}
}
$references[$key]->rgb = $this->getRandomColors();
}
// dd($references[0]->rgb);
return $this->render('admin/admin_products/product_statistics.html.twig', [
'product_id' => $prod_id,
'product' => $repoProduct->find($prod_id),
'yearOrderList' => $yearOrderList,
'monthsList' => $this->monthList,
'selectedYear' => $year,
'references' => $references,
'datasSales' => $datas,
]);
}
private function getRandomColors()
{
foreach (array('r', 'g', 'b') as $color) {
$rgbColor[$color] = mt_rand(0, 255);
}
return $rgbColor;
}
private function getYearOrderList($firstYear)
{
$result = [];
if (date('Y') - $firstYear > 0) {
$diff = date('Y') - $firstYear;
for ($i = 0; $i <= $diff; $i++) {
$result[] = $firstYear + $i;
}
} else {
$result[] = $firstYear;
}
return $result;
}
#[Route(path: '/admin/products/marks', name: 'admin_products_marks')]
public function marks(Request $request, EcoMarksRepository $repoMarks)
{
if ($request->get('mark')) {
$mark = new EcoMarks;
if ($request->get('mark_id') && $request->get('mark_id') > 0) {
$mark = $repoMarks->find($request->get('mark_id'));
}
$mark->setMark($request->get('mark'));
$mark->setSiteId($this->session->get('admin_site_uid'));
$this->entityManager->persist($mark);
$this->entityManager->flush();
}
return $this->render('admin/admin_products/products_marks.html.twig', [
'marks' => $repoMarks->findBy(['siteId' => $this->session->get('admin_site_uid')], ['mark' => 'ASC']),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormMark', options: ['expose' => true])]
public function axDisplayFormMark(Request $request, EcoMarksRepository $repoMark)
{
if ($request->isXmlHttpRequest()) {
$mark = new EcoMarks;
if ($request->get('mark_id') > 0) {
$mark = $repoMark->find($request->get('mark_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_mark.html.twig', [
'modalTitle' => 'Marque',
'mark_id' => $request->get('mark_id'),
'mark' => $mark,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/mark/remove/{id}', name: 'admin_products_mark_remove', defaults: ['id' => 0])]
public function remove_mark(
Request $request,
EcoMarksRepository $repoMarks,
EcoProductsRepository $ecoProductsRepository,
$id
)
{
$mark = new EcoMarks;
if ($id > 0) {
$mark = $repoMarks->find($id);
$productInMark = $ecoProductsRepository->findBy(['mark_id' => $mark->getId()]);
if ($productInMark != null) {
$this->addFlash('danger', "Impossible de supprimer une marque possédant des produits");
return $this->redirectToRoute('admin_products_marks');
}
try {
$this->entityManager->remove($mark);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_marks');
}
#[Route(path: '/admin/products/providers', name: 'admin_products_providers')]
public function providers(Request $request, EcoProvidersRepository $repoProviders)
{
if ($request->get('provider')) {
$provider = new EcoProviders;
if ($request->get('provider_id') && $request->get('provider_id') > 0) {
$provider = $repoProviders->find($request->get('provider_id'));
}
$provider->setProvider($request->get('provider'));
$provider->setDescription($request->get('description'));
$provider->setCity($request->get('city'));
$provider->setPostalCode($request->get('postalCode'));
$provider->setSiteId($this->session->get('admin_site_uid'));
$this->entityManager->persist($provider);
$this->entityManager->flush();
}
return $this->render('admin/admin_products/products_providers.html.twig', [
'providers' => $repoProviders->findBy(['siteId' => $this->session->get('admin_site_uid')],
['provider' => 'ASC']),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormProvider', options: ['expose' => true])]
public function axDisplayFormProvider(Request $request, EcoProvidersRepository $repoProvider)
{
if ($request->isXmlHttpRequest()) {
$provider = new EcoProviders;
if ($request->get('provider_id') > 0) {
$provider = $repoProvider->find($request->get('provider_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_provider.html.twig', [
'modalTitle' => 'Fournisseur',
'mark_id' => $request->get('provider_id'),
'provider' => $provider,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/provider/remove/{id}', name: 'admin_products_provider_remove', defaults: ['id' => 0])]
public function remove_provider(
Request $request,
EcoProvidersRepository $repoProviders,
EcoProductsRepository $ecoProductsRepository,
$id
)
{
$provider = new EcoProviders;
if ($id > 0) {
$provider = $repoProviders->find($id);
$productInProvider = $ecoProductsRepository->findBy(['provider_id' => $provider->getId()]);
if ($productInProvider != null) {
$this->addFlash('danger', "Impossible de supprimer un fournisseur associé à des produits");
return $this->redirectToRoute('admin_products_providers');
}
try {
$this->entityManager->remove($provider);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_providers');
}
#[Route(path: '/admin/products/labels', name: 'admin_products_labels')]
public function labels(Request $request, EcoLabelsRepository $labelsRepository)
{
if ($request->get('name')) {
$label = new EcoLabels;
$picture = null;
if ($request->get('label_id') && $request->get('label_id') > 0) {
$label = $labelsRepository->find($request->get('label_id'));
$picture = $label->getLogo();
}
$label->setName($request->get('name'));
//$label->setLogo($request->get('logo'));
dump($request);
// upload du fichier
if ($request->files->get("logo") !== null) {
$upload = $this->fileService->startUpload(
[
"fileData" => $request->files->get("logo"),
"oldFileName" => $picture,
"fileDestination" => $this->getParameter(
"upload_labels_" . $this->session->get('admin_site_uid')
),
"autorizedExtensions" => $this->autorizedImages,
"createWebp" => true
]
);
// upload OK
if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string(
$upload['filename']
)) {
$label->setLogo($upload['filename']);
} // upload KO avec message perso
elseif (isset($upload['error_msg'])) {
$label->setLogo($picture);
$errorMsg = $upload['error_msg'];
} // upload KO avec message générique
else {
$label->setLogo($picture);
$errorMsg = "Une erreur s'est produite lors de l'enregistrement du fichier";
}
}
try {
$this->entityManager->persist($label);
$this->entityManager->flush();
} catch (Exception $e) {
$errorMsg = "Une erreur s'est produite lors de l'enregistrement";
}
// il y a eu une erreur
if (isset($errorMsg)) {
$this->addFlash('danger', $errorMsg);
} // pas d'erreur
else {
$this->addFlash('success', "enregistré avec succès");
}
}
return $this->render('admin/admin_products/products_labels.html.twig', [
'labels' => $labelsRepository->findBy([], ['name' => 'ASC']),
]);
}
/**
* @param Request $request
*/
#[Route(path: '/admin/products/axDisplayFormLabel', options: ['expose' => true])]
public function axDisplayFormlabel(Request $request, EcoLabelsRepository $labelsRepository)
{
if ($request->isXmlHttpRequest()) {
$label = new EcoLabels;
if ($request->get('label_id') > 0) {
$label = $labelsRepository->find($request->get('label_id'));
}
$renderModale = $this->renderView('admin/admin_products/tpl_form_label.html.twig', [
'modalTitle' => 'Label',
'label_id' => $request->get('label_id'),
'label' => $label,
'autorizedImages' => $this->autorizedImages,
]);
return new JsonResponse([
'status' => true,
'modal' => html_entity_decode($renderModale),
]);
}
return new JsonResponse([
'status' => false,
]);
}
#[Route(path: '/admin/products/label/remove/{id}', name: 'admin_products_label_remove', defaults: ['id' => 0])]
public function remove_label(
Request $request,
EcoLabelsRepository $labelsRepository,
EcoProductsLabelsRepository $ecoProductsLabelsRepository,
$id
)
{
$label = new EcoProductsLabels();
if ($id > 0) {
$label = $labelsRepository->find($id);
$productInLabel = $ecoProductsLabelsRepository->findBy(['label_id' => $label->getId()]);
if ($productInLabel != null) {
$this->addFlash('danger', "Impossible de supprimer un label associé à des produits");
return $this->redirectToRoute('admin_products_labels');
}
try {
$this->entityManager->remove($label);
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression");
}
}
return $this->redirectToRoute('admin_products_labels');
}
#[Route(path: '/admin/products/remove-picture-label/{id}', name: 'admin_product_remove_picture_label', defaults: ['id' => ''])]
public function removePictureLabel($id)
{
if ($id > 0) {
try {
$media = $this->entityManager->getRepository(EcoLabels::class)->find($id);
$filename = $media->getLogo();
$media->setLogo(null);
$this->entityManager->persist($media);
$this->entityManager->flush();
if ($filename != null && $filename != "" && is_string($filename) && $this->filesystem->exists(
$file = $this->getParameter(
'upload_labels_' . $this->session->get('admin_site_uid')
) . "/" . $filename
)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_labels_' . $this->session->get('admin_site_uid')),
"filename" => $filename,
]);
}
$this->addFlash('success', "L'illustration a été supprimée avec succès");
} catch (Exception $e) {
$this->addFlash('danger', "Une erreur s'est produite lors de la suppression de l'illustration");
}
}
return $this->redirectToRoute('admin_products_labels');
}
#[Route(path: '/admin/product-combination/{prod_id}', name: 'admin_product_combination', defaults: ['prod_id' => 0])]
public function product_combination(Request $request, EcoProductsRepository $repoProduct, $prod_id = 0)
{
return $this->render('admin/admin_products/product_combination.html.twig', [
'product_id' => $prod_id,
'product' => $repoProduct->find($prod_id),
'combinations' => $repoProduct->findByProductsCombination($prod_id),
]);
}
#[Route(path: '/admin/product-combination-remove/{prod_id}/{com_prod_id}', name: 'admin_combination_remove', defaults: [
'prod_id' => 0,
'com_prod_id' => ''
])]
public function product_combination_remove(
EcoProductsCombinationRepository $repoProductCombination,
$com_prod_id,
$prod_id = 0
)
{
$combination = $repoProductCombination->findBy(['product_id' => $prod_id, 'com_product_id' => $com_prod_id]);
foreach ($combination as $comb) {
$this->entityManager->remove($comb);
}
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
return $this->redirectToRoute('admin_product_combination', ['prod_id' => $prod_id]);
}
#[Route(path: '/admin/products/product-search', options: ['expose' => true])]
public function searchProduct(Request $request, EcoProductsRepository $repoCustomers)
{
$customers = $repoCustomers->findBySearchProductsByFilter($request->get('search'));
$datas = [];
foreach ($customers as $key => $result) {
$data = [
'label' => $result['prod_model'],
'value' => $result['prod_model'],
'id' => $result['prod_id'],
];
$datas[] = $data;
}
return new JsonResponse([
'datas' => json_encode($datas),
]);
}
#[Route(path: '/admin/insert-combination/{prod_id}', name: 'admin_insert_combination', defaults: ['prod_id' => 0])]
public function insert_combination(
Request $request,
EcoProductsCombinationRepository $repoProductCombination,
$prod_id = 0
)
{
$result = $repoProductCombination->findBy([
'product_id' => $prod_id,
'com_product_id' => $request->get('product_id')
]);
//Si pas de résultat on peut insérer la combinaison
if ($result == null) {
$combination = new EcoProductsCombination();
$combination->setProductId($prod_id);
$combination->setComProductId($request->get('product_id'));
$this->entityManager->persist($combination);
$this->entityManager->flush();
$this->addFlash('success', "Ajout avec succès");
} else {
$this->addFlash('danger', "Cet article est déjà attribué.");
}
return $this->redirectToRoute('admin_product_combination', ['prod_id' => $prod_id]);
}
#[Route(path: '/admin/products/bundle/{prod_id}', name: 'admin_product_bundle', defaults: ['prod_id' => ''])]
public function bundle(Request $request, EcoProductsRepository $repoProduct, $prod_id)
{
return $this->render('admin/admin_products/products_bundle.html.twig', [
'product' => $repoProduct->find($prod_id),
'product_id' => $prod_id,
'bundles' => $repoProduct->findByProductsBundle($prod_id),
]);
}
#[Route(path: '/admin/products/reference-search', options: ['expose' => true])]
public function searchReferenceProduct(Request $request, EcoProductsRepository $repoCustomers)
{
$customers = $repoCustomers->findBySearchReferencesByFilter($request->get('search'));
$datas = [];
foreach ($customers as $key => $result) {
$data = [
'label' => $result['prod_model'] . ' - ' . $result['ref_entitled'] . ' (' . $result['ref_reference'] . ')',
'value' => $result['prod_model'] . ' ' . $result['ref_entitled'],
'id' => $result['ref_id'],
];
$datas[] = $data;
}
return new JsonResponse([
'datas' => json_encode($datas),
]);
}
#[Route(path: '/admin/insert-reference-bundle/{prod_id}', name: 'admin_insert_reference_bundle', defaults: ['prod_id' => 0])]
public function insert_reference_bundle(
Request $request,
EcoProductsBundleRepository $repoProductBundle,
$prod_id = 0
)
{
$result = $repoProductBundle->findBy([
'product_id' => $prod_id,
'reference_id' => $request->get('reference_id')
]);
//Si pas de résultat on peut insérer la combinaison
if ($result == null) {
$bundle = new EcoProductsBundle();
$bundle->setProductId($prod_id);
$bundle->setReferenceId($request->get('reference_id'));
$bundle->setBundleQte(1);
$this->entityManager->persist($bundle);
$this->entityManager->flush();
$this->addFlash('success', "Ajout avec succès");
} else {
$this->addFlash('danger', "Cet article est déjà attribué.");
}
return $this->redirectToRoute('admin_product_bundle', ['prod_id' => $prod_id]);
}
#[Route(path: '/admin/product-bundle-remove/{prod_id}/{reference_id}', name: 'admin_bundle_remove', defaults: [
'prod_id' => 0,
'reference_id' => ''
])]
public function product_bundle_remove(EcoProductsBundleRepository $repoProductBundle, $reference_id, $prod_id = 0)
{
$bundles = $repoProductBundle->findBy(['product_id' => $prod_id, 'reference_id' => $reference_id]);
foreach ($bundles as $bundle) {
$this->entityManager->remove($bundle);
}
$this->entityManager->flush();
$this->addFlash('success', "Suppression avec succès");
return $this->redirectToRoute('admin_product_bundle', ['prod_id' => $prod_id]);
}
#[Route(path: '/admin/products/axUpdateProductQtePack')]
public function axUpdateProductQtePack(
Request $request,
EcoProductsBundleRepository $repoBundle,
FlashNotificationAjax $flash
)
{
if ($request->get('product_id') && $request->get('reference_id') && $request->get('qte') && $request->get(
'qte'
) > 0) {
$prodPack = $repoBundle->findOneBy([
'product_id' => $request->get('product_id'),
'reference_id' => $request->get('reference_id')
]);
if ($prodPack != null) {
$prodPack->setBundleQte($request->get('qte'));
$this->entityManager->persist($prodPack);
$this->entityManager->flush();
return new JsonResponse([
'status' => true,
'flashMessage' => $flash->notification(
'success',
'enregistré avec succès'
),
]);
}
}
return new JsonResponse([
'status' => false,
'flashMessage' => $flash->notification(
'danger',
"Une erreur s'est produite lors de l'enregistrement"
),
]);
}
}