12 técnicas de cocina con aceite de oliva virgen extra
técnicas de cocina con aceite de oliva virgen extra
Gracias a las fantásticas recetas de nuestro amigo y chef José Cortes hemos descubrierto en nuestra sección para gourmets una serie de técnicas en las que el aceite de oliva virgen extra es el gran protagonista. No nos sorprende que la mayoría de los amantes de la cocina busquen formas creativas de usar productos de calidad para elaborar sus platos, pero lo que sí es cierto es que cada día más nos impresiona más descubrir la extraordinaria versatilidad que tiene el aceite, el oro líquido tan importante para nosotros y para la cocina mediterránea. Por ello, hoy vamos ha hablar de esas técnicas de cocina y aplicaciones que tiene nuestro aceite, algunas de las cuales pueden incluso sorprenderte:
12 aplicaciones y usos del aceite de oliva virgen extra:
En frío:
Aliño.
Emulsiones.
Conservas.
Ahumados
En caliente:
Saltear y rehogar.
Freír.
Asar al horno o a la parrilla.
Confitar.
Infusionar.
En texturas:
Sorbete.
Polvo.
Espuma.
En frío:
1. Aliño.
El aliño con aceite de oliva virgen extra en el que aderezamos ensaladas y mezclamos con especias, condimentos, sal y pimienta es todo un clásico. Este tipo de técnica en crudo garantiza la conservación de todas las propiedades organolépticas y saludables del aceite, entre ellas sus rasgos fragante y aromatizante, aportando el sabor más intenso del que dispone el aceite de oliva virgen extra que uses. El aliño por excelencia es la vinagreta.
2. Emulsiones.
La emulsión es la unión de dos ingredientes que pueden parecer incompatibles, pero cuya mezcla homogénea da como resultado una salsa de textura increíble y sabor incomparable. Usar la variedad de aceite de oliva virgen extra Arbequina en este tipo de técnica garantiza una fragancia más sutil que no enmascare el sabor único del otro ingrediente que uses. Las emulsiones más tradicionales de nuestra cocina son la mahonesa, el salmorejo, el ajo blanco y, como no, nuestro alioli.
3. Conservas.
Con el objetivo de prolongar la vida de algunos de los alimentos, en la historia gastronómica han existido distintas formas de conservación. La sal ha sido uno de esos productos tradicionales, pero también el aceite de oliva virgen extra. La conservación en un aceite de oliva virgen extra hace que productos como quesos, pescados, carne cocinada, etc. se sigan conservándose en buen estado por más tiempo sin perder calidad. Y es que este aceite, a diferencia de otros, es más beneficioso para la salud.
4. Ahumados.
El ahumado es una técnica en la que es necesario realizar humo y cubrir ciertos alimentos para que se impregnen de este y así aportar un color y aroma distintos. Además de intensificar el sabor del alimento se puede dar fragancias no sólo con el aceite de oliva virgen extra, sino también con hierbas aromáticas para lo que puedes aprender un poco más con esta receta de coca de aceite con escalibada y sardinas ahumadas.
El aceite de oliva virgen extra, como hemos podido comentar en alguna ocasión, es una de las mejores, sino la mejor grasa con la que se puede cocinar en caliente. Puesto que contiene múltiples antioxidantes, sus propiedades saludables resisten a altas temperaturas, por ello resulta ideal en elaboraciones culinarias en las que es necesario rehogar o saltear.
Estas son similares. Ambas necesitan aceite de oliva virgen extra pero, mientras saltear alimentos necesita de mayor temperatura en el fuego y menor tiempo, rehogar implica justo lo contrario, es decir, cocinar por un largo tiempo a fuego bajo. En los dos casos, la cantidad de aceite usado es baja en comparación a la siguiente técnica:
6. Freír.
Como seguramente ya sabes, freír implica la inmersión del alimento en aceite de oliva virgen extra a muy alta temperatura. Las clásicas patatas fritas o las verduras y mariscos en tempura son deliciosas y más saludables si se usa este aceite en lugar de otro producto graso.
7. Asar al horno o a la parrilla.
Tanto para asar alimentos con aliño al horno, como para adobarlos y prepararlos a la parrilla, el aceite de oliva virgen extra es de nuevo el ingrediente graso estrella. No sólo puede aportar un mayor sabor, sino que su oxidación será menor a alta temperatura, conservando más propiedades organolépticas que otras grasas.
8. Confitar.
Para conseguir una textura más suave y gelatinosa de algunos alimentos como pueden algunas carnes de res, pero también pescados y verduras, confitar con aceite de oliva virgen extra y algunas hierbas aromáticas puede dar lugar a productos de un sabor inigualable. En estos casos, la paciencia es fundamental, ya que confitar consiste en cocer a temperatura muy baja por un tiempo prolongado.
9. Infusionar.
Por otro lado, el mismo aceite de oliva virgen extra también se puede confitar o infusionar para aromatizarlo con hierbas, especias, o bien, otros productos como por ejemplo jalapeños, para luego dejar temperar el aceite y usarlo en otras elaboraciones gastronómicas como se explica en esta receta gourmet de carpaccio de gambas.
En texturas:
10. Sorbete.
El sorbete de aceite de oliva virgen extra es realmente fácil de hacer. Solo se necesita congelar el aceite de oliva que, en el frío del congelador, se coagulará. Esto aporta una textura única y muy interesante que puede usarse en platos especiales e incluso postres ya que, especialmente la variedad Arbequina, combina a la perfección con todo tipo de elaboraciones, tanto dulces como saladas. Si te interesa descubrir un ejemplo de su aplicación, aquí tienes una ensalada gourmet en la que se usa el sorbete de aceite de oliva virgen extra.
11. Polvo.
Otra de las texturas peculiares que podemos conseguir con el aceite de oliva virgen extra es el polvo. La técnica es realmente sencilla, pero para llevarla a cabo es necesario usar maltodextrina, una mezcla de polímeros resultado de la hidrólisis del almidón. Este un ingrediente característico de la cocina molecular que nos ayuda a conseguir esa textura en polvo al mezclarse con el aceite.
La técnica es bastante intuitiva ya que hay que ir mezclando ambos ingredientes hasta conseguir el polvo. Grosso modo es una parte de maltodextrina por media de aceite. Puesto que el resultado tiende a ser dulce, si se desea usar en platos más saldos es recomendable añadir un poco de sal o incluso alguna especia como el pimentón, como se demuestra en esta receta gourmet de trampó y pulpo.
Trampó con pulpo y polvo de aceite de oliva virgen extra
12. Espuma.
Aunque es, tal vez, la técnica más complicada, la espuma de aceite sólo necesita dos elementos peculiares además del ingrediente principal: un sifón y glice, otro ingrediente de la cocina molecular que aportará estabilidad a la espuma.
En primer lugar, para elaborar la espuma se debe alcanzar una temperatura de 65ºC con el aceite de oliva virgen extra para que el glice pueda disolverse bien. Esta mezcla emulsionada pasa a un sifón que deberá llevarse a la nevera para que se atempere y coja cuerpo antes de usarlo y aportar a los platos otra textura única y deliciosa.
Acepto las condiciones de reserva y la política de privacidad
Condiciones de reserva
Reserva y puntualidad Mantendremos tu mesa reservada durante 15 minutos de cortesía. Si prevés llegar más tarde, te agradeceremos que nos lo comuniques. En caso contrario, no podremos garantizar la disponibilidad de la reserva.
Cancelaciones Las cancelaciones realizadas con menos de 24 horas de antelación no serán reembolsables en ningún caso.
Edad mínima El acceso está permitido únicamente a mayores de 14 años.
Mascotas Las mascotas son bienvenidas en nuestra terraza, siempre que permanezcan limpias, tranquilas, atadas y bajo la supervisión de su responsable, evitando en todo momento molestias al resto de los clientes. Nos reservamos el derecho de asignar la mesa que consideremos más adecuada. Durante la temporada de invierno, te rogamos que nos consultes antes de realizar la reserva.
Código de vestimenta Agradecemos una vestimenta smart casual: elegante, cómoda e informal.
Convivencia Te rogamos mantener un ambiente tranquilo, evitando alzar la voz y mostrando respeto tanto hacia los demás clientes como hacia nuestro equipo. Está permitido fumar únicamente en la zona habilitada para ello.
Restricciones alimentarias Si tienes alguna alergia, intolerancia o restricción alimentaria, te agradeceremos que nos lo comuniques antes de tu llegada. Una vez iniciado el servicio, no podemos garantizar que sea posible realizar modificaciones en el menú.
Con el fin de preservar el ambiente y el bienestar de todos los presentes, nos reservamos el derecho de solicitar el abandono del establecimiento en caso de comportamientos que alteren la convivencia o el normal desarrollo del servicio.
'; }).join('');
var offset = (new Date(flavorCalYear, flavorCalMonth, 1).getDay() + 6) % 7;
var dim = new Date(flavorCalYear, flavorCalMonth + 1, 0).getDate();
for (var i = 0; i < offset; i++) h += '';
var minStr = formatDateLocal(flavorMinDate);
var maxStr = formatDateLocal(flavorMaxDate);
for (var d = 1; d <= dim; d++) {
var date = new Date(flavorCalYear, flavorCalMonth, d);
var dateStr = formatDateLocal(date);
var isSel = flavorData.date === dateStr;
var isToday = date.toDateString() === today.toDateString();
var isPast = dateStr < minStr || dateStr > maxStr;
var isClosed = !isPast && flavorOpenDays.indexOf(date.getDay()) === -1;
var isBlocked = !isPast && !isClosed && flavorBlockedDates[dateStr];
var cls = 'flavor-cal-day';
if (isPast) cls += ' past';
else if (isClosed || isBlocked) cls += ' closed';
else if (isSel) cls += ' on';
else if (isToday) cls += ' today';
if (isPast || isClosed || isBlocked) {
h += '
' + d + '
';
} else {
h += '';
}
}
grid.innerHTML = h;
grid.querySelectorAll('.flavor-cal-day[data-date]').forEach(function(b) {
b.addEventListener('click', function() {
flavorData.date = b.dataset.date;
flavorData.time = null;
flavorRenderCalendar();
flavorLoadTimeSlots(flavorData.date);
});
});
}
document.getElementById('flavorCalPrev').addEventListener('click', function() {
var now = new Date();
if (flavorCalMonth <= now.getMonth() && flavorCalYear <= now.getFullYear()) return;
flavorCalMonth--;
if (flavorCalMonth < 0) { flavorCalMonth = 11; flavorCalYear--; }
flavorRenderCalendar();
});
document.getElementById('flavorCalNext').addEventListener('click', function() {
flavorCalMonth++;
if (flavorCalMonth > 11) { flavorCalMonth = 0; flavorCalYear++; }
flavorRenderCalendar();
});
// =====================
// TIME SLOTS
// =====================
function flavorLoadTimeSlots(dateStr) {
var container = document.getElementById('flavorSlots');
var guests = flavorData.guests || 2;
container.innerHTML = '
' + flavorI18n.loadingTimes + '
';
fetch(flavorRestUrl + 'restaurants/' + flavorRestaurantId + '/available-slots?date=' + dateStr + '&guests=' + guests)
.then(function(r) { return r.json(); })
.then(function(data) {
if (data.success && data.data && data.data.length > 0) {
var html = '';
data.data.forEach(function(slot) {
var timeShort = slot.time.substring(0, 5);
if (slot.available) {
var cls = 'flavor-slot' + (flavorData.time === timeShort ? ' on' : '');
html += '';
} else {
var reasonText = flavorI18n.notAvailable;
if (slot.reason === 'capacity') reasonText = flavorI18n.capacityFull;
else if (slot.reason === 'max_reservations') reasonText = flavorI18n.maxReservations;
else if (slot.reason === 'min_advance') reasonText = flavorI18n.minAdvance;
html += '';
}
});
container.innerHTML = html;
container.querySelectorAll('.flavor-slot:not(.busy)').forEach(function(b) {
b.addEventListener('click', function() {
flavorData.time = b.dataset.t;
container.querySelectorAll('.flavor-slot').forEach(function(s) { s.classList.remove('on'); });
b.classList.add('on');
flavorCheckStep1();
});
});
} else {
container.innerHTML = '
';
// Disparar snippet de tracking "reserva creada" (Meta Pixel, GA, etc. según lo que haya configurado el restaurante).
flavorRunTrackingSnippet('flavor-tracking-reservation');
// Si el depósito ya se ha cobrado en el mismo flujo (Stripe Elements dentro del form), el evento de pago
// también corresponde ahora; el retorno de Stripe con ?payment=success cubre el otro caso (Checkout externo).
if (depositAmount > 0) {
flavorRunTrackingSnippet('flavor-tracking-payment');
}
}
function flavorShowError(message) {
flavorContainer.innerHTML =
'
' +
'
\u2717
' +
'
' + flavorI18n.error + '
' +
'
' + message + '
' +
'' +
'
';
}
// =====================
// TOAST
// =====================
function flavorToast(message, type) {
type = type || 'warning';
var existing = document.querySelector('.flavor-toast-modal');
var existingOverlay = document.querySelector('.flavor-toast-overlay');
if (existing) existing.remove();
if (existingOverlay) existingOverlay.remove();
var overlay = document.createElement('div');
overlay.className = 'flavor-toast-overlay';
document.body.appendChild(overlay);
var toast = document.createElement('div');
toast.className = 'flavor-toast-modal';
toast.innerHTML = '
' + message + '
';
document.body.appendChild(toast);
function closeToast() {
toast.classList.remove('show');
overlay.classList.remove('show');
setTimeout(function() { toast.remove(); overlay.remove(); }, 250);
}
overlay.onclick = closeToast;
setTimeout(function() { overlay.classList.add('show'); toast.classList.add('show'); }, 10);
setTimeout(closeToast, 2500);
}
// =====================
// BLOCKED DATES & INIT
// =====================
fetch(flavorRestUrl + 'restaurants/' + flavorRestaurantId + '/blocked-dates')
.then(function(r) { return r.json(); })
.then(function(data) {
if (data.success && data.data) {
flavorBlockedDates = data.data;
flavorRenderCalendar();
flavorSelectFirstAvailableDate();
}
})
.catch(function() { flavorSelectFirstAvailableDate(); });
function flavorSelectFirstAvailableDate() {
var today = new Date(); today.setHours(0,0,0,0);
for (var i = 0; i <= flavorMaxAdvanceDays; i++) {
var check = new Date(today);
check.setDate(today.getDate() + i);
var dateStr = formatDateLocal(check);
if (flavorOpenDays.indexOf(check.getDay()) === -1) continue;
if (flavorBlockedDates[dateStr]) continue;
if (i === 0) { var hoursLeft = 24 - new Date().getHours(); if (hoursLeft < flavorMinAdvanceHours) continue; }
flavorSelectDate(dateStr);
return;
}
}
function flavorSelectDate(dateStr) {
flavorData.date = dateStr;
flavorData.time = null;
flavorRenderCalendar();
flavorLoadTimeSlots(dateStr);
}
// =====================
// GESTION DE RESERVAS
// =====================
var flavorCurrentReservation = null;
function flavorShowManage() {
document.querySelectorAll('.flavor-panel').forEach(function(s) { s.style.display = 'none'; });
document.querySelector('.flavor-stepper').style.display = 'none';
document.querySelector('.flavor-manage-view').style.display = 'block';
document.querySelector('.flavor-manage-search').style.display = 'block';
document.querySelector('.flavor-manage-result').style.display = 'none';
document.querySelector('.flavor-manage-modify').style.display = 'none';
}
function flavorHideManage() {
document.querySelector('.flavor-manage-view').style.display = 'none';
document.querySelectorAll('.flavor-panel').forEach(function(s) { s.style.display = 'none'; });
document.getElementById('flavorPanel1').style.display = 'block';
document.getElementById('flavorPanel1').classList.add('active');
document.querySelector('.flavor-stepper').style.display = 'flex';
flavorStep = 1;
flavorUpdateStepper();
flavorCurrentReservation = null;
}
function flavorManageTab(tab) {
document.querySelectorAll('.flavor-manage-tab').forEach(function(t) { t.classList.remove('active'); });
document.querySelectorAll('.flavor-manage-tab-content').forEach(function(c) { c.classList.remove('active'); });
document.querySelector('.flavor-manage-tab-content[data-tab="' + tab + '"]').classList.add('active');
event.target.classList.add('active');
}
function flavorSearchByCode() {
var code = document.getElementById('flavor-manage-code').value.trim();
if (!code) { flavorToast(flavorI18n.enterCode); return; }
flavorSearchReservation({ code: code });
}
function flavorSearchByData() {
var firstName = document.getElementById('flavor-manage-firstname').value.trim();
var lastName = document.getElementById('flavor-manage-lastname').value.trim();
var phone = document.getElementById('flavor-manage-phone').value.trim();
var date = document.getElementById('flavor-manage-date').value;
var time = document.getElementById('flavor-manage-time').value;
if (!firstName) { flavorToast(flavorI18n.enterName); return; }
if (!lastName) { flavorToast(flavorI18n.enterLastName); return; }
if (!phone) { flavorToast(flavorI18n.enterPhone); return; }
if (!date) { flavorToast(flavorI18n.enterDate); return; }
if (!time) { flavorToast(flavorI18n.enterTime); return; }
flavorSearchReservation({ first_name: firstName, last_name: lastName, phone: phone, date: date, time: time + ':00' });
}
function flavorSearchReservation(params) {
document.querySelector('.flavor-loader').style.display = 'flex';
var url = flavorRestUrl + 'reservations/search?restaurant_id=' + flavorRestaurantId;
if (params.code) { url += '&code=' + encodeURIComponent(params.code); }
else {
url += '&first_name=' + encodeURIComponent(params.first_name);
url += '&last_name=' + encodeURIComponent(params.last_name);
url += '&phone=' + encodeURIComponent(params.phone);
url += '&date=' + encodeURIComponent(params.date);
url += '&time=' + encodeURIComponent(params.time);
}
fetch(url)
.then(function(r) { return r.json(); })
.then(function(data) {
document.querySelector('.flavor-loader').style.display = 'none';
if (data.success && data.data) { flavorCurrentReservation = data.data; flavorShowReservationResult(data.data); }
else { flavorToast(data.message || flavorI18n.reservationNotFound, 'error'); }
})
.catch(function() { document.querySelector('.flavor-loader').style.display = 'none'; flavorToast(flavorI18n.searchError, 'error'); });
}
function flavorShowReservationResult(res) {
document.querySelector('.flavor-manage-search').style.display = 'none';
document.querySelector('.flavor-manage-result').style.display = 'block';
document.querySelector('.flavor-manage-modify').style.display = 'none';
var dateParts = res.reservation_date.split('-');
var dateStr = dateParts[2] + '/' + dateParts[1] + '/' + dateParts[0];
var statusText = flavorI18n.confirmed, statusClass = 'confirmed';
if (res.status === 'pending') { statusText = flavorI18n.pending; statusClass = 'pending'; }
if (res.status === 'cancelled') { statusText = flavorI18n.cancelled; statusClass = 'cancelled'; }
document.querySelector('.flavor-reservation-code').textContent = res.reservation_code;
document.querySelector('.flavor-reservation-status').textContent = statusText;
document.querySelector('.flavor-reservation-status').className = 'flavor-reservation-status ' + statusClass;
document.querySelector('.flavor-reservation-date').textContent = dateStr;
document.querySelector('.flavor-reservation-time').textContent = res.reservation_time.substring(0, 5);
document.querySelector('.flavor-reservation-guests').textContent = res.guests + ' ' + flavorI18n.people;
document.querySelector('.flavor-reservation-name').textContent = res.first_name + ' ' + res.last_name;
document.querySelector('.flavor-reservation-email').textContent = res.email || '';
document.querySelector('.flavor-reservation-phone').textContent = res.phone || '';
var allergiesRow = document.querySelector('.flavor-reservation-allergies');
if (res.allergies && res.allergies.trim()) { allergiesRow.style.display = 'flex'; document.querySelector('.flavor-reservation-allergies-text').textContent = res.allergies; } else { allergiesRow.style.display = 'none'; }
var dietaryRow = document.querySelector('.flavor-reservation-dietary');
if (res.dietary_restrictions && res.dietary_restrictions.trim()) { dietaryRow.style.display = 'flex'; document.querySelector('.flavor-reservation-dietary-text').textContent = res.dietary_restrictions; } else { dietaryRow.style.display = 'none'; }
var notesRow = document.querySelector('.flavor-reservation-notes');
if (res.notes && res.notes.trim()) { notesRow.style.display = 'flex'; document.querySelector('.flavor-reservation-notes-text').textContent = res.notes; } else { notesRow.style.display = 'none'; }
var menuSection = document.querySelector('.flavor-reservation-menu');
var hasMenu = (res.menu_starters && res.menu_starters.trim()) || (res.menu_mains && res.menu_mains.trim()) || (res.menu_desserts && res.menu_desserts.trim());
if (hasMenu) {
menuSection.style.display = 'block';
var st = document.querySelector('.flavor-reservation-starters'); if (res.menu_starters && res.menu_starters.trim()) { st.style.display = 'block'; document.querySelector('.flavor-reservation-starters-text').textContent = res.menu_starters; } else { st.style.display = 'none'; }
var mn = document.querySelector('.flavor-reservation-mains'); if (res.menu_mains && res.menu_mains.trim()) { mn.style.display = 'block'; document.querySelector('.flavor-reservation-mains-text').textContent = res.menu_mains; } else { mn.style.display = 'none'; }
var ds = document.querySelector('.flavor-reservation-desserts'); if (res.menu_desserts && res.menu_desserts.trim()) { ds.style.display = 'block'; document.querySelector('.flavor-reservation-desserts-text').textContent = res.menu_desserts; } else { ds.style.display = 'none'; }
} else { menuSection.style.display = 'none'; }
var actionsDiv = document.querySelector('.flavor-manage-actions');
if (res.status === 'cancelled') { actionsDiv.style.display = 'none'; } else { actionsDiv.style.display = 'flex'; }
}
function flavorShowModify() {
document.querySelector('.flavor-manage-result').style.display = 'none';
document.querySelector('.flavor-manage-modify').style.display = 'block';
var res = flavorCurrentReservation;
var select = document.getElementById('flavor-modify-guests');
select.innerHTML = '';
for (var i = flavorMinGuests; i <= Math.min(flavorMaxGuests, 12); i++) {
var opt = document.createElement('option');
opt.value = i; opt.textContent = i + ' ' + (i === 1 ? flavorI18n.person : flavorI18n.people);
if (i === parseInt(res.guests)) opt.selected = true;
select.appendChild(opt);
}
document.getElementById('flavor-modify-date').value = res.reservation_date;
document.getElementById('flavor-modify-first-name').value = res.first_name || '';
document.getElementById('flavor-modify-last-name').value = res.last_name || '';
document.getElementById('flavor-modify-email').value = res.email || '';
document.getElementById('flavor-modify-phone').value = res.phone || '';
document.getElementById('flavor-modify-allergies').value = res.allergies || '';
document.getElementById('flavor-modify-dietary').value = res.dietary_restrictions || '';
document.getElementById('flavor-modify-notes').value = res.notes || '';
document.getElementById('flavor-modify-shared-table').checked = parseInt(res.shared_table) === 1;
document.getElementById('flavor-modify-starters').value = res.menu_starters || '';
document.getElementById('flavor-modify-mains').value = res.menu_mains || '';
document.getElementById('flavor-modify-desserts').value = res.menu_desserts || '';
flavorLoadModifyTimeSlots(res.reservation_date);
}
function flavorLoadModifyTimeSlots(date) {
var select = document.getElementById('flavor-modify-time');
select.innerHTML = '';
var guests = document.getElementById('flavor-modify-guests').value;
fetch(flavorRestUrl + 'restaurants/' + flavorRestaurantId + '/available-slots?date=' + date + '&guests=' + guests)
.then(function(r) { return r.json(); })
.then(function(data) {
select.innerHTML = '';
if (data.success && data.data && data.data.length > 0) {
data.data.forEach(function(slot) {
if (slot.available) { var opt = document.createElement('option'); opt.value = slot.time.substring(0, 5); opt.textContent = slot.time.substring(0, 5); select.appendChild(opt); }
});
var currentTime = flavorCurrentReservation.reservation_time;
var hasCurrentTime = false;
for (var i = 0; i < select.options.length; i++) { if (select.options[i].value === currentTime) { hasCurrentTime = true; break; } }
if (!hasCurrentTime && date === flavorCurrentReservation.reservation_date) {
var opt = document.createElement('option'); opt.value = currentTime; opt.textContent = currentTime.substring(0, 5) + ' ' + flavorI18n.current; opt.selected = true; select.insertBefore(opt, select.firstChild);
}
} else { select.innerHTML = ''; }
})
.catch(function() { select.innerHTML = ''; });
}
document.getElementById('flavor-modify-date').addEventListener('change', function() { flavorLoadModifyTimeSlots(this.value); });
function flavorBackToResult() {
document.querySelector('.flavor-manage-modify').style.display = 'none';
document.querySelector('.flavor-manage-result').style.display = 'block';
}
function flavorSaveModification() {
if (!flavorCurrentReservation) return;
var newTime = document.getElementById('flavor-modify-time').value;
if (!newTime) { flavorToast(flavorI18n.selectTimeFirst); return; }
document.querySelector('.flavor-loader').style.display = 'flex';
fetch(flavorRestUrl + 'reservations/' + flavorCurrentReservation.id + '/modify', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
guests: parseInt(document.getElementById('flavor-modify-guests').value),
reservation_date: document.getElementById('flavor-modify-date').value,
reservation_time: newTime,
first_name: document.getElementById('flavor-modify-first-name').value,
last_name: document.getElementById('flavor-modify-last-name').value,
email: document.getElementById('flavor-modify-email').value,
phone: document.getElementById('flavor-modify-phone').value,
allergies: document.getElementById('flavor-modify-allergies').value,
dietary_restrictions: document.getElementById('flavor-modify-dietary').value,
notes: document.getElementById('flavor-modify-notes').value,
shared_table: document.getElementById('flavor-modify-shared-table').checked ? 1 : 0,
menu_starters: document.getElementById('flavor-modify-starters').value,
menu_mains: document.getElementById('flavor-modify-mains').value,
menu_desserts: document.getElementById('flavor-modify-desserts').value
})
})
.then(function(r) { return r.json(); })
.then(function(data) {
document.querySelector('.flavor-loader').style.display = 'none';
if (data.success) { flavorCurrentReservation = data.data; flavorShowReservationResult(data.data); flavorToast(flavorI18n.modifySuccess, 'success'); }
else { flavorToast(data.message || flavorI18n.modifyError, 'error'); }
})
.catch(function() { document.querySelector('.flavor-loader').style.display = 'none'; flavorToast(flavorI18n.modifyError, 'error'); });
}
function flavorCancelReservation() {
if (!flavorCurrentReservation) return;
if (!confirm(flavorI18n.cancelConfirm)) return;
document.querySelector('.flavor-loader').style.display = 'flex';
fetch(flavorRestUrl + 'reservations/' + flavorCurrentReservation.id + '/cancel-public', { method: 'PUT', headers: { 'Content-Type': 'application/json' } })
.then(function(r) { return r.json(); })
.then(function(data) {
document.querySelector('.flavor-loader').style.display = 'none';
if (data.success) { flavorCurrentReservation.status = 'cancelled'; flavorShowReservationResult(flavorCurrentReservation); flavorToast(flavorI18n.cancelSuccess, 'success'); }
else { flavorToast(data.message || flavorI18n.cancelError, 'error'); }
})
.catch(function() { document.querySelector('.flavor-loader').style.display = 'none'; flavorToast(flavorI18n.cancelError, 'error'); });
}
// == Init ==
flavorRenderCalendar();
flavorCheckStep1();
// Detect manage_code in URL
(function() {
var urlParams = new URLSearchParams(window.location.search);
var manageCode = urlParams.get('manage_code');
if (manageCode || window.location.hash === '#manage') {
flavorShowManage();
setTimeout(function() { var el = document.getElementById('manage'); if (el) { window.scrollTo({ top: window.pageYOffset + el.getBoundingClientRect().top - 20, behavior: 'smooth' }); } }, 500);
if (manageCode) { document.getElementById('flavor-manage-code').value = manageCode; setTimeout(function() { flavorSearchReservation({ code: manageCode }); }, 300); }
}
})();
// Detectar retorno de Stripe Checkout externo con ?payment=success (link de pago enviado por email).
// Dispara el snippet de tracking de pago del depósito. Se ejecuta una sola vez y limpiamos el
// parámetro de la URL para que un F5 no vuelva a disparar el evento.
(function() {
try {
var params = new URLSearchParams(window.location.search);
if (params.get('payment') === 'success') {
flavorRunTrackingSnippet('flavor-tracking-payment');
// Limpiar los parámetros payment=success&code=... de la URL sin recargar
if (window.history && window.history.replaceState) {
params.delete('payment');
params.delete('code');
var qs = params.toString();
var cleanUrl = window.location.pathname + (qs ? '?' + qs : '') + window.location.hash;
window.history.replaceState({}, document.title, cleanUrl);
}
}
} catch (e) {}
})();
Miguel Miralles
Miquel Miralles, Treurer's CEO, is part of the owner family, being already the second generation involved in the project. He has a background in economics and law, and has taken numerous courses related to foreign trade, olive agronomy and extra virgin olive oil production techniques. His training and experience of more than 15 years in the world of olive oil are her guarantee to lead this project.