Tienda M&A Soluciones

180 productos de limpieza eco-friendly. Pide por WhatsApp y recibe en Cd. Victoria. Pago por transferencia o contra entrega.

180
Productos
9
Categorías
12
Marcas propias
180 productos
Agregado al carrito
// ============================================================ // SISTEMA DE PEDIDOS v3 — Integrado con Base44 // ============================================================ // ── CONFIGURACIÓN ────────────────────────────────────────── // PASO 1: Pega aquí la URL de tu función en Base44 cuando la tengas lista. // Mientras esté vacía, el sistema funciona solo con localStorage. var BASE44_URL = ''; // Ej: 'https://api.base44.app/api/apps/TU_APP_ID/functions' var MA_ORDERS_KEY = 'ma_orders_v3'; var STATUS_STEPS = ['Pendiente','Confirmado','Enviado','Entregado']; var STATUS_IDX = { pendiente:0, confirmado:1, enviado:2, entregado:3 }; var STATUS_LABEL = { pendiente: '⏳ Pendiente', confirmado:'✅ Confirmado', enviado: '🚚 Enviado', entregado: '🎉 Entregado', cancelado: '❌ Cancelado' }; function loadOrders(){ try{ return JSON.parse(localStorage.getItem(MA_ORDERS_KEY)||'[]'); } catch(e){ return []; } } function saveOrders(orders){ localStorage.setItem(MA_ORDERS_KEY, JSON.stringify(orders)); } // ── CONSULTA A BASE44 ─────────────────────────────────────── // Devuelve { status, folio } o null si falla / no configurado async function fetchStatusFromBase44(folio){ if(!BASE44_URL) return null; try{ var res = await fetch(BASE44_URL + '/checkOrderStatus?folio=' + encodeURIComponent(folio), { headers:{ 'Content-Type':'application/json' } }); if(!res.ok) return null; var data = await res.json(); // Base44 debe devolver: { status: "pendiente"|"confirmado"|"enviado"|"entregado"|"cancelado" } return data; } catch(e){ return null; } } // Envía pedido a Base44 para guardarlo (llamado después del submit) async function pushOrderToBase44(order){ if(!BASE44_URL) return; try{ await fetch(BASE44_URL + '/createOrder', { method:'POST', headers:{ 'Content-Type':'application/json' }, body: JSON.stringify({ folio: order.folio, customer_name: order.name, customer_phone: order.phone, customer_address: order.address, payment_method: order.pay, notes: order.notes, total: order.total, items: order.items.map(function(i){ return { product_id:i.id, name:i.name, quantity:i.qty, unit_price:i.price }; }) }) }); } catch(e){ /* silencioso — el pedido ya está en localStorage */ } } // ── RENDER PEDIDOS ────────────────────────────────────────── function renderOrders(){ var orders = loadOrders(); var list = document.getElementById('ordersList'); var badge = document.getElementById('navOrdersBadge'); if(!list) return; if(badge){ badge.textContent = orders.length || ''; badge.style.display = orders.length ? 'inline-flex' : 'none'; } if(orders.length === 0){ list.innerHTML = [ '
', '
📋
', '

Sin pedidos todavía

', '

Cuando realices tu primer pedido, aparecerá aquí con su seguimiento.

', '
' ].join(''); return; } var hasBase44 = !!BASE44_URL; list.innerHTML = [...orders].reverse().map(function(o){ var sk = o.status || 'pendiente'; var idx = STATUS_IDX[sk] !== undefined ? STATUS_IDX[sk] : 0; var pill = '' + (STATUS_LABEL[sk]||sk) + ''; var progress = STATUS_STEPS.map(function(s,i){ var cls = i < idx ? 'done' : i === idx ? 'active' : ''; var line = i < STATUS_STEPS.length-1 ? '' : ''; return '
' + line + '
' + ''+s+'' + '
'; }).join(''); var items = o.items.map(function(i){ return i.qty+'x '+(i.name.length>48 ? i.name.slice(0,48)+'…' : i.name)+ ' — $'+(i.qty*i.price).toFixed(2); }).join('
'); var waMsg = buildWAMessage(o); var waUrl = 'https://wa.me/'+WA_NUMBER+'?text='+encodeURIComponent(waMsg); var syncLine = hasBase44 ? 'Sincronizado con Base44' : 'Sin conexión a Base44 aún'; return [ '
', '
', ' Folio '+o.folio+'', ' '+pill, ' '+o.date+'', '
', '
', '
'+items+'
', '
'+progress+'
', ' '+syncLine, '
', '
', '
'+o.name+'
'+o.phone+'
', ' $'+o.total.toFixed(2)+' MXN', ' ', ' ', ' Dar seguimiento por WhatsApp', ' ', '
', '
' ].join('\n'); }).join(''); } // ── ACTUALIZACIÓN MASIVA (botón Actualizar) ───────────────── async function refreshAllStatuses(){ var btn = document.getElementById('refreshOrders'); if(btn) btn.classList.add('spinning'); var orders = loadOrders(); if(!BASE44_URL || orders.length === 0){ if(btn) btn.classList.remove('spinning'); renderOrders(); return; } var updated = false; for(var i=0; iFolio no encontrado
', 'No encontramos el folio '+folio+'.', BASE44_URL ? ' Verifica que el folio sea correcto.' : ' La consulta en tiempo real estará disponible cuando conectes Base44.' ].join(''); return; } var sk = finalStatus; var idx = STATUS_IDX[sk] !== undefined ? STATUS_IDX[sk] : 0; var prog = STATUS_STEPS.map(function(s,i){ var cls = i < idx ? 'done' : i === idx ? 'active' : ''; var line= i < STATUS_STEPS.length-1 ? '' : ''; return '
'+line+'
'+s+'
'; }).join(''); result.className = 'folio-result ok'; result.style.display = 'block'; result.innerHTML = [ '
', ' Folio '+folio+'', ' '+STATUS_LABEL[sk]+'', ' Fuente: '+source+'', '
', '
'+prog+'
' ].join(''); } // ── GUARDAR PEDIDO AL HACER SUBMIT ───────────────────────── var origForm2 = document.getElementById('orderForm'); if(origForm2){ origForm2.addEventListener('submit', function(){ setTimeout(async function(){ var name = (document.getElementById('fName')||{}).value||''; var phone = (document.getElementById('fPhone')||{}).value||''; var address = (document.getElementById('fAddress')||{}).value||''; var pay = (document.querySelector('input[name="pay"]:checked')||{}).value||'Por definir'; var notes = (document.getElementById('fNotes')||{}).value||''; if(!name||!phone||!address) return; var cartSnap = (typeof state !== 'undefined' && state.cart && state.cart.length) ? state.cart.slice() : JSON.parse(localStorage.getItem('ma_cart')||'[]'); if(!cartSnap.length) return; var total = cartSnap.reduce(function(s,i){ return s+i.qty*i.price; }, 0); var folio = 'MA-'+Date.now().toString().slice(-6); var order = { id: Date.now(), folio: folio, date: new Date().toLocaleDateString('es-MX',{day:'2-digit',month:'short',year:'numeric',hour:'2-digit',minute:'2-digit'}), name:name, phone:phone, address:address, pay:pay, notes:notes, items: cartSnap.map(function(i){ return {id:i.id,name:i.name,price:i.price,qty:i.qty}; }), total:total, status:'pendiente' }; var orders = loadOrders(); orders.push(order); saveOrders(orders); renderOrders(); // Mostrar sección pedidos var sec = document.getElementById('misPedidos'); if(sec){ sec.style.display='block'; } // Intentar enviar a Base44 (async, no bloquea) pushOrderToBase44(order); }, 500); }, true); } // ── BOTÓN ACTUALIZAR ──────────────────────────────────────── var refBtn = document.getElementById('refreshOrders'); if(refBtn) refBtn.addEventListener('click', refreshAllStatuses); // ── BOTÓN LIMPIAR ─────────────────────────────────────────── var clearBtn2 = document.getElementById('clearOrders'); if(clearBtn2){ clearBtn2.addEventListener('click', function(){ if(confirm('¿Limpiar todo el historial de pedidos de este dispositivo?')){ localStorage.removeItem(MA_ORDERS_KEY); renderOrders(); } }); } // ── BUSCADOR: eventos ─────────────────────────────────────── var srchBtn = document.getElementById('folioSearchBtn'); if(srchBtn) srchBtn.addEventListener('click', searchByFolio); var folioInp = document.getElementById('folioInput'); if(folioInp){ folioInp.addEventListener('keydown', function(e){ if(e.key==='Enter') searchByFolio(); }); } // ── AUTO-ACTUALIZAR al abrir la sección ───────────────────── var navBtn2 = document.getElementById('navOrdersBtn'); if(navBtn2){ navBtn2.addEventListener('click', function(){ var sec = document.getElementById('misPedidos'); if(sec && sec.style.display !== 'none') refreshAllStatuses(); }); } // Mensaje WA con folio function buildWAMessage(o){ var lines = [ 'Hola M&A Soluciones 🌿', 'Quiero dar seguimiento a mi pedido. *Folio: '+o.folio+'*','', ]; o.items.forEach(function(i){ lines.push('• '+i.qty+'x '+i.name+' — $'+(i.qty*i.price).toFixed(2)); }); lines.push('','*Total: $'+o.total.toFixed(2)+' MXN*',''); lines.push('📋 *Mis datos*'); lines.push('• Nombre: '+o.name); lines.push('• Teléfono: '+o.phone); lines.push('• Dirección: '+o.address); lines.push('• Pago: '+o.pay); if(o.notes) lines.push('• Notas: '+o.notes); lines.push('','¿Me puede confirmar el estatus de entrega? ¡Gracias!'); return lines.join('\n'); } renderOrders();