PANEL ADMINISTRATIVO

GESTIÓN DE DESCUENTOS

Administra el código STONEBOY22 y revisa el historial de uso

1

Configuración Inicial

Google Sheets + Apps Script

  1. Ve a Google Sheets y crea una hoja nueva llamada "DunkZone Descuentos"
  2. Nombra la primera hoja como "Historial"
  3. En la fila 1, escribe estos encabezados:
    Nº Orden | Fecha | Cliente | WhatsApp | Email | Producto | Talla | Precio Original | Código | Descuento % | Descuento B/. | Total Pagado | Timestamp
  4. Ve a Extensiones → Apps Script
  5. Pega el código de abajo y haz clic en Implementar → Nueva implementación → Tipo: Aplicación Web
  6. Ejecutar como: Yo | Acceso: Cualquiera
  7. Copia la URL generada

EmailJS (Notificaciones)

  1. Regístrate gratis en EmailJS.com
  2. Crea un Email Service (conecta tu Gmail)
  3. Crea un Email Template con este contenido:
Asunto: 🏷️ NUEVO USO DE CÓDIGO - {{order_number}}

📦 Nº de Orden: {{order_number}}
👤 Cliente: {{customer_name}}
📞 Contacto: {{customer_contact}}
📧 Email: {{customer_email}}
👟 Producto: {{product_name}} ({{product_size}})
💰 Precio Original: {{original_price}}
🏷️ Código Usado: {{discount_code}}
💚 Descuento: {{discount_percent}} ({{discount_amount}})
✅ TOTAL PAGADO: {{final_price}}
📅 Fecha: {{order_date}}

Las variables con {{}} deben coincidir exactamente con los nombres del JS

2

Código Google Apps Script

Copia y pega este código en el editor de Apps Script de Google Sheets:

function doPost(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Historial');
  const data = JSON.parse(e.postData.contents);
  
  sheet.appendRow([
    data.orderNumber,
    data.orderDate,
    data.customerName,
    data.customerContact,
    data.customerEmail || 'No proporcionado',
    data.productName,
    data.productSize,
    data.originalPrice,
    data.discountCode,
    data.discountPercent + '%',
    data.discountAmount,
    data.finalPrice,
    data.timestamp
  ]);
  
  return ContentService
    .createTextOutput(JSON.stringify({ success: true }))
    .setMimeType(ContentService.MimeType.JSON);
}

function doGet(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Historial');
  const data = sheet.getDataRange().getValues();
  const headers = data.shift();
  
  const result = data.map(row => ({
    orderNumber: row[0],
    orderDate: row[1],
    customerName: row[2],
    customerContact: row[3],
    customerEmail: row[4],
    productName: row[5],
    productSize: row[6],
    originalPrice: row[7],
    discountCode: row[8],
    discountPercent: row[9],
    discountAmount: row[10],
    finalPrice: row[11],
    timestamp: row[12]
  }));
  
  return ContentService
    .createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}
Después de implementar, obtendrás una URL como https://script.google.com/macros/s/XXXXX/exec
3

Conectar el Sistema

En el archivo descuento/index.js, reemplaza estas 3 variables:

Google Script URL: const GOOGLE_SCRIPT_URL = 'https://script.google.com/macros/s/TU_ID/exec';
EmailJS User ID: const EMAILJS_USER_ID = 'TU_USER_ID';
EmailJS Service ID: const EMAILJS_SERVICE_ID = 'TU_SERVICE_ID';
EmailJS Template ID: const EMAILJS_TEMPLATE_ID = 'TU_TEMPLATE_ID';

Pídeme que actualice esas variables cuando tengas los datos de tus cuentas.

Código Activo

Código

STONEBOY22

Descuento

10%

Estado

Activo

Historial

Google Sheets

Cómo Activar / Desactivar el Código

Para controlar si STONEBOY22 está activo, crea una segunda hoja en tu Google Sheets llamada "Config":

Columna A Columna B
STONEBOY22 ACTIVO o INACTIVO

Cambia el valor en la Columna B para activar/desactivar. El sistema consulta esto en tiempo real.

Google Apps Script - Versión Completa

Usa esta versión actualizada que incluye control de estado (ACTIVO/INACTIVO):

// PEGA ESTO EN GOOGLE APPS SCRIPT (Extensiones → Apps Script)
function doPost(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Historial');
  var data = JSON.parse(e.postData.contents);
  
  sheet.appendRow([
    data.orderNumber, data.orderDate, data.customerName,
    data.customerContact, data.customerEmail || 'No proporcionado',
    data.productName, data.productSize, data.originalPrice,
    data.discountCode, data.discountPercent + '%',
    data.discountAmount, data.finalPrice, data.timestamp
  ]);
  
  return ContentService.createTextOutput(JSON.stringify({ success: true }))
    .setMimeType(ContentService.MimeType.JSON);
}

function doGet(e) {
  var params = e.parameter;
  
  // VERIFICAR SI UN CÓDIGO ESTÁ ACTIVO
  if (params.action === 'status') {
    var configSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Config');
    if (!configSheet) {
      return ContentService.createTextOutput(JSON.stringify({ active: true }))
        .setMimeType(ContentService.MimeType.JSON);
    }
    var configData = configSheet.getDataRange().getValues();
    for (var i = 1; i < configData.length; i++) {
      if (configData[i][0] === params.code) {
        var isActive = configData[i][1] === true || configData[i][1] === 'ACTIVO';
        return ContentService.createTextOutput(JSON.stringify({ active: isActive }))
          .setMimeType(ContentService.MimeType.JSON);
      }
    }
    return ContentService.createTextOutput(JSON.stringify({ active: true }))
      .setMimeType(ContentService.MimeType.JSON);
  }
  
  // OBTENER HISTORIAL COMPLETO
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Historial');
  var data = sheet.getDataRange().getValues();
  var headers = data.shift();
  
  var result = data.map(function(row) {
    return {
      orderNumber: row[0], orderDate: row[1], customerName: row[2],
      customerContact: row[3], customerEmail: row[4], productName: row[5],
      productSize: row[6], originalPrice: row[7], discountCode: row[8],
      discountPercent: row[9], discountAmount: row[10], finalPrice: row[11]
    };
  });
  
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

Checklist de Configuración