almeira-web/dripzone-app/scripts/seed-templates-appwrite.js

216 lines
15 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { Client, Databases } = require('node-appwrite');
const fs = require('fs');
const path = require('path');
const endpoint = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://appwrite.almeira.com.co/v1';
const projectId = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '69b84df5003bd8957c5c';
const apiKey = process.env.APPWRITE_API_KEY || 'standard_cce3cdb866ea6433888d40cedd24dc45987372308fdc3dd0697de08648c0e5c7e04b02c3bcee271403fd656b00a5820f04c08b51631284a6e8a3582d8aed2aa33234f3c29cc777e9b162eb54810b789251b0d006a9a3b081ebc2da53b9baa94614b124b3508ad849fd9a4187cc6094f506d4b57f409b69d9562a74df594f3ec3';
const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID || 'sneakers_multistore_db';
const client = new Client()
.setEndpoint(endpoint)
.setProject(projectId)
.setKey(apiKey);
const databases = new Databases(client);
// Import templates from compiled or read ts file directly
async function seed() {
console.log('🌱 Seeding message templates into Appwrite...');
// Read templates-service.ts to extract default templates
const templateServiceFile = fs.readFileSync(path.resolve(__dirname, '../src/lib/templates-service.ts'), 'utf-8');
// Define templates matching DEFAULT_MESSAGE_TEMPLATES
const templates = [
{
id: 'order_confirmation_customer',
title: 'Confirmación de Pedido al Cliente',
description: 'Mensaje oficial enviado al cliente tras registrar exitosamente su pedido en la tienda.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `🎉 *¡GRACIAS POR TU PEDIDO EN {tienda_nombre}!* 🎉\n📌 *No. de Orden:* #{orden_id}\n\n👤 *Cliente:* {cliente_nombre}\n📱 *Teléfono:* {cliente_telefono}\n📍 *Dirección:* {cliente_direccion}\n🏙️ *Ciudad:* {cliente_ciudad}\n\n📦 *DETALLE DE TU COMPRA:*\n{articulos_resumen}\n\n💵 *Subtotal:* {subtotal}\n🚚 *Envío:* {costo_envio}\n💰 *VALOR TOTAL:* {total}\n{condicion_pago_resumen}\n\n💳 *Método de Pago:* {metodo_pago}\n\nEstamos alistando tu paquete. Te enviaremos el número de guía o notificación de entrega. ¡Muchas gracias por tu confianza! ✨`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre de Tienda', example: 'DripZone', description: 'Nombre comercial' },
{ key: 'orden_id', label: 'No. de Orden', example: 'ORD-9842', description: 'ID orden' },
{ key: 'cliente_nombre', label: 'Nombre del Cliente', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'cliente_telefono', label: 'Teléfono Cliente', example: '3106390296', description: 'Celular' },
{ key: 'cliente_direccion', label: 'Dirección de Entrega', example: 'Calle 5 # 24-80', description: 'Dirección' },
{ key: 'cliente_ciudad', label: 'Ciudad Destino', example: 'Cali', description: 'Ciudad' },
{ key: 'articulos_resumen', label: 'Lista de Artículos', example: '👟 Nike Air Force 1 x1', description: 'Pares' },
{ key: 'subtotal', label: 'Subtotal COP', example: '$125.000 COP', description: 'Subtotal' },
{ key: 'costo_envio', label: 'Costo de Envío', example: 'GRATIS', description: 'Envío' },
{ key: 'total', label: 'Total COP', example: '$125.000 COP', description: 'Total' },
{ key: 'condicion_pago_resumen', label: 'Resumen Anticipo / Saldo', example: '🤝 Pago 100% Contraentrega', description: 'Condición' },
{ key: 'metodo_pago', label: 'Método de Pago', example: 'Contraentrega', description: 'Método' },
{ key: 'saldo_contraentrega', label: 'Saldo en Puerta', example: '$115.000 COP', description: 'Saldo' },
{ key: 'anticipo', label: 'Valor Separación', example: '$10.000 COP', description: 'Anticipo' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'order_checkout_wa',
title: 'Pedido Web hacia WhatsApp de Tienda',
description: 'Texto que el cliente abre en WhatsApp al finalizar su compra en el carrito o checkout web.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `🎉 *CONFIRMACIÓN DE PEDIDO EN {tienda_nombre} #{orden_id}* 🎉\n\n👤 *Cliente:* {cliente_nombre}\n📱 *Teléfono:* {cliente_telefono}\n📍 *Dirección:* {cliente_direccion}, {cliente_ciudad}\n\n📦 *PRODUCTOS SOLICITADOS:*\n{articulos_resumen}\n\n💵 *Subtotal:* {subtotal}\n🚚 *Flete:* {costo_envio}\n💰 *TOTAL A PAGAR:* {total}\n{condicion_pago_resumen}\n💳 *Forma de Pago:* {metodo_pago}\n\n¡Por favor confirmar mi pedido para proceder con el alistamiento! 🔥`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre de Tienda', example: 'DripZone', description: 'Nombre de la marca' },
{ key: 'orden_id', label: 'No. Orden', example: 'ORD-9842', description: 'ID de la orden' },
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'cliente_telefono', label: 'Teléfono', example: '3106390296', description: 'Teléfono' },
{ key: 'cliente_direccion', label: 'Dirección', example: 'Av 6N # 28N-12', description: 'Dirección' },
{ key: 'cliente_ciudad', label: 'Ciudad', example: 'Cali', description: 'Ciudad' },
{ key: 'articulos_resumen', label: 'Productos', example: '👟 Jordan 4 Retro (41) x1', description: 'Resumen' },
{ key: 'subtotal', label: 'Subtotal', example: '$140.000 COP', description: 'Subtotal' },
{ key: 'costo_envio', label: 'Envío', example: 'GRATIS', description: 'Flete' },
{ key: 'total', label: 'Total', example: '$140.000 COP', description: 'Total' },
{ key: 'condicion_pago_resumen', label: 'Condición Pago', example: 'Separación $10.000', description: 'Condición' },
{ key: 'metodo_pago', label: 'Método', example: 'Contraentrega', description: 'Método' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'order_status_dispatched',
title: 'Notificación de Pedido Despachado en Ruta',
description: 'Mensaje enviado cuando la transportadora o mensajero local recoge el paquete.',
category: 'logistics_shipping',
channel: 'whatsapp',
isActive: true,
content: `🚚 *¡TU PEDIDO VA EN CAMINO!* 📦💨\n\nHola {cliente_nombre}, tus zapatillas ya fueron despachadas para entrega en *{cliente_ciudad}*.\n\n📌 *Orden:* #{orden_id}\n📍 *Dirección de Entrega:* {cliente_direccion}\n📦 *Empresa Transportadora:* {transportadora}\n🏷️ *Número de Guía / Rastreo:* *{numero_guia}*\n🤝 *Valor a Pagar al Recibir (Contraentrega):* *{saldo_contraentrega}*\n\nPor favor estar atento a la portería o celular. ¡Gracias por tu compra en {tienda_nombre}! 🔥`,
availableVariables: JSON.stringify([
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'orden_id', label: 'No. Orden', example: 'ORD-9842', description: 'ID de la orden' },
{ key: 'cliente_direccion', label: 'Dirección', example: 'Carrera 100 # 16-20', description: 'Dirección' },
{ key: 'cliente_ciudad', label: 'Ciudad', example: 'Cali', description: 'Ciudad' },
{ key: 'transportadora', label: 'Transportadora', example: 'Interrapidísimo / Mensajería Urbana', description: 'Operador' },
{ key: 'numero_guia', label: 'Número de Guía', example: 'GUIA-8839201', description: 'Guía' },
{ key: 'saldo_contraentrega', label: 'Saldo a Pagar', example: '$125.000 COP', description: 'Saldo contraentrega' },
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Marca' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'order_status_delivered',
title: 'Confirmación de Pedido Entregado con Éxito',
description: 'Mensaje post-venta enviado cuando el mensajero confirma entrega exitosa.',
category: 'logistics_shipping',
channel: 'whatsapp',
isActive: true,
content: `⭐ *¡PEDIDO ENTREGADO CON ÉXITO!* ⭐\n\nHola {cliente_nombre}, nuestro sistema confirma que tu orden *#{orden_id}* fue entregada exitosamente.\n\nEsperamos que disfrutes al máximo tus nuevas zapatillas. Recuerda que cuentas con garantía por defectos y cambio de talla.\n\n📸 ¡Sube tu foto a Instagram y etiquétanos en *{instagram_handle}* para un 10% de descuento en tu próxima compra!\n\n¡Muchas gracias por elegir {tienda_nombre}! ✨`,
availableVariables: JSON.stringify([
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'orden_id', label: 'No. Orden', example: 'ORD-9842', description: 'ID orden' },
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Marca' },
{ key: 'instagram_handle', label: 'Instagram', example: '@dripzone.co', description: 'Cuenta IG' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'auth_login_otp',
title: 'Código OTP de Seguridad para Iniciar Sesión',
description: 'Código de 6 dígitos enviado por WhatsApp al usuario para autenticación sin contraseña.',
category: 'security_auth',
channel: 'whatsapp',
isActive: true,
content: `🔐 *{tienda_nombre} - Código de Seguridad*\n\nHola {usuario_nombre}, tu código de verificación para acceder a tu cuenta es:\n\n👉 *{codigo_otp}*\n\n⏱️ _Válido por 5 minutos. No compartas este código con nadie._`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Marca' },
{ key: 'usuario_nombre', label: 'Nombre Usuario', example: 'Cliente DripZone', description: 'Usuario' },
{ key: 'codigo_otp', label: 'Código de 6 Dígitos', example: '849201', description: 'Código OTP' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'auth_register_otp',
title: 'Código OTP para Verificación de Nueva Cuenta',
description: 'Código enviado por WhatsApp al nuevo cliente tras registrar su cuenta en la plataforma.',
category: 'security_auth',
channel: 'whatsapp',
isActive: true,
content: `👟 *¡Bienvenido(a) a {tienda_nombre}!* ✨\n\nHola {usuario_nombre}, ingresa el siguiente código en la app para verificar tu número de WhatsApp:\n\n👉 *{codigo_otp}*\n\nAl validar tu cuenta, habilitas compras 100% contraentrega sin fricción. ¡Gracias por unirte! 🔥`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Marca' },
{ key: 'usuario_nombre', label: 'Nombre Usuario', example: 'Cliente DripZone', description: 'Nombre' },
{ key: 'codigo_otp', label: 'Código de 6 Dígitos', example: '582194', description: 'Código OTP' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'customer_deposit_request',
title: 'Solicitud de Separación con $10.000 COP (Garantía de Despacho)',
description: 'Mensaje con enlace oficial para pagar el anticipo de $10.000 COP (PSE, Tarjetas, Nequi) y programar el envío.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `⚡ *{tienda_nombre} - CONFIRMACIÓN DE DESPACHO* 📦\n\nHola {cliente_nombre}, para programar el despacho express de tu orden *#{orden_id}* hacia *{cliente_ciudad}*, realiza el pago del anticipo de separación de *{valor_anticipo}*.\n\n💳 *Paga en línea de forma 100% segura (PSE, Tarjetas Débito/Crédito, Nequi o Bre-B):*\n👉 {link_pago_bold}\n\n🤝 El saldo restante de *{saldo_contraentrega}* lo cancelas al recibir tu paquete en tu puerta (en efectivo o transferencia). ¡Gracias por tu compra!`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Tienda' },
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Cliente' },
{ key: 'orden_id', label: 'No. Orden', example: 'ORD-9842', description: 'ID orden' },
{ key: 'cliente_ciudad', label: 'Ciudad', example: 'Cali', description: 'Ciudad' },
{ key: 'valor_anticipo', label: 'Valor Anticipo', example: '$10.000 COP', description: 'Separación' },
{ key: 'saldo_contraentrega', label: 'Saldo Contraentrega', example: '$125.000 COP', description: 'Saldo' },
{ key: 'link_pago_bold', label: 'Link de Pago', example: 'https://drip-zone.online', description: 'Enlace Pago' }
]),
updatedAt: new Date().toISOString()
},
{
id: 'customer_deposit_confirmed',
title: 'Confirmación de Anticipo al Cliente',
description: 'Notificación enviada al cliente por WhatsApp cuando su pago de anticipo de separación es acreditado con éxito.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `🎉 *¡Tu anticipo de separación fue confirmado con éxito!*\n\nHola *{cliente_nombre}*, recibimos correctamente tu pago de *{valor_anticipo}* en línea.\n\n📦 Tu orden *#{orden_id}* ya se encuentra en alistamiento y empaque para despacho a *{cliente_ciudad}*.\n🤝 *Saldo restante a pagar contraentrega:* *{saldo_contraentrega}* al recibir en tu puerta.\n\nPuedes consultar el estado de tu pedido en cualquier momento desde la app oficial de {tienda_nombre}.\n\n¡Muchas gracias por tu compra en {tienda_nombre}!`,
availableVariables: JSON.stringify([
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre de la tienda' },
{ key: 'cliente_nombre', label: 'Nombre Cliente', example: 'Cliente DripZone', description: 'Nombre del comprador' },
{ key: 'orden_id', label: 'No. de Orden', example: 'ORD-9842', description: 'ID de la orden' },
{ key: 'valor_anticipo', label: 'Valor Anticipo', example: '$10.000 COP', description: 'Monto anticipo pagado' },
{ key: 'cliente_ciudad', label: 'Ciudad Destino', example: 'Cali', description: 'Municipio de entrega' },
{ key: 'saldo_contraentrega', label: 'Saldo Contraentrega', example: '$115.000 COP', description: 'Saldo en puerta' }
]),
updatedAt: new Date().toISOString()
}
];
for (const t of templates) {
try {
const doc = await databases.getDocument(databaseId, 'message_templates', t.id);
console.log(`ℹ️ Plantilla ${t.id} ya existe, actualizando...`);
await databases.updateDocument(databaseId, 'message_templates', t.id, {
title: t.title,
description: t.description,
category: t.category,
channel: t.channel,
content: t.content,
availableVariables: t.availableVariables,
isActive: t.isActive,
updatedAt: t.updatedAt
});
console.log(`✅ Plantilla ${t.id} actualizada.`);
} catch (e) {
console.log(`Creando plantilla ${t.id}...`);
await databases.createDocument(databaseId, 'message_templates', t.id, {
title: t.title,
description: t.description,
category: t.category,
channel: t.channel,
content: t.content,
availableVariables: t.availableVariables,
isActive: t.isActive,
updatedAt: t.updatedAt
});
console.log(`✅ Plantilla ${t.id} creada en Appwrite.`);
}
}
console.log('🎉 ¡Todas las plantillas quedaron sincronizadas en Appwrite!');
}
seed().catch(err => console.error('Error seeding templates:', err));