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));