De beste wijnen gepersonaliseerd voor u!
Ga naar verlanglijst Verlanglijst

Winkelwagen

Je winkelwagen is momenteel leeg

Best sellers

Aanbevolen categorieën

Duurzame productie en zorgvuldige selectie

/* Custom Cuvée Corporate Gifts V20.2 — PUBLIC frontend Publieke configuratorfrontend. API: https://customcuvee-corporate-gifts.long-queen-43a7.workers.dev */ (function(){ "use strict"; function init(){ const root=document.getElementById("cc-corporate-gifts"); if(!root||root.dataset.ccV20==="1")return;root.dataset.ccV20="1"; const $=id=>root.querySelector("#"+id); const PUBLIC={"version":"2.2-api","minimum_bottles":50,"occasions":{"relations":{"name":"Klanten & relaties","hint":"Representatief, breed toegankelijk en zichtbaar branded."},"employees":{"name":"Medewerkers","hint":"Een warm cadeau met goede prijs-kwaliteit en voldoende inhoud."},"event":{"name":"Jubileum & event","hint":"Feestelijk en geschikt om direct te overhandigen."},"other":{"name":"Anders","hint":"We houden de aanbeveling breed en praktisch."}},"countries":{"Frankrijk":{"verified":["Vigné-Lourac"],"families":2},"Italië":{"verified":["Feudi Salentini · 125"],"families":1},"Spanje":{"verified":["Cavas Masachs · Dignitat","Bodegas Alceño · Gold Senses"],"families":5},"Duitsland":{"verified":[],"families":2},"Oostenrijk":{"verified":[],"families":1},"Zuid-Afrika":{"verified":[],"families":1},"Geen voorkeur":{"verified":[],"families":1}},"wine_glasses":{"max_standard_box_capacity":4}}; const API_BASE="https://customcuvee-corporate-gifts.long-queen-43a7.workers.dev"; const fallbackBudgets=[ {id:"custom",label:"Eigen budget / speciaal verzoek",min:0,max:999,copy:"Geef je doelbedrag of afwijkende wens mee.",badge:"Maatwerk"} ]; const tastes=[ {id:"accessible",label:"Breed toegankelijk",copy:"Veilige keuze voor een brede groep."}, {id:"fresh",label:"Fris & modern",copy:"Levendig, droog en eigentijds."}, {id:"round",label:"Rond & rijk",copy:"Meer body en cadeaugevoel."}, {id:"full",label:"Vol & uitgesproken",copy:"Voor een wijn die echt blijft hangen."}, {id:"elegant",label:"Elegant & feestelijk",copy:"Verfijnd of mousserend."}, {id:"distinctive",label:"Verras me",copy:"Iets minder voor de hand liggend."} ]; const state={index:0,occasion:null,qty:100,qtyPlus:false,budget:null,customBudget:"",specialRequest:"",drink:null,wineCount:1,composition:null,taste:null,origin:"any",recommendation:null,beerCount:4,packageId:null,branding:true,glassCount:0}; const remote={options:null,recommendations:null,calc:null,upsell:null,finish:null,seq:0}; let refreshTimer=null; const money=v=>new Intl.NumberFormat("nl-NL",{style:"currency",currency:"EUR"}).format(Number(v||0)); const esc=s=>String(s||"").replace(/[&<>"']/g,ch=>({"&":"&","<":"<",">":">","\"":""","'":"'"}[ch])); const sameIds=(a,b)=>!!a&&!!b&&[...a].sort().join("|")===[...b].sort().join("|"); function budget(){ const list=remote.options?.budgetOptions||fallbackBudgets; const b=list.find(x=>x.id===state.budget); if(!b)return null; if(b.id==="custom"&&Number(state.customBudget)>0){ const t=Number(state.customBudget); return {...b,min:Math.max(0,t-2.5),max:t+2.5} } return b } function steps(){ const c=["occasion","quantity","drink"]; if(state.drink==="wine")return c.concat(["wineFormat","budget","wineComposition","wineTaste","wineOrigin","wineRecommendation","finish","result"]); if(state.drink==="beer")return c.concat(["beerChoice","budget","finish","result"]); return c } const currentKey=()=>steps()[state.index]; const minGift=n=>Math.ceil(PUBLIC.minimum_bottles/Math.max(1,Number(n)||1)); const total=n=>Number(state.qty||0)*Math.max(1,Number(n)||1); function moq(n,label="flessen"){const t=total(n),g=minGift(n);return t>=PUBLIC.minimum_bottles?`
${t} ${label} totaal · minimum van ${PUBLIC.minimum_bottles} gehaald.
`:`
${t} ${label} totaal · minimaal ${PUBLIC.minimum_bottles} nodig. Kies ten minste ${g} geschenken.
`} function api(path,payload){ if(!/^https:\/\//.test(API_BASE))return Promise.reject(new Error("V20 API is nog niet gekoppeld")); return fetch(API_BASE.replace(/\/$/,"")+path,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload)}) .then(async r=>{const j=await r.json().catch(()=>({}));if(!r.ok)throw new Error(j.error||"API-fout");return j}) } function invalidate(level="all"){remote.seq++;remote.calc=null;remote.upsell=null;remote.finish=null;if(level==="all"){remote.options=null;remote.recommendations=null}else if(level==="recommend")remote.recommendations=null} function scheduleRefresh(ms=120){clearTimeout(refreshTimer);refreshTimer=setTimeout(refreshRemote,ms)} function renderProgress(){const p=$("progress");p.innerHTML="";steps().forEach((_,i)=>{const s=document.createElement("span");if(i<=state.index)s.className="on";p.appendChild(s)})} function renderPath(){const bits=[];if(state.occasion)bits.push(PUBLIC.occasions[state.occasion]?.name);if(state.qty)bits.push(`${state.qtyPlus?"500+":state.qty} geschenken`);if(state.budget)bits.push(state.budget==="custom"?(state.customBudget?`Maatwerk ± €${Number(state.customBudget).toFixed(2).replace(".",",")}`:"Maatwerk"):budget()?.label);if(state.drink)bits.push(state.drink==="wine"?"Wijn":"Speciaalbier");if(state.drink==="wine")bits.push(`${state.wineCount} fles${state.wineCount>1?"sen":""} p/geschenk`);if(state.drink==="beer")bits.push(`${state.beerCount} bieren p/geschenk`);if(state.taste)bits.push(tastes.find(x=>x.id===state.taste)?.label);if(state.origin&&state.origin!=="any")bits.push(state.origin);if(state.glassCount)bits.push(`${state.glassCount} wijnglas${state.glassCount>1?"zen":""}`);const p=$("pathline");if(bits.length){p.style.display="block";p.innerHTML=`Jouw keuzes: ${bits.join(" · ")}`}else{p.style.display="none";p.innerHTML=""}} function renderQuantity(){const i=$("qty"),d=$("qtyDisplay"),h=$("qtyHint");i.value=state.qty;state.qtyPlus=state.qty>=500;d.textContent=state.qtyPlus?"500+":state.qty;i.style.setProperty("--range-progress",Math.max(0,Math.min(100,((state.qty-1)/499)*100))+"%");let n=null,l="flessen";if(state.drink==="wine")n=state.wineCount;if(state.drink==="beer"){n=state.beerCount;l="bierflessen"}if(n){const t=total(n);h.textContent=t``).join("")} function renderBudget(){ const list=remote.options?.budgetOptions||[]; if(!state.drink){ $("budgetOptions").innerHTML='
Kies eerst wijn of speciaalbier en de inhoud per geschenk.
'; }else if(!list.length){ $("budgetOptions").innerHTML='
We berekenen passende budgetopties voor deze oplage…
'; }else{ $("budgetOptions").innerHTML=list.map(b=>``).join("") } $("customBudgetPanel").style.display=state.budget==="custom"?"block":"none" } function renderFormats(){ $("formatOptions").innerHTML=[1,2,3].map(n=>{ const from=remote.options?.formatPrices?.[n]; const copy=n===1?"Compact en sterk branded.":n===2?"Wit + rood of twee stijlen uit één familie.":"Een complete selectie met maximale cadeauwaarde."; const valid=total(n)>=PUBLIC.minimum_bottles; return `` }).join("")+moq(state.wineCount) } function compositionDefs(){if(state.wineCount===1)return [["white","Wit","Van fris Sauvignon tot rijke Chardonnay."],["red","Rood","Van soepele Merlot tot volle Primitivo."],["rose","Rosé","Fris, fruitig en breed inzetbaar."],["sparkling","Mousserend","Feestelijk: Mousseux of Cava."],["any","Laat mij adviseren","Kleur is ondergeschikt aan de beste match."]];if(state.wineCount===2)return [["white_red","Wit + rood","De klassieke zakelijke combinatie."],["two_white","Twee witte wijnen","Bijvoorbeeld twee stijlen uit één wijnhuis."],["two_red","Twee rode wijnen","Voor een voller, winterser cadeau."],["sparkling_still","Bubbel + stille wijn","Feestelijker, binnen één land waar mogelijk."],["any","Laat mij adviseren","Wij kiezen het sterkste coherente duo."]];return [["white_red_sparkling","Wit + rood + bubbel","Complete, feestelijke selectie."],["white_rose_red","Wit + rosé + rood","Breed en toegankelijk."],["one_winery","Drie uit één wijnhuis","Maximale inhoudelijke samenhang."],["any","Laat mij adviseren","De sterkste trio-combinatie binnen één familie/land."]]} function renderCompositions(){if(!state.composition)state.composition=state.wineCount===1?"any":state.wineCount===2?"white_red":"one_winery";$("compositionOptions").innerHTML=compositionDefs().map(([id,n,c])=>``).join("")} function renderTastes(){$("tasteOptions").innerHTML=tastes.map(t=>``).join("")} function originDescription(c){const o=PUBLIC.countries[c];if(!o)return "";if(o.verified?.length)return `O.a. ${o.verified.join(" en ")}.`;return `${o.families} private-label familielijn${o.families===1?"":"en"} beschikbaar.`} function renderOrigins(){const cs=remote.options?.validOrigins||Object.keys(PUBLIC.countries).sort();if(state.origin!=="any"&&!cs.includes(state.origin))state.origin="any";$("originOptions").innerHTML=[["any","Geen voorkeur","Laat smaak en samenhang beslissen."]].concat(cs.map(c=>[c,c,originDescription(c)])).map(([id,n,d])=>``).join("")} function colorName(c){return {white:"wit",red:"rood",rose:"rosé",sparkling:"mousserend"}[c]||c} function recReason(x){const bits=[x.coherence.type==="Eén wijnhuis"?`Alles van ${x.coherence.label}`:x.coherence.type==="Eén familielijn"?`Eén consistente familielijn uit ${x.wines[0].country}`:`Alles uit ${x.wines[0].country}`];const t=tastes.find(z=>z.id===state.taste);if(t)bits.push(`sluit aan op “${t.label.toLowerCase()}”`);return bits.join(" · ")+"."} function renderRecommendations(){const opts=remote.recommendations;if(!opts){$("wineRecommendations").innerHTML='
We zoeken de beste combinaties…
';return}if(!opts.length){$("wineRecommendations").innerHTML='
Met deze combinatie is geen coherent pakket beschikbaar. Kies een andere herkomst of samenstelling.
';state.recommendation=null;return}if(!state.recommendation||!opts.some(o=>sameIds(o.ids,state.recommendation)))state.recommendation=opts[Math.min(1,opts.length-1)].ids;const selected=opts.find(o=>sameIds(o.ids,state.recommendation))?.unit||opts[0].unit;$("wineRecommendations").innerHTML=opts.map((x,i)=>{const delta=x.unit-selected,c=x.wines[0].country,p=x.coherence.label;return ``}).join("")} function renderBeer(){ $("beerOptions").innerHTML=[2,4,6].map(n=>{ const p=remote.options?.beerPrices?.[n]; const valid=total(n)>=PUBLIC.minimum_bottles; return `` }).join("")+moq(state.beerCount,"bierflessen") } function renderFinish(){const f=remote.finish;if(!f){$("finishOptions").innerHTML='
Prijs en afwerking worden geladen…
';return}if(state.drink==="wine"){const phtml=f.packages.map(p=>{const detail=p.visibleLabel?"Private label blijft zichtbaar.":"Gesloten cadeaupresentatie.";const badge=p.unavailable?`Vanaf ${p.minQty} geschenken`:(p.id===f.defaultId?'Standaard':`${p.diff>0?"+ "+money(p.diff)+" p/st":"Alternatief"}`);return ``}).join("");const ghtml=f.glasses.map(g=>g.count===0?``:``).join("");$("finishOptions").innerHTML=`

1. Verpakking

Alle standaardopties
${phtml}

2. Wijnglazen

Optioneel
${ghtml}

3. Branding verpakking

Naast het flesetiket
`}else{const c=f.current;$("finishOptions").innerHTML=`

1. Flesdrager

2. Branding verpakking

`}} function renderSummary(){const c=remote.calc,rows=$("summaryRows");if(!state.drink){rows.innerHTML="";$("unitPrice").textContent="—";$("orderTotal").textContent="";return}if(!c){rows.innerHTML='
Prijs wordt berekend…
';$("unitPrice").textContent="…";$("orderTotal").textContent="";return}let html=`
Geschenken${state.qtyPlus?"500+":c.q}
Type${state.drink==="wine"?"Wijn":"Speciaalbier"}
`;if(state.drink==="wine")html+=`
Inhoud p/geschenk${c.wines.length} fles${c.wines.length>1?"sen":""}
Flessen totaal${c.bottleCount}
Wijn${c.wines.map(w=>w.name).join(" · ")}
${c.glasses?`
Wijnglazen${c.glasses}
`:""}
Verpakking${c.packaging?.name||"Maatwerk"}
`;else html+=`
Inhoud p/geschenk${state.beerCount} × 33 cl
Bierflessen totaal${c.totalBottles}
Verpakking${c.packaging?.name||"Maatwerk"}
`;html+=`
Verpakking branded${c.branded?"Ja":"Nee"}
`;rows.innerHTML=html;$("summaryHint").textContent="";$("unitPrice").textContent=money(c.unit);$("orderTotal").textContent=(state.qtyPlus?"Indicatieve orderwaarde vanaf ":"Indicatieve orderwaarde ")+money(c.revenue);const b=budget(),st=$("budgetStatus");if(state.budget==="custom"&&!Number(state.customBudget)){st.style.display="block";st.className="status good";st.textContent="Je speciale verzoek nemen we mee in de offerte."}else if(b&&b.id!=="open"){st.style.display="block";if(c.unit>=b.min&&c.unit<=b.max){st.className="status good";st.textContent="Deze samenstelling past binnen je richtbudget."}else if(c.unit>b.max){st.className="status warn";st.textContent="Deze samenstelling ligt boven je richtbudget."}else{st.className="status good";st.textContent="Je blijft onder budget. Er is ruimte voor een upgrade."}}else st.style.display="none";const u=remote.upsell,up=$("sidebarUpsell");up.innerHTML=u?`
Uitbreiden

${u.title}

${u.copy}

`:"";up._upsell=u} function renderResult(){const c=remote.calc;if(!c)return;let title,inside,origin;if(state.drink==="wine"){title=`${state.qtyPlus?"500+":c.q} × ${c.wines.length}-flessen wijncadeau`;inside=c.wines.map(w=>`${w.name} (${w.grape})`).join(" + ");origin=c.wines[0].country}else{title=`${state.qtyPlus?"500+":c.q} × biergeschenk`;inside=state.beerCount+" × 33 cl";origin="Stadsbrouwerij Veenendaal"}$("resultBox").innerHTML=`

${title}

Inhoud${esc(inside)}
Herkomst / maker${esc(origin)}
${c.glasses?`
Wijnglazen${c.glasses}
`:""}
Verpakking${esc(c.packaging?.name||"Maatwerk")}
Private labelInbegrepen
Indicatieve prijs
${money(c.unit)} p/st excl. btw
${state.qtyPlus?"Vanaf ":"Totaal "}${money(c.revenue)} excl. btw
`;$("finalUpsell").innerHTML=remote.upsell?`
Uitbreiden

${remote.upsell.title}

${remote.upsell.copy}

`:""} function canNext(){const k=currentKey();if(k==="occasion")return !!state.occasion;if(k==="quantity")return state.qty>=1;if(k==="budget")return !!state.budget;if(k==="drink")return !!state.drink;if(k==="wineFormat")return total(state.wineCount)>=PUBLIC.minimum_bottles;if(k==="wineComposition")return !!state.composition;if(k==="wineTaste")return !!state.taste;if(k==="wineOrigin")return !!state.origin;if(k==="wineRecommendation")return !!state.recommendation&&total(state.recommendation.length)>=PUBLIC.minimum_bottles;if(k==="beerChoice")return total(state.beerCount)>=PUBLIC.minimum_bottles;return true} function renderAll(){renderProgress();renderPath();renderQuantity();renderOccasion();renderBudget();if(state.drink==="wine"){renderFormats();renderCompositions();renderTastes();renderOrigins();renderRecommendations()}if(state.drink==="beer")renderBeer();if(["finish","result"].includes(currentKey()))renderFinish();renderSummary();if(currentKey()==="result")renderResult();$("next").disabled=!canNext()} function setStep(i){state.index=Math.max(0,Math.min(steps().length-1,i));root.querySelectorAll(".step").forEach(s=>s.classList.toggle("active",s.dataset.key===currentKey()));$("back").style.visibility=state.index===0?"hidden":"visible";$("next").style.display=currentKey()==="result"?"none":"inline-block";renderAll();scheduleRefresh(0)} async function refreshRemote(){ const seq=++remote.seq,st={...state}; try{ if(st.drink){ if(!remote.options)remote.options=await api("/options",{state:st}); if(seq!==remote.seq)return; if(st.drink==="wine"&&["wineRecommendation","finish","result"].includes(currentKey())){ if(!remote.recommendations){const rr=await api("/recommendations",{state:st});if(seq!==remote.seq)return;remote.recommendations=rr.recommendations;if(!state.recommendation&&remote.recommendations.length)state.recommendation=remote.recommendations[Math.min(1,remote.recommendations.length-1)].ids} } if((st.drink==="beer"||state.recommendation)&&["finish","result"].includes(currentKey())){remote.finish=await api("/finish",{state:{...state}});if(seq!==remote.seq)return;remote.calc=remote.finish.current} else if(st.drink==="beer"||state.recommendation){const cr=await api("/calculate",{state:{...state}});if(seq!==remote.seq)return;remote.calc=cr.calc;remote.upsell=cr.upsell} if(["finish","result"].includes(currentKey())){const cr=await api("/calculate",{state:{...state}});if(seq!==remote.seq)return;remote.calc=cr.calc;remote.upsell=cr.upsell} } }catch(e){console.error("Custom Cuvée V20:",e);const hint=$("summaryHint");if(hint)hint.textContent=e.message} renderAll() } function applyUpsell(u){if(!u)return;if(u.kind==="addBottle"){state.wineCount=u.targetN;state.composition="any";state.origin="any";state.recommendation=u.ids;state.packageId=null;state.glassCount=0}if(u.kind==="branding")state.branding=true;if(u.kind==="glass"){state.glassCount=u.targetG;state.packageId=null}if(u.kind==="beerMore")state.beerCount=u.targetN;invalidate("all");renderAll();scheduleRefresh(0)} root.addEventListener("click",e=>{const inf=e.target.closest(".info");if(inf){e.stopPropagation();root.querySelectorAll(".info.open").forEach(x=>{if(x!==inf)x.classList.remove("open")});inf.classList.toggle("open");return}const up=e.target.closest("[data-upsell]");if(up){applyUpsell($("sidebarUpsell")._upsell||remote.upsell);return}const q=e.target.closest("[data-qty]");if(q){state.qty=Number(q.dataset.qty);state.qtyPlus=state.qty>=500;state.recommendation=null;invalidate("all");renderAll();scheduleRefresh();return}const b=e.target.closest("[data-action]");if(!b)return;const a=b.dataset.action,v=b.dataset.value;if(a==="occasion")state.occasion=v;if(a==="budget")state.budget=v;if(a==="drink"){state.drink=v;state.budget=null;state.recommendation=null;state.packageId=null;state.branding=true;state.glassCount=0;if(v==="wine"){state.composition=null;state.taste=null;state.origin="any"}}if(a==="wineCount"){state.wineCount=Number(v);state.budget=null;state.composition=null;state.recommendation=null;state.packageId=null;state.glassCount=0}if(a==="composition"){state.composition=v;state.recommendation=null}if(a==="taste"){state.taste=v;state.recommendation=null}if(a==="origin"){state.origin=v;state.recommendation=null}if(a==="recommend"){state.recommendation=v.split(",");state.packageId=null;state.branding=true;state.glassCount=0}if(a==="beerCount"){state.beerCount=Number(v);state.budget=null;}if(a==="packageId"){state.packageId=v;state.glassCount=0}if(a==="branding")state.branding=v==="true";if(a==="glassCount"){state.glassCount=Number(v);if(state.glassCount>0)state.packageId=null}invalidate(a==="recommend"||a==="packageId"||a==="branding"||a==="glassCount"?"calc":"all");renderAll();scheduleRefresh(0)}); $("customBudget").addEventListener("input",e=>{state.customBudget=e.target.value;state.recommendation=null;invalidate("all");scheduleRefresh(250)}); $("specialRequest").addEventListener("input",e=>state.specialRequest=e.target.value); $("qty").addEventListener("input",e=>{state.qty=Math.max(1,Math.min(500,Number(e.target.value)||1));state.qtyPlus=state.qty>=500;state.recommendation=null;invalidate("all");renderAll();scheduleRefresh(180)}); $("next").addEventListener("click",()=>{if(canNext())setStep(state.index+1)}); $("back").addEventListener("click",()=>setStep(state.index-1)); $("submitLead").addEventListener("click",async()=>{ const contact={name:$("leadName").value.trim(),company:$("leadCompany").value.trim(),email:$("leadEmail").value.trim(),phone:$("leadPhone").value.trim(),deliveryDate:$("leadDate").value,note:$("leadNote").value.trim()},success=$("success"); if(!contact.company||!contact.email){success.classList.add("show");success.textContent="Vul minimaal bedrijfsnaam en zakelijk e-mailadres in.";return} const btn=$("submitLead");btn.disabled=true;btn.textContent="Aanvraag versturen…"; try{const r=await api("/quote",{state,contact});success.classList.add("show");success.innerHTML=`Aanvraag ontvangen.
Je aanvraagnummer is ${r.quoteId}. Je ontvangt per e-mail de vervolgstappen.`;$("afterSubmit").style.display="block";$("quoteIdBadge").textContent=r.quoteId;$("afterSubmitTitle").textContent=`Dank je${contact.name?", "+contact.name.split(" ")[0]:""}. Je aanvraag is ontvangen.`;btn.textContent="Aanvraag verstuurd"} catch(e){success.classList.add("show");success.textContent="Aanvraag kon nog niet worden verstuurd: "+e.message;btn.disabled=false;btn.textContent="Vraag mijn definitieve offerte aan"} }); setStep(0); } if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",init,{once:true});else init(); })();
Wij slaan cookies op om onze website te verbeteren. Is dat akkoord? Ja Nee Meer over cookies »