216 lines
15 KiB
JavaScript
216 lines
15 KiB
JavaScript
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));
|