<!DOCTYPE html>
<html>
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-PSQRPHDD');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>
Relais-Vert
</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text></svg>">
<link rel="canonical" href="/">
<link rel="apple-touch-icon" sizes="76x76" href="/assets/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png">
<link rel="icon" type="image/png" href="/assets/favicon/android-chrome-72x72.png" sizes="72x72">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/assets/favicon/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="/assets/favicon/favicon.ico">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-TileImage" content="/assets/favicon/mstile-150x150.png">
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="/build/app.1a701a29.css">
<link rel="stylesheet" href="/build/styles.d943cf93.css">
<script src="/build/runtime.bee14273.js" defer></script><script src="/build/vendors-node_modules_jquery_dist_jquery_js.478ce660.js" defer></script><script src="/build/vendors-node_modules_core-js_internals_array-iteration_js-node_modules_core-js_internals_arra-7d9ff1.b560b12a.js" defer></script><script src="/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_bootstrap_dist_js_boo-a163a2.2b6e1430.js" defer></script><script src="/build/app.4a232fb5.js" defer></script>
<script>
var search_selector = 'form.search';
var search_windowSize = 768;
function checkWindowSize(val) { if($(window).width() < val) { return true; } else { return false; } }
function searchToggle() {
if(checkWindowSize(768)) {
$(search_selector).find("button").addClass('toggle');
$(search_selector).find("input").addClass('hidden');
}
else {
$(search_selector).find("button").removeClass('toggle');
$(search_selector).find("input").removeClass('hidden');
}
$(search_selector).find("button.toggle").on("click", function() {
$(search_selector).find("button").removeClass('toggle');
$(search_selector).find("input").removeClass('hidden');
});
$(window).on('click', function() {
$(search_selector).find("button").addClass('toggle');
$(search_selector).find("input").addClass('hidden');
});
$(search_selector).on('click', function(event){
event.stopPropagation();
});
}
function initialisationRecherche() {
// Gestion moteur de recherche
let barreRecherche = document.getElementById("barreRecherche");
// Vérifier que l'élément existe avant d'ajouter l'event listener
if (barreRecherche == null) {
return;
}// if
document.addEventListener("click", function(event) {
let dropdownRecherche = document.querySelector(".dropdownRecherche");
if (dropdownRecherche != null) {
dropdownRecherche.classList.remove("show")
}// if
});
var timeOutRecherche;
barreRecherche.addEventListener("input", function(event) {
// Temporisation pour attendre la fin de la saisie
clearTimeout(timeOutRecherche);
timeOutRecherche = setTimeout(function(){
let dropdownRecherche = document.querySelector(".dropdownRecherche");
let champsChargeRecherche = document.getElementById("chargeRecherche");
let champsBarreRecherche = document.getElementById("barreRecherche");
if (dropdownRecherche != null) {
dropdownRecherche.classList.add('show');
}// if
if (champsChargeRecherche != null) {
champsChargeRecherche.classList.remove("invisible")
}// if
// envoi requete
const options = {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
q : champsBarreRecherche.value,
}),
};
fetch("\/eshop\/recherche\/auto", options)
.then(function(response) {
return response.text();
})
.then(function(data) {
let champsChargeRecherche = document.getElementById("chargeRecherche");
let listeRecherche = document.getElementById("listeRecherche");
// dropdownRecherche.classList.add('show');
if (champsChargeRecherche != null) {
champsChargeRecherche.classList.add("invisible")
}// if
if (listeRecherche != null) {
listeRecherche.innerHTML = data;
}// if
})
.catch(function(error) {
console.log(error);
});
}, 300);
});
}// function
/**
* Décompose la différence entre 2 dates en heures / minutes / secondes
*/
function dateDiff(date1, date2){
var diff = {} // Initialisation du retour
var tmp = date2 - date1;
tmp = Math.floor(tmp/1000); // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60; // Extraction du nombre de secondes
tmp = Math.floor((tmp-diff.sec)/60); // Nombre de minutes (partie entière)
diff.min = tmp % 60; // Extraction du nombre de minutes
tmp = Math.floor((tmp-diff.min)/60); // Nombre d'heures (entières)
diff.hour = tmp % 24; // Extraction du nombre d'heures
tmp = Math.floor((tmp-diff.hour)/24); // Nombre de jours restants
diff.day = tmp;
return diff;
}// function
function initialiseRetourHautPage() {
$(window).scroll(function () { //Fonction appelée quand on descend la page
if ($(this).scrollTop() > 200 ) { // Quand on est à 200pixels du haut de page,
$('#scrollUp').css('right','10px'); // Replace à 10pixels de la droite l'image
} else {
$('#scrollUp').removeAttr( 'style' ); // Enlève les attributs CSS affectés par javascript
}
});
}// function
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
</script>
<script>
/**
*
*/
function initialisationMiseEnPage()
{
// search
searchToggle();
var iOSAgent = window.navigator.userAgent.match(/Android|webOS|iPhone|iPod|iPad|BlackBerry|Windows Phone/);
var iOSPlatform = window.navigator.platform && window.navigator.platform.match(/Android|iPhone|iPod|iPad|BlackBerry/);
var iOSRequestDesktop = (!iOSAgent && !iOSPlatform);
// Test si interface non mobile
if (iOSRequestDesktop) {
// Elements de fond de page ! important !
var deco ='';
deco += '<img src="\/assets\/img\/boule\u002D03.svg" id="boule-03" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/boule\u002D04.svg" id="boule-04" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/boule\u002D05.svg" id="boule-05" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/boucle\u002D03.svg" id="boucle-03" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/boucle\u002D04.svg" id="boucle-04" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/boucle\u002D05.svg" id="boucle-05" class="deco d-none d-lg-inline">';
deco += '<img src="\/assets\/img\/petales\u002D02.svg" id="petales-02" class="deco d-none d-lg-inline">';
$('body').prepend(deco);
// footer
deco ='';
deco += '<img src="\/assets\/img\/boule\u002D01.svg" id="boule-01" class="deco d-none d-lg-inline"">';
deco += '<img src="\/assets\/img\/boule\u002D02.svg" id="boule-02" class="deco d-none d-lg-inline"">';
deco += '<img src="\/assets\/img\/boucle\u002D01.svg" id="boucle-01" class="deco d-none d-lg-inline"">';
deco += '<img src="\/assets\/img\/boucle\u002D02.svg" id="boucle-02" class="deco d-none d-lg-inline"">';
deco += '<img src="\/assets\/img\/cercle\u002D01.svg" id="cercle-01" class="deco d-none d-lg-inline"">';
deco += '<img src="\/assets\/img\/petales\u002D01.svg" id="petales-01" class="deco d-none d-lg-inline"">';
$('footer').prepend(deco);
}// if
}// function
// document.ready
document.addEventListener("DOMContentLoaded", function() {
// Initialisation de la mise en page générale
initialisationMiseEnPage();
})// function
</script> <script>
function initialiseCarrousel(p_nomCarrousel, p_loop = false)
{
var caroussel = $(document.getElementById(p_nomCarrousel));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
listeParamsCarroussel = {
loop: p_loop,
autoplay: p_loop,
autoplayHoverPause: true,
autoplayTimeout:3000,
margin:20,
stagePadding: 7,
responsive : {
// breakpoint from 0 up
0 : {
items: 1,
},
// breakpoint from 480 up
768 : {
items: 2,
},
// breakpoint from 768 up
992 : {
items: 3,
},
1200: {
items: 4,
}
},
};
caroussel.owlCarousel(listeParamsCarroussel);// Owl Carousel
boutonCarrouselNext = document.getElementById(p_nomCarrousel + "_Next");
boutonCarrouselPrev = document.getElementById(p_nomCarrousel + "_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
}// function
function initialiseCarrouselPub() {
caroussel = $(document.getElementById("carousselPub"));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
caroussel.owlCarousel({
loop: true,
autoplay: true,
autoplayTimeout:5000,
autoplayHoverPause: true,
items: 1,
center: true,
margin: 0,
mouseDrag: false,
touchDrag: false,
pullDrag: false,
onChanged: majCompteurVues,
dots: false,
});// Owl Carousel
boutonCarrouselNext = document.getElementById("carousselPub_Next");
boutonCarrouselPrev = document.getElementById("carousselPub_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
initialiseClicBandeauPub(".owl-item:not(.cloned)");
}// function
function initialiseCarrouselPubBox(p_nomCarrousel) {
var caroussel = $(document.getElementById(p_nomCarrousel));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
caroussel.owlCarousel({
loop: false,
margin: 0,
checkVisible: false,
responsive : {
0 : {
items: 1,
},
1400 : {
items: 2,
},
},
});// Owl Carousel
boutonCarrouselNext = document.getElementById(p_nomCarrousel + "_Next");
boutonCarrouselPrev = document.getElementById(p_nomCarrousel + "_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
}// function
function initialiseClicBandeauPub(p_conteneur) {
listeLiensBandeaux = document.querySelectorAll(p_conteneur + " a.lienBandeauPub");
listeLiensBandeaux.forEach(function (element) {
element.addEventListener("click", function (event) {
bandeauObj = event.target.closest("div");
envoiRequeteCompteur(bandeauObj.dataset.chemin, "clic");
})
})// foreach
}// function
function majCompteurVues(event) {
itemIndex = event.item.index;
listeItems = event.target.querySelectorAll(".item");
if (itemIndex != null) {
itemObj = listeItems[itemIndex];
if (itemObj.dataset.etatvue == "") {
itemObj.classList.add("attenteEvt_" + itemObj.dataset.bandeau);
envoiRequeteCompteur(itemObj.dataset.chemin, "vue");
}// if
}// if
}// function
function majCompteurVuesMiniBox(p_classBandeau) {
bandeauMiniBox = document.querySelectorAll(p_classBandeau);
bandeauMiniBox.forEach((element) => {
listeItems = element.querySelectorAll(".bandeau_listing");
if (itemIndex != null) {
listeItems.forEach((itemObj) => {
console.log(itemObj);
if (itemObj.dataset.etatvue == "") {
itemObj.classList.add("attenteEvt_" + itemObj.dataset.bandeau);
envoiRequeteCompteur(itemObj.dataset.chemin, "vue");
}// if
});
}// if
});
}// function
function envoiRequeteCompteur(chemin, type) {
fetch(chemin + "/" + type)
.then(function(response) {
return response.json();
})
.then(function(data) {
if (data.success) {
// Enregistrement de l'état du bandeau en déja vue
bandeauPub = document.querySelector(".attenteEvt_" + data.bandeau)
bandeauPub.dataset.etatvue = "true";
}// if
})
.catch(function(error) {
// $.notify("Erreur lors de l'ajout au panier", "error");
});
}// function
</script> <script>
/**
* Affichage de la popup de promotion
* Enregistre que l'utilisateur l'a vu
*/
function affichePopup() {
// Récupére l'information d'affichage de la popup
champsPopupActive = document.querySelector("#fenetreGenerale");
if (champsPopupActive != null) {
popupActive = champsPopupActive.dataset.popup;
if (popupActive == "oui") {
$("#popupPromo").modal("show");
// Enregistre que l'utilisateur a vu la popup
fetch("\/eshop\/accueil\/popup")
.then(function() {
})
.then(function(data) {
})
.catch(function(error) {
$.notify("Erreur detectée", "error");
});
}// if
}// if
}// function
</script> <script>
/**
* Initialise les tableaux DataTable
*/
function initialiseTablesPanier() {
// Initialise toutes les tables au format DataTable
let listePanier = document.querySelectorAll(".listeCategoriePanier");
listePanier.forEach(function (element) {
let grid = $(element).DataTable({
responsive: {
details: false,
},
columnDefs: [
{ responsivePriority: 1, targets: 10 },
{ responsivePriority: 2, targets: [1,9] },
],
ordering: false,
dom: "",
pageLength: "100000",
language: {
url: "/assets/datatables_fr-FR.json",
lengthMenu: "Afficher _MENU_ lignes",
loadingRecords: `<tr><td colspan="100%"><span class="spinner-border text-primary"></span></td></tr>`,
zeroRecords: "Aucun résultat trouvé",
info: "Affichage de _START_ à _END_ sur _TOTAL_ ligne",
infoFiltered: "",
paginate: {
"previous": '<i class="fa-solid fa-caret-left"></i>',
"next": '<i class="fa-solid fa-caret-right"></i>',
"first": "",
"last": ""
},
},
});
});
}// function
function chargeAdressePanier() {
selectionAdresse = document.getElementById('commande_form_adresses');
if (selectionAdresse != null) {
adresseId = selectionAdresse.value;
fetch("\/eshop\/panier\/adresse/" + adresseId)
.then(function(response) {
return response.text();
})
.then(function(data) {
formulaireAdresse = document.getElementById('form_commande_adresse');
formulaireAdresse.innerHTML = data;
})
.catch(function(error) {
console.log(error);
$.notify("Erreur chargement adresse", "error");
});
}// if
}// function
function initialiseOptionRetrait() {
choixOptionRetrait = document.getElementById('commande_form_optionRetrait');
divPlanTransport = document.getElementById('planTransport');
divRetraitDepot = document.getElementById('optionsRetrait');
if (divPlanTransport != null) {
divPlanTransport.setAttribute("test", "test");
if (choixOptionRetrait != null) {
choixOptionRetrait.checked = false;
choixOptionRetrait.addEventListener("click", function (event) {
divPlanTransport = document.getElementById('planTransport');
divRetraitDepot = document.getElementById('optionsRetrait');
selectDateTransport = document.getElementById('commande_form_dateLivraison');
selectDateRetrait = document.getElementById('commande_form_dateRetrait');
divPlanTransport.classList.toggle("d-none");
divRetraitDepot.classList.toggle("d-none");
if (this.checked) {
selectDateTransport.removeAttribute("required");
selectDateRetrait.setAttribute("required", "required");
} else {
selectDateTransport.setAttribute("required", "required");
selectDateRetrait.removeAttribute("required");
}// if
});
}// if
}// if
}// function
/**
* Gestion de la modification du panier (met à jour toutes les lignes)
*/
function initialiseSupprimePanier() {
boutonVidePanier = document.querySelector("#boutonVidePanier");
if (boutonVidePanier != null) {
boutonVidePanier.addEventListener("click", function (event) {
// Boire de dialogue de confirmation de la suppression
$retour = confirm("Confirmez-vous la suppression du panier ?");
// Si confirmation de la suppression
if($retour == true) {
document.location = boutonVidePanier.dataset.chemin;
}// if
});//
}// if
}// function
/**
* Gestion de l'ajout de produits depuis la fiche produit
* 20230312 - LGA - gestion des quantités dans le récap panier
*/
function initialiseAjoutPanierFiche() {
// Gestion ajout du produit dans le panier
boutonAjoutPanier = document.querySelector(".boutonAjoutPanier");
if (boutonAjoutPanier != null) {
boutonAjoutPanier.addEventListener("click", function (evenement) {
// Récupére les infos du produit
produitId = evenement.target.parentElement.dataset.produitid;
chemin = evenement.target.parentElement.dataset.chemin;
// Récupére la quantité dans le récap
// infosRecap = renvoieLigneSuiviRecap(produitId);
// quantite = infosRecap[1];
// 20231026 - LGA - Récupére directement la quantité dans le champs quantite
let champsQuantite = document.getElementById("quantite_" + produitId);
let champsTotal = document.querySelector("#prixTotalHt_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite > 0) {
produit = [ {
"produit" : produitId,
"quantite" : quantite,
}];
statutRetour = ajouteProduitsPanier(produit, chemin);
if (statutRetour) {
supprimeLigneSuiviRecap(produitId);
champsQuantite.value = "0";
champsTotal.innerText = "0,00 €";
}// if
}// if
}// if
});
}// if
}// function
/**
* Gestion de l'ajout de produits depuis cartes et lignes produit
* TODO - A fusionner avec initialiseAjoutPanierFiche - probleme de la recupération du produit Id à gérer sur le front
*/
function initialiseAjoutPanierCartes() {
boutonAjoutPanierCartes = document.querySelectorAll(".boutonAjoutPanier");
boutonAjoutPanierCartes.forEach(function (element) {
element.addEventListener("click", function (evenement) {
// Récupére les infos du produit
produitId = evenement.target.dataset.produitid;
chemin = evenement.target.dataset.chemin;
// Récupére la quantité dans le récap
// infosRecap = renvoieLigneSuiviRecap(produitId);
// quantite = infosRecap[1];
// 20231026 - LGA - Récupére directement la quantité dans le champs quantite
let champsQuantite = document.getElementById("quantite_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite > 0) {
produit = [ {
"produit" : produitId,
"quantite" : quantite,
}];
statutRetour = ajouteProduitsPanier(produit, chemin);
if (statutRetour == true) {
champsQuantite.value = "0";
supprimeLigneSuiviRecap(produitId);
}// if
}// if
}// if
});
})
}// function
/**
* Gestion de la modification du calcul des totaux panier selon options sélectionnées
* - si autre canal, pas de franco
* - mode de retrait dépot, pas de franco
*/
function initialiseModifTotal() {
// Initialise le bouton canal
let selectionCanal = document.querySelector("#commande_form_autreCanal");
if (selectionCanal != null) {
selectionCanal.addEventListener("change", function (event) {
rechargeTotauxPanier();
});
}// if
// Initialise le bouton mode_retrait
let selectionRetrait = document.querySelector("#commande_form_optionRetrait");
if (selectionRetrait != null) {
selectionRetrait.addEventListener("change", function (event) {
rechargeTotauxPanier();
});
}// if
}// function
/**
* Initialise le total du panier
*/
function rechargeTotauxPanier() {
let panierTotal = document.getElementById("panierTotal");
if (panierTotal != null) {
let cheminUrl = panierTotal.dataset.chemin;
let franco = testConditionsFranco();
// Envoi de la recherche et réception résultat
const params = {
"franco" : franco,
};
const options = {
method: 'POST',
body: JSON.stringify( params ) ,
};
fetch(cheminUrl, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
miseAJourTotaux(data.totaux);
})
.catch(function(error) {
$.notify("Erreur calcul total : " + error, "error");
});
}// if
}// function
/**
* Gestion de la modification du panier (met à jour toutes les lignes)
*/
function rechargeProduitsPanier() {
let champsListeProduits = document.querySelector("#accordionProduits");
let quantitesPanier = document.querySelectorAll(".inputQuantite");
let listeProduits = [];
let franco = testConditionsFranco();
quantitesPanier.forEach(function (element) {
produitPanierId = element.parentNode.dataset.produitpanierid;
quantite = element.value;
listeProduits.push({ "id" : produitPanierId, "quantite" : quantite });
});
if (listeProduits.length > 0) {
// Envoi de la recherche et réception résultat
const params = {
"produitsPanierId" : listeProduits,
"franco" : franco,
};
const options = {
method: 'POST',
body: JSON.stringify( params ) ,
};
fetch(champsListeProduits.dataset.chemin, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
miseAJourProduits(data.produits);
miseAJourTotaux(data.totaux);
})
.catch(function(error) {
console.log(error);
$.notify("Erreur lors de l'ajout au panier", "error");
});
}// if
}// function
function testConditionsFranco() {
let franco = true;
let selectionCanal = document.querySelector("#commande_form_autreCanal");
let selectionRetrait = document.querySelector("#commande_form_optionRetrait");
// Vérifie les options sélectionnées pour calcul franco
if (selectionCanal != null && selectionCanal.value != "") {
franco = false;
}// if
if (selectionRetrait != null && selectionRetrait.checked) {
franco = false;
}// if
return franco;
}// function
/**
* Mise a jour des champs totaux
*/
function miseAJourTotaux(p_totaux) {
let panierTotalHT = document.getElementById("panierTotalHT");
let panierTotalPreco = document.getElementById("panierTotalPreco");
let panierTotalTVA5 = document.getElementById("panierTotalTVA5");
let panierTotalTVA10 = document.getElementById("panierTotalTVA10");
let panierTotalTVA20 = document.getElementById("panierTotalTVA20");
let panierTotalLivraison = document.getElementById("panierTotalLivraison");
let panierTotalTTC = document.getElementById("panierTotalTTC");
let resteFrancoPort = document.getElementById("resteFrancoPort");
let infosTotalLivraison = document.getElementById("infosTotalLivraison");
let franco = testConditionsFranco();
panierTotalHT.innerText = parseFloat(p_totaux.totalHT).toFixed(2);
panierTotalPreco.innerText = parseFloat(p_totaux.totalPreco).toFixed(2);
panierTotalTVA5.innerText = parseFloat(p_totaux.totalTVA5).toFixed(2);
panierTotalTVA10.innerText = parseFloat(p_totaux.totalTVA10).toFixed(2);
panierTotalTVA20.innerText = parseFloat(p_totaux.totalTVA20).toFixed(2);
if (franco && resteFrancoPort != null) {
resteFrancoPort.innerText =
(new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(
parseFloat(panierTotalLivraison.dataset.franco - p_totaux.totalHT).toFixed(2)));
if ((panierTotalLivraison.dataset.franco - p_totaux.totalHT) <= 0) {
afficheMessageFranco(false);
} else {
afficheMessageFranco(true);
}// if
} else {
afficheMessageFranco(false);
}// if
totalLivraison = parseFloat(p_totaux.totalLivraison);
if (totalLivraison == 0 || !franco) {
infosTotalLivraison.innerText = "Gratuit";
} else {
infosTotalLivraison.innerText = totalLivraison + " €";
}// if
panierTotalLivraison.innerText = parseInt(p_totaux.totalLivraison).toFixed(2);
panierTotalTTC.innerText = parseFloat(p_totaux.totalTTC).toFixed(2);
}// function
function afficheMessageFranco(p_etat) {
infosResteFranco = document.getElementById("infosResteFranco");
if (infosResteFranco != null) {
infosResteFranco.hidden = !p_etat;
}// if
}// function
/**
* Ajout des produits sélectionnés dans la mercuriale :
* Ajoute chaque produit
*/
function ajoutMercurialePanier() {
let champsQuantiteMercuriale = document.querySelectorAll(".quantite");
let boutonMercurialePanier = document.querySelector("#boutonMercurialePanier");
let chemin = boutonMercurialePanier.dataset.chemin;
let codeRetourMercu = true;
let listeProduits = [];
champsQuantiteMercuriale.forEach(function(element) {
let produitId = element.dataset.produitid;
// let infosRecap = renvoieLigneSuiviRecap(produitId); // Récupére la quantité dans le récap
// let quantite = infosRecap[1];
let champsQuantite = document.getElementById("quantite_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite != null && quantite > 0) {
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
}// if
}// if
});
if (listeProduits.length > 0) {
let codeRetour = ajouteProduitsPanier(listeProduits, chemin);
// Si ajout panier OK, remise à zéro de la quantité saisie
if (codeRetour === true) {
champsQuantiteMercuriale.forEach(function(element) {
let produitId = element.dataset.produitid;
let champsQuantite = document.getElementById("quantite_" + produitId);
supprimeLigneSuiviRecap(produitId);
champsQuantite.value = "0";
});
} else {
codeRetourMercu = false;
}// if
} else {
$.notify("Aucun produit sélectionné", "warning");
}// if
return codeRetourMercu;
}// function
/**
* Ajout des produits sélectionnés dans la mercuriale :
* Ajoute chaque produit
*/
function ajoutCadencierPanier() {
let champsQuantiteCadencier = document.querySelectorAll(".inputCadencier");
let boutonCadencierPanier = document.querySelector("#boutonCadencierPanier");
let chemin = boutonCadencierPanier.dataset.chemin;
let codeRetourCadencier = true;
let listeProduits = [];
champsQuantiteCadencier.forEach(function(element) {
let produitId = element.dataset.produitid;
// let infosRecap = renvoieLigneSuiviRecap(produitId); // Récupére la quantité dans le récap
let quantite = element.value;
if (quantite != null && quantite > 0) {
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
}// if
});
if (listeProduits.length > 0) {
let codeRetour = ajouteProduitsPanier(listeProduits, chemin);
// Si ajout panier OK, remise à zéro de la quantité saisie
if (codeRetour === true) {
champsQuantiteCadencier.forEach(function(element) {
element.value = "0";
});
} else {
codeRetourCadencier = false;
}// if
} else {
$.notify("Aucun produit sélectionné", "warning");
}// if
return codeRetourCadencier;
}// function
/**
* Affiche une fenetre modal de récap des produits ajoutés au panier
*/
function afficheRecapPanier(p_contenuModal) {
let champsConfirmationPanier = document.getElementById("confirmationPanier");
let fenetreModalPanier = new Modal(champsConfirmationPanier, {
show: true,
focus: true,
});
corpsModale = champsConfirmationPanier.querySelector(".modal-body");
corpsModale.innerHTML = p_contenuModal;
initialiseMAJPrixQuantite(true, corpsModale);
fenetreModalPanier.show();
$("#confirmationPanier").on("hide.bs.modal", function (event) {
// Supprime le contenu de la modal - Important sinon provoque un bug sur les champs quantités
corpsModale = event.target.querySelector(".modal-body");
corpsModale.innerHTML = "";
});
}// function
/**
* Ajout l'une liste de produits au panier : requete asynchrone
*/
function ajouteProduitsPanier(p_listeProduitId, p_chemin) {
const urlAjout = p_chemin;
statutAjout = true;
// Envoi de la recherche et réception résultat
const params = {
produitsId : p_listeProduitId, // Liste d'ids de produit
};
const optionsAjout = {
method: 'POST',
body: JSON.stringify( params ),
};
fetch(urlAjout, optionsAjout)
.then(function(response) {
return response.json();
})
.then(function(data) {
nombreProduitsPanier = document.querySelector("#nombreProduitsPanier");
// Mise à jour du nombre de produits en panier dans l'entete
if (nombreProduitsPanier != null) {
nombreProduitsPanier.innerText = data.nombreProduitsPanier;
}// if
afficheRecapPanier(data.contenuModal);
afficheTotalSuiviPanier(data.totauxPanier);
})
.catch(function(error) {
// $.notify("Erreur lors de l'ajout au panier", "error");
statutAjout = false;
});// fetch
return statutAjout;
}// function
/**
* Valide la quantité saisie par l'utilisateur.
* Si invalide, renvoie toujours 1
*/
function testValiditeQuantite(p_quantite, p_min, p_max) {
valeurQuantite = parseInt(p_quantite);
if (isNaN(valeurQuantite)) {
valeurQuantite = p_min;
} else {
if (valeurQuantite > parseInt(p_max)) {
valeurQuantite = parseInt(p_max);
}// if
if (valeurQuantite < parseInt(p_min)) {
valeurQuantite = parseInt(p_min);
}// if
}// if
return valeurQuantite;
}// function
/**
* Remise à zéro des champs quantité de la page en cours
*/
function effaceChampsQuantites() {
let champsQuantites = document.querySelectorAll(".inputQuantite");
champsQuantites.forEach(function(element) {
element.value = "";
});
}// function
/**************************************************************
* Gestion de la fenetre de récapitulatif du panier
*/
/**
* Initialise la fenetre de suivi du panier
*/
function initialiseSuiviPanier() {
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
let boutonOuvertureSuivi = document.querySelector("#boutonOuvertureSuivi");
if (fenetreSuiviPanier != null) {
afficheSuiviPanier();
// bouton de fermeture de la fenetre de suivi
boutonFermetureSuivi = fenetreSuiviPanier.querySelector("#boutonFermetureSuivi");
if (boutonFermetureSuivi != null) {
boutonFermetureSuivi.addEventListener("click", function(event) {
afficheSuiviPanier("false");
});
}// if
// bouton ouverture de la fenetre de suivi
if (boutonOuvertureSuivi != null) {
boutonOuvertureSuivi.addEventListener("click", function(event) {
afficheSuiviPanier("true");
});
}// if
// Gestion des événements sur le contenu du recap (suppression produit)
contenuSuivi = fenetreSuiviPanier.querySelector(".contenu");
if (contenuSuivi != null) {
contenuSuivi.addEventListener("click", function (event) {
champsCible = event.target;
if (champsCible.classList.contains("supprimeSuivi")) {
produitId = champsCible.getAttribute("data-produitid");
supprimeLigneSuiviRecap(produitId);
}// if
});
}// if
// Recharge les produits en cours stockés en session
loadProduitsRecapPanier();
// Initialise la fonction de déplacement de la fenetre recap panier
$(fenetreSuiviPanier).draggable({
handle: ".entete",
drag: function (event, ui) {
let scrollWinX = window.scrollX;
let scrollWinY = window.scrollY;
let largeurFenetre = window.innerWidth
let hauteurFenetre = window.innerHeight;
let largeurRecap = this.offsetWidth;
let hauteurRecap = this.offsetHeight - 200;
let posModifTop = posSuiviTop = ui.offset.top;
let posModifLeft = posSuiviLeft = ui.offset.left;
let cacheFenetre = false;
if (posSuiviTop < (-10 + scrollWinY)) {
posModifTop = -10 + scrollWinY;
cacheFenetre = true;
}// if
if (posSuiviLeft < -100) {
posModifLeft = 10;
cacheFenetre = true;
}// if
if (posSuiviTop + hauteurRecap > (hauteurFenetre + scrollWinY)) {
posModifTop = hauteurFenetre - hauteurRecap - 10 + scrollWinY ;
cacheFenetre = true;
event.preventDefault();
}// if
if (posSuiviLeft + largeurRecap > largeurFenetre) {
posModifLeft = largeurFenetre - largeurRecap - 10;
cacheFenetre = true;
event.preventDefault();
}// if
let positionRecapTop = localStorage.setItem("positionRecapTop", posModifTop);
let positionRecapLeft = localStorage.setItem("positionRecapLeft", posModifLeft);
if (cacheFenetre) {
afficheSuiviPanier("false");
}// if
}
});
}// if
}// function
/**
* Initialise l'affichage de la fenetre recap panier
*/
function afficheSuiviPanier(p_visible = null)
{
// Récupére en session l'état de la fenetre (et du bouton) : Visible ou non
let recapPanierVisible = localStorage.getItem("recapPanierVisible") ?? "true";
if (p_visible != null) {
recapPanierVisible = p_visible;
}// if
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
let boutonOuvertureSuivi = document.querySelector("#boutonOuvertureSuivi");
if (recapPanierVisible == "true") {
fenetreSuiviPanier.classList.remove("d-none");
boutonOuvertureSuivi.classList.add("d-none");
localStorage.setItem("recapPanierVisible", true);
loadProduitsRecapPanier();
} else {
fenetreSuiviPanier.classList.add("d-none");
boutonOuvertureSuivi.classList.remove("d-none");
localStorage.setItem("recapPanierVisible", false);
}// if
let scrollWinX = window.scrollX;
let scrollWinY = window.scrollY;
let largeurFenetre = window.innerWidth
let hauteurFenetre = window.innerHeight;
let positionFenetre = parseInt($(fenetreSuiviPanier).offset());
let positionRecapTop = parseInt(localStorage.getItem("positionRecapTop"));
let positionRecapLeft = parseInt(localStorage.getItem("positionRecapLeft"));
let largeurRecap = fenetreSuiviPanier.offsetWidth;
let hauteurRecap = fenetreSuiviPanier.offsetHeight - 200;
if (positionRecapTop == null || positionRecapTop < scrollWinY || positionFenetre.top < scrollWinY) {
positionRecapTop = 10 + scrollWinY;
}// if
if (positionRecapTop + hauteurRecap > (hauteurFenetre + scrollWinY)) {
positionRecapTop = 10 + scrollWinY;
}// if
if (positionRecapLeft == null || positionRecapLeft < 0 || positionFenetre.left < 0) {
positionRecapLeft = 10;
}// if
if (positionRecapLeft > largeurFenetre) {
positionRecapLeft = largeurFenetre - largeurRecap - 10;
}// if
$(fenetreSuiviPanier).offset({ top : positionRecapTop, left : positionRecapLeft});
}// function
/**
* Mise à jour des totaux produits de la fenetre suivi
*/
function calculTotalSuiviRecap() {
let contenuSuiviPanier = document.querySelector("#suiviPanier .contenu");
if (contenuSuiviPanier == null) {
return;
}// if
let produitsRecap = contenuSuiviPanier.querySelectorAll("span");
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxRecap");
let caseTotalHtSuivi = totauxSuiviPanier.querySelector("#totalHT");
let caseTotalTvaSuivi = totauxSuiviPanier.querySelector("#totalTVA");
let caseTotalTtcSuivi = totauxSuiviPanier.querySelector("#totalTTC");
let totalHt = 0;
let totalTva = 0;
let totalTtc = 0;
produitsRecap.forEach(function(element) {
prixHt = parseFloat(element.dataset.prix);
quantite = element.dataset.quantite;
quantiteCond = element.dataset.quantitecond;
prixQttHt = prixHt * quantite * quantiteCond;
tauxTva = parseFloat(element.dataset.tauxtva);
partTva = (prixQttHt * tauxTva) / 100;
prixTtc = (prixQttHt) + partTva;
totalHt += prixQttHt;
totalTva += partTva;
totalTtc += prixTtc;
});
caseTotalHtSuivi.innerText = parseFloat(totalHt).toFixed(2) + " €";
caseTotalTvaSuivi.innerText = parseFloat(totalTva).toFixed(2) + " €";
caseTotalTtcSuivi.innerText = parseFloat(totalTtc).toFixed(2) + " €";
}// function
/**
* Mise à jour des totaux panier de la fenetre suivi
*/
function afficheTotalSuiviPanier(p_totaux) {
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxPanier");
let caseTotalHtPanier = totauxSuiviPanier.querySelector("#totalPanierHT");
let caseRestePanierFranco = totauxSuiviPanier.querySelector("#restePanierFranco");
let caseTotalTtcPanier = totauxSuiviPanier.querySelector("#totalPanierTTC");
caseTotalHtPanier.innerText = parseFloat(p_totaux.totalHT).toFixed(2) + " €";
caseRestePanierFranco.innerText = parseFloat(p_totaux.resteFranco) + " €";
caseTotalTtcPanier.innerText = parseFloat(p_totaux.totalTTC).toFixed(2) + " €";
}// function
/**
* Ajoute une ligne html corespondant à un produit dans le recap panier
*/
function ajouteLigneSuiviRecap(p_origine, p_produitId, p_prix, p_quantite, p_quantiteCond, p_tauxTva, p_libelle, p_lienFiche)
{
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
if (contenuSuivi != null) {
let suiviProduit = contenuSuivi.querySelector("#suiviProduit" + p_produitId);
let nouvelleQuantite = p_quantite;
if (suiviProduit != null) {
quantitePrecedente = parseInt(suiviProduit.getAttribute("data-quantiteprec"));
if (quantitePrecedente != null) {
nouvelleQuantite += quantitePrecedente;
}// if
}// if
if (nouvelleQuantite > 0) {
if (suiviProduit != null) {
suiviProduit.innerHTML = p_libelle + " : " + nouvelleQuantite;
suiviProduit.setAttribute("data-prix", p_prix);
suiviProduit.setAttribute("data-quantite", nouvelleQuantite);
} else {
let quantitePrecedente = p_quantite;
if (p_origine == "page") {
quantitePrecedente = 0;
}// if
contenuSuivi.innerHTML +=
"<div id='blocProduit" + p_produitId + "' class='col-11 ligneProduitPanier mx-2 my-1'>"
+ "<i class='d-inline col-1 fa-solid fa-circle-xmark supprimeSuivi mr-1 charte_couleur_primaire' data-produitid='"+ p_produitId +"'></i>"
+ "<a href='" + p_lienFiche + "' class='lien_defaut charte_couleur_primaire ms-1'>"
+ "<span id='suiviProduit" + p_produitId
+ "' class='d-inline col-10 ligneProduit fw-bold' data-produitid='" + p_produitId
+ "' data-prix='" + p_prix
+ "' data-quantitecond='" + p_quantiteCond
+ "' data-quantite='" + p_quantite
+ "' data-quantiteprec='" + quantitePrecedente
+ "' data-tauxtva='" + p_tauxTva
+ "' data-libelle='" + p_libelle
+ "' data-lienfiche='" + p_lienFiche
+ "'>"
+ p_libelle + " : " + p_quantite
+ "</span>"
+ "</a>"
+"</div>";
}// if
} else {
supprimeLigneSuiviRecap(p_produitId);
}// if
// Stockage des infos de la fenetre recap en session
//sauvegardeSuiviPanier();
// Calculs les totaux de la fenetre recap
calculTotalSuiviRecap();
}// if
}// function
/**
* Supprime une ligne html correspondant à un produit dans le recap panier
*/
function supprimeLigneSuiviRecap(p_produitId) {
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
let blocProduit = contenuSuivi.querySelector("#blocProduit" + p_produitId);
if (blocProduit != null) {
blocProduit.remove();
}// if
// Suppression du produit dans la session
supprimeProduitRecapPanier(p_produitId);
// Calculs les totaux de la fenetre recap
calculTotalSuiviRecap();
}// function
/**
* renvoie les informations correspondant à un produit dans le recap panier
*/
function renvoieLigneSuiviRecap(p_produitId) {
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
let suiviProduit = contenuSuivi.querySelector("#suiviProduit" + p_produitId);
let prix = null;
let quantite = null;
if (suiviProduit != null) {
prix = suiviProduit.getAttribute("data-prix");
quantite = suiviProduit.getAttribute("data-quantite");
}// if
return [prix, quantite];
}// function
/**
* Sauvegarde le contenu du recap panier en session
*/
function sauvegardeSuiviPanier() {
let contenuRecapPanier = document.querySelectorAll("#suiviPanier .ligneProduit");
let tabRecapPanier = [];
contenuRecapPanier.forEach(function(element) {
let produitId = element.dataset.produitid;
let produitPrix = element.dataset.prix;
let produitQuantite = element.dataset.quantite;
let produitQuantiteCond = element.dataset.quantitecond;
let produitTva = element.dataset.tauxtva;
let produitLibelle = element.dataset.libelle.replace("_","-").replace("'", "\'");
let lienFiche = element.dataset.lienfiche;
let ligneRecapPanier =
produitId + "_" + produitPrix + "_" + produitQuantite + "_" + produitQuantiteCond + "_"
+ produitTva + "_" + produitLibelle + "_" + lienFiche;
tabRecapPanier.push(ligneRecapPanier);
});
// Stockage en session
localStorage.setItem("recapPanierContenu", tabRecapPanier);
}// function
/**
* Remise a zéro de la fenetre Recap : effacement données fenetre et session
*/
function videSuiviPanier() {
effaceContenuPanier();
localStorage.setItem("recapPanierContenu", null);
}// function
/**
* Remise à zéro des élements
*/
function effaceContenuPanier() {
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
if (fenetreSuiviPanier != null) {
let contenuSuivi = fenetreSuiviPanier.querySelector(".contenu");
contenuSuivi.innerHTML = "";
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxRecap");
let caseTotalHtSuivi = totauxSuiviPanier.querySelector("#totalHT");
let caseTotalTvaSuivi = totauxSuiviPanier.querySelector("#totalTVA");
let caseTotalTtcSuivi = totauxSuiviPanier.querySelector("#totalTTC");
caseTotalHtSuivi.innerText = 0;
caseTotalTvaSuivi.innerText = 0;
caseTotalTtcSuivi.innerText = 0;
}// if
}// if
/**
* Calcul du délai restant avant l'heure limite de commande
* Récupére l'heure correspondant au jour dans le tableau du plan de transport
* Le format de l'heure doit être : HH{H}MM ex : 10H30
*/
let changeDateLivraison = false;
function afficheDecompteAvantCommande() {
let dateActuelle = new Date();
let dateDemain = new Date();
dateDemain.setDate(dateActuelle.getDate()+1);
let champsPlanTransport = document.querySelector("#planTransport");
let nbJoursPlan = 0;
if (champsPlanTransport != null) {
nbJoursPlan = parseInt(champsPlanTransport.dataset.nbjours);
}// if
let delai = "--";
let chronoDelai = document.querySelectorAll(".chronoDelaiCommande");
let jourDelai = document.querySelectorAll(".jourDelaiCommande");
let numeroJourPlan = dateActuelle.getDay();
let numeroJourSuivantPlan;
numeroJourSuivantPlan = 1;
if (numeroJourPlan < nbJoursPlan) {
numeroJourSuivantPlan = numeroJourPlan + 1;
}
let infosJour = document.querySelector("#infosJour_" + numeroJourPlan);
let infosDemain = document.querySelector("#infosJour_" + numeroJourSuivantPlan);
let infosLivraisonJour = document.querySelector("#infosLivraison_" + numeroJourPlan);
let infosLivraisonDemain = document.querySelector("#infosLivraison_" + numeroJourSuivantPlan);
if (infosJour === null || infosDemain === null) {
return;
}
const chaineHeure = infosJour.innerText;
const heureJour = chaineHeure.substring(0,2);
const minuteJour = chaineHeure.substring(3);
let jour = infosLivraisonJour.innerText;
let dateLimite = new Date(
dateActuelle.getFullYear(),
dateActuelle.getMonth(),
dateActuelle.getDate(),
heureJour,
minuteJour, 0
);
if (isNaN(dateLimite)) {
return;
}
if (dateActuelle > dateLimite) {
const chaineHeureDemain = infosDemain.innerText;
const heureDemain = chaineHeureDemain.substring(0,2);
const minuteDemain = chaineHeureDemain.substring(3);
dateLimite = new Date(
dateDemain.getFullYear(),
dateDemain.getMonth(),
dateDemain.getDate(),
heureDemain,
minuteDemain, 0
);
jour = infosLivraisonDemain.innerText;
if (!changeDateLivraison) {
changeDateLivraison = true;
fetchDateLivraisons();
}
}
const diff = dateDiff(dateActuelle, dateLimite);
delai =
diff.hour.toString().padStart(2, '0') + "h " +
diff.min.toString().padStart(2, '0') + "m " +
diff.sec.toString().padStart(2, "0") + "s";
chronoDelai.forEach(champs => champs.innerText = delai);
jourDelai.forEach(champs => champs.innerText = jour);
}// function
/**
* Affiche une fenetre modal de récap des produits en précommande du panier
*/
function afficheRecapPrecommandePanier(p_contenuModal) {
let champsConfirmationPrecommandePanier = document.getElementById("confirmationPrecommandePanier");
let fenetreModalPanierRecapPrecommand = new Modal(champsConfirmationPrecommandePanier, {
show: true,
focus: true,
});
corpsModale = champsConfirmationPrecommandePanier.querySelector(".modal-body-containeur");
corpsModale.innerHTML = p_contenuModal;
fenetreModalPanierRecapPrecommand.show();
$("#confirmationPrecommandePanier").on("hide.bs.modal", function (event) {
// Supprime le contenu de la modal - Important sinon provoque un bug sur les champs quantités
corpsModale = event.target.querySelector(".modal-body-containeur");
corpsModale.innerHTML = "";
});
}// function
// Charge les précommandes de l'utilisateur, renvie true s'il en possède
function chargePrecommandeRecap(p_chemin) {
const urlRecapPreco = p_chemin;
statutRecapPreco = true;
const optionsRecapPreco = {
method: 'GET',
};
return fetch(urlRecapPreco, optionsRecapPreco)
.then(function(response) {
return response.json();
})
.then(function(data) {
// Vérifie s'il y a des précommandes
if (data.contenuModal != "") {
afficheRecapPrecommandePanier(data.contenuModal);
} else {
statutRecapPreco = false
}
return statutRecapPreco
})
.catch(function(error) {
// $.notify("Erreur lors de la récupération des précommandes du panier", "error");
});// fetch
}
function verifieChampQuantiteRemplie() {
let quantiteCheck = true;
document.querySelectorAll('.inputQuantite').forEach(element => {
if (element.value <= 0 || element.value === "") {
quantiteCheck = false;
}
});
return quantiteCheck;
}
// Vérifie si tout les champs required d'un formulaire sont remplis
function verifieChampRequiredRemplie(form) {
const elementsRequired = form.querySelectorAll('[required="required"]');
// On reforme la liste pour qu'elle ait la méthodes every
return [...elementsRequired].every((element) => {
return (element.type === "checkbox" && element.checked) || (element.type !== "checkbox" && element.value !== "")
})
}
// Initialise la méchanique du pop up de confirmation des produit en précommandes
function initialisePrecommandeModal() {
form = document.forms["commande_form"];
boutonValidePanier = document.querySelector("#commande_form_valide");
boutonSupprimePrecoEtValide = document.querySelector("#supprimePrecoEtValide");
boutonGardePrecoEtValide = document.querySelector("#gardePrecoEtValide");
confirmationPrecommandePanier = document.querySelector("#confirmationPrecommandePanier");
if (boutonValidePanier != null){
boutonValidePanier.addEventListener('click', function(event) {
const quantiteCheck = verifieChampQuantiteRemplie();
const requiredCheck = verifieChampRequiredRemplie(form);
if (!quantiteCheck) {
event.preventDefault();
$.notify("Veuillez entrer une quantité valide pour chaque produit", "error");
return;
}
if (!requiredCheck) {
return;
}
event.preventDefault();
const statutRecapPreco = chargePrecommandeRecap(confirmationPrecommandePanier.dataset.chemin);
statutRecapPreco.then(function (data) {
// Submit le formulaire si aucune précommande n'est présente
if (!data) {
form.requestSubmit();
}
});
});
}
if (boutonSupprimePrecoEtValide != null){
boutonSupprimePrecoEtValide.addEventListener('click', function(event) {
document.querySelector(".ignorePreco").checked = true;
form.requestSubmit();
});
}
if (boutonGardePrecoEtValide != null){
boutonGardePrecoEtValide.addEventListener('click', function(event) {
document.querySelector(".ignorePreco").checked = false;
form.requestSubmit();
});
}
}
function fetchDateLivraisons() {
const urlDateLivraison = document.querySelector("#planTransport").dataset.chemin;
fetch(urlDateLivraison)
.then(response => response.json())
.then(data => {
rebuildSelectDateLivraison(data);
});
}
function rebuildSelectDateLivraison(data) {
const dateLivraisonSelect = document.querySelector("#commande_form_dateLivraison");
const firstOption = dateLivraisonSelect.querySelector("option");
dateLivraisonSelect.innerHTML = "";
dateLivraisonSelect.appendChild(firstOption);
const options = {
dateStyle: "full",
timeZone: 'Europe/Paris'
};
data.forEach(date => {
const dateLivraison = new Date(date.date);
const jourLibelle = dateLivraison.toLocaleDateString('fr-FR', options);
const formatDate = date.date.substring(0, 10);
const option = new Option(jourLibelle, formatDate);
dateLivraisonSelect.appendChild(option);
});
}
function removeProduitPanier(produitPanierId) {
const produitLigne = document.querySelector("#tr_" + produitPanierId);
const familleSlug = produitLigne.dataset.familleSlug;
if (produitLigne) {
window.location.href = produitLigne.dataset.deletePath + "?deleteHashtag=" + familleSlug;
}
}
/***************************************************************************/
/* NP : update 2025-11-12 : refonte récap panier avec localStorage */
/***************************************************************************/
/**
* Mise à jour de la fenetre suivi : ajout du produit si non present, sinon maj de la quantité
*
*/
function ajouteProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche)
{
sauvegardeProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche);
// Récupére en session l'état de la fenetre (et du bouton) : Visible ou non
const recapPanierVisible = localStorage.getItem("recapPanierVisible") ?? "true";
// Ajoute les infos produits dans la fenetre recap, uniquement si fenetre visible
if (recapPanierVisible == "true") {
//ajouteProduitLigneSuiviRecap(produitId, prix, quantite, quantite, quantiteCond, tauxTva, libelle, lienFiche);
loadProduitsRecapPanier();
}
}
function sauvegardeProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche) {
// Ne pas sauvegarder en localStorage si l'utilisateur est sur la page panier
const quantiteField = document.querySelector("#quantite_" + produitId);
if (quantiteField.dataset.page == "panier") {
return;
}
const recapPanierContenu = localStorage.getItem("recapPanierContenu");
let recapPanierContenuData = [];
let recapPanierContenuDataToSave = [];
if (recapPanierContenu !== '' && recapPanierContenu !== 'null' && recapPanierContenu !== null) {
recapPanierContenuData = JSON.parse(recapPanierContenu);
}
let produitExiste = false;
recapPanierContenuData.forEach(function(element) {
const data = element.split("_");
const elementProduitId = parseInt(data[0]);
const elementProduitPrix = parseFloat(data[1]);
let elementProduitQuantite = parseInt(data[2]);
const elementProduitQuantiteCond = parseInt(data[3]);
const elementProduitTva = parseFloat(data[4]);
const elementProduitLibelle = data[5];
const elementLienFiche = data[6];
if (elementProduitId == produitId) {
elementProduitQuantite = quantite;
produitExiste = true;
}
let ligneRecapPanierToSave = elementProduitId
+ "_" + elementProduitPrix
+ "_" + elementProduitQuantite
+ "_" + elementProduitQuantiteCond
+ "_" + elementProduitTva
+ "_" + elementProduitLibelle
+ "_" + elementLienFiche;
recapPanierContenuDataToSave.push(ligneRecapPanierToSave);
});
if (!produitExiste) {
let produitLibelle = libelle.replace("_","-").replace("'", "\'");
let ligneRecapPanierToSave = produitId + "_" + prix + "_" + quantite + "_" + quantiteCond + "_" + tauxTva + "_" + libelle + "_" + lienFiche;
recapPanierContenuDataToSave.push(ligneRecapPanierToSave);
}
localStorage.setItem("recapPanierContenu", JSON.stringify(recapPanierContenuDataToSave));
}
function supprimeProduitRecapPanierEtRecharge(p_produitId) {
try {
supprimeProduitRecapPanier(p_produitId);
loadProduitsRecapPanier();
} catch (error) {
console.error("Erreur lors de la suppression du produit du recap panier : ", error);
}
}
function supprimeProduitRecapPanier(p_produitId) {
let recapPanierContenu = localStorage.getItem("recapPanierContenu");
let recapPanierContenuData = [];
let recapPanierContenuDataToSave = [];
if (recapPanierContenu !== '') {
recapPanierContenuData = JSON.parse(recapPanierContenu);
}
recapPanierContenuData.forEach(function(element) {
const data = element.split("_");
let elementProduitId = data[0];
// on conserve uniquement les produits différents de celui à supprimer
if (elementProduitId != p_produitId) {
recapPanierContenuDataToSave.push(element);
}
});
localStorage.setItem("recapPanierContenu", JSON.stringify(recapPanierContenuDataToSave));
}
function loadProduitsRecapPanier()
{
effaceContenuPanier();
const recapPanierContenu = localStorage.getItem("recapPanierContenu");
if (recapPanierContenu === null || recapPanierContenu === '' || recapPanierContenu === 'null') {
return;
}
const data = JSON.parse(recapPanierContenu);
data.forEach(function(element) {
const info = element.split("_");
const produitId = info[0];
const prix = info[1];
const quantite = info[2];
const quantiteCond = info[3];
const tauxTva = info[4];
const libelle = info[5].replace("-", "_").replace("\'", "'");
const lienFiche = info[6];
ajouteProduitLigneSuiviRecap(produitId, prix, quantite, quantite, quantiteCond, tauxTva, libelle, lienFiche);
});
calculTotalSuiviRecap();
}
function ajouteProduitLigneSuiviRecap(p_produitId, p_prix, p_quantite, p_quantitePrecedente, p_quantiteCond, p_tauxTva, p_libelle, p_lienFiche)
{
const contenuSuivi = document.querySelector("#suiviPanier .contenu");
// Si le panier récap n'est pas présent, on ne fait rien (cas si on est sur la page panier par exemple)
if (contenuSuivi === null) {
return;
}
contenuSuivi.innerHTML +=
"<div id='blocProduit" + p_produitId + "' class='col-11 ligneProduitPanier mx-2 my-1'>"
+ "<i class='d-inline col-1 fa-solid fa-circle-xmark supprimeSuivi mr-1 charte_couleur_primaire' data-produitid='"+ p_produitId +"'></i>"
+ "<a href='" + p_lienFiche + "' class='lien_defaut charte_couleur_primaire ms-1'>"
+ "<span id='suiviProduit" + p_produitId
+ "' class='d-inline col-10 ligneProduit fw-bold' data-produitid='" + p_produitId
+ "' data-prix='" + p_prix
+ "' data-quantitecond='" + p_quantiteCond
+ "' data-quantite='" + p_quantite
+ "' data-quantiteprec='" + p_quantitePrecedente
+ "' data-tauxtva='" + p_tauxTva
+ "' data-libelle='" + p_libelle
+ "' data-lienfiche='" + p_lienFiche
+ "'>"
+ p_libelle + " : " + p_quantite
+ "</span>"
+ "</a>"
+"</div>";
const inputQuantites = document.querySelectorAll(".inputQuantite[data-produitid='" + p_produitId + "']");
if (inputQuantites.length > 0) {
inputQuantites.forEach(function(inputQuantite) {
inputQuantite.value = p_quantite;
});
}
}
/**
* Ajout des produits sélectionnés présents dans la fenetre de recap au panier
*/
function ajouteProduitsRecapPanier()
{
const boutonAjoutFenetreChariot = document.querySelector("#boutonAjoutFenetreChariot");
const contenuRecapPanier = document.querySelectorAll("#suiviPanier .ligneProduit");
const chemin = boutonAjoutFenetreChariot.dataset.chemin;
let listeProduits = [];
contenuRecapPanier.forEach(function(element) {
const produitId = element.getAttribute("data-produitid");
const quantite = element.getAttribute("data-quantite");
if (quantite <= 0) {
return;
}
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
});
if (listeProduits.length <= 0) {
$.notify("Aucun produit sélectionné", "warning");
return false;
}
return ajouteProduitsPanier(listeProduits, chemin);
}
document.addEventListener("DOMContentLoaded", function() {
// Gestion de l'historique du navigateur : recharge le panier dans tous les cas
document.addEventListener("visibilitychange", function(event) {
effaceContenuPanier();
loadProduitsRecapPanier();
});
// Initialisation du bouton de mise en panier
const boutonAjoutFenetreChariot = document.querySelector("#boutonAjoutFenetreChariot");
if (boutonAjoutFenetreChariot != null) {
boutonAjoutFenetreChariot.addEventListener("click", function(event) {
if (ajouteProduitsRecapPanier()) {
videSuiviPanier();
effaceChampsQuantites();
}
});
}// if
});
</script> <script>
// document.ready
document.addEventListener("DOMContentLoaded", function() {
// Initialisation de la barre de recherche
initialisationRecherche();
// Affiche la fenetre de suivi des commandes
initialiseSuiviPanier();
// Initialise la Newsletter
// initialiseNewsletter();
// Initialise le bandeau de pubs
initialiseCarrouselPub();
// Initialise popup
affichePopup();
// $(window).on('resize', function() {
// // search
// searchToggle();
// });
// Affichage du bouton retour en haut de page
initialiseRetourHautPage();
});// ready
</script>
<script>
function initialiseBoutonsFavori() {
// Initialisation des liens vers les fiches produits
liensFavori = document.getElementsByClassName("lien_favori");
Array.from(liensFavori).forEach(function (lienFavori) {
lienFavori.addEventListener("click", function (event) {
// Envoi de la recherche et réception résultat
const params = {
produit: this.dataset.produit,
};
const options = {
method: 'POST',
body: JSON.stringify( params ),
};
fetch(this.dataset.chemin, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
lienFavori = document.getElementById("favori" + data.produit);
lienFavori.classList.toggle("selection");
$.notify(data.message, "success");
})
.catch(function(error) {
$.notify("Erreur favori", "error");
});
});
});
}// function
</script> <script>
function initialiseCarrousel(p_nomCarrousel, p_loop = false)
{
var caroussel = $(document.getElementById(p_nomCarrousel));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
listeParamsCarroussel = {
loop: p_loop,
autoplay: p_loop,
autoplayHoverPause: true,
autoplayTimeout:3000,
margin:20,
stagePadding: 7,
responsive : {
// breakpoint from 0 up
0 : {
items: 1,
},
// breakpoint from 480 up
768 : {
items: 2,
},
// breakpoint from 768 up
992 : {
items: 3,
},
1200: {
items: 4,
}
},
};
caroussel.owlCarousel(listeParamsCarroussel);// Owl Carousel
boutonCarrouselNext = document.getElementById(p_nomCarrousel + "_Next");
boutonCarrouselPrev = document.getElementById(p_nomCarrousel + "_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
}// function
function initialiseCarrouselPub() {
caroussel = $(document.getElementById("carousselPub"));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
caroussel.owlCarousel({
loop: true,
autoplay: true,
autoplayTimeout:5000,
autoplayHoverPause: true,
items: 1,
center: true,
margin: 0,
mouseDrag: false,
touchDrag: false,
pullDrag: false,
onChanged: majCompteurVues,
dots: false,
});// Owl Carousel
boutonCarrouselNext = document.getElementById("carousselPub_Next");
boutonCarrouselPrev = document.getElementById("carousselPub_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
initialiseClicBandeauPub(".owl-item:not(.cloned)");
}// function
function initialiseCarrouselPubBox(p_nomCarrousel) {
var caroussel = $(document.getElementById(p_nomCarrousel));
// Ajout test si carroussel contient des elements
if (Object.keys(caroussel).length > 0) {
caroussel.owlCarousel({
loop: false,
margin: 0,
checkVisible: false,
responsive : {
0 : {
items: 1,
},
1400 : {
items: 2,
},
},
});// Owl Carousel
boutonCarrouselNext = document.getElementById(p_nomCarrousel + "_Next");
boutonCarrouselPrev = document.getElementById(p_nomCarrousel + "_Prev");
if (boutonCarrouselNext != null) {
// Go to the next item
boutonCarrouselNext.addEventListener("click", function() {
caroussel.trigger('next.owl.carousel');
});
}// if
if (boutonCarrouselPrev != null) {
// Go to the previous item
boutonCarrouselPrev.addEventListener("click", function() {
caroussel.trigger('prev.owl.carousel', [300]);
});
}// if
}// if
}// function
function initialiseClicBandeauPub(p_conteneur) {
listeLiensBandeaux = document.querySelectorAll(p_conteneur + " a.lienBandeauPub");
listeLiensBandeaux.forEach(function (element) {
element.addEventListener("click", function (event) {
bandeauObj = event.target.closest("div");
envoiRequeteCompteur(bandeauObj.dataset.chemin, "clic");
})
})// foreach
}// function
function majCompteurVues(event) {
itemIndex = event.item.index;
listeItems = event.target.querySelectorAll(".item");
if (itemIndex != null) {
itemObj = listeItems[itemIndex];
if (itemObj.dataset.etatvue == "") {
itemObj.classList.add("attenteEvt_" + itemObj.dataset.bandeau);
envoiRequeteCompteur(itemObj.dataset.chemin, "vue");
}// if
}// if
}// function
function majCompteurVuesMiniBox(p_classBandeau) {
bandeauMiniBox = document.querySelectorAll(p_classBandeau);
bandeauMiniBox.forEach((element) => {
listeItems = element.querySelectorAll(".bandeau_listing");
if (itemIndex != null) {
listeItems.forEach((itemObj) => {
console.log(itemObj);
if (itemObj.dataset.etatvue == "") {
itemObj.classList.add("attenteEvt_" + itemObj.dataset.bandeau);
envoiRequeteCompteur(itemObj.dataset.chemin, "vue");
}// if
});
}// if
});
}// function
function envoiRequeteCompteur(chemin, type) {
fetch(chemin + "/" + type)
.then(function(response) {
return response.json();
})
.then(function(data) {
if (data.success) {
// Enregistrement de l'état du bandeau en déja vue
bandeauPub = document.querySelector(".attenteEvt_" + data.bandeau)
bandeauPub.dataset.etatvue = "true";
}// if
})
.catch(function(error) {
// $.notify("Erreur lors de l'ajout au panier", "error");
});
}// function
</script> <script>
/**
* Initialise les tableaux DataTable - Utilisé pour le responsive
*/
function initialiseTableListing() {
// Initialise toutes les tables au format DataTable
let listeProduits = document.querySelectorAll("#listeProduits");
listeProduits.forEach(function (element) {
$(element).DataTable({
"language": { "url": "/assets/datatables_fr-FR.json"},
responsive: true,
ordering: false,
paging: false,
"dom": "",
});
});
}// function
function initialiseMAJPrixQuantite(forceRefresh = false, parentElement = null) {
const pageHead = document.getElementById("pageHead");
let listeChampsQuantite = document.querySelectorAll(".inputQuantite");
if (parentElement != null) {
listeChampsQuantite = parentElement.querySelectorAll(".inputQuantite");
}
const counterMax = 10;
let counter = 0;
listeChampsQuantite.forEach(async function(element) {
// pause pour ne pas surcharger le serveur
if (counter >= counterMax) {
sleep(10);
counter = 0;
}
element.addEventListener("input", function(event) {
let page = event.target.dataset.page;
let quantite = parseInt(event.target.value);
if (page == "panier") {
if (isNaN(quantite) || quantite <= 0) {
return;
}
rechargeProduitsPanier();
} else {
rechargePrixProduit(event.target);
}
});
element.addEventListener("click", function(event) {
const value = event.target.value;
if (value == "0") {
event.target.value = "";
}
});
element.addEventListener("blur", function(event) {
const value = event.target.value;
if (value == "") {
event.target.value = "0";
}
});
// Gestion de la modification du panier uniquement
element.addEventListener("change", function(event) {
const produitPanierId = element.parentNode.dataset.produitpanierid;
const page = event.target.dataset.page;
const quantite = parseInt(event.target.value);
if (page !== "panier") {
return;
}
// Ajout d'une bordure rouge si la quantité est invalide
event.target.classList.remove("border-color-danger");
if (isNaN(quantite) || quantite < 0) {
element.classList.add("border-color-danger");
return;
}
// Si la quantité est positive, on ne fait rien
// c'est géré par l'événement input (besoin pour un autre événement sur les fleches)
if (quantite > 0) {
return;
}
// Si la quantité est à 0 alors on supprime le produit du panier
removeProduitPanier(produitPanierId);
});
if (pageHead != null || forceRefresh) {
rechargePrixProduit(element);
}
counter++;
});
}// function
function transmetInfosProduitToRecapPanier(p_target, p_infosProduit)
{
const produitId = parseInt(p_target.dataset.produitid);
const quantite = parseInt(p_target.value);
const quantiteMin = parseInt(p_target.min);
const quantiteMax = parseInt(p_target.max);
const tauxTva = parseFloat(p_target.dataset.tauxtva);
const libelle = p_target.dataset.libelleproduit;
const lienFiche = p_target.dataset.lienfiche;
// p_infosProduit (récupéré depuis le serveur)
const prix = parseFloat(p_infosProduit.prixCondTarif);
const quantiteCond = parseInt(p_infosProduit.quantiteCond);
const quantiteValidite = getValiditeQuantite(quantite, quantiteMin, quantiteMax);
ajouteProduitRecapPanier(produitId, prix, quantiteValidite, quantiteCond, tauxTva, libelle, lienFiche);
}
function getValiditeQuantite(p_quantite, p_min, p_max) {
valeurQuantite = parseInt(p_quantite);
if (isNaN(valeurQuantite)) {
valeurQuantite = p_min;
} else {
if (valeurQuantite > parseInt(p_max)) {
valeurQuantite = parseInt(p_max);
}// if
if (valeurQuantite < parseInt(p_min)) {
valeurQuantite = parseInt(p_min);
}// if
}// if
return valeurQuantite;
}// function
/**
* Gestion de la modification du panier (met à jour toutes les lignes)
*/
function rechargePrixProduit(p_target) {
if (p_target == null) {
return;
}
// Envoi de la recherche et réception résultat
const params = {
"produitId" : p_target.dataset.produitid,
"quantite" : p_target.value,
};
const options = {
method: 'POST',
body: JSON.stringify( params )
};
fetch(p_target.dataset.chemin, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
miseAJourProduits([ data.infosProduit ]);
})
.catch(function(error) {
console.log(error);
//$.notify("Une erreur est survenue.", "error");
});
}// function
/**
* Mise a jour des champs infos produits
*/
function miseAJourProduits(p_produits) {
p_produits.forEach(function(element) {
if (element === null) {
return;
}
majProduit(element);
majLigneProduit(element);
});
}// function
function majLigneProduit(p_infosProduit) {
const tarifDetails = p_infosProduit.tarifDetails;
const loaders = document.querySelectorAll(".loader[data-produit='" + p_infosProduit.produit + "']");
loaders.forEach(function(loader) {
loader.classList.add("d-none");
});
// Récupération des badges
const badgePrixFixeAll = document.querySelectorAll(".badge.prix_fixe[data-produit='" + p_infosProduit.produit + "']");
const badgeRemiseAll = document.querySelectorAll(".badge.remise[data-produit='" + p_infosProduit.produit + "']");
if (tarifDetails.detailsTarif != null) {
let remise = tarifDetails.remise ?? 0;
let promotionClass = '';
if (remise === 0) {
if (tarifDetails.detailsTarif.PR !== undefined) {
try {
const quanitatif = tarifDetails.detailsTarif.PR.quantitatif;
const premiereEtapeRemise = quanitatif.split(':::')[0];
remise = (100 - parseFloat(premiereEtapeRemise.split('/')[2])) / 100;
promotionClass = 'non_atteint';
} catch (e) {}
}
}
if (badgePrixFixeAll.length > 0 && remise == -1) {
badgePrixFixeAll.forEach(function(badgePrixFixe) {
badgePrixFixe.innerText = "Prix Fixe";
badgePrixFixe.classList.remove("d-none");
});
} else if (badgeRemiseAll.length > 0 && remise > 0) {
if (tarifDetails.panache != null) {
badgeRemiseAll.forEach(function(badgeRemise) {
badgeRemise.dataset.badgePanache = tarifDetails.panache;
});
}
badgeRemiseAll.forEach(function(badgeRemise) {
badgeRemise.innerText = Math.round(100 - (100 * remise)) + " %";
badgeRemise.classList.remove("d-none");
if (promotionClass !== '') {
badgeRemise.classList.add(promotionClass);
} else {
badgeRemise.classList.remove('non_atteint');
}
});
if (badgePrixFixeAll.length > 0) {
badgePrixFixeAll.forEach(function(badgePrixFixe) {
badgePrixFixe.classList.add("d-none");
});
}
}
}
const prixUnitaireHtTarifSpans = document.querySelectorAll(".prix_unitaire_ht_tarif[data-produit='" + p_infosProduit.produit + "']");
if (prixUnitaireHtTarifSpans.length > 0) {
// p_infosProduit.prix = prixUnitaireHt et p_infosProduit.prixTarif = prixUnitaireHtTarif
if (p_infosProduit.prix !== p_infosProduit.prixTarif && tarifDetails.remise > 0) {
prixUnitaireHtTarifSpans.forEach(function(prixUnitaireHtTarifSpan) {
prixUnitaireHtTarifSpan.setAttribute("data-bs-toggle", "tooltip");
prixUnitaireHtTarifSpan.setAttribute("data-bs-placement", "top");
prixUnitaireHtTarifSpan.setAttribute("data-bs-title", "Prix catalogue : " + parseFloat(p_infosProduit.prix).toFixed(2) + " €");
if (Tooltip.getInstance(prixUnitaireHtTarifSpan) === null) {
new Tooltip(prixUnitaireHtTarifSpan);
}
});
}
prixUnitaireHtTarifSpans.forEach(function(prixUnitaireHtTarifSpan) {
prixUnitaireHtTarifSpan.classList.remove("d-none");
});
}
// Récupération du libellé de la quantité
const libelleQuantites = document.querySelectorAll(".libelleQuantite[data-produit='" + p_infosProduit.produit + "']");
if (libelleQuantites.length > 0 && tarifDetails.libellesQuantites != null) {
let text = '<span class="d-block">Prix selon quantité</span>';
tarifDetails.libellesQuantites.forEach(function(libelleQuantite) {
text += '<div class="row d-block">';
text += '<span class="text-start">' + libelleQuantite.quantitatif + '</span>';
text += '<span class="text-end">' + parseFloat(libelleQuantite.prix).toFixed(2) + ' €</span>';
text += '</div>';
});
libelleQuantites.forEach(function(libelleQuantite) {
libelleQuantite.setAttribute("data-bs-title", text);
libelleQuantite.classList.remove("d-none");
if (Tooltip.getInstance(libelleQuantite) === null) {
new Tooltip(libelleQuantite);
}
});
libelleQuantites.forEach(function(libelleQuantite) {
libelleQuantite.classList.remove("d-none");
if (Tooltip.getInstance(libelleQuantite) === null) {
new Tooltip(libelleQuantite);
}
});
}
const badgeRemiseDetailsAll = document.querySelectorAll(".badge_remise_details[data-produit='" + p_infosProduit.produit + "']");
if (badgeRemiseDetailsAll.length > 0 && tarifDetails.libellesRemises != null) {
let text = "";
tarifDetails.libellesRemises.forEach(function(libelleRemise) {
text += '<p class="text-start m-0 p-0">';
text += '<span id="badge_' + p_infosProduit.produit + '_' + libelleRemise.code + '">' + libelleRemise.libelle + '</span>';
text += '</p>';
});
badgeRemiseDetailsAll.forEach(function(badgeRemiseDetails) {
badgeRemiseDetails.setAttribute("data-bs-title", text);
badgeRemiseDetails.classList.remove("d-none");
if (Tooltip.getInstance(badgeRemiseDetails) === null) {
new Tooltip(badgeRemiseDetails);
}
});
}
}
/**
* Rafraichit les informations produits selon contexte
*/
function majProduit(p_infosProduit) {
if (p_infosProduit == null) {
return null;
}// if
let produitid = p_infosProduit.produit;
let champsProduit = document.querySelector("#quantite_" + p_infosProduit.produit);
if (champsProduit == null) {
return;
}
let page = champsProduit.dataset.page;
let produitPrixHt = parseFloat(champsProduit.dataset.prixcolisht);
let prixTotal = p_infosProduit.prixTarif;
let tauxDecolisage = p_infosProduit.decolisage;
let champsTotal = document.querySelector("#prixTotalHt_" + produitid);
let champsPrix = document.querySelector("#prixColisHt_" + produitid);
let champsRemise = document.getElementById("remise_" + produitid);
let champsTauxDecolisage = document.querySelector("#champsTauxDecolisage_" + produitid);
const recapProduit = champsProduit.dataset.recap;
if (page == "fiche") {
champsPrix.innerText =
(new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(p_infosProduit.prix));
// Gestion affichage decolisage
if (champsTauxDecolisage != null) {
if (tauxDecolisage == null || tauxDecolisage == 1) {
champsTauxDecolisage.innerText = "";
} else {
champsTauxDecolisage.innerText = "+" + ((tauxDecolisage - 1) * 100).toFixed(0) + "%";
}// if
}// if
} else {
champsPrix.innerText =
(new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(p_infosProduit.prixTarif));
}// if
if (champsRemise != null) {
champsRemise.innerText = p_infosProduit.remise;
}// if
if (champsTotal != null) {
champsTotal.innerText =
(new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(p_infosProduit.total));
}// if
// Mise à jour des badges
majBadges(p_infosProduit, tauxDecolisage);
if (champsProduit.dataset.recap == "true") {
return;
}
if (champsProduit.value > 0) {
transmetInfosProduitToRecapPanier(champsProduit, p_infosProduit);
} else {
supprimeProduitRecapPanierEtRecharge(produitid);
}
}// function
/**
* Mise à jour de l'affichage des prix des badges s'il y a des tranches de prix et modification de leur affichage en tenant compte de la tranche
*/
function majBadges(p_infosProduit, tauxDecolisage) {
let prix = parseFloat(p_infosProduit.prix);
if (p_infosProduit.details === null) {
return prix;
}
let produitid = p_infosProduit.produit;
let listeRemises = Object.entries(p_infosProduit.details);
listeRemises.forEach(function(ligneRemise) {
if (ligneRemise === null || ligneRemise === "") {
return;
}
let remiseQuantitative = ligneRemise[1].remise;
if (remiseQuantitative === null) {
return;
}
const badgePrix = document.querySelector("#badge_prix_" + produitid + "_" + ligneRemise[0]);
const badgeLibelle = document.querySelector("#badge_libelle_" + produitid + "_" + ligneRemise[0]);
if (badgePrix === null) {
return;
}
remiseQuantitative = ligneRemise[1].remise;
if (remiseQuantitative !== 0) {
const tauxRemise = (prix * remiseQuantitative) / 100;
prix = parseFloat(prix) + tauxRemise;
}// if
if (tauxDecolisage !== null) {
prix = parseFloat(prix) * tauxDecolisage;
}// if
badgePrix.innerText = (new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(prix));
if (badgeLibelle !== null) {
badgeLibelle.innerText = ligneRemise[1].libelle;
}// if
});
return prix;
}// function
function calculTarifProduitsClient() {
const listeProduits = document.querySelectorAll(".inputQuantite");
listeProduits.forEach(function(event) {
rechargePrixProduit(event.target);
});
}
document.addEventListener("DOMContentLoaded", function() {
const inputs = document.querySelectorAll(".inputQuantite");
inputs.forEach(function(event) {
if (event.value == "0") {
event.style.color = "#9c9c9c";
}
event.addEventListener("input", function(event) {
if (event.target.value == "0") {
event.target.style.color = "#9c9c9c";
} else {
event.target.style.color = "#1f1f1f";
}
});
if (event.dataset.rupture == "1") {
event.style.color = "black";
}
});
});
</script> <script>
// Gestion des boutons qui permettent d'incrémenter ou décrémenter la valeur du formulaire
let delaiStartDown, intervalleDown;
let delaiStartUp;
function gestionFlechesInput() {
let boutonsInput = document.querySelectorAll(".iconeQuantite");
boutonsInput.forEach((boutonInput) => {
boutonInput.addEventListener('mousedown', function(event) {
effaceTimers();
let produitId = event.target.dataset.produit;
let champsQuantite = document.querySelector("#quantite_" + produitId);
let element = null;
if (champsQuantite != null) {
element = "#" + champsQuantite.id;
}// if
let modifQuantite;
if (boutonInput.classList.contains("augmenteQuantite")) {
modifQuantite = "plus"
} else if (boutonInput.classList.contains("diminueQuantite")) {
modifQuantite = "moins"
}// if
modifieQuantites(element, modifQuantite);
delaiStartDown = setTimeout(function() {
intervalleDown = setInterval(function() {
modifieQuantites(element, modifQuantite)
}, 50);
}, 300);
});
boutonInput.addEventListener('mouseup', function(event) {
let produitId = event.target.dataset.produit;
let inputQuantite = document.querySelector("#quantite_" + produitId);
let page = this.dataset.page;
if (page == "panier") {
clearTimeout(delaiStartUp);
delaiStartUp = setTimeout(function() {
inputQuantite.dispatchEvent(new Event("input"));
}, 700);
} else {
inputQuantite.dispatchEvent(new Event("input"));
}// if
effaceTimers();
});
boutonInput.addEventListener('mouseleave', function(event) {
effaceTimers();
});
});
}// function
function effaceTimers() {
clearTimeout(delaiStartDown);
clearInterval(intervalleDown);
}// function
function modifieQuantites(element, modifQuantite) {
let inputQuantite = document.querySelector(element);
// Controle la validité du contenu du champs
quantite = inputQuantite.value;
// Si la quantité est invalide, on la met à la valeur minimale
if (quantite < 0 || quantite === "" || isNaN(quantite)) {
quantite = 0;
inputQuantite.value = inputQuantite.min;
return;
}
valeurMin = parseInt(inputQuantite.min);
valeurMax = parseInt(inputQuantite.max);
inputQuantite.value = testValiditeQuantite(quantite, valeurMin, valeurMax);
if (modifQuantite == "plus") {
inputQuantite.stepUp();
// inputQuantite.dispatchEvent(new Event("input"));
}
else if(modifQuantite == "moins" && (inputQuantite.value != "" || inputQuantite.value > 0)) {
inputQuantite.stepDown();
// inputQuantite.dispatchEvent(new Event("input"));
}// if
if (inputQuantite.value == 0) {
inputQuantite.value = "0";
}// if
}// function
</script>
<script>
/**
* Initialise les tableaux DataTable
*/
function initialiseTablesPanier() {
// Initialise toutes les tables au format DataTable
let listePanier = document.querySelectorAll(".listeCategoriePanier");
listePanier.forEach(function (element) {
let grid = $(element).DataTable({
responsive: {
details: false,
},
columnDefs: [
{ responsivePriority: 1, targets: 10 },
{ responsivePriority: 2, targets: [1,9] },
],
ordering: false,
dom: "",
pageLength: "100000",
language: {
url: "/assets/datatables_fr-FR.json",
lengthMenu: "Afficher _MENU_ lignes",
loadingRecords: `<tr><td colspan="100%"><span class="spinner-border text-primary"></span></td></tr>`,
zeroRecords: "Aucun résultat trouvé",
info: "Affichage de _START_ à _END_ sur _TOTAL_ ligne",
infoFiltered: "",
paginate: {
"previous": '<i class="fa-solid fa-caret-left"></i>',
"next": '<i class="fa-solid fa-caret-right"></i>',
"first": "",
"last": ""
},
},
});
});
}// function
function chargeAdressePanier() {
selectionAdresse = document.getElementById('commande_form_adresses');
if (selectionAdresse != null) {
adresseId = selectionAdresse.value;
fetch("\/eshop\/panier\/adresse/" + adresseId)
.then(function(response) {
return response.text();
})
.then(function(data) {
formulaireAdresse = document.getElementById('form_commande_adresse');
formulaireAdresse.innerHTML = data;
})
.catch(function(error) {
console.log(error);
$.notify("Erreur chargement adresse", "error");
});
}// if
}// function
function initialiseOptionRetrait() {
choixOptionRetrait = document.getElementById('commande_form_optionRetrait');
divPlanTransport = document.getElementById('planTransport');
divRetraitDepot = document.getElementById('optionsRetrait');
if (divPlanTransport != null) {
divPlanTransport.setAttribute("test", "test");
if (choixOptionRetrait != null) {
choixOptionRetrait.checked = false;
choixOptionRetrait.addEventListener("click", function (event) {
divPlanTransport = document.getElementById('planTransport');
divRetraitDepot = document.getElementById('optionsRetrait');
selectDateTransport = document.getElementById('commande_form_dateLivraison');
selectDateRetrait = document.getElementById('commande_form_dateRetrait');
divPlanTransport.classList.toggle("d-none");
divRetraitDepot.classList.toggle("d-none");
if (this.checked) {
selectDateTransport.removeAttribute("required");
selectDateRetrait.setAttribute("required", "required");
} else {
selectDateTransport.setAttribute("required", "required");
selectDateRetrait.removeAttribute("required");
}// if
});
}// if
}// if
}// function
/**
* Gestion de la modification du panier (met à jour toutes les lignes)
*/
function initialiseSupprimePanier() {
boutonVidePanier = document.querySelector("#boutonVidePanier");
if (boutonVidePanier != null) {
boutonVidePanier.addEventListener("click", function (event) {
// Boire de dialogue de confirmation de la suppression
$retour = confirm("Confirmez-vous la suppression du panier ?");
// Si confirmation de la suppression
if($retour == true) {
document.location = boutonVidePanier.dataset.chemin;
}// if
});//
}// if
}// function
/**
* Gestion de l'ajout de produits depuis la fiche produit
* 20230312 - LGA - gestion des quantités dans le récap panier
*/
function initialiseAjoutPanierFiche() {
// Gestion ajout du produit dans le panier
boutonAjoutPanier = document.querySelector(".boutonAjoutPanier");
if (boutonAjoutPanier != null) {
boutonAjoutPanier.addEventListener("click", function (evenement) {
// Récupére les infos du produit
produitId = evenement.target.parentElement.dataset.produitid;
chemin = evenement.target.parentElement.dataset.chemin;
// Récupére la quantité dans le récap
// infosRecap = renvoieLigneSuiviRecap(produitId);
// quantite = infosRecap[1];
// 20231026 - LGA - Récupére directement la quantité dans le champs quantite
let champsQuantite = document.getElementById("quantite_" + produitId);
let champsTotal = document.querySelector("#prixTotalHt_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite > 0) {
produit = [ {
"produit" : produitId,
"quantite" : quantite,
}];
statutRetour = ajouteProduitsPanier(produit, chemin);
if (statutRetour) {
supprimeLigneSuiviRecap(produitId);
champsQuantite.value = "0";
champsTotal.innerText = "0,00 €";
}// if
}// if
}// if
});
}// if
}// function
/**
* Gestion de l'ajout de produits depuis cartes et lignes produit
* TODO - A fusionner avec initialiseAjoutPanierFiche - probleme de la recupération du produit Id à gérer sur le front
*/
function initialiseAjoutPanierCartes() {
boutonAjoutPanierCartes = document.querySelectorAll(".boutonAjoutPanier");
boutonAjoutPanierCartes.forEach(function (element) {
element.addEventListener("click", function (evenement) {
// Récupére les infos du produit
produitId = evenement.target.dataset.produitid;
chemin = evenement.target.dataset.chemin;
// Récupére la quantité dans le récap
// infosRecap = renvoieLigneSuiviRecap(produitId);
// quantite = infosRecap[1];
// 20231026 - LGA - Récupére directement la quantité dans le champs quantite
let champsQuantite = document.getElementById("quantite_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite > 0) {
produit = [ {
"produit" : produitId,
"quantite" : quantite,
}];
statutRetour = ajouteProduitsPanier(produit, chemin);
if (statutRetour == true) {
champsQuantite.value = "0";
supprimeLigneSuiviRecap(produitId);
}// if
}// if
}// if
});
})
}// function
/**
* Gestion de la modification du calcul des totaux panier selon options sélectionnées
* - si autre canal, pas de franco
* - mode de retrait dépot, pas de franco
*/
function initialiseModifTotal() {
// Initialise le bouton canal
let selectionCanal = document.querySelector("#commande_form_autreCanal");
if (selectionCanal != null) {
selectionCanal.addEventListener("change", function (event) {
rechargeTotauxPanier();
});
}// if
// Initialise le bouton mode_retrait
let selectionRetrait = document.querySelector("#commande_form_optionRetrait");
if (selectionRetrait != null) {
selectionRetrait.addEventListener("change", function (event) {
rechargeTotauxPanier();
});
}// if
}// function
/**
* Initialise le total du panier
*/
function rechargeTotauxPanier() {
let panierTotal = document.getElementById("panierTotal");
if (panierTotal != null) {
let cheminUrl = panierTotal.dataset.chemin;
let franco = testConditionsFranco();
// Envoi de la recherche et réception résultat
const params = {
"franco" : franco,
};
const options = {
method: 'POST',
body: JSON.stringify( params ) ,
};
fetch(cheminUrl, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
miseAJourTotaux(data.totaux);
})
.catch(function(error) {
$.notify("Erreur calcul total : " + error, "error");
});
}// if
}// function
/**
* Gestion de la modification du panier (met à jour toutes les lignes)
*/
function rechargeProduitsPanier() {
let champsListeProduits = document.querySelector("#accordionProduits");
let quantitesPanier = document.querySelectorAll(".inputQuantite");
let listeProduits = [];
let franco = testConditionsFranco();
quantitesPanier.forEach(function (element) {
produitPanierId = element.parentNode.dataset.produitpanierid;
quantite = element.value;
listeProduits.push({ "id" : produitPanierId, "quantite" : quantite });
});
if (listeProduits.length > 0) {
// Envoi de la recherche et réception résultat
const params = {
"produitsPanierId" : listeProduits,
"franco" : franco,
};
const options = {
method: 'POST',
body: JSON.stringify( params ) ,
};
fetch(champsListeProduits.dataset.chemin, options)
.then(function(response) {
return response.json();
})
.then(function(data) {
miseAJourProduits(data.produits);
miseAJourTotaux(data.totaux);
})
.catch(function(error) {
console.log(error);
$.notify("Erreur lors de l'ajout au panier", "error");
});
}// if
}// function
function testConditionsFranco() {
let franco = true;
let selectionCanal = document.querySelector("#commande_form_autreCanal");
let selectionRetrait = document.querySelector("#commande_form_optionRetrait");
// Vérifie les options sélectionnées pour calcul franco
if (selectionCanal != null && selectionCanal.value != "") {
franco = false;
}// if
if (selectionRetrait != null && selectionRetrait.checked) {
franco = false;
}// if
return franco;
}// function
/**
* Mise a jour des champs totaux
*/
function miseAJourTotaux(p_totaux) {
let panierTotalHT = document.getElementById("panierTotalHT");
let panierTotalPreco = document.getElementById("panierTotalPreco");
let panierTotalTVA5 = document.getElementById("panierTotalTVA5");
let panierTotalTVA10 = document.getElementById("panierTotalTVA10");
let panierTotalTVA20 = document.getElementById("panierTotalTVA20");
let panierTotalLivraison = document.getElementById("panierTotalLivraison");
let panierTotalTTC = document.getElementById("panierTotalTTC");
let resteFrancoPort = document.getElementById("resteFrancoPort");
let infosTotalLivraison = document.getElementById("infosTotalLivraison");
let franco = testConditionsFranco();
panierTotalHT.innerText = parseFloat(p_totaux.totalHT).toFixed(2);
panierTotalPreco.innerText = parseFloat(p_totaux.totalPreco).toFixed(2);
panierTotalTVA5.innerText = parseFloat(p_totaux.totalTVA5).toFixed(2);
panierTotalTVA10.innerText = parseFloat(p_totaux.totalTVA10).toFixed(2);
panierTotalTVA20.innerText = parseFloat(p_totaux.totalTVA20).toFixed(2);
if (franco && resteFrancoPort != null) {
resteFrancoPort.innerText =
(new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(
parseFloat(panierTotalLivraison.dataset.franco - p_totaux.totalHT).toFixed(2)));
if ((panierTotalLivraison.dataset.franco - p_totaux.totalHT) <= 0) {
afficheMessageFranco(false);
} else {
afficheMessageFranco(true);
}// if
} else {
afficheMessageFranco(false);
}// if
totalLivraison = parseFloat(p_totaux.totalLivraison);
if (totalLivraison == 0 || !franco) {
infosTotalLivraison.innerText = "Gratuit";
} else {
infosTotalLivraison.innerText = totalLivraison + " €";
}// if
panierTotalLivraison.innerText = parseInt(p_totaux.totalLivraison).toFixed(2);
panierTotalTTC.innerText = parseFloat(p_totaux.totalTTC).toFixed(2);
}// function
function afficheMessageFranco(p_etat) {
infosResteFranco = document.getElementById("infosResteFranco");
if (infosResteFranco != null) {
infosResteFranco.hidden = !p_etat;
}// if
}// function
/**
* Ajout des produits sélectionnés dans la mercuriale :
* Ajoute chaque produit
*/
function ajoutMercurialePanier() {
let champsQuantiteMercuriale = document.querySelectorAll(".quantite");
let boutonMercurialePanier = document.querySelector("#boutonMercurialePanier");
let chemin = boutonMercurialePanier.dataset.chemin;
let codeRetourMercu = true;
let listeProduits = [];
champsQuantiteMercuriale.forEach(function(element) {
let produitId = element.dataset.produitid;
// let infosRecap = renvoieLigneSuiviRecap(produitId); // Récupére la quantité dans le récap
// let quantite = infosRecap[1];
let champsQuantite = document.getElementById("quantite_" + produitId);
if (champsQuantite != null) {
let quantite = champsQuantite.value;
if (quantite != null && quantite > 0) {
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
}// if
}// if
});
if (listeProduits.length > 0) {
let codeRetour = ajouteProduitsPanier(listeProduits, chemin);
// Si ajout panier OK, remise à zéro de la quantité saisie
if (codeRetour === true) {
champsQuantiteMercuriale.forEach(function(element) {
let produitId = element.dataset.produitid;
let champsQuantite = document.getElementById("quantite_" + produitId);
supprimeLigneSuiviRecap(produitId);
champsQuantite.value = "0";
});
} else {
codeRetourMercu = false;
}// if
} else {
$.notify("Aucun produit sélectionné", "warning");
}// if
return codeRetourMercu;
}// function
/**
* Ajout des produits sélectionnés dans la mercuriale :
* Ajoute chaque produit
*/
function ajoutCadencierPanier() {
let champsQuantiteCadencier = document.querySelectorAll(".inputCadencier");
let boutonCadencierPanier = document.querySelector("#boutonCadencierPanier");
let chemin = boutonCadencierPanier.dataset.chemin;
let codeRetourCadencier = true;
let listeProduits = [];
champsQuantiteCadencier.forEach(function(element) {
let produitId = element.dataset.produitid;
// let infosRecap = renvoieLigneSuiviRecap(produitId); // Récupére la quantité dans le récap
let quantite = element.value;
if (quantite != null && quantite > 0) {
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
}// if
});
if (listeProduits.length > 0) {
let codeRetour = ajouteProduitsPanier(listeProduits, chemin);
// Si ajout panier OK, remise à zéro de la quantité saisie
if (codeRetour === true) {
champsQuantiteCadencier.forEach(function(element) {
element.value = "0";
});
} else {
codeRetourCadencier = false;
}// if
} else {
$.notify("Aucun produit sélectionné", "warning");
}// if
return codeRetourCadencier;
}// function
/**
* Affiche une fenetre modal de récap des produits ajoutés au panier
*/
function afficheRecapPanier(p_contenuModal) {
let champsConfirmationPanier = document.getElementById("confirmationPanier");
let fenetreModalPanier = new Modal(champsConfirmationPanier, {
show: true,
focus: true,
});
corpsModale = champsConfirmationPanier.querySelector(".modal-body");
corpsModale.innerHTML = p_contenuModal;
initialiseMAJPrixQuantite(true, corpsModale);
fenetreModalPanier.show();
$("#confirmationPanier").on("hide.bs.modal", function (event) {
// Supprime le contenu de la modal - Important sinon provoque un bug sur les champs quantités
corpsModale = event.target.querySelector(".modal-body");
corpsModale.innerHTML = "";
});
}// function
/**
* Ajout l'une liste de produits au panier : requete asynchrone
*/
function ajouteProduitsPanier(p_listeProduitId, p_chemin) {
const urlAjout = p_chemin;
statutAjout = true;
// Envoi de la recherche et réception résultat
const params = {
produitsId : p_listeProduitId, // Liste d'ids de produit
};
const optionsAjout = {
method: 'POST',
body: JSON.stringify( params ),
};
fetch(urlAjout, optionsAjout)
.then(function(response) {
return response.json();
})
.then(function(data) {
nombreProduitsPanier = document.querySelector("#nombreProduitsPanier");
// Mise à jour du nombre de produits en panier dans l'entete
if (nombreProduitsPanier != null) {
nombreProduitsPanier.innerText = data.nombreProduitsPanier;
}// if
afficheRecapPanier(data.contenuModal);
afficheTotalSuiviPanier(data.totauxPanier);
})
.catch(function(error) {
// $.notify("Erreur lors de l'ajout au panier", "error");
statutAjout = false;
});// fetch
return statutAjout;
}// function
/**
* Valide la quantité saisie par l'utilisateur.
* Si invalide, renvoie toujours 1
*/
function testValiditeQuantite(p_quantite, p_min, p_max) {
valeurQuantite = parseInt(p_quantite);
if (isNaN(valeurQuantite)) {
valeurQuantite = p_min;
} else {
if (valeurQuantite > parseInt(p_max)) {
valeurQuantite = parseInt(p_max);
}// if
if (valeurQuantite < parseInt(p_min)) {
valeurQuantite = parseInt(p_min);
}// if
}// if
return valeurQuantite;
}// function
/**
* Remise à zéro des champs quantité de la page en cours
*/
function effaceChampsQuantites() {
let champsQuantites = document.querySelectorAll(".inputQuantite");
champsQuantites.forEach(function(element) {
element.value = "";
});
}// function
/**************************************************************
* Gestion de la fenetre de récapitulatif du panier
*/
/**
* Initialise la fenetre de suivi du panier
*/
function initialiseSuiviPanier() {
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
let boutonOuvertureSuivi = document.querySelector("#boutonOuvertureSuivi");
if (fenetreSuiviPanier != null) {
afficheSuiviPanier();
// bouton de fermeture de la fenetre de suivi
boutonFermetureSuivi = fenetreSuiviPanier.querySelector("#boutonFermetureSuivi");
if (boutonFermetureSuivi != null) {
boutonFermetureSuivi.addEventListener("click", function(event) {
afficheSuiviPanier("false");
});
}// if
// bouton ouverture de la fenetre de suivi
if (boutonOuvertureSuivi != null) {
boutonOuvertureSuivi.addEventListener("click", function(event) {
afficheSuiviPanier("true");
});
}// if
// Gestion des événements sur le contenu du recap (suppression produit)
contenuSuivi = fenetreSuiviPanier.querySelector(".contenu");
if (contenuSuivi != null) {
contenuSuivi.addEventListener("click", function (event) {
champsCible = event.target;
if (champsCible.classList.contains("supprimeSuivi")) {
produitId = champsCible.getAttribute("data-produitid");
supprimeLigneSuiviRecap(produitId);
}// if
});
}// if
// Recharge les produits en cours stockés en session
loadProduitsRecapPanier();
// Initialise la fonction de déplacement de la fenetre recap panier
$(fenetreSuiviPanier).draggable({
handle: ".entete",
drag: function (event, ui) {
let scrollWinX = window.scrollX;
let scrollWinY = window.scrollY;
let largeurFenetre = window.innerWidth
let hauteurFenetre = window.innerHeight;
let largeurRecap = this.offsetWidth;
let hauteurRecap = this.offsetHeight - 200;
let posModifTop = posSuiviTop = ui.offset.top;
let posModifLeft = posSuiviLeft = ui.offset.left;
let cacheFenetre = false;
if (posSuiviTop < (-10 + scrollWinY)) {
posModifTop = -10 + scrollWinY;
cacheFenetre = true;
}// if
if (posSuiviLeft < -100) {
posModifLeft = 10;
cacheFenetre = true;
}// if
if (posSuiviTop + hauteurRecap > (hauteurFenetre + scrollWinY)) {
posModifTop = hauteurFenetre - hauteurRecap - 10 + scrollWinY ;
cacheFenetre = true;
event.preventDefault();
}// if
if (posSuiviLeft + largeurRecap > largeurFenetre) {
posModifLeft = largeurFenetre - largeurRecap - 10;
cacheFenetre = true;
event.preventDefault();
}// if
let positionRecapTop = localStorage.setItem("positionRecapTop", posModifTop);
let positionRecapLeft = localStorage.setItem("positionRecapLeft", posModifLeft);
if (cacheFenetre) {
afficheSuiviPanier("false");
}// if
}
});
}// if
}// function
/**
* Initialise l'affichage de la fenetre recap panier
*/
function afficheSuiviPanier(p_visible = null)
{
// Récupére en session l'état de la fenetre (et du bouton) : Visible ou non
let recapPanierVisible = localStorage.getItem("recapPanierVisible") ?? "true";
if (p_visible != null) {
recapPanierVisible = p_visible;
}// if
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
let boutonOuvertureSuivi = document.querySelector("#boutonOuvertureSuivi");
if (recapPanierVisible == "true") {
fenetreSuiviPanier.classList.remove("d-none");
boutonOuvertureSuivi.classList.add("d-none");
localStorage.setItem("recapPanierVisible", true);
loadProduitsRecapPanier();
} else {
fenetreSuiviPanier.classList.add("d-none");
boutonOuvertureSuivi.classList.remove("d-none");
localStorage.setItem("recapPanierVisible", false);
}// if
let scrollWinX = window.scrollX;
let scrollWinY = window.scrollY;
let largeurFenetre = window.innerWidth
let hauteurFenetre = window.innerHeight;
let positionFenetre = parseInt($(fenetreSuiviPanier).offset());
let positionRecapTop = parseInt(localStorage.getItem("positionRecapTop"));
let positionRecapLeft = parseInt(localStorage.getItem("positionRecapLeft"));
let largeurRecap = fenetreSuiviPanier.offsetWidth;
let hauteurRecap = fenetreSuiviPanier.offsetHeight - 200;
if (positionRecapTop == null || positionRecapTop < scrollWinY || positionFenetre.top < scrollWinY) {
positionRecapTop = 10 + scrollWinY;
}// if
if (positionRecapTop + hauteurRecap > (hauteurFenetre + scrollWinY)) {
positionRecapTop = 10 + scrollWinY;
}// if
if (positionRecapLeft == null || positionRecapLeft < 0 || positionFenetre.left < 0) {
positionRecapLeft = 10;
}// if
if (positionRecapLeft > largeurFenetre) {
positionRecapLeft = largeurFenetre - largeurRecap - 10;
}// if
$(fenetreSuiviPanier).offset({ top : positionRecapTop, left : positionRecapLeft});
}// function
/**
* Mise à jour des totaux produits de la fenetre suivi
*/
function calculTotalSuiviRecap() {
let contenuSuiviPanier = document.querySelector("#suiviPanier .contenu");
if (contenuSuiviPanier == null) {
return;
}// if
let produitsRecap = contenuSuiviPanier.querySelectorAll("span");
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxRecap");
let caseTotalHtSuivi = totauxSuiviPanier.querySelector("#totalHT");
let caseTotalTvaSuivi = totauxSuiviPanier.querySelector("#totalTVA");
let caseTotalTtcSuivi = totauxSuiviPanier.querySelector("#totalTTC");
let totalHt = 0;
let totalTva = 0;
let totalTtc = 0;
produitsRecap.forEach(function(element) {
prixHt = parseFloat(element.dataset.prix);
quantite = element.dataset.quantite;
quantiteCond = element.dataset.quantitecond;
prixQttHt = prixHt * quantite * quantiteCond;
tauxTva = parseFloat(element.dataset.tauxtva);
partTva = (prixQttHt * tauxTva) / 100;
prixTtc = (prixQttHt) + partTva;
totalHt += prixQttHt;
totalTva += partTva;
totalTtc += prixTtc;
});
caseTotalHtSuivi.innerText = parseFloat(totalHt).toFixed(2) + " €";
caseTotalTvaSuivi.innerText = parseFloat(totalTva).toFixed(2) + " €";
caseTotalTtcSuivi.innerText = parseFloat(totalTtc).toFixed(2) + " €";
}// function
/**
* Mise à jour des totaux panier de la fenetre suivi
*/
function afficheTotalSuiviPanier(p_totaux) {
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxPanier");
let caseTotalHtPanier = totauxSuiviPanier.querySelector("#totalPanierHT");
let caseRestePanierFranco = totauxSuiviPanier.querySelector("#restePanierFranco");
let caseTotalTtcPanier = totauxSuiviPanier.querySelector("#totalPanierTTC");
caseTotalHtPanier.innerText = parseFloat(p_totaux.totalHT).toFixed(2) + " €";
caseRestePanierFranco.innerText = parseFloat(p_totaux.resteFranco) + " €";
caseTotalTtcPanier.innerText = parseFloat(p_totaux.totalTTC).toFixed(2) + " €";
}// function
/**
* Ajoute une ligne html corespondant à un produit dans le recap panier
*/
function ajouteLigneSuiviRecap(p_origine, p_produitId, p_prix, p_quantite, p_quantiteCond, p_tauxTva, p_libelle, p_lienFiche)
{
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
if (contenuSuivi != null) {
let suiviProduit = contenuSuivi.querySelector("#suiviProduit" + p_produitId);
let nouvelleQuantite = p_quantite;
if (suiviProduit != null) {
quantitePrecedente = parseInt(suiviProduit.getAttribute("data-quantiteprec"));
if (quantitePrecedente != null) {
nouvelleQuantite += quantitePrecedente;
}// if
}// if
if (nouvelleQuantite > 0) {
if (suiviProduit != null) {
suiviProduit.innerHTML = p_libelle + " : " + nouvelleQuantite;
suiviProduit.setAttribute("data-prix", p_prix);
suiviProduit.setAttribute("data-quantite", nouvelleQuantite);
} else {
let quantitePrecedente = p_quantite;
if (p_origine == "page") {
quantitePrecedente = 0;
}// if
contenuSuivi.innerHTML +=
"<div id='blocProduit" + p_produitId + "' class='col-11 ligneProduitPanier mx-2 my-1'>"
+ "<i class='d-inline col-1 fa-solid fa-circle-xmark supprimeSuivi mr-1 charte_couleur_primaire' data-produitid='"+ p_produitId +"'></i>"
+ "<a href='" + p_lienFiche + "' class='lien_defaut charte_couleur_primaire ms-1'>"
+ "<span id='suiviProduit" + p_produitId
+ "' class='d-inline col-10 ligneProduit fw-bold' data-produitid='" + p_produitId
+ "' data-prix='" + p_prix
+ "' data-quantitecond='" + p_quantiteCond
+ "' data-quantite='" + p_quantite
+ "' data-quantiteprec='" + quantitePrecedente
+ "' data-tauxtva='" + p_tauxTva
+ "' data-libelle='" + p_libelle
+ "' data-lienfiche='" + p_lienFiche
+ "'>"
+ p_libelle + " : " + p_quantite
+ "</span>"
+ "</a>"
+"</div>";
}// if
} else {
supprimeLigneSuiviRecap(p_produitId);
}// if
// Stockage des infos de la fenetre recap en session
//sauvegardeSuiviPanier();
// Calculs les totaux de la fenetre recap
calculTotalSuiviRecap();
}// if
}// function
/**
* Supprime une ligne html correspondant à un produit dans le recap panier
*/
function supprimeLigneSuiviRecap(p_produitId) {
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
let blocProduit = contenuSuivi.querySelector("#blocProduit" + p_produitId);
if (blocProduit != null) {
blocProduit.remove();
}// if
// Suppression du produit dans la session
supprimeProduitRecapPanier(p_produitId);
// Calculs les totaux de la fenetre recap
calculTotalSuiviRecap();
}// function
/**
* renvoie les informations correspondant à un produit dans le recap panier
*/
function renvoieLigneSuiviRecap(p_produitId) {
let contenuSuivi = document.querySelector("#suiviPanier .contenu");
let suiviProduit = contenuSuivi.querySelector("#suiviProduit" + p_produitId);
let prix = null;
let quantite = null;
if (suiviProduit != null) {
prix = suiviProduit.getAttribute("data-prix");
quantite = suiviProduit.getAttribute("data-quantite");
}// if
return [prix, quantite];
}// function
/**
* Sauvegarde le contenu du recap panier en session
*/
function sauvegardeSuiviPanier() {
let contenuRecapPanier = document.querySelectorAll("#suiviPanier .ligneProduit");
let tabRecapPanier = [];
contenuRecapPanier.forEach(function(element) {
let produitId = element.dataset.produitid;
let produitPrix = element.dataset.prix;
let produitQuantite = element.dataset.quantite;
let produitQuantiteCond = element.dataset.quantitecond;
let produitTva = element.dataset.tauxtva;
let produitLibelle = element.dataset.libelle.replace("_","-").replace("'", "\'");
let lienFiche = element.dataset.lienfiche;
let ligneRecapPanier =
produitId + "_" + produitPrix + "_" + produitQuantite + "_" + produitQuantiteCond + "_"
+ produitTva + "_" + produitLibelle + "_" + lienFiche;
tabRecapPanier.push(ligneRecapPanier);
});
// Stockage en session
localStorage.setItem("recapPanierContenu", tabRecapPanier);
}// function
/**
* Remise a zéro de la fenetre Recap : effacement données fenetre et session
*/
function videSuiviPanier() {
effaceContenuPanier();
localStorage.setItem("recapPanierContenu", null);
}// function
/**
* Remise à zéro des élements
*/
function effaceContenuPanier() {
let fenetreSuiviPanier = document.querySelector("#suiviPanier");
if (fenetreSuiviPanier != null) {
let contenuSuivi = fenetreSuiviPanier.querySelector(".contenu");
contenuSuivi.innerHTML = "";
let totauxSuiviPanier = document.querySelector("#suiviPanier .totauxRecap");
let caseTotalHtSuivi = totauxSuiviPanier.querySelector("#totalHT");
let caseTotalTvaSuivi = totauxSuiviPanier.querySelector("#totalTVA");
let caseTotalTtcSuivi = totauxSuiviPanier.querySelector("#totalTTC");
caseTotalHtSuivi.innerText = 0;
caseTotalTvaSuivi.innerText = 0;
caseTotalTtcSuivi.innerText = 0;
}// if
}// if
/**
* Calcul du délai restant avant l'heure limite de commande
* Récupére l'heure correspondant au jour dans le tableau du plan de transport
* Le format de l'heure doit être : HH{H}MM ex : 10H30
*/
let changeDateLivraison = false;
function afficheDecompteAvantCommande() {
let dateActuelle = new Date();
let dateDemain = new Date();
dateDemain.setDate(dateActuelle.getDate()+1);
let champsPlanTransport = document.querySelector("#planTransport");
let nbJoursPlan = 0;
if (champsPlanTransport != null) {
nbJoursPlan = parseInt(champsPlanTransport.dataset.nbjours);
}// if
let delai = "--";
let chronoDelai = document.querySelectorAll(".chronoDelaiCommande");
let jourDelai = document.querySelectorAll(".jourDelaiCommande");
let numeroJourPlan = dateActuelle.getDay();
let numeroJourSuivantPlan;
numeroJourSuivantPlan = 1;
if (numeroJourPlan < nbJoursPlan) {
numeroJourSuivantPlan = numeroJourPlan + 1;
}
let infosJour = document.querySelector("#infosJour_" + numeroJourPlan);
let infosDemain = document.querySelector("#infosJour_" + numeroJourSuivantPlan);
let infosLivraisonJour = document.querySelector("#infosLivraison_" + numeroJourPlan);
let infosLivraisonDemain = document.querySelector("#infosLivraison_" + numeroJourSuivantPlan);
if (infosJour === null || infosDemain === null) {
return;
}
const chaineHeure = infosJour.innerText;
const heureJour = chaineHeure.substring(0,2);
const minuteJour = chaineHeure.substring(3);
let jour = infosLivraisonJour.innerText;
let dateLimite = new Date(
dateActuelle.getFullYear(),
dateActuelle.getMonth(),
dateActuelle.getDate(),
heureJour,
minuteJour, 0
);
if (isNaN(dateLimite)) {
return;
}
if (dateActuelle > dateLimite) {
const chaineHeureDemain = infosDemain.innerText;
const heureDemain = chaineHeureDemain.substring(0,2);
const minuteDemain = chaineHeureDemain.substring(3);
dateLimite = new Date(
dateDemain.getFullYear(),
dateDemain.getMonth(),
dateDemain.getDate(),
heureDemain,
minuteDemain, 0
);
jour = infosLivraisonDemain.innerText;
if (!changeDateLivraison) {
changeDateLivraison = true;
fetchDateLivraisons();
}
}
const diff = dateDiff(dateActuelle, dateLimite);
delai =
diff.hour.toString().padStart(2, '0') + "h " +
diff.min.toString().padStart(2, '0') + "m " +
diff.sec.toString().padStart(2, "0") + "s";
chronoDelai.forEach(champs => champs.innerText = delai);
jourDelai.forEach(champs => champs.innerText = jour);
}// function
/**
* Affiche une fenetre modal de récap des produits en précommande du panier
*/
function afficheRecapPrecommandePanier(p_contenuModal) {
let champsConfirmationPrecommandePanier = document.getElementById("confirmationPrecommandePanier");
let fenetreModalPanierRecapPrecommand = new Modal(champsConfirmationPrecommandePanier, {
show: true,
focus: true,
});
corpsModale = champsConfirmationPrecommandePanier.querySelector(".modal-body-containeur");
corpsModale.innerHTML = p_contenuModal;
fenetreModalPanierRecapPrecommand.show();
$("#confirmationPrecommandePanier").on("hide.bs.modal", function (event) {
// Supprime le contenu de la modal - Important sinon provoque un bug sur les champs quantités
corpsModale = event.target.querySelector(".modal-body-containeur");
corpsModale.innerHTML = "";
});
}// function
// Charge les précommandes de l'utilisateur, renvie true s'il en possède
function chargePrecommandeRecap(p_chemin) {
const urlRecapPreco = p_chemin;
statutRecapPreco = true;
const optionsRecapPreco = {
method: 'GET',
};
return fetch(urlRecapPreco, optionsRecapPreco)
.then(function(response) {
return response.json();
})
.then(function(data) {
// Vérifie s'il y a des précommandes
if (data.contenuModal != "") {
afficheRecapPrecommandePanier(data.contenuModal);
} else {
statutRecapPreco = false
}
return statutRecapPreco
})
.catch(function(error) {
// $.notify("Erreur lors de la récupération des précommandes du panier", "error");
});// fetch
}
function verifieChampQuantiteRemplie() {
let quantiteCheck = true;
document.querySelectorAll('.inputQuantite').forEach(element => {
if (element.value <= 0 || element.value === "") {
quantiteCheck = false;
}
});
return quantiteCheck;
}
// Vérifie si tout les champs required d'un formulaire sont remplis
function verifieChampRequiredRemplie(form) {
const elementsRequired = form.querySelectorAll('[required="required"]');
// On reforme la liste pour qu'elle ait la méthodes every
return [...elementsRequired].every((element) => {
return (element.type === "checkbox" && element.checked) || (element.type !== "checkbox" && element.value !== "")
})
}
// Initialise la méchanique du pop up de confirmation des produit en précommandes
function initialisePrecommandeModal() {
form = document.forms["commande_form"];
boutonValidePanier = document.querySelector("#commande_form_valide");
boutonSupprimePrecoEtValide = document.querySelector("#supprimePrecoEtValide");
boutonGardePrecoEtValide = document.querySelector("#gardePrecoEtValide");
confirmationPrecommandePanier = document.querySelector("#confirmationPrecommandePanier");
if (boutonValidePanier != null){
boutonValidePanier.addEventListener('click', function(event) {
const quantiteCheck = verifieChampQuantiteRemplie();
const requiredCheck = verifieChampRequiredRemplie(form);
if (!quantiteCheck) {
event.preventDefault();
$.notify("Veuillez entrer une quantité valide pour chaque produit", "error");
return;
}
if (!requiredCheck) {
return;
}
event.preventDefault();
const statutRecapPreco = chargePrecommandeRecap(confirmationPrecommandePanier.dataset.chemin);
statutRecapPreco.then(function (data) {
// Submit le formulaire si aucune précommande n'est présente
if (!data) {
form.requestSubmit();
}
});
});
}
if (boutonSupprimePrecoEtValide != null){
boutonSupprimePrecoEtValide.addEventListener('click', function(event) {
document.querySelector(".ignorePreco").checked = true;
form.requestSubmit();
});
}
if (boutonGardePrecoEtValide != null){
boutonGardePrecoEtValide.addEventListener('click', function(event) {
document.querySelector(".ignorePreco").checked = false;
form.requestSubmit();
});
}
}
function fetchDateLivraisons() {
const urlDateLivraison = document.querySelector("#planTransport").dataset.chemin;
fetch(urlDateLivraison)
.then(response => response.json())
.then(data => {
rebuildSelectDateLivraison(data);
});
}
function rebuildSelectDateLivraison(data) {
const dateLivraisonSelect = document.querySelector("#commande_form_dateLivraison");
const firstOption = dateLivraisonSelect.querySelector("option");
dateLivraisonSelect.innerHTML = "";
dateLivraisonSelect.appendChild(firstOption);
const options = {
dateStyle: "full",
timeZone: 'Europe/Paris'
};
data.forEach(date => {
const dateLivraison = new Date(date.date);
const jourLibelle = dateLivraison.toLocaleDateString('fr-FR', options);
const formatDate = date.date.substring(0, 10);
const option = new Option(jourLibelle, formatDate);
dateLivraisonSelect.appendChild(option);
});
}
function removeProduitPanier(produitPanierId) {
const produitLigne = document.querySelector("#tr_" + produitPanierId);
const familleSlug = produitLigne.dataset.familleSlug;
if (produitLigne) {
window.location.href = produitLigne.dataset.deletePath + "?deleteHashtag=" + familleSlug;
}
}
/***************************************************************************/
/* NP : update 2025-11-12 : refonte récap panier avec localStorage */
/***************************************************************************/
/**
* Mise à jour de la fenetre suivi : ajout du produit si non present, sinon maj de la quantité
*
*/
function ajouteProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche)
{
sauvegardeProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche);
// Récupére en session l'état de la fenetre (et du bouton) : Visible ou non
const recapPanierVisible = localStorage.getItem("recapPanierVisible") ?? "true";
// Ajoute les infos produits dans la fenetre recap, uniquement si fenetre visible
if (recapPanierVisible == "true") {
//ajouteProduitLigneSuiviRecap(produitId, prix, quantite, quantite, quantiteCond, tauxTva, libelle, lienFiche);
loadProduitsRecapPanier();
}
}
function sauvegardeProduitRecapPanier(produitId, prix, quantite, quantiteCond, tauxTva, libelle, lienFiche) {
// Ne pas sauvegarder en localStorage si l'utilisateur est sur la page panier
const quantiteField = document.querySelector("#quantite_" + produitId);
if (quantiteField.dataset.page == "panier") {
return;
}
const recapPanierContenu = localStorage.getItem("recapPanierContenu");
let recapPanierContenuData = [];
let recapPanierContenuDataToSave = [];
if (recapPanierContenu !== '' && recapPanierContenu !== 'null' && recapPanierContenu !== null) {
recapPanierContenuData = JSON.parse(recapPanierContenu);
}
let produitExiste = false;
recapPanierContenuData.forEach(function(element) {
const data = element.split("_");
const elementProduitId = parseInt(data[0]);
const elementProduitPrix = parseFloat(data[1]);
let elementProduitQuantite = parseInt(data[2]);
const elementProduitQuantiteCond = parseInt(data[3]);
const elementProduitTva = parseFloat(data[4]);
const elementProduitLibelle = data[5];
const elementLienFiche = data[6];
if (elementProduitId == produitId) {
elementProduitQuantite = quantite;
produitExiste = true;
}
let ligneRecapPanierToSave = elementProduitId
+ "_" + elementProduitPrix
+ "_" + elementProduitQuantite
+ "_" + elementProduitQuantiteCond
+ "_" + elementProduitTva
+ "_" + elementProduitLibelle
+ "_" + elementLienFiche;
recapPanierContenuDataToSave.push(ligneRecapPanierToSave);
});
if (!produitExiste) {
let produitLibelle = libelle.replace("_","-").replace("'", "\'");
let ligneRecapPanierToSave = produitId + "_" + prix + "_" + quantite + "_" + quantiteCond + "_" + tauxTva + "_" + libelle + "_" + lienFiche;
recapPanierContenuDataToSave.push(ligneRecapPanierToSave);
}
localStorage.setItem("recapPanierContenu", JSON.stringify(recapPanierContenuDataToSave));
}
function supprimeProduitRecapPanierEtRecharge(p_produitId) {
try {
supprimeProduitRecapPanier(p_produitId);
loadProduitsRecapPanier();
} catch (error) {
console.error("Erreur lors de la suppression du produit du recap panier : ", error);
}
}
function supprimeProduitRecapPanier(p_produitId) {
let recapPanierContenu = localStorage.getItem("recapPanierContenu");
let recapPanierContenuData = [];
let recapPanierContenuDataToSave = [];
if (recapPanierContenu !== '') {
recapPanierContenuData = JSON.parse(recapPanierContenu);
}
recapPanierContenuData.forEach(function(element) {
const data = element.split("_");
let elementProduitId = data[0];
// on conserve uniquement les produits différents de celui à supprimer
if (elementProduitId != p_produitId) {
recapPanierContenuDataToSave.push(element);
}
});
localStorage.setItem("recapPanierContenu", JSON.stringify(recapPanierContenuDataToSave));
}
function loadProduitsRecapPanier()
{
effaceContenuPanier();
const recapPanierContenu = localStorage.getItem("recapPanierContenu");
if (recapPanierContenu === null || recapPanierContenu === '' || recapPanierContenu === 'null') {
return;
}
const data = JSON.parse(recapPanierContenu);
data.forEach(function(element) {
const info = element.split("_");
const produitId = info[0];
const prix = info[1];
const quantite = info[2];
const quantiteCond = info[3];
const tauxTva = info[4];
const libelle = info[5].replace("-", "_").replace("\'", "'");
const lienFiche = info[6];
ajouteProduitLigneSuiviRecap(produitId, prix, quantite, quantite, quantiteCond, tauxTva, libelle, lienFiche);
});
calculTotalSuiviRecap();
}
function ajouteProduitLigneSuiviRecap(p_produitId, p_prix, p_quantite, p_quantitePrecedente, p_quantiteCond, p_tauxTva, p_libelle, p_lienFiche)
{
const contenuSuivi = document.querySelector("#suiviPanier .contenu");
// Si le panier récap n'est pas présent, on ne fait rien (cas si on est sur la page panier par exemple)
if (contenuSuivi === null) {
return;
}
contenuSuivi.innerHTML +=
"<div id='blocProduit" + p_produitId + "' class='col-11 ligneProduitPanier mx-2 my-1'>"
+ "<i class='d-inline col-1 fa-solid fa-circle-xmark supprimeSuivi mr-1 charte_couleur_primaire' data-produitid='"+ p_produitId +"'></i>"
+ "<a href='" + p_lienFiche + "' class='lien_defaut charte_couleur_primaire ms-1'>"
+ "<span id='suiviProduit" + p_produitId
+ "' class='d-inline col-10 ligneProduit fw-bold' data-produitid='" + p_produitId
+ "' data-prix='" + p_prix
+ "' data-quantitecond='" + p_quantiteCond
+ "' data-quantite='" + p_quantite
+ "' data-quantiteprec='" + p_quantitePrecedente
+ "' data-tauxtva='" + p_tauxTva
+ "' data-libelle='" + p_libelle
+ "' data-lienfiche='" + p_lienFiche
+ "'>"
+ p_libelle + " : " + p_quantite
+ "</span>"
+ "</a>"
+"</div>";
const inputQuantites = document.querySelectorAll(".inputQuantite[data-produitid='" + p_produitId + "']");
if (inputQuantites.length > 0) {
inputQuantites.forEach(function(inputQuantite) {
inputQuantite.value = p_quantite;
});
}
}
/**
* Ajout des produits sélectionnés présents dans la fenetre de recap au panier
*/
function ajouteProduitsRecapPanier()
{
const boutonAjoutFenetreChariot = document.querySelector("#boutonAjoutFenetreChariot");
const contenuRecapPanier = document.querySelectorAll("#suiviPanier .ligneProduit");
const chemin = boutonAjoutFenetreChariot.dataset.chemin;
let listeProduits = [];
contenuRecapPanier.forEach(function(element) {
const produitId = element.getAttribute("data-produitid");
const quantite = element.getAttribute("data-quantite");
if (quantite <= 0) {
return;
}
listeProduits.push({
"produit" : produitId,
"quantite" : quantite
});
});
if (listeProduits.length <= 0) {
$.notify("Aucun produit sélectionné", "warning");
return false;
}
return ajouteProduitsPanier(listeProduits, chemin);
}
document.addEventListener("DOMContentLoaded", function() {
// Gestion de l'historique du navigateur : recharge le panier dans tous les cas
document.addEventListener("visibilitychange", function(event) {
effaceContenuPanier();
loadProduitsRecapPanier();
});
// Initialisation du bouton de mise en panier
const boutonAjoutFenetreChariot = document.querySelector("#boutonAjoutFenetreChariot");
if (boutonAjoutFenetreChariot != null) {
boutonAjoutFenetreChariot.addEventListener("click", function(event) {
if (ajouteProduitsRecapPanier()) {
videSuiviPanier();
effaceChampsQuantites();
}
});
}// if
});
</script>
<script>
var carousselNouveautes = null;
// document.ready
document.addEventListener("DOMContentLoaded", function() {
// Chargement des composants React
// activePanierCompteur(".panierCompteur");
// Initialisation des boutons favoris
initialiseBoutonsFavori();
initialiseCarrousel("carousselNouveautes", true);
initialiseCarrousel("carousselTops");
initialiseCarrousel("carousselRecurrents");
initialiseCarrousel("carousselPromotions");
// Initialise la mise à jour auto des prix (cas de tarif quantitatif)
initialiseMAJPrixQuantite();
// Initialisation des boutons ajout panier
initialiseAjoutPanierCartes();
// Initialisation des flèches
gestionFlechesInput();
// Cache par défaut la fenetre suivi panier sur l'accueil
// afficheSuiviPanier("true");
// Gestion du la redirection vers le top région sélectionné
let select = document.querySelector("#selectionregion")
if(select != null) {
select.addEventListener("change",function(event)
{
regionSelectionnee = event.target.selectedOptions[0];
let url = new URL(regionSelectionnee.dataset.url);
let params = new URLSearchParams(url.search);
// params.append('region', event.target.value);
urlEnvoyee = url.toString() + "?" + params.toString()
document.location = urlEnvoyee;
});
}// if
});// ready
</script>
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PSQRPHDD"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="modal fade" id="scanModal" tabindex="-1" aria-labelledby="scanModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Scan de code</h1>
<button type="button" class="btn-close" onclick="scanner()" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div id="reader">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary closeModal" data-bs-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<div class="container main overflow-hidden">
<script src="https://unpkg.com/html5-qrcode@2.0.9/dist/html5-qrcode.min.js"></script>
<script>
// document.ready
document.addEventListener("DOMContentLoaded", function() {
// Variables à modifier selon préférences. Id de la barre de recherche à modifier dans la fonction onScanSuccess
const IDdivAModifier = "reader"
const cheminImage = "/assets/img/camera.png"
const tradBouton = "Demande d'accès à l'appareil photo"
const tradLienPhoto = "Scan à partir de l'appareil photo"
const tradLienImage = "Scan à partir d'un fichier image"
const boutonScan = "#boutonScan"
// Lancement du script qrcodescanner
let html5QrcodeScanner = new Html5QrcodeScanner(
IDdivAModifier, { fps: 10, qrbox: 250 })
html5QrcodeScanner.render(onScanSuccess)
// Sélection des éléments pour les traduire
const boutonAccesAppareilPhoto = document.querySelector("#" + IDdivAModifier + "__dashboard_section_csr button")
const changerSourceImage = document.querySelector("#" + IDdivAModifier + "__dashboard_section_swaplink")
const header = document.querySelector("#" + IDdivAModifier + " div")
const photoCamera = document.querySelector("#" + IDdivAModifier + "__scan_region")
const selectImage = document.querySelector("#" + IDdivAModifier + "__dashboard_section_fsr span")
// Supression du lien vers l'application
const divHeader = document.querySelector("#" + IDdivAModifier + " span")
divHeader.remove()
selectImage.remove()
// Traduction des éléments
boutonAccesAppareilPhoto.innerHTML = tradBouton
changerSourceImage.innerHTML = tradLienImage
// Mise en page et affichage de notre image à la place de celle d'origine qui n'est plus en ligne
const br = document.createElement("br")
photoCamera.appendChild(br);
const img = document.createElement("img")
img.src = cheminImage
img.width = "64"
img.style = 'opacity: 0.3;'
photoCamera.appendChild(img)
// Modification de la mise en page et de la traduction à chaque fois que l'on clique sur le changement de source
changerSourceImage.onclick = function() {
const photoCameraImg = document.querySelector("#" + IDdivAModifier + "__scan_region img")
const divphotoCamera = document.querySelector("#" + IDdivAModifier + "__scan_region")
if(photoCameraImg != null) {
divphotoCamera.appendChild(br);
photoCameraImg.src = cheminImage;
} else{
divphotoCamera.appendChild(br);
divphotoCamera.appendChild(img);
}// if
if(changerSourceImage.innerHTML == "Scan using camera directly") {
changerSourceImage.innerHTML = tradLienPhoto;
} else {
changerSourceImage.innerHTML = tradLienImage;
}// if
}// function
});// ready
// Fonction appelée quand un scan de code a réussi
function onScanSuccess(decodedText, decodedResult) {
// console.log(`Code scanned = ${decodedText}`, decodedResult);
// Sélection de la barre de recherche et ajout du code barre scanné
const recherche = document.querySelector("#barreRecherche")
recherche.value = decodedText
// Fermeture du modal et focus sur la barre de recherche
const modal = document.querySelector(".closeModal")
modal.click()
recherche.focus()
}// function
</script>
<header>
<div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
<a href="/eshop/accueil" class="logo d-flex align-items-center me-md-auto bg-white text-decoration-none">
<img src="/assets/img/logo.jpg" alt="Millesime 86">
</a>
<div id="recherche" class="" data-bs-auto-close="outside" style="z-index: 10;">
<form class="search ms-md-auto me-auto" action="/eshop/recherche/" method="GET">
<div class="input-group recherche">
<input type="search" autocomplete="off" id="barreRecherche" name="q" class="form-control border-0 dropdown-toggle" value=""
placeholder="Rechercher..." aria-label="Rechercher" role="button">
<div class="p-2">
<div id="chargeRecherche" class="spinner-border spinner-border-sm charte_couleur_secondaire invisible" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<a type="button" id="boutonScan" class="my-1 align-baseline border-0"
data-bs-toggle="modal" data-bs-target="#scanModal">
<img class="codebarre me-1" src="/assets/img/barcode-scan-icon.svg" width="35" style="margin-top: 1px" />
</a>
<button type="submit" class="btn recherche my-1 rounded-pill"><i class="fa-solid fa-magnifying-glass"></i></button>
<div class="dropdown-menu dropdownRecherche">
<div id="listeRecherche" class="row mx-2">
</div>
</div>
</div>
</form>
</div>
<ul class="nav top ms-auto justify-content-center my-md-0 text-small" style="z-index: 9;">
<li>
<a id="btnCreation" class="btn rounded-0" href="https://www.relais-vert.com/devenir-client" target="_blank" role="button">
<span>Devenir client</span>
</a>
</li>
<li>
<a id="btnConnexion" class="btn rounded-0" href="/eshop/login" role="button">
<span>Déjà client ? Connectez-vous</span>
</a>
</li>
</ul>
</div>
</header>
<nav class="navbar navbar-expand-lg bg-light" style="z-index: 5;">
<div class="container-fluid g-0">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item home pt-2">
<a class="navbar-brand" href="/eshop/accueil">ACCUEIL</a>
</li>
<li class="nav-item px-3 dropdown has-megamenu">
<a class="nav-link dropdown-toggle lien_megamenu_desktop"
href="/eshop/catalogue/frais/1.fam">Frais</a>
<a class="nav-link dropdown-toggle lien_megamenu_mobile" data-bs-toggle="dropdown"
href="/eshop/catalogue/frais/1.fam">Frais</a>
<div id="menuDropdown" class="dropdown-menu megamenu overflow-auto" role="menu">
<ul class="row">
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-produits-de-la-mer/17.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS DE LA MER</strong></a>
</div>
<a href="/eshop/catalogue/frais-produits-de-la-mer-algues/103.fam" class="text-nowrap lien_megamenu" role="button">
Algues
</a>
<a href="/eshop/catalogue/frais-produits-de-la-mer-crustaces/104.fam" class="text-nowrap lien_megamenu" role="button">
Crustacés
</a>
<a href="/eshop/catalogue/frais-produits-de-la-mer-hors-d-oeuvre/101.fam" class="text-nowrap lien_megamenu" role="button">
Hors d'œuvre
</a>
<a href="/eshop/catalogue/frais-produits-de-la-mer-poisson/102.fam" class="text-nowrap lien_megamenu" role="button">
Poisson
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-produits-frais/16.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS FRAIS</strong></a>
</div>
<a href="/eshop/catalogue/frais-produits-frais-accessoires/32.fam" class="text-nowrap lien_megamenu" role="button">
Accessoires
</a>
<a href="/eshop/catalogue/frais-produits-frais-aides-culinaires/37.fam" class="text-nowrap lien_megamenu" role="button">
Aides Culinaires
</a>
<a href="/eshop/catalogue/frais-produits-frais-boulangerie/34.fam" class="text-nowrap lien_megamenu" role="button">
Boulangerie
</a>
<a href="/eshop/catalogue/frais-produits-frais-charcuterie-vegetale/45.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie végétale
</a>
<a href="/eshop/catalogue/frais-produits-frais-condiments/41.fam" class="text-nowrap lien_megamenu" role="button">
Condiments
</a>
<a href="/eshop/catalogue/frais-produits-frais-cremerie-vegetale/44.fam" class="text-nowrap lien_megamenu" role="button">
Crèmerie végétale
</a>
<a href="/eshop/catalogue/frais-produits-frais-desserts/28.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/frais-produits-frais-graines-germees/36.fam" class="text-nowrap lien_megamenu" role="button">
Graines germées
</a>
<a href="/eshop/catalogue/frais-produits-frais-hors-d-oeuvre/33.fam" class="text-nowrap lien_megamenu" role="button">
Hors d'oeuvre
</a>
<a href="/eshop/catalogue/frais-produits-frais-legumes/40.fam" class="text-nowrap lien_megamenu" role="button">
Légumes
</a>
<a href="/eshop/catalogue/frais-produits-frais-liquides/35.fam" class="text-nowrap lien_megamenu" role="button">
Liquides
</a>
<a href="/eshop/catalogue/frais-produits-frais-pates-fraiches/29.fam" class="text-nowrap lien_megamenu" role="button">
Pâtes fraîches
</a>
<a href="/eshop/catalogue/frais-produits-frais-plv/43.fam" class="text-nowrap lien_megamenu" role="button">
PLV
</a>
<a href="/eshop/catalogue/frais-produits-frais-produits-de-la-ruche/38.fam" class="text-nowrap lien_megamenu" role="button">
Produits de la ruche
</a>
<a href="/eshop/catalogue/frais-produits-frais-produits-traiteurs/30.fam" class="text-nowrap lien_megamenu" role="button">
Produits traiteurs
</a>
<a href="/eshop/catalogue/frais-produits-frais-tofu-tempeh-seitan/46.fam" class="text-nowrap lien_megamenu" role="button">
Tofu/tempeh/Seitan
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-produits-frais-festifs/18.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS FRAIS FESTIFS</strong></a>
</div>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-produits-laitiers/19.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS LAITIERS</strong></a>
</div>
<a href="/eshop/catalogue/frais-produits-laitiers-beurres/150.fam" class="text-nowrap lien_megamenu" role="button">
Beurres
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-cremes-fraiches/149.fam" class="text-nowrap lien_megamenu" role="button">
Crèmes fraîches
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-desserts/151.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-fromages/148.fam" class="text-nowrap lien_megamenu" role="button">
Fromages
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-fromages-blancs/153.fam" class="text-nowrap lien_megamenu" role="button">
Fromages blancs
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-lait/147.fam" class="text-nowrap lien_megamenu" role="button">
Lait
</a>
<a href="/eshop/catalogue/frais-produits-laitiers-yaourts/152.fam" class="text-nowrap lien_megamenu" role="button">
Yaourts
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-viandes/20.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>VIANDES</strong></a>
</div>
<a href="/eshop/catalogue/frais-viandes-boeuf/156.fam" class="text-nowrap lien_megamenu" role="button">
Boeuf
</a>
<a href="/eshop/catalogue/frais-viandes-charcuterie/154.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie
</a>
<a href="/eshop/catalogue/frais-viandes-porc/155.fam" class="text-nowrap lien_megamenu" role="button">
Porc
</a>
<a href="/eshop/catalogue/frais-viandes-service-arriere/163.fam" class="text-nowrap lien_megamenu" role="button">
Service arrière
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/frais-volailles/21.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>VOLAILLES</strong></a>
</div>
<a href="/eshop/catalogue/frais-volailles-abats/170.fam" class="text-nowrap lien_megamenu" role="button">
Abats
</a>
<a href="/eshop/catalogue/frais-volailles-canard/168.fam" class="text-nowrap lien_megamenu" role="button">
Canard
</a>
<a href="/eshop/catalogue/frais-volailles-charcuterie/167.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie
</a>
<a href="/eshop/catalogue/frais-volailles-dinde/164.fam" class="text-nowrap lien_megamenu" role="button">
Dinde
</a>
<a href="/eshop/catalogue/frais-volailles-poulet/166.fam" class="text-nowrap lien_megamenu" role="button">
Poulet
</a>
<a href="/eshop/catalogue/frais-volailles-produits-traiteur/169.fam" class="text-nowrap lien_megamenu" role="button">
Produits traiteur
</a>
<a href="/eshop/catalogue/frais-volailles-service-arriere/171.fam" class="text-nowrap lien_megamenu" role="button">
Service arrière
</a>
</div>
</li>
</ul>
<div>
</li>
<li class="nav-item px-3 dropdown has-megamenu">
<a class="nav-link dropdown-toggle lien_megamenu_desktop"
href="/eshop/catalogue/sec/2.fam">Sec</a>
<a class="nav-link dropdown-toggle lien_megamenu_mobile" data-bs-toggle="dropdown"
href="/eshop/catalogue/sec/2.fam">Sec</a>
<div id="menuDropdown" class="dropdown-menu megamenu overflow-auto" role="menu">
<ul class="row">
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/sec-cosmetique-hygiene/26.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>COSMÉTIQUE & HYGIÈNE</strong></a>
</div>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-cheveux/138.fam" class="text-nowrap lien_megamenu" role="button">
Cheveux
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-corps/139.fam" class="text-nowrap lien_megamenu" role="button">
Corps
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-hygiene/142.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-hygiene-bebe-soins-maternite/145.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène bébé, soins maternité
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-hygiene-buccale/143.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène buccale
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-hygiene-feminine/141.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène féminine
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-plv/137.fam" class="text-nowrap lien_megamenu" role="button">
PLV
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-testeurs/136.fam" class="text-nowrap lien_megamenu" role="button">
Testeurs
</a>
<a href="/eshop/catalogue/sec-cosmetique-hygiene-visage/140.fam" class="text-nowrap lien_megamenu" role="button">
Visage
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/sec-entretien-maison/23.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>ENTRETIEN / MAISON</strong></a>
</div>
<a href="/eshop/catalogue/sec-entretien-maison-droguerie-ecologique/59.fam" class="text-nowrap lien_megamenu" role="button">
Droguerie écologique
</a>
<a href="/eshop/catalogue/sec-entretien-maison-entretien-menager/55.fam" class="text-nowrap lien_megamenu" role="button">
Entretien ménager
</a>
<a href="/eshop/catalogue/sec-entretien-maison-maison/58.fam" class="text-nowrap lien_megamenu" role="button">
Maison
</a>
<a href="/eshop/catalogue/sec-entretien-maison-plv/57.fam" class="text-nowrap lien_megamenu" role="button">
PLV
</a>
<a href="/eshop/catalogue/sec-entretien-maison-textile/60.fam" class="text-nowrap lien_megamenu" role="button">
Textile
</a>
<a href="/eshop/catalogue/sec-entretien-maison-vrac/61.fam" class="text-nowrap lien_megamenu" role="button">
Vrac
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/sec/24.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>ÉPICERIE</strong></a>
</div>
<a href="/eshop/catalogue/sec-epicerie-accessoires/62.fam" class="text-nowrap lien_megamenu" role="button">
Accessoires
</a>
<a href="/eshop/catalogue/sec-epicerie-aides-culinaires/91.fam" class="text-nowrap lien_megamenu" role="button">
Aides culinaires
</a>
<a href="/eshop/catalogue/sec-epicerie-alimentation-infantile/63.fam" class="text-nowrap lien_megamenu" role="button">
Alimentation infantile
</a>
<a href="/eshop/catalogue/sec-epicerie-barres/64.fam" class="text-nowrap lien_megamenu" role="button">
Barres
</a>
<a href="/eshop/catalogue/sec-epicerie-biscuits-aperitifs/99.fam" class="text-nowrap lien_megamenu" role="button">
Biscuits apéritifs
</a>
<a href="/eshop/catalogue/sec-epicerie-biscuits-gateaux/65.fam" class="text-nowrap lien_megamenu" role="button">
Biscuits/gâteaux
</a>
<a href="/eshop/catalogue/sec-epicerie-boissons-chaudes/98.fam" class="text-nowrap lien_megamenu" role="button">
Boissons chaudes
</a>
<a href="/eshop/catalogue/sec-epicerie-cereales/67.fam" class="text-nowrap lien_megamenu" role="button">
Céréales
</a>
<a href="/eshop/catalogue/sec-epicerie-cereales-petit-dejeuner/68.fam" class="text-nowrap lien_megamenu" role="button">
Céréales petit déjeuner
</a>
<a href="/eshop/catalogue/sec-epicerie-condiments/69.fam" class="text-nowrap lien_megamenu" role="button">
Condiments
</a>
<a href="/eshop/catalogue/sec-epicerie-confiserie/88.fam" class="text-nowrap lien_megamenu" role="button">
Confiserie
</a>
<a href="/eshop/catalogue/sec-epicerie-conserves-fruits/89.fam" class="text-nowrap lien_megamenu" role="button">
Conserves fruits
</a>
<a href="/eshop/catalogue/sec-epicerie-conserves-legumes/90.fam" class="text-nowrap lien_megamenu" role="button">
Conserves légumes
</a>
<a href="/eshop/catalogue/sec-epicerie-conserves-produits-de-la-mer/96.fam" class="text-nowrap lien_megamenu" role="button">
Conserves produits de la mer
</a>
<a href="/eshop/catalogue/sec-epicerie-desserts/70.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/sec-epicerie-divers/83.fam" class="text-nowrap lien_megamenu" role="button">
Divers
</a>
<a href="/eshop/catalogue/sec-epicerie-edulcorants/71.fam" class="text-nowrap lien_megamenu" role="button">
Édulcorants
</a>
<a href="/eshop/catalogue/sec-epicerie-farines/72.fam" class="text-nowrap lien_megamenu" role="button">
Farines
</a>
<a href="/eshop/catalogue/sec-epicerie-fruits-secs/73.fam" class="text-nowrap lien_megamenu" role="button">
Fruits Secs
</a>
<a href="/eshop/catalogue/sec-epicerie-galettes/93.fam" class="text-nowrap lien_megamenu" role="button">
Galettes
</a>
<a href="/eshop/catalogue/sec-epicerie-graines-a-germer/74.fam" class="text-nowrap lien_megamenu" role="button">
Graines à germer
</a>
<a href="/eshop/catalogue/sec-epicerie-hors-d-oeuvre/87.fam" class="text-nowrap lien_megamenu" role="button">
Hors d'oeuvre
</a>
<a href="/eshop/catalogue/sec-epicerie-huiles/75.fam" class="text-nowrap lien_megamenu" role="button">
Huiles
</a>
<a href="/eshop/catalogue/sec-epicerie-legumineuses/76.fam" class="text-nowrap lien_megamenu" role="button">
Légumineuses
</a>
<a href="/eshop/catalogue/sec-epicerie-liquides/66.fam" class="text-nowrap lien_megamenu" role="button">
Liquides
</a>
<a href="/eshop/catalogue/sec-epicerie-oleagineux/77.fam" class="text-nowrap lien_megamenu" role="button">
Oléagineux
</a>
<a href="/eshop/catalogue/sec-epicerie-pains-tartines-biscottes/92.fam" class="text-nowrap lien_megamenu" role="button">
Pains/tartines/biscottes
</a>
<a href="/eshop/catalogue/sec-epicerie-pates/78.fam" class="text-nowrap lien_megamenu" role="button">
Pâtes
</a>
<a href="/eshop/catalogue/sec-epicerie-plantes-reglementees/86.fam" class="text-nowrap lien_megamenu" role="button">
Plantes réglementées
</a>
<a href="/eshop/catalogue/sec-epicerie-plats-prepares/95.fam" class="text-nowrap lien_megamenu" role="button">
Plats préparés
</a>
<a href="/eshop/catalogue/sec-epicerie-plv/85.fam" class="text-nowrap lien_megamenu" role="button">
PLV
</a>
<a href="/eshop/catalogue/sec-epicerie-produits-pour-animaux/79.fam" class="text-nowrap lien_megamenu" role="button">
Produits pour animaux
</a>
<a href="/eshop/catalogue/sec-epicerie-riz/80.fam" class="text-nowrap lien_megamenu" role="button">
Riz
</a>
<a href="/eshop/catalogue/sec-epicerie-soupes-potages-veloutes/81.fam" class="text-nowrap lien_megamenu" role="button">
Soupes/Potages/Veloutés
</a>
<a href="/eshop/catalogue/sec-epicerie-sucres/82.fam" class="text-nowrap lien_megamenu" role="button">
Sucres
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/sec-produits-secs-festifs/25.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS SECS FESTIFS</strong></a>
</div>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/sec-sante-bien-etre/27.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>SANTÉ BIEN-ÊTRE</strong></a>
</div>
<a href="/eshop/catalogue/sec-sante-bien-etre-aromatherapie/174.fam" class="text-nowrap lien_megamenu" role="button">
Aromathérapie
</a>
<a href="/eshop/catalogue/sec-sante-bien-etre-complements-alimentaires/172.fam" class="text-nowrap lien_megamenu" role="button">
Compléments Alimentaires
</a>
<a href="/eshop/catalogue/sec-sante-bien-etre-encens-autres/175.fam" class="text-nowrap lien_megamenu" role="button">
Encens - Autres
</a>
<a href="/eshop/catalogue/sec-sante-bien-etre-nutrition/177.fam" class="text-nowrap lien_megamenu" role="button">
Nutrition
</a>
<a href="/eshop/catalogue/sec-sante-bien-etre-produits-de-la-ruche/173.fam" class="text-nowrap lien_megamenu" role="button">
Produits de la Ruche
</a>
<a href="/eshop/catalogue/sec-sante-bien-etre-soins-externes/178.fam" class="text-nowrap lien_megamenu" role="button">
Soins externes
</a>
</div>
</li>
</ul>
<div>
</li>
<li class="nav-item px-3 dropdown has-megamenu">
<a class="nav-link dropdown-toggle lien_megamenu_desktop"
href="/eshop/catalogue/vrac/756.fam">Vrac</a>
<a class="nav-link dropdown-toggle lien_megamenu_mobile" data-bs-toggle="dropdown"
href="/eshop/catalogue/vrac/756.fam">Vrac</a>
<div id="menuDropdown" class="dropdown-menu megamenu overflow-auto" role="menu">
<ul class="row">
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-cosmetique-hygiene/764.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>COSMÉTIQUE & HYGIÈNE</strong></a>
</div>
<a href="/eshop/catalogue/vrac-cosmetique-hygiene-cheveux/808.fam" class="text-nowrap lien_megamenu" role="button">
Cheveux
</a>
<a href="/eshop/catalogue/vrac-cosmetique-hygiene-corps/809.fam" class="text-nowrap lien_megamenu" role="button">
Corps
</a>
<a href="/eshop/catalogue/vrac-cosmetique-hygiene-hygiene/828.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène
</a>
<a href="/eshop/catalogue/vrac-cosmetique-hygiene-hygiene-buccale/829.fam" class="text-nowrap lien_megamenu" role="button">
Hygiène buccale
</a>
<a href="/eshop/catalogue/vrac-cosmetique-hygiene-plv/807.fam" class="text-nowrap lien_megamenu" role="button">
PLV
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-entretien-maison/758.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>ENTRETIEN / MAISON</strong></a>
</div>
<a href="/eshop/catalogue/vrac-entretien-maison-droguerie-ecologique/830.fam" class="text-nowrap lien_megamenu" role="button">
Droguerie écologique
</a>
<a href="/eshop/catalogue/vrac-entretien-maison-entretien-menager/778.fam" class="text-nowrap lien_megamenu" role="button">
Entretien ménager
</a>
<a href="/eshop/catalogue/vrac-entretien-maison-maison/810.fam" class="text-nowrap lien_megamenu" role="button">
Maison
</a>
<a href="/eshop/catalogue/vrac-entretien-maison-textile/831.fam" class="text-nowrap lien_megamenu" role="button">
Textile
</a>
<a href="/eshop/catalogue/vrac-entretien-maison-vrac/840.fam" class="text-nowrap lien_megamenu" role="button">
Vrac
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-epicerie/759.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>ÉPICERIE</strong></a>
</div>
<a href="/eshop/catalogue/vrac-epicerie-aides-culinaires/805.fam" class="text-nowrap lien_megamenu" role="button">
Aides culinaires
</a>
<a href="/eshop/catalogue/vrac-epicerie-alimentation-infantile/1024.fam" class="text-nowrap lien_megamenu" role="button">
Alimentation infantile
</a>
<a href="/eshop/catalogue/vrac-epicerie-barres/1003.fam" class="text-nowrap lien_megamenu" role="button">
Barres
</a>
<a href="/eshop/catalogue/vrac-epicerie-biscuits-aperitifs/822.fam" class="text-nowrap lien_megamenu" role="button">
Biscuits apéritifs
</a>
<a href="/eshop/catalogue/vrac-epicerie-biscuits-gateaux/770.fam" class="text-nowrap lien_megamenu" role="button">
Biscuits/gâteaux
</a>
<a href="/eshop/catalogue/vrac-epicerie-boissons-chaudes/821.fam" class="text-nowrap lien_megamenu" role="button">
Boissons chaudes
</a>
<a href="/eshop/catalogue/vrac-epicerie-cereales/772.fam" class="text-nowrap lien_megamenu" role="button">
Céréales
</a>
<a href="/eshop/catalogue/vrac-epicerie-cereales-petit-dejeuner/773.fam" class="text-nowrap lien_megamenu" role="button">
Céréales petit déjeuner
</a>
<a href="/eshop/catalogue/vrac-epicerie-condiments/774.fam" class="text-nowrap lien_megamenu" role="button">
Condiments
</a>
<a href="/eshop/catalogue/vrac-epicerie-confiserie/802.fam" class="text-nowrap lien_megamenu" role="button">
Confiserie
</a>
<a href="/eshop/catalogue/vrac-epicerie-conserves-fruits/803.fam" class="text-nowrap lien_megamenu" role="button">
Conserves fruits
</a>
<a href="/eshop/catalogue/vrac-epicerie-conserves-legumes/804.fam" class="text-nowrap lien_megamenu" role="button">
Conserves légumes
</a>
<a href="/eshop/catalogue/vrac-epicerie-conserves-produits-de-la-mer/814.fam" class="text-nowrap lien_megamenu" role="button">
Conserves produits de la mer
</a>
<a href="/eshop/catalogue/vrac-epicerie-desserts/775.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/vrac-epicerie-edulcorants/777.fam" class="text-nowrap lien_megamenu" role="button">
Édulcorants
</a>
<a href="/eshop/catalogue/vrac-epicerie-farines/779.fam" class="text-nowrap lien_megamenu" role="button">
Farines
</a>
<a href="/eshop/catalogue/vrac-epicerie-fruits-secs/780.fam" class="text-nowrap lien_megamenu" role="button">
Fruits Secs
</a>
<a href="/eshop/catalogue/vrac-epicerie-galettes/1036.fam" class="text-nowrap lien_megamenu" role="button">
Galettes
</a>
<a href="/eshop/catalogue/vrac-epicerie-graines-a-germer/1035.fam" class="text-nowrap lien_megamenu" role="button">
Graines à germer
</a>
<a href="/eshop/catalogue/vrac-epicerie-hors-d-oeuvre/801.fam" class="text-nowrap lien_megamenu" role="button">
Hors d'oeuvre
</a>
<a href="/eshop/catalogue/vrac-epicerie-huiles/781.fam" class="text-nowrap lien_megamenu" role="button">
Huiles
</a>
<a href="/eshop/catalogue/vrac-epicerie-legumineuses/782.fam" class="text-nowrap lien_megamenu" role="button">
Légumineuses
</a>
<a href="/eshop/catalogue/vrac-epicerie-liquides/771.fam" class="text-nowrap lien_megamenu" role="button">
Liquides
</a>
<a href="/eshop/catalogue/vrac-epicerie-oleagineux/783.fam" class="text-nowrap lien_megamenu" role="button">
Oléagineux
</a>
<a href="/eshop/catalogue/vrac-epicerie-pains-tartines-biscottes/806.fam" class="text-nowrap lien_megamenu" role="button">
Pains/tartines/biscottes
</a>
<a href="/eshop/catalogue/vrac-epicerie-pates/784.fam" class="text-nowrap lien_megamenu" role="button">
Pâtes
</a>
<a href="/eshop/catalogue/vrac-epicerie-riz/788.fam" class="text-nowrap lien_megamenu" role="button">
Riz
</a>
<a href="/eshop/catalogue/vrac-epicerie-soupes-potages-veloutes/1025.fam" class="text-nowrap lien_megamenu" role="button">
Soupes/Potages/Veloutés
</a>
<a href="/eshop/catalogue/vrac-epicerie-sucres/789.fam" class="text-nowrap lien_megamenu" role="button">
Sucres
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-fruits-secs-vracs/762.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>FRUITS SECS VRACS</strong></a>
</div>
<a href="/eshop/catalogue/vrac-fruits-secs-vracs-fruits-secs-vrac/790.fam" class="text-nowrap lien_megamenu" role="button">
Fruits secs vrac
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-oeufs/769.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>OEUFS</strong></a>
</div>
<a href="/eshop/catalogue/vrac-oeufs-oeufs/819.fam" class="text-nowrap lien_megamenu" role="button">
OEUFS
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-produits-de-la-mer/760.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS DE LA MER</strong></a>
</div>
<a href="/eshop/catalogue/vrac-produits-de-la-mer-algues/800.fam" class="text-nowrap lien_megamenu" role="button">
Algues
</a>
<a href="/eshop/catalogue/vrac-produits-de-la-mer-crustaces/1038.fam" class="text-nowrap lien_megamenu" role="button">
Crustacés
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-produits-frais/757.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS FRAIS</strong></a>
</div>
<a href="/eshop/catalogue/vrac-produits-frais-aides-culinaires/818.fam" class="text-nowrap lien_megamenu" role="button">
Aides Culinaires
</a>
<a href="/eshop/catalogue/vrac-produits-frais-boulangerie/793.fam" class="text-nowrap lien_megamenu" role="button">
Boulangerie
</a>
<a href="/eshop/catalogue/vrac-produits-frais-charcuterie-vegetale/834.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie végétale
</a>
<a href="/eshop/catalogue/vrac-produits-frais-condiments/824.fam" class="text-nowrap lien_megamenu" role="button">
Condiments
</a>
<a href="/eshop/catalogue/vrac-produits-frais-cremerie-vegetale/833.fam" class="text-nowrap lien_megamenu" role="button">
Crèmerie végétale
</a>
<a href="/eshop/catalogue/vrac-produits-frais-desserts/776.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/vrac-produits-frais-graines-germees/811.fam" class="text-nowrap lien_megamenu" role="button">
Graines germées
</a>
<a href="/eshop/catalogue/vrac-produits-frais-hors-d-oeuvre/792.fam" class="text-nowrap lien_megamenu" role="button">
Hors d'oeuvre
</a>
<a href="/eshop/catalogue/vrac-produits-frais-pates-fraiches/785.fam" class="text-nowrap lien_megamenu" role="button">
Pâtes fraîches
</a>
<a href="/eshop/catalogue/vrac-produits-frais-produits-traiteurs/787.fam" class="text-nowrap lien_megamenu" role="button">
Produits traiteurs
</a>
<a href="/eshop/catalogue/vrac-produits-frais-tofu-tempeh-seitan/835.fam" class="text-nowrap lien_megamenu" role="button">
Tofu/tempeh/Seitan
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-produits-frais-festifs/761.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS FRAIS FESTIFS</strong></a>
</div>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-produits-laitiers/765.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>PRODUITS LAITIERS</strong></a>
</div>
<a href="/eshop/catalogue/vrac-produits-laitiers-beurres/826.fam" class="text-nowrap lien_megamenu" role="button">
Beurres
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-cremes-fraiches/825.fam" class="text-nowrap lien_megamenu" role="button">
Crèmes fraîches
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-desserts/827.fam" class="text-nowrap lien_megamenu" role="button">
Desserts
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-fromages/812.fam" class="text-nowrap lien_megamenu" role="button">
Fromages
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-fromages-blancs/837.fam" class="text-nowrap lien_megamenu" role="button">
Fromages blancs
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-lait/794.fam" class="text-nowrap lien_megamenu" role="button">
Lait
</a>
<a href="/eshop/catalogue/vrac-produits-laitiers-yaourts/836.fam" class="text-nowrap lien_megamenu" role="button">
Yaourts
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-sante-bien-etre/768.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>SANTÉ BIEN-ÊTRE</strong></a>
</div>
<a href="/eshop/catalogue/vrac-sante-bien-etre-complements-alimentaires/1007.fam" class="text-nowrap lien_megamenu" role="button">
Compléments Alimentaires
</a>
<a href="/eshop/catalogue/vrac-sante-bien-etre-encens-autres/1037.fam" class="text-nowrap lien_megamenu" role="button">
Encens - Autres
</a>
<a href="/eshop/catalogue/vrac-sante-bien-etre-soins-externes/832.fam" class="text-nowrap lien_megamenu" role="button">
Soins externes
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-viandes/766.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>VIANDES</strong></a>
</div>
<a href="/eshop/catalogue/vrac-viandes-charcuterie/795.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie
</a>
<a href="/eshop/catalogue/vrac-viandes-porc/796.fam" class="text-nowrap lien_megamenu" role="button">
Porc
</a>
<a href="/eshop/catalogue/vrac-viandes-service-arriere/839.fam" class="text-nowrap lien_megamenu" role="button">
Service arrière
</a>
</div>
</li>
<li class="col-lg-2 overflow-hidden">
<div class="row">
<div class="col-12 titre_megamenu mx-1 mb-2 p-2">
<a href="/eshop/catalogue/vrac-volailles/767.fam" class="text-nowrap lien_defaut charte_couleur_secondaire"
role="button"><strong>VOLAILLES</strong></a>
</div>
<a href="/eshop/catalogue/vrac-volailles-abats/817.fam" class="text-nowrap lien_megamenu" role="button">
Abats
</a>
<a href="/eshop/catalogue/vrac-volailles-canard/815.fam" class="text-nowrap lien_megamenu" role="button">
Canard
</a>
<a href="/eshop/catalogue/vrac-volailles-charcuterie/813.fam" class="text-nowrap lien_megamenu" role="button">
Charcuterie
</a>
<a href="/eshop/catalogue/vrac-volailles-dinde/797.fam" class="text-nowrap lien_megamenu" role="button">
Dinde
</a>
<a href="/eshop/catalogue/vrac-volailles-poulet/799.fam" class="text-nowrap lien_megamenu" role="button">
Poulet
</a>
<a href="/eshop/catalogue/vrac-volailles-produits-traiteur/816.fam" class="text-nowrap lien_megamenu" role="button">
Produits traiteur
</a>
<a href="/eshop/catalogue/vrac-volailles-service-arriere/838.fam" class="text-nowrap lien_megamenu" role="button">
Service arrière
</a>
</div>
</li>
</ul>
<div>
</li>
</ul>
<ul class="navbar-nav special">
<li class="nav-item mercu"><a href="/eshop/mercuriale/" class="nav-link">Mercuriale</a></li>
<li class="nav-item new"><a href="/eshop/catalogue/liste/nouveautes.lst" class="nav-link">Nouveautés</a></li>
</ul>
</div>
</div>
</nav>
<main id="fenetreGenerale" class="container" data-popup="non">
<div class="publicite bandeau" style="cursor: initial;">
<div class="position-relative">
<button id="carousselPub_Prev" class="btn m-0 p-3 position-absolute translate-middle-y top-50 start-0" type="button" role="presentation">
<span aria-label="Précédent"><i class="fa-solid fa-chevron-left"></i></span>
</button>
<div id="carousselPub" class="owl-carousel">
<div id="bandeauPub_654" class="item"
data-bandeau="654" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/654">
<img src="/eshop/pub/bandeau/image/654"
alt="" class=""/>
</div>
<div id="bandeauPub_653" class="item"
data-bandeau="653" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/653">
<img src="/eshop/pub/bandeau/image/653"
alt="" class=""/>
</div>
<div id="bandeauPub_646" class="item"
data-bandeau="646" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/646">
<img src="/eshop/pub/bandeau/image/646"
alt="" class=""/>
</div>
<div id="bandeauPub_630" class="item"
data-bandeau="630" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/630">
<img src="/eshop/pub/bandeau/image/630"
alt="" class=""/>
</div>
<div id="bandeauPub_634" class="item"
data-bandeau="634" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/634">
<img src="/eshop/pub/bandeau/image/634"
alt="" class=""/>
</div>
<div id="bandeauPub_628" class="item"
data-bandeau="628" data-etatvue=""
data-chemin="/eshop/pub/bandeau/incremente/628">
<img src="/eshop/pub/bandeau/image/628"
alt="" class=""/>
</div>
</div>
<button id="carousselPub_Next" class="btn m-0 p-3 position-absolute translate-middle-y top-50 end-0" type="button" role="presentation">
<span aria-label="Suivant"><i class="fa-solid fa-chevron-right"></i></span>
</button>
</div>
</div>
<section class="row news selnone">
<div class="col titre">
<div class="row align-items-end">
<div class="col text-start">
<img class="" src="/assets/img/tho_01.svg" alt="Nouveautés">
</div>
<div class="col text-end">
<a href="/eshop/catalogue/liste/nouveautes.lst" class="lien_defaut charte_couleur_secondaire">
Toutes les nouveautés</a>
<button id="carousselNouveautes_Prev" class="btn m-0 p-0 border-0" type="button" role="presentation">
<span aria-label="Précédent"><i class="fa-solid fa-circle-chevron-left"></i></span>
</button>
<button id="carousselNouveautes_Next" class="btn m-0 p-0 border-0" type="button" role="presentation">
<span aria-label="Suivant"><i class="fa-solid fa-circle-chevron-right"></i></span>
</button>
</div>
</div>
</div>
<div id="carousselNouveautes" class="owl-carousel">
<div class="item">
<div id="produit_24791"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/jus-aloe-vera-a-boire-500ml-bonescient/46680.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46680');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/jus-aloe-vera-a-boire-500ml-bonescient/46680.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>JUS ALOE VERA A BOIRE (500ML) BONESCIENT</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Espagne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/es.svg" alt="ES | lower"
title="Espagne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46680</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/jus-aloe-vera-a-boire-500ml-bonescient/46680.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24687"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/saumon-fume-x2-tranches-80g-natur-amie/18101.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18101');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/saumon-fume-x2-tranches-80g-natur-amie/18101.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>SAUMON FUME X2 TRANCHES (80G) NATUR'AMIE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18101</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/saumon-fume-x2-tranches-80g-natur-amie/18101.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24740"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/mais-doux-en-grains-au-naturel-3x150g-pne-3x140g-bio-pour-tous/46932.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46932');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/mais-doux-en-grains-au-naturel-3x150g-pne-3x140g-bio-pour-tous/46932.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>MAIS DOUX EN GRAINS AU NATUREL (3X150G - PNE 3X140G) BIO POUR TOUS</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46932</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/mais-doux-en-grains-au-naturel-3x150g-pne-3x140g-bio-pour-tous/46932.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24560"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/delice-de-truite-petit-pois-et-menthe-90g-la-truitelle/46750.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46750');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/delice-de-truite-petit-pois-et-menthe-90g-la-truitelle/46750.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>DELICE DE TRUITE PETIT POIS ET MENTHE (90G) LA TRUITELLE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46750</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/delice-de-truite-petit-pois-et-menthe-90g-la-truitelle/46750.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24677"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/riz-au-lait-vanille-de-madagascar-2x125g-laiterie-de-kerguillet/18106.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18106');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/riz-au-lait-vanille-de-madagascar-2x125g-laiterie-de-kerguillet/18106.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>RIZ AU LAIT VANILLE DE MADAGASCAR (2X125G) LAITERIE DE KERGUILLET</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18106</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/riz-au-lait-vanille-de-madagascar-2x125g-laiterie-de-kerguillet/18106.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24733"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/tortillas-wrap-au-ble-x6-a-25-cm-370g-philia/46410.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46410');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/tortillas-wrap-au-ble-x6-a-25-cm-370g-philia/46410.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>TORTILLAS WRAP AU BLE X6 Ø 25 CM (370G) PHILIA</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46410</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/tortillas-wrap-au-ble-x6-a-25-cm-370g-philia/46410.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24747"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/gouda-ail-des-ours-env-4-5kg-bastiaansen-bio/18154.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18154');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/gouda-ail-des-ours-env-4-5kg-bastiaansen-bio/18154.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>GOUDA AIL DES OURS (ENV. 4.5KG) BASTIAANSEN BIO</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18154</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/gouda-ail-des-ours-env-4-5kg-bastiaansen-bio/18154.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24822"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/ami-scarpone-170g-sojami/18119.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18119');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/ami-scarpone-170g-sojami/18119.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>AMI'SCARPONE (170G) SOJAMI</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18119</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/ami-scarpone-170g-sojami/18119.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24746"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/gouda-vieux-en-portion-180g-bastiaansen-bio/18153.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18153');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/gouda-vieux-en-portion-180g-bastiaansen-bio/18153.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>GOUDA VIEUX EN PORTION (180G) BASTIAANSEN BIO</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18153</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/gouda-vieux-en-portion-180g-bastiaansen-bio/18153.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24824"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/gnocchi-coeur-fondant-legumes-du-soleil-300g-coquelicot-provence/18123.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18123');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/gnocchi-coeur-fondant-legumes-du-soleil-300g-coquelicot-provence/18123.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>GNOCCHI COEUR FONDANT LEGUMES DU SOLEIL (300G) COQUELICOT PROVENCE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18123</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/gnocchi-coeur-fondant-legumes-du-soleil-300g-coquelicot-provence/18123.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24856"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/rillettes-de-porc-250g-pres-gourmands/18155.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18155');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/rillettes-de-porc-250g-pres-gourmands/18155.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>RILLETTES DE PORC (250G) PRES GOURMANDS</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18155</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/rillettes-de-porc-250g-pres-gourmands/18155.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24798"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/tomme-aux-fleurs-de-foin-1-2-meule-sans-lactose-env-3kg-kaserebellen/18127.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18127');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/tomme-aux-fleurs-de-foin-1-2-meule-sans-lactose-env-3kg-kaserebellen/18127.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>TOMME AUX FLEURS DE FOIN 1/2 MEULE SANS LACTOSE (ENV. 3KG) KASEREBELLEN</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18127</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/tomme-aux-fleurs-de-foin-1-2-meule-sans-lactose-env-3kg-kaserebellen/18127.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24855"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/pizza-a-la-brousse-de-brebis-160g-la-borie/18117.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=18117');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/pizza-a-la-brousse-de-brebis-160g-la-borie/18117.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>PIZZA A LA BROUSSE DE BREBIS (160G) LA BORIE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Union Européenne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/ue.svg" alt="UE | lower"
title="Union Européenne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 18117</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/pizza-a-la-brousse-de-brebis-160g-la-borie/18117.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24499"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/preparation-pour-taboule-courgettes-amandes-et-balsamique-330g-local-en-bocal/46698.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46698');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/preparation-pour-taboule-courgettes-amandes-et-balsamique-330g-local-en-bocal/46698.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>PREPARATION POUR TABOULE COURGETTES AMANDES ET BALSAMIQUE (330G) LOCAL EN BOCAL</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46698</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/preparation-pour-taboule-courgettes-amandes-et-balsamique-330g-local-en-bocal/46698.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24774"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/le-veritable-petit-dej-myrtille-350g-biofair-nutrition/46888.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46888');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/le-veritable-petit-dej-myrtille-350g-biofair-nutrition/46888.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>LE VERITABLE PETIT DEJ MYRTILLE (350G) BIOFAIR NUTRITION</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46888</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/le-veritable-petit-dej-myrtille-350g-biofair-nutrition/46888.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_24743"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/maxi-cookies-tout-chocolat-2x1-5kg-moulin-du-pivert/46715.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=46715');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/maxi-cookies-tout-chocolat-2x1-5kg-moulin-du-pivert/46715.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>MAXI COOKIES TOUT CHOCOLAT (2X1.5KG) MOULIN DU PIVERT</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 46715</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/maxi-cookies-tout-chocolat-2x1-5kg-moulin-du-pivert/46715.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row top selnone">
<div class="col titre">
<div class="row align-items-end">
<div class="col-2 text-start">
<img class="" src="/assets/img/tho_02.svg" alt="Top des Ventes">
</div>
<div class="col text-end">
<button id="carousselTops_Prev" class="btn m-0 p-0 border-0" type="button" role="presentation">
<span aria-label="Précédent"><i class="fa-solid fa-circle-chevron-left"></i></span>
</button>
<button id="carousselTops_Next" class="btn m-0 p-0 border-0" type="button" role="presentation">
<span aria-label="Suivant"><i class="fa-solid fa-circle-chevron-right"></i></span>
</button>
</div>
</div>
</div>
<div id="carousselTops" class="owl-carousel">
<div class="item">
<div id="produit_20528"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/amande-decortiquee-25kg-espagne/39345.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=39345');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/amande-decortiquee-25kg-espagne/39345.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>AMANDE DECORTIQUEE (25KG) ESPAGNE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Espagne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/es.svg" alt="ES | lower"
title="Espagne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 39345</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/amande-decortiquee-25kg-espagne/39345.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_19521"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/banane-rep-dom-equitable-cat-ii/BABI.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=BABI');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/banane-rep-dom-equitable-cat-ii/BABI.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>BANANE REP DOM EQUITABLE CAT II</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">République dominicaine</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/do.svg" alt="DO | lower"
title="République dominicaine" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: BABI</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/banane-rep-dom-equitable-cat-ii/BABI.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_17447"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/biosoy-nature-1l-soy/24095.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=24095');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/biosoy-nature-1l-soy/24095.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>BIOSOY NATURE (1L) SOY</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 24095</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/biosoy-nature-1l-soy/24095.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_18520"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/boisson-riz-nature-1l-bio-pour-tous/38791.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=38791');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/boisson-riz-nature-1l-bio-pour-tous/38791.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>BOISSON RIZ NATURE (1L) BIO POUR TOUS</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Italie</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/it.svg" alt="IT | lower"
title="Italie" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 38791</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/boisson-riz-nature-1l-bio-pour-tous/38791.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_5867"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALA.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=CALA');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALA.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>CAROTTE LAVEE CAT II</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: CALA</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALA.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_17051"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/chou-vert-lisse-cat-ii/CHVL.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=CHVL');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/chou-vert-lisse-cat-ii/CHVL.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>CHOU VERT LISSE CAT II</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: CHVL</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/chou-vert-lisse-cat-ii/CHVL.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_22443"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/eau-micellaire-500ml-joayo/45040.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=45040');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/eau-micellaire-500ml-joayo/45040.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>EAU MICELLAIRE (500ML) JOAYO</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 45040</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/eau-micellaire-500ml-joayo/45040.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_5186"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/eau-minerale-naturelle-1-5l-eau-montcalm/22690.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=22690');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/eau-minerale-naturelle-1-5l-eau-montcalm/22690.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>EAU MINERALE NATURELLE (1,5L) EAU MONTCALM</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 22690</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/eau-minerale-naturelle-1-5l-eau-montcalm/22690.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_13770"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-brique-1l-natur-avenir/15894.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=15894');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-brique-1l-natur-avenir/15894.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>LAIT DE VACHE UHT DEMI-ECREME BRIQUE (1L) NATUR'AVENIR</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 15894</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-brique-1l-natur-avenir/15894.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_19534"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-delactose-brique-1l-natur-avenir/16269.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=16269');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-delactose-brique-1l-natur-avenir/16269.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>LAIT DE VACHE UHT DEMI-ECREME DELACTOSE BRIQUE (1L) NATUR'AVENIR</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 16269</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/lait-de-vache-uht-demi-ecreme-delactose-brique-1l-natur-avenir/16269.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_12176"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/lait-de-vache-uht-entier-bouteille-1l-natur-avenir/16268.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=16268');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/lait-de-vache-uht-entier-bouteille-1l-natur-avenir/16268.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>LAIT DE VACHE UHT ENTIER BOUTEILLE (1L) NATUR'AVENIR</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 16268</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/lait-de-vache-uht-entier-bouteille-1l-natur-avenir/16268.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_6461"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/noix-de-cajou-22-68kg-vietnam/38733.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=38733');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/noix-de-cajou-22-68kg-vietnam/38733.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>NOIX DE CAJOU (22.68KG) VIETNAM</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Viêt Nam</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/vn.svg" alt="VN | lower"
title="Viêt Nam" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 38733</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/noix-de-cajou-22-68kg-vietnam/38733.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_17814"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/orange-espagne-cat-1/ORES10.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=ORES10');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/orange-espagne-cat-1/ORES10.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>ORANGE ESPAGNE CAT 1</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Espagne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/es.svg" alt="ES | lower"
title="Espagne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: ORES10</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/orange-espagne-cat-1/ORES10.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_9701"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/pdt-allians-x-10-kg-cat-ii/PDTAL.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=PDTAL');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/pdt-allians-x-10-kg-cat-ii/PDTAL.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>PDT ALLIANS X 10 KG CAT II</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: PDTAL</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/pdt-allians-x-10-kg-cat-ii/PDTAL.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_18720"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/amande-decortiquee-cal-34-36-10kg-espagne/39344.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=39344');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/amande-decortiquee-cal-34-36-10kg-espagne/39344.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>AMANDE DECORTIQUEE CAL 34/36 (10KG) ESPAGNE</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Espagne</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/es.svg" alt="ES | lower"
title="Espagne" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 39344</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/amande-decortiquee-cal-34-36-10kg-espagne/39344.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_5083"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/argile-verte-concassee-3kg-argiletz/22117.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=22117');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/argile-verte-concassee-3kg-argiletz/22117.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>ARGILE VERTE CONCASSEE (3KG) ARGILETZ</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">France</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/fr.svg" alt="FR | lower"
title="France" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 22117</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/argile-verte-concassee-3kg-argiletz/22117.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_10213"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/boisson-d-avoine-1l-bio-pour-tous/39036.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=39036');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/boisson-d-avoine-1l-bio-pour-tous/39036.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>BOISSON D'AVOINE (1L) BIO POUR TOUS</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Italie</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/it.svg" alt="IT | lower"
title="Italie" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 39036</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/boisson-d-avoine-1l-bio-pour-tous/39036.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_19248"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALAIT.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=CALAIT');">
<div class="mask rgba-white-slight"></div>
<img class="badge_preco" src="/assets/img/badge_bio.png" />
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALAIT.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>CAROTTE LAVEE CAT II</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">Italie</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/it.svg" alt="IT | lower"
title="Italie" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: CALAIT</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/carotte-lavee-cat-ii/CALAIT.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="item">
<div id="produit_13277"
class="carte_produit prd card card-cascade wider shadow">
<a href="/eshop/catalogue/faux-gras-125g-gaia/40725.prd">
<div class="view view-cascade overlay text-center"
style="background-image: url('/eshop/produit/image?produit=40725');">
<div class="mask rgba-white-slight"></div>
</div>
</a>
<div class="card-body card-body-cascade">
<a href="/eshop/catalogue/faux-gras-125g-gaia/40725.prd" class="lien_defaut">
<div class="produit_infos">
<h4 class="card-title charte_couleur_primaire"><strong>FAUX GRAS (125G) GAIA</strong></h4>
<p class="fl row mb-0">
<span class="col pe-0 text-nowrap text-black">UE / Non UE</span>
<img crossorigin="anonymous" src="http://localhost:5001/assets/img/pays/un.svg" alt="un | lower"
title="UE / Non UE" class="flag col">
</p>
<p class="fr ref charte_police_gras">Réf.: 40725</p>
<div class="clear"></div>
<div class="clear"></div>
</div>
</a>
<div class="produit_liens btns">
<a href="/eshop/catalogue/faux-gras-125g-gaia/40725.prd">
<button class="fl voir">
<i class="fa-solid fa-eye"></i> <span>VOIR +</span>
</button>
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row lkin selnone">
<div class="titre">
<a href="https://fr.linkedin.com/company/relaisvert84" target="_blank">
<img src="/assets/img/tho_05.svg" alt="Suivez notre actualité sur Linked In"></a>
</div>
</section>
</main>
</div>
<footer>
<div class="container-fluid top">
<div class="container">
<div class="row">
<div class="col-xl-3">
<a href="/" class="logo align-items-center text-decoration-none">
<img src="http://localhost:5001/assets/img/logo.svg" alt="Relais Vert">
</a>
<ul class="coords nav">
<li><i class="fa-solid fa-location-dot"></i> <p>ZA Bellecour 3, 621 Allée Bellecour<br>
84200 Carpentras PACA, FRANCE </p></li>
<li><a href="tel:+33490672372" target="_blank" class="tel"><i class="fa-solid fa-phone"></i> <span>04 90 67 23 72</span></a></li>
<li><i class="fa-regular fa-envelope"></i> <span>contact84@relais-vert.com</span></li>
</ul>
</div>
<div class="col-xl-3 col-lg-4 col-sm-6">
<div class="titre">
Catégories
</div>
<ul class="menu nav">
<li>
<a href="/eshop/catalogue/frais/1.fam">Frais</a>
</li>
<li>
<a href="/eshop/catalogue/sec/2.fam">Sec</a>
</li>
<li>
<a href="/eshop/catalogue/vrac/756.fam">Vrac</a>
</li>
</ul>
<div class="titre">
Spécial
</div>
<ul class="menu nav">
<li><a href="/eshop/catalogue/liste/nouveautes.lst">Nouveautés</a></li>
<li><a href="/eshop/catalogue/liste/tops.lst">Top des ventes</a></li>
</ul>
</div>
<div class="col-xl-3 col-lg-4 col-sm-6">
<div class="titre">
Mon compte
</div>
<ul class="menu nav">
<li><a href="https://www.relais-vert.com/devenir-client" target="_blank">Devenir client</a></li>
</ul>
</div>
<div class="col-xl-3 col-lg-4">
<div class="titre">
Sur les réseaux sociaux
</div>
<ul class="social nav">
<li><a href="https://www.facebook.com/Relaisvert84/" target="_blank"><i class="fa-brands fa-facebook-square"></i></a></li>
<li><a href="https://fr.linkedin.com/company/Relaisvert84" target="_blank"><i class="fa-brands fa-linkedin"></i></a></li>
<li><a href="https://www.youtube.com/@relaisvert5028" target="_blank"><i class="fa-brands fa-youtube"></i></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid bottom">
<div class="container text-center">
<img src="http://localhost:5001/assets/img/logo.svg" class="logo" alt="Groupe Relais Vert, la bio & vous">
<div class="titre">Nos filiales</div>
<a href="https://www.kilibio.com/" target="_blank"><img src="/assets/img/kilimandjabio.jpg" alt="Kilimandjabio"></a>
<a href="https://www.millesime86.bio/" target="_blank"><img src="/assets/img/millesime86.jpg" alt="Millésime 86"></a>
<div class="mentions">
<a href="/eshop/cgu">CGU</a> - <a href="/eshop/cgv">CGV</a> - <a href="/eshop/mentions">Mentions légales</a><br>
Copyright Relais Vert 2022 - Tous droits réservés
<p>Développé par <a href="https://www.vertuoz.fr" target="_blank"><img src="/assets/img/Vertuoz-logo.svg" alt="Vertuoz"></a></p>
</div>
</div>
</div>
</footer>
<div id="scrollUp">
<a href="#top"><img src="/assets/img/to_top.png"/></a>
</div>
</body>
</html>