Por Mayor

<!doctype html>

Parisina
Clientes al por mayor

Registro y actualización de clientes al por mayor

Usa este espacio para registrarte por primera vez como cliente al por mayor de Parisina, o para actualizar los datos que ya tenemos tuyos.

Parisina · Laureles, Medellín

Registro de Cliente Mayorista

Acceso Cliente Mayorista

"

/${PARISINA_CONFIG.catalogoRange}?key=${PARISINA_CONFIG.apiKey}`; const response = await fetch(url); const data = await response.json(); if (!data.values) throw new Error('No Catálogo'); const [headers, ...rows] = data.values; this.catalogo = rows .filter(row => row[7]?.toUpperCase() === 'SI') .map(row => ({ codigo: row[0], categoria: row[1], producto: row[2], presentacion: row[3], precio: parseFloat(row[4]) || 0, diasEntrega: parseInt(row[6]) || 0, })); console.log(`✓ ${this.catalogo.length} productos`); } async loadClientes() { const url = `https://sheets.googleapis.com/v4/spreadsheets/${PARISINA_CONFIG.clientesSheetId}/values/${PARISINA_CONFIG.clientesRange}?key=${PARISINA_CONFIG.apiKey}`; const response = await fetch(url); const data = await response.json(); if (!data.values) throw new Error('No Clientes'); const [headers, ...rows] = data.values; this.clientes = rows .filter(row => { const codigo = parseInt(row[0]); return codigo >= 2001 && codigo <= 2900 && row[11]?.toUpperCase() === 'SI'; }) .map(row => ({ codigo: parseInt(row[0]), nombre: row[1], habituales: (row[9] || '').split(',').map(c => c.trim()).filter(c => c), pinHash: row[10], })); console.log(`✓ ${this.clientes.length} clientes`); } async authenticateClient(codigo, pin) { const cliente = this.clientes.find(c => c.codigo === parseInt(codigo)); if (!cliente) throw new Error('Código no encontrado'); const pinInput = `${codigo}:${pin}`; const pinHash = await this.sha256(pinInput); if (pinHash !== cliente.pinHash) throw new Error('PIN incorrecto'); this.currentClient = cliente; return cliente; } async sha256(message) { const msgBuffer = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); } getHabitualProducts() { if (!this.currentClient) return []; return this.currentClient.habituales .map(codigo => this.catalogo.find(p => p.codigo === codigo)) .filter(p => p !== undefined); } setupEventListeners() { document.querySelectorAll('[data-tab]').forEach(tab => { tab.addEventListener('click', (e) => { const tabName = e.target.dataset.tab; this.switchTab(tabName); }); }); const newClientForm = document.querySelector('[data-form="new-client"]'); if (newClientForm) { newClientForm.addEventListener('submit', (e) => this.handleNewClientSubmit(e)); } const authBtn = document.querySelector('[data-action="auth-client"]'); if (authBtn) { authBtn.addEventListener('click', () => this.handleClientAuth()); } } switchTab(tabName) { document.querySelectorAll('[data-tab-content]').forEach(content => { content.classList.remove('active'); content.style.display = 'none'; }); document.querySelectorAll('[data-tab]').forEach(tab => { tab.classList.remove('active'); }); const activeContent = document.querySelector(`[data-tab-content="${tabName}"]`); if (activeContent) { activeContent.classList.add('active'); activeContent.style.display = 'block'; } document.querySelector(`[data-tab="${tabName}"]`)?.classList.add('active'); } async handleClientAuth() { const codigoInput = document.querySelector('[data-auth-codigo]'); const pinInput = document.querySelector('[data-auth-pin]'); const messageEl = document.querySelector('[data-auth-message]'); if (!codigoInput || !pinInput) return; try { const cliente = await this.authenticateClient(codigoInput.value, pinInput.value); this.displayClientInfo(cliente); this.displayHabitualProducts(); messageEl.textContent = `✓ Bienvenido ${cliente.nombre}`; messageEl.className = 'success-message'; messageEl.style.display = 'block'; } catch (error) { messageEl.textContent = `✗ ${error.message}`; messageEl.className = 'error-message'; messageEl.style.display = 'block'; } } displayClientInfo(cliente) { const infoContainer = document.querySelector('[data-client-info]'); if (!infoContainer) return; infoContainer.innerHTML = `

${cliente.nombre}

Código: ${cliente.codigo}

`; infoContainer.style.display = 'block'; } displayHabitualProducts() { const habitualContainer = document.querySelector('[data-habitual-products]'); if (!habitualContainer) return; const habituales = this.getHabitualProducts(); if (habituales.length === 0) { habitualContainer.innerHTML = '

Sin productos habituales

'; habitualContainer.style.display = 'block'; return; } habitualContainer.innerHTML = `

Productos Habituales

${habituales.map(p => `

${p.producto}

${p.codigo}

$${p.precio.toLocaleString()}

`).join('')}
`; habitualContainer.style.display = 'block'; } handleNewClientSubmit(event) { event.preventDefault(); const messageEl = document.querySelector('[data-auth-message]'); messageEl.textContent = '✓ Solicitud registrada. El equipo se contactará pronto.'; messageEl.className = 'success-message'; messageEl.style.display = 'block'; event.target.reset(); } showError(message) { const alertEl = document.querySelector('[data-alert]'); if (alertEl) { alertEl.textContent = message; alertEl.style.display = 'block'; } } } // Inicializar if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { window.parisinaWholesale = new ParisinaWholesale(); }); } else { window.parisinaWholesale = new ParisinaWholesale(); }

Comparte la magia de la Navidad

Envíos disponibles para Área Metropolitana