feat: plantillas configurables de catalogo/marketing, pago de separacion exclusivo por Bold, textos de calzado saneados y envio/garantia dependiente de ciudad

This commit is contained in:
AI Bot 2026-09-10 22:23:21 -05:00
parent e4820668cb
commit 7d051d2d83
17 changed files with 936 additions and 135 deletions

View File

@ -27,11 +27,11 @@ export function generateAttractiveProductCopy(product: {
return `${selectedHook}
✨ *¿Por qué todos las eligen?*
• 💎 *Calidad G5 / 1.1 Prémium:* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables.
• 💎 *Materiales Seleccionados:* Materiales de alto rendimiento, acabados prémium y silueta impecable.
• ☁️ *Confort Inigualable:* Plantilla acolchada ergonómica para máxima suavidad al caminar o entrenar.
• 🚚 *Despacho Prioritario Nacional:* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia.
• 💵 *Pago 100% Contraentrega:* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Revisas tu producto y verificas tu talla con total respaldo.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del flete y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Realizas tu pedido y pagas al recibir en tu puerta según cobertura.
• 🛡️ *Garantía Directa:* Revisas tu producto y cuentas con garantía de fábrica y cambio de talla.
⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla en bodega nacional. ¡Asegura tu par ahora antes de que se agoten!`;
}

View File

@ -79,9 +79,9 @@ object TemplateManager {
"customer_deposit_request" to (
"⚡ *{tienda_nombre} - CONFIRMACIÓN DE DESPACHO* 📦\n\n" +
"Hola {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 por Bold (PSE / Tarjetas / Bre-B / Nequi):*\n" +
"💳 *Paga en línea de forma 100% segura por Bold (PSE / Tarjetas / Bre-B):*\n" +
"👉 {link_pago_bold}\n\n" +
"🤝 El saldo restante de *{saldo_contraentrega}* lo cancelas al recibir tu paquete en tu puerta. ¡Gracias por tu compra!"
"🤝 El saldo restante de *{saldo_contraentrega}* lo cancelas al recibir tu paquete en tu puerta (en efectivo o con Bold). ¡Gracias por tu compra!"
),
"customer_deposit_confirmed" to (
"🎉 *¡Tu anticipo de separación fue confirmado con éxito!*\n\n" +
@ -97,13 +97,13 @@ object TemplateManager {
"📍 *Dirección de Entrega:* {cliente_direccion}\n" +
"🏙️ *Ciudad:* {cliente_ciudad}\n" +
"💵 *Saldo a Pagar Contraentrega:* *{saldo_contraentrega}*\n" +
"💳 *Medio de Pago:* {metodo_pago} (Efectivo o Transferencia Nequi)\n\n" +
"💳 *Medio de Pago:* {metodo_pago} (Efectivo o mediante Bold al recibir)\n\n" +
"Por favor estar atento a la portería o celular. ¡Gracias por tu compra en {tienda_nombre}! 🔥"
),
"order_delivered" to (
"🌟 ¡Hola *{cliente_nombre}*! Tu orden #{orden_id} ha sido *ENTREGADA CON ÉXITO*.\n\n" +
"👟 Esperamos que disfrutes al máximo tus zapatillas.\n\n" +
"💬 Si tienes cualquier consulta sobre el 1er cambio de talla gratuito o garantía, estamos a tu disposición por este canal oficial.\n\n" +
"💬 Si tienes cualquier consulta sobre garantía o cambio de talla (sujeto a cobertura y políticas según tu ciudad), estamos a tu disposición por este canal oficial.\n\n" +
"¡Muchas gracias por elegir {tienda_nombre}! ✨"
),
"auth_login_otp" to (

View File

@ -344,7 +344,7 @@ export default function AdminPaymentMethodsPage() {
<label className="block text-[11px] font-bold text-neutral-400 mb-1">Descripción para el Cliente</label>
<textarea
rows={2}
placeholder="Ej. Separa con $10.000 COP vía Nequi/Daviplata y paga el saldo al recibir en casa."
placeholder="Ej. Separa con $10.000 COP vía Bold oficial y paga el saldo en efectivo o mediante Bold al recibir."
value={editingMethod.description || ''}
onChange={(e) => setEditingMethod({ ...editingMethod, description: e.target.value })}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-xs text-white outline-hidden focus:border-purple-500"
@ -355,7 +355,7 @@ export default function AdminPaymentMethodsPage() {
<label className="block text-[11px] font-bold text-neutral-400 mb-1">Cuentas o Instrucciones de Pago</label>
<input
type="text"
placeholder="Ej. Nequi / Daviplata: 316 745 5877 • Carlos Innova"
placeholder="Ej. Pasarela Bold Oficial • PSE / Tarjetas / QR"
value={editingMethod.accountInfo || ''}
onChange={(e) => setEditingMethod({ ...editingMethod, accountInfo: e.target.value })}
className="w-full bg-neutral-950 border border-neutral-800 rounded-xl px-3 py-2 text-xs text-white outline-hidden focus:border-purple-500"

View File

@ -178,19 +178,13 @@ export async function POST(request: Request) {
: '37, 38, 39, 40, 41, 42, 43';
const priceFormatted = formatCOP(matchedProduct.retailPrice || 125000);
const responseText = (
`👟 *${matchedProduct.name}*\n` +
`━━━━━━━━━━━━━━━━━━━━━━\n` +
`📏 *Tallas Disponibles:* ${sizesText} (Horma Nacional)\n` +
`💵 *Precio Oficial:* *${priceFormatted} COP*\n` +
`🚚 *Pago Contraentrega:* Pagas un anticipo de *$10.000* para despacho garantizado y el resto al recibir.\n` +
`🛡️ *Garantía:* 1er cambio de talla gratuito.\n\n` +
`🛒 *¿Cómo procesar tu pedido y pago seguro?*\n` +
`Para tu seguridad, asignación de factura y reserva de tu talla, el pedido y pago del anticipo ($10.000 por Bold / PSE / Nequi / Tarjetas) se procesan a través de nuestra plataforma:\n\n` +
`👉 *Enlace directo de compra:* ${checkoutUrl}\n` +
`📱 *O pide en nuestra App Móvil:* https://drip-zone.online/app-dripzone.apk\n\n` +
`Diligencia tus datos de envío en el enlace y hoy mismo programamos tu despacho. Si necesitas ayuda con tu talla habitual, ¡aquí estamos para asesorarte!`
);
const responseText = dataService.renderMessageTemplate('whatsapp_bot_inquiry', {
producto_nombre: matchedProduct.name,
tallas: sizesText,
precio: priceFormatted,
enlace_checkout: checkoutUrl,
enlace_app: 'https://drip-zone.online/app-dripzone.apk',
});
let sent = false;
const primaryImage = matchedProduct.images?.[0] || matchedProduct.colors?.[0]?.image;
@ -220,21 +214,12 @@ export async function POST(request: Request) {
if (isCommercialGreeting && !isQuickFollowup) {
customerChatCache.set(customerPhone, now);
const generalResponse = (
`¡Hola! 👋 Te damos la bienvenida a *DripZone Colombia* 🇨🇴\n` +
`Tu tienda oficial de sneakers, zapatillas y streetwear con horma nacional.\n` +
`━━━━━━━━━━━━━━━━━━━━━━\n\n` +
`👀 *Puedes consultar nuestro catálogo y modelos aquí en WhatsApp o en nuestra tienda online:*\n` +
`🌐 *Catálogo Completo:* https://drip-zone.online\n` +
`🛒 *Procesar Pedido:* https://drip-zone.online/checkout\n` +
`📱 *Descargar App Android:* https://drip-zone.online/app-dripzone.apk\n\n` +
`💡 *¿Cómo funciona tu compra?*\n` +
`1️⃣ Elige tu modelo y talla en el catálogo.\n` +
`2️⃣ Los pedidos y pagos se procesan en la web o app para asegurar tu factura y despacho inmediato.\n` +
`3️⃣ Realizas un anticipo de *$10.000* por Bold (PSE, tarjetas o Nequi) y pagas el saldo restante *contraentrega* al recibir en tu puerta.\n` +
`4️⃣ Tu primer cambio de talla es 100% gratuito.\n\n` +
`💬 *¿Te gustó algún modelo de nuestro catálogo de WhatsApp?* Indícanos el nombre o tu talla y con gusto te asesoramos y enviamos el enlace directo.`
);
const generalResponse = dataService.renderMessageTemplate('whatsapp_bot_greeting', {
tienda_nombre: 'DripZone',
enlace_tienda: 'https://drip-zone.online',
enlace_checkout: 'https://drip-zone.online/checkout',
enlace_app: 'https://drip-zone.online/app-dripzone.apk',
});
await sendWhatsAppMessage(customerPhone, generalResponse, 'DripZone', '83B5BD230796-4324-AE73-3508F69E279D');

View File

@ -466,7 +466,7 @@ export default function CheckoutPage() {
</div>
<p className="text-xs text-neutral-300 leading-relaxed">
Escanea el <strong>Código QR Bre-B</strong> desde <strong>Bancolombia, Nequi, Daviplata</strong> o cualquier app bancaria, o toca el botón para pagar en línea:
Escanea el <strong>Código QR Bre-B</strong> o toca el botón para pagar en línea de forma 100% segura con <strong>Bold</strong>:
</p>
{boldPayment?.qrImageUrl ? (
@ -500,19 +500,14 @@ export default function CheckoutPage() {
className="w-full bg-gradient-to-r from-purple-600 to-indigo-600 hover:from-purple-500 hover:to-indigo-500 text-white font-black text-xs py-3 px-4 rounded-xl flex items-center justify-center gap-2 shadow-lg transition-all"
>
<CreditCard className="w-4 h-4" />
<span>Pagar $10.000 con Bold (PSE / Tarjeta / Nequi)</span>
<span>Pagar $10.000 con Bold (PSE / Tarjetas / Bre-B)</span>
<ExternalLink className="w-3.5 h-3.5" />
</a>
)}
<div className="bg-neutral-900/90 p-2.5 rounded-xl border border-neutral-800 text-xs font-mono text-neutral-300 flex justify-between items-center">
<span>📱 Transferencia Directa:</span>
<strong className="text-white">Nequi: {storeSettings?.nequiAccount || '310 639 0296'}</strong>
</div>
</div>
<div className="pt-2 border-t border-white/10 flex justify-between items-center text-xs">
<span className="text-neutral-400">🤝 Saldo restante contraentrega:</span>
<span className="text-neutral-400">🤝 Saldo restante contraentrega (efectivo o mediante Bold):</span>
<span className="text-emerald-400 font-bold font-mono">
{formatCOP(Math.max(0, orderCompleted.totalAmount - (orderCompleted.depositAmount || 10000)))} COP
</span>
@ -586,7 +581,7 @@ export default function CheckoutPage() {
</span>
</div>
<p className="text-xs text-neutral-300 leading-relaxed">
Tu calzado y talla seleccionada están reservados. Completa tu dirección y confirma el anticipo de <strong className="text-emerald-400">$10.000 por Bold</strong> (PSE, tarjetas o Nequi) para despachar hoy. El saldo restante lo pagas <strong>contraentrega</strong> al recibir en tu puerta.
Tu calzado y talla seleccionada están reservados. Completa tu dirección y confirma el anticipo de <strong className="text-emerald-400">$10.000 por Bold</strong> (PSE o tarjetas) para asegurar tu despacho hoy. El saldo restante lo pagas <strong>contraentrega (en efectivo o mediante Bold)</strong> al recibir en tu puerta.
</p>
</div>
</div>

View File

@ -18,6 +18,7 @@ import {
} from 'lucide-react';
import { Product } from '@/types';
import { formatCOP } from '@/lib/pricing-engine';
import { renderClientTemplate, initClientTemplates } from '@/lib/templates-client';
interface WhatsAppOrderLinkModalProps {
isOpen: boolean;
@ -42,6 +43,10 @@ export function WhatsAppOrderLinkModal({
? product.sizes
: ['37', '38', '39', '40', '41', '42', '43'];
useEffect(() => {
initClientTemplates();
}, []);
useEffect(() => {
if (product) {
if (availableSizes.length > 0) {
@ -69,20 +74,19 @@ export function WhatsAppOrderLinkModal({
const greeting = customerName.trim()
? `¡Hola ${customerName.trim()}! 👋`
: '¡Hola! 👋';
const appDownloadUrl = `${domain}/app-dripzone.apk`;
const advisorNote = customNote.trim() ? `📝 *Nota del Asesor:* ${customNote.trim()}\n\n` : '';
const commercialMessage = (
`${greeting} Qué gusto saludarte de parte de *DripZone Colombia* 🇨🇴\n\n` +
`Para confirmar tu pedido de las *${product.name}* en talla *${selectedSize}* (Horma Nacional) y despacharlo con total garantía y factura:\n\n` +
`💎 *Precio Oficial:* ${formattedPrice} COP\n` +
`🚚 *Pago Contraentrega:* Pagas un anticipo de *$10.000* por Bold (PSE, tarjetas o Nequi) para asegurar tu despacho y el saldo restante contraentrega al recibir.\n` +
`🛡️ *Beneficio Exclusivo:* 1er cambio de talla 100% gratuito.\n\n` +
`🛒 *Por favor completa tus datos de entrega y anticipo seguro aquí:*\n` +
`👉 ${checkoutUrl}\n\n` +
`📱 *O si prefieres, descárgate nuestra App Móvil oficial:*\n` +
`https://drip-zone.online/app-dripzone.apk\n\n` +
(customNote.trim() ? `📝 *Nota del Asesor:* ${customNote.trim()}\n\n` : '') +
`Cualquier inquietud con tu dirección o el pago, ¡aquí estamos para ayudarte!`
).trim();
const commercialMessage = renderClientTemplate('catalog_order_message', {
saludo: greeting,
tienda_nombre: 'DripZone',
producto_nombre: product.name,
talla: selectedSize,
precio: formattedPrice,
enlace_checkout: checkoutUrl,
enlace_app: appDownloadUrl,
nota_asesor: advisorNote,
}).trim();
const handleCopyUrl = () => {
navigator.clipboard.writeText(checkoutUrl);

View File

@ -1,12 +1,13 @@
import { sanitizePublicationTitle, sanitizePublicationText } from './sanitizer';
import { dataService } from './data-service';
/**
* Generador de Textos Comerciales Persuasivos y Atractivos para Calzado Deportivo
* Produce descripciones llamativas con llamados a la acción (CTA), beneficios de calidad G5/1.1,
* garantía de entrega y estética street-wear colombiana para maximizar conversiones.
* Generador de Textos Comerciales para Calzado Deportivo y Moda Urbana
* Produce descripciones limpias, auténticas y llamativas basadas en la plantilla
* configurable de la tienda, sin inventar materiales inexistentes (como costuras falsas o calidades G5).
*
* REGLA ESTRICTA: NI en el título NI en el texto de la publicación se debe incluir el nombre
* del grupo de WhatsApp ni el proveedor del producto.
* del grupo de WhatsApp ni el proveedor del producto ni costos internos.
*/
export function generateAttractiveProductCopy(product: {
@ -26,30 +27,30 @@ export function generateAttractiveProductCopy(product: {
const cat = (product.category || '').toLowerCase();
let hook = '';
let bullet1 = '• 💎 *Calidad Prémium Garantizada:* Materiales de alto rendimiento, costuras reforzadas y acabados de lujo.';
let bullet1 = '• 💎 *Materiales Seleccionados:* Materiales de alto rendimiento, acabados prémium y silueta impecable.';
let bullet2 = '• ☁️ *Máximo Confort y Ergonomía:* Diseñado para acompañarte todo el día con total comodidad.';
let cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles en inventario nacional. ¡Asegura el tuyo ahora antes de que se agoten!';
let cta = '⚠️ *Disponibilidad:* Pocas unidades disponibles por talla. ¡Asegura el tuyo ahora!';
if (cat.includes('chancla') || cat.includes('slide') || cat.includes('sandalia')) {
hook = `🔥 ¡Comodidad insuperable con las nuevas ${cleanName}! Diseñadas para descanso, piscina o estilo urbano relajado con materiales ultra livianos y amortiguación suave.`;
bullet1 = '• 💎 *Material EVA / Suave de Alta Densidad:* Espuma ergonómica que no se deforma y absorbe el impacto al caminar.';
bullet2 = '• 🌊 *Resistentes al Agua y Antideslizantes:* Suela con agarre óptimo para máxima seguridad y secado rápido.';
bullet1 = '• 💎 *Material EVA de Alta Densidad:* Espuma ergonómica que absorbe el impacto al caminar y mantiene su forma.';
bullet2 = '• 🌊 *Resistentes al Agua y Antideslizantes:* Suela con agarre seguro para todo tipo de superficies.';
cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla. ¡Pide tus chanclas hoy mismo!';
} else if (cat.includes('carriel') || cat.includes('bandolera') || cat.includes('riñonera') || cat.includes('crossbody')) {
hook = `🔥 ¡Lleva tus esenciales con el auténtico estilo y practicidad del ${cleanName}! Múltiples compartimientos, cierres de alta durabilidad y correa ajustable ergonómica.`;
bullet1 = '• 💎 *Materiales de Alta Resistencia:* Acabados prémium, costuras de seguridad y cierres metálicos fluidos.';
bullet1 = '• 💎 *Materiales de Alta Resistencia:* Acabados prémium, herrajes reforzados y cierres metálicos fluidos.';
bullet2 = '• 👝 *Distribución Inteligente:* Espacio seguro para celular, billetera, llaves y documentos con fácil acceso.';
cta = '⚠️ *Edición Exclusiva:* Pocas unidades en bodega. ¡Haz tu pedido y paga al recibir en tu casa!';
cta = '⚠️ *Edición Exclusiva:* Pocas unidades en bodega. ¡Haz tu pedido y paga al recibir!';
} else if (cat.includes('malet') || cat.includes('morral') || cat.includes('mochila') || cat.includes('tula')) {
hook = `🚀 ¡Organiza tu día con la máxima capacidad y resistencia del ${cleanName}! Ideal para estudio, trabajo, gimnasio o viajes de fin de semana.`;
bullet1 = '• 💎 *Compartimiento Acolchado para Laptop:* Protección antichoque para tus dispositivos y pertenencias de valor.';
bullet2 = '• 🎒 *Cargaderas Acolchadas Antitranspirantes:* Distribución ergonómica del peso para proteger tu espalda.';
cta = '⚠️ *Alta Demanda:* Pocas unidades disponibles para despacho inmediato nacional.';
cta = '⚠️ *Alta Demanda:* Pocas unidades disponibles para despacho nacional.';
} else if (cat.includes('bolso') || cat.includes('cartera')) {
hook = `✨ ¡Elegancia, distinción y versatilidad con el ${cleanName}! El toque definitivo para complementar tu outfit en cualquier momento del día.`;
bullet1 = '• 💎 *Textura Prémium y Detalles Finos:* Herrajes dorados/plateados de alta gama y forro interior reforzado.';
bullet1 = '• 💎 *Textura Prémium y Detalles Finos:* Herrajes de alta gama y forro interior resistente.';
bullet2 = '• 👜 *Espacio Ideal y Versátil:* Capacidad perfecta para tu día a día manteniendo una silueta estilizada.';
cta = '⚠️ *Colección Limitada:* Stock muy reducido en Colombia. ¡Asegura tu bolso favorito antes de que se agote!';
cta = '⚠️ *Colección Limitada:* Stock reducido. ¡Asegura tu bolso favorito antes de que se agote!';
} else if (cat.includes('gorra') || cat.includes('cap')) {
hook = `🧢 ¡Completa tu look con la exclusiva ${cleanName}! Silueta estructurada, visera impecable y bordados en alta definición.`;
bullet1 = '• 💎 *Bordado 3D de Alta Densidad:* Acabados milimétricos y corona estructurada que no pierde su forma.';
@ -57,27 +58,42 @@ export function generateAttractiveProductCopy(product: {
cta = '⚠️ *Drop Exclusivo:* Pocas piezas en inventario. ¡Pídela ahora con envío a toda Colombia!';
} else if (cat.includes('ropa') || cat.includes('textil') || cat.includes('camiseta') || cat.includes('hoodie')) {
hook = `🔥 ¡Estilo urbano auténtico con la prenda ${cleanName}! Silueta moderna, textura suave al tacto y máxima frescura.`;
bullet1 = '• 💎 *Algodón Prémium / Tela Pesada:* No destiñe ni encoge tras las lavadas, manteniendo caída y color.';
bullet1 = '• 💎 *Algodón Prémium / Confección Cómoda:* Mantiene caída y color tras las lavadas.';
bullet2 = '• 👕 *Corte Streetwear Confort:* Ajuste ideal para lucir impecable en cualquier ocasión.';
cta = '⚠️ *Tallas Limitadas:* Disponible para entrega inmediata a nivel nacional.';
cta = '⚠️ *Tallas Limitadas:* Disponible para entrega a nivel nacional.';
} else {
// Por defecto: Zapatillas / Sneakers
hook = `🔥 ¡Lleva tu outfit al siguiente nivel con las icónicas ${cleanName}! Diseñadas para quienes no negocian entre estilo de alto impacto y máxima comodidad para el día a día.`;
bullet1 = '• 💎 *Calidad G5 / 1.1 Prémium:* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables.';
bullet2 = '• ☁️ *Confort Inigualable:* Plantilla acolchada ergonómica para máxima suavidad al caminar o entrenar.';
cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla en inventario nacional. ¡Asegura tu par ahora antes de que se agoten!';
hook = `🔥 ¡Lleva tu outfit al siguiente nivel con las icónicas ${cleanName}! Diseñadas para quienes buscan estilo de alto impacto y máxima comodidad para el día a día.`;
bullet1 = '• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.';
bullet2 = '• ☁️ *Máximo Confort:* Plantilla ergonómica acolchada para brindar soporte y comodidad en cada paso.';
cta = '⚠️ *Disponibilidad:* Pocas unidades por talla en inventario nacional. ¡Asegura tu par ahora!';
}
// Si existe la plantilla configurable en dataService, la utilizamos
try {
const renderedFromTemplate = dataService?.renderMessageTemplate?.('product_copy_generator', {
gancho: hook,
producto_nombre: cleanName,
marca: brand,
categoria: product.category || 'Zapatillas',
});
if (renderedFromTemplate && renderedFromTemplate.trim().length > 30) {
return sanitizePublicationText(renderedFromTemplate, product.forbiddenTerms, product.supplierPrice);
}
} catch (_) {}
// Fallback seguro y limpio
const rawCopy = `${hook}
✨ *¿Por qué todos lo eligen?*
${bullet1}
${bullet2}
• 🚚 *Despacho Prioritario Nacional:* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia.
• 💵 *Pago 100% Contraentrega:* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Revisas tu producto al llegar con total respaldo.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del envío y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Separas tu pedido con anticipo por Bold oficial y cancelas el saldo restante en efectivo o con Bold al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Respaldo de fábrica y cambio de talla (sujeto a cobertura y políticas según tu ciudad).
${cta}`;
return sanitizePublicationText(rawCopy, product.forbiddenTerms, product.supplierPrice);
}

View File

@ -123,23 +123,23 @@ export const INITIAL_CITIES: City[] = [
export const INITIAL_PAYMENT_METHODS: PaymentMethod[] = [
{
id: 'pay-bold-link',
name: 'Bold.co • PSE, Tarjetas Débito/Crédito, Nequi o QR (Oficial)',
name: 'Bold.co Oficial • PSE, Tarjetas Débito/Crédito o QR',
type: 'bold',
description: 'Paga de forma rápida y 100% segura con tu cuenta Bold. Acepta PSE, Tarjetas Visa/Mastercard y QR de cualquier banco.',
description: 'Paga de forma rápida y 100% segura con la pasarela oficial Bold.co. Acepta PSE, Tarjetas Visa/Mastercard y QR interoperable.',
requiresDeposit: false,
depositAmount: 0,
boldPaymentLink: 'https://drip-zone.online',
accountInfo: 'Pasarela Oficial Bold.co • PSE / Tarjetas / QR Bre-B',
accountInfo: 'Pasarela Oficial Bold.co (PSE / Tarjetas / QR Bre-B)',
isActive: true,
},
{
id: 'pay-deposit-10k',
name: 'Separación con $10.000 + Saldo Contraentrega',
name: 'Separación con $10.000 por Bold + Saldo Contraentrega',
type: 'contraentrega',
description: 'Asegura tu talla con solo $10.000 COP vía Bold/Nequi/Daviplata y cancelas el saldo restante en efectivo o transferencia cuando el mensajero llegue a tu casa.',
description: 'Asegura tu talla con solo $10.000 COP únicamente a través de Bold (PSE, tarjetas o Bre-B) y cancelas el saldo restante en efectivo o mediante Bold al recibir en tu puerta.',
requiresDeposit: true,
depositAmount: 10000,
accountInfo: 'Nequi / Daviplata Oficial DripZone: 310 639 0296',
accountInfo: 'Pasarela Oficial Bold.co (PSE / Tarjetas)',
boldPaymentLink: 'https://drip-zone.online',
isActive: true,
},
@ -147,20 +147,20 @@ export const INITIAL_PAYMENT_METHODS: PaymentMethod[] = [
id: 'pay-cod-full',
name: 'Pago 100% Contraentrega (Cali y Alrededores)',
type: 'contraentrega',
description: 'Pagas el 100% del valor total al recibir en tu puerta (válido para entregas urbanas en 24 horas).',
description: 'Pagas el 100% del valor en efectivo o mediante Bold al recibir en tu puerta (válido para entregas urbanas en 24 horas).',
requiresDeposit: false,
depositAmount: 0,
isActive: true,
},
{
id: 'pay-nequi-full',
name: 'Transferencia Total Anticipada Nequi / Daviplata',
type: 'nequi',
description: 'Paga el 100% anticipado y recibe prioridad de despacho express en 24 horas.',
name: 'Transferencia Anticipada',
type: 'bold',
description: 'Paga anticipadamente en línea a través de Bold.',
requiresDeposit: false,
depositAmount: 0,
accountInfo: 'Nequi / Daviplata Oficial DripZone: 310 639 0296',
isActive: true,
accountInfo: 'Pasarela Oficial Bold.co',
isActive: false,
},
];

View File

@ -54,7 +54,7 @@ export function getProductSocialProof(product: {
'✨ Tendencia Nacional',
'🚀 Lanzamiento 2026',
'💎 Edición Premium',
'🌟 Calidad G5',
'🌟 Calidad Prémium',
];
const calculatedBadge = product.originBadge || badges[positiveHash % badges.length];

View File

@ -42,6 +42,13 @@ export const TEMPLATE_CATEGORIES: {
description: 'Explicación de garantías de flete/anticipo, políticas contraentrega y cambios de talla.',
colorBadge: 'bg-rose-500/20 text-rose-300 border-rose-500/30',
},
{
key: 'catalog_marketing',
name: 'Catálogo & Textos Comerciales',
emoji: '🏷️',
description: 'Descripciones de producto, textos para catálogo de WhatsApp (Meta), mensajes del asesor y respuestas del bot.',
colorBadge: 'bg-indigo-500/20 text-indigo-300 border-indigo-500/30',
},
];
export const DEFAULT_MESSAGE_TEMPLATES: MessageTemplate[] = [
@ -256,7 +263,7 @@ Estamos alistando tu paquete. Te enviaremos el número de guía o notificación
📍 *Dirección de Entrega:* {cliente_direccion}
🏙️ *Ciudad:* {cliente_ciudad}
💵 *Saldo a Pagar Contraentrega:* *{saldo_contraentrega}*
💳 *Medio de Pago:* {metodo_pago} (Efectivo o Transferencia Nequi)
💳 *Medio de Pago:* {metodo_pago} (Efectivo o mediante Bold al recibir)
Por favor estar atento a la portería o celular. ¡Gracias por tu compra en {tienda_nombre}! 🔥`,
defaultContent: `👋 ¡Hola *{cliente_nombre}*!
@ -266,7 +273,7 @@ Por favor estar atento a la portería o celular. ¡Gracias por tu compra en {tie
📍 *Dirección de Entrega:* {cliente_direccion}
🏙️ *Ciudad:* {cliente_ciudad}
💵 *Saldo a Pagar Contraentrega:* *{saldo_contraentrega}*
💳 *Medio de Pago:* {metodo_pago} (Efectivo o Transferencia Nequi)
💳 *Medio de Pago:* {metodo_pago} (Efectivo o mediante Bold al recibir)
Por favor estar atento a la portería o celular. ¡Gracias por tu compra en {tienda_nombre}! 🔥`,
availableVariables: [
@ -290,14 +297,14 @@ Por favor estar atento a la portería o celular. ¡Gracias por tu compra en {tie
👟 Esperamos que disfrutes al máximo tus zapatillas.
💬 Si tienes cualquier consulta sobre el 1er cambio de talla gratuito o garantía, estamos a tu disposición por este canal oficial.
💬 Si tienes cualquier consulta sobre garantía o cambio de talla (sujeto a cobertura y políticas según tu ciudad), estamos a tu disposición por este canal oficial.
¡Muchas gracias por elegir {tienda_nombre}! ✨`,
defaultContent: `🌟 ¡Hola *{cliente_nombre}*! Tu orden #{orden_id} ha sido *ENTREGADA CON ÉXITO*.
👟 Esperamos que disfrutes al máximo tus zapatillas.
💬 Si tienes cualquier consulta sobre el 1er cambio de talla gratuito o garantía, estamos a tu disposición por este canal oficial.
💬 Si tienes cualquier consulta sobre garantía o cambio de talla (sujeto a cobertura y políticas según tu ciudad), estamos a tu disposición por este canal oficial.
¡Muchas gracias por elegir {tienda_nombre}! ✨`,
availableVariables: [
@ -525,7 +532,7 @@ Hola {usuario_nombre}! Tu código de seguridad para validar tu cuenta es:
Hola {cliente_nombre}, para procesar tu orden #{orden_id} hacia {cliente_ciudad}, se requiere la separación del flete por valor de *{costo_envio}* (100% descontable al recibir en tu puerta).
💡 Motivo: {motivo_garantia}
💳 Puedes realizar el pago mediante Bold / Nequi / Daviplata al {cuenta_nequi}.
💳 Puedes realizar el pago en línea de forma 100% segura por Bold: {link_pago_bold}
¡Una vez confirmado tu comprobante, tu despacho saldrá de inmediato!`,
defaultContent: `🛡️ *Garantía de Despacho Requerida - {tienda_nombre}*
@ -533,7 +540,7 @@ Hola {cliente_nombre}, para procesar tu orden #{orden_id} hacia {cliente_ciudad}
Hola {cliente_nombre}, para procesar tu orden #{orden_id} hacia {cliente_ciudad}, se requiere la separación del flete por valor de *{costo_envio}* (100% descontable al recibir en tu puerta).
💡 Motivo: {motivo_garantia}
💳 Puedes realizar el pago mediante Bold / Nequi / Daviplata al {cuenta_nequi}.
💳 Puedes realizar el pago en línea de forma 100% segura por Bold: {link_pago_bold}
¡Una vez confirmado tu comprobante, tu despacho saldrá de inmediato!`,
availableVariables: [
@ -543,28 +550,28 @@ Hola {cliente_nombre}, para procesar tu orden #{orden_id} hacia {cliente_ciudad}
{ key: 'cliente_ciudad', label: 'Ciudad', example: 'Bogotá D.C.', description: 'Ciudad' },
{ key: 'costo_envio', label: 'Costo Flete', example: '$12.000 COP', description: 'Valor del flete' },
{ key: 'motivo_garantia', label: 'Motivo de Garantía', example: 'Pedido anterior no recibido en domicilio', description: 'Motivo' },
{ key: 'cuenta_nequi', label: 'Cuenta Nequi', example: '316 745 5877', description: 'Nequi / Daviplata' },
{ key: 'link_pago_bold', label: 'Enlace Pago Bold', example: 'https://bold.co/p/dripzone', description: 'Pasarela oficial Bold' },
],
},
{
id: 'cod_policy_notice',
title: 'Aviso de Políticas de Entrega y Cambio Gratis',
description: 'Resumen de políticas contraentrega y 1er cambio de talla gratuito para soporte al cliente.',
title: 'Aviso de Políticas de Entrega y Cambio de Talla',
description: 'Resumen de políticas contraentrega y condiciones de cambio de talla para soporte al cliente.',
category: 'guarantees_policies',
channel: 'whatsapp',
isActive: true,
content: `📋 *Políticas de Compra y Entrega - {tienda_nombre}*
✅ *Pago Contraentrega:* Pagas al recibir en tu domicilio.
👟 *Garantía de Talla:* 1er Cambio de Talla 100% Gratis en Cali y zonas de cobertura metropolitana.
⏱️ *Tiempo de Entrega:* 24 horas en área local, 2-4 días a nivel nacional.
✅ *Pago Contraentrega:* Separas tu pedido con solo $10.000 por Bold oficial y pagas el saldo al recibir en tu domicilio (en efectivo o mediante Bold).
👟 *Garantía y Cambio de Talla:* Garantía directa de fábrica. Cambio de talla garantizado según la ciudad de destino (cobertura local con mensajero en Cali y logística de reenvío en otras ciudades).
🚚 *Envíos Nacionales:* Tiempos de entrega y valor del flete varían de acuerdo a tu ciudad.
Cualquier duda o asesoría adicional, ¡estamos para servirte con todo el gusto!`,
defaultContent: `📋 *Políticas de Compra y Entrega - {tienda_nombre}*
✅ *Pago Contraentrega:* Pagas al recibir en tu domicilio.
👟 *Garantía de Talla:* 1er Cambio de Talla 100% Gratis en Cali y zonas de cobertura metropolitana.
⏱️ *Tiempo de Entrega:* 24 horas en área local, 2-4 días a nivel nacional.
✅ *Pago Contraentrega:* Separas tu pedido con solo $10.000 por Bold oficial y pagas el saldo al recibir en tu domicilio (en efectivo o mediante Bold).
👟 *Garantía y Cambio de Talla:* Garantía directa de fábrica. Cambio de talla garantizado según la ciudad de destino (cobertura local con mensajero en Cali y logística de reenvío en otras ciudades).
🚚 *Envíos Nacionales:* Tiempos de entrega y valor del flete varían de acuerdo a tu ciudad.
Cualquier duda o asesoría adicional, ¡estamos para servirte con todo el gusto!`,
availableVariables: [
@ -607,6 +614,289 @@ Cualquier duda o asesoría adicional, ¡estamos para servirte con todo el gusto!
{ key: 'saldo_contraentrega', label: 'Saldo Contraentrega', example: '$115.000 COP', description: 'Saldo en puerta' },
],
},
// 6. CATÁLOGO & TEXTOS COMERCIALES
{
id: 'catalog_product_desc',
title: 'Descripción de Producto para Catálogo WhatsApp y Feeds',
description: 'Texto oficial que acompaña cada producto en el catálogo de WhatsApp Business (Meta Commerce), feeds XML y CSV.',
category: 'catalog_marketing',
channel: 'whatsapp',
isActive: true,
content: `Colección: {coleccion_icono} *{coleccion_nombre} {tienda_nombre}*
{descripcion_producto}
📏 Tallas disponibles: {tallas} (Horma Nacional)
💎 Precio oficial: {precio} COP
🚚 Envíos a toda Colombia (el valor del flete y tiempo de entrega varían según la ciudad de destino)
💵 Pago contraentrega sujeto a cobertura de tu ciudad
🛡️ Garantía de fábrica y cambio de talla (sujeto a políticas de cobertura según ciudad)
🛒 ¿CÓMO REALIZAR TU PEDIDO Y PAGO SEGURO?
La atención comercial y asesoría es por este WhatsApp. Para garantizar tu despacho con factura y seguimiento en línea, el pedido y pago del anticipo ($10.000 únicamente por Bold oficial) se procesan a través de nuestra plataforma:
👉 Enlace directo de compra: {enlace_compra}
📱 O descarga la App Móvil oficial: {enlace_app}
💬 ¿Dudas con tu talla o envío? Escríbenos a este chat y un asesor te atenderá al instante.`,
defaultContent: `Colección: {coleccion_icono} *{coleccion_nombre} {tienda_nombre}*
{descripcion_producto}
📏 Tallas disponibles: {tallas} (Horma Nacional)
💎 Precio oficial: {precio} COP
🚚 Envíos a toda Colombia (el valor del flete y tiempo de entrega varían según la ciudad de destino)
💵 Pago contraentrega sujeto a cobertura de tu ciudad
🛡️ Garantía de fábrica y cambio de talla (sujeto a políticas de cobertura según ciudad)
🛒 ¿CÓMO REALIZAR TU PEDIDO Y PAGO SEGURO?
La atención comercial y asesoría es por este WhatsApp. Para garantizar tu despacho con factura y seguimiento en línea, el pedido y pago del anticipo ($10.000 únicamente por Bold oficial) se procesan a través de nuestra plataforma:
👉 Enlace directo de compra: {enlace_compra}
📱 O descarga la App Móvil oficial: {enlace_app}
💬 ¿Dudas con tu talla o envío? Escríbenos a este chat y un asesor te atenderá al instante.`,
availableVariables: [
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre de la marca' },
{ key: 'coleccion_icono', label: 'Ícono Colección', example: '👟', description: 'Emoji de categoría' },
{ key: 'coleccion_nombre', label: 'Nombre Colección', example: 'Zapatillas Urbanas', description: 'Categoría WhatsApp' },
{ key: 'descripcion_producto', label: 'Descripción Base', example: 'Zapatillas exclusivas en horma nacional...', description: 'Detalle del modelo' },
{ key: 'tallas', label: 'Tallas Disponibles', example: '37 al 43', description: 'Curva de tallas' },
{ key: 'precio', label: 'Precio COP', example: '$125.000', description: 'Precio de venta' },
{ key: 'enlace_compra', label: 'Enlace Directo Checkout', example: 'https://drip-zone.online/checkout?productId=...', description: 'Link de compra' },
{ key: 'enlace_app', label: 'Enlace Descarga App', example: 'https://drip-zone.online/app-dripzone.apk', description: 'Descarga APK' },
],
},
{
id: 'catalog_order_message',
title: 'Mensaje de Asesor con Enlace de Compra y Cotización',
description: 'Mensaje comercial que el asesor copia o envía al cliente desde el catálogo de WhatsApp con el enlace de compra.',
category: 'catalog_marketing',
channel: 'whatsapp',
isActive: true,
content: `{saludo} Qué gusto saludarte de parte de *{tienda_nombre} Colombia* 🇨🇴
Para confirmar tu pedido de las *{producto_nombre}* en talla *{talla}* (Horma Nacional) y despacharlo con total garantía y factura:
💎 *Precio Oficial:* {precio} COP
🚚 *Pago Contraentrega:* Separas con solo *$10.000* a través de Bold oficial (PSE o tarjetas) y el saldo restante lo cancelas contraentrega (en efectivo o mediante Bold) al recibir en tu puerta.
📦 *Envío:* El valor del flete y tiempos de entrega varían según tu ciudad de destino.
🛡️ *Garantía:* Garantía directa y cambio de talla según políticas de cobertura en tu ciudad.
🛒 *Por favor completa tus datos de entrega y anticipo seguro aquí:*
👉 {enlace_checkout}
📱 *O si prefieres, descárgate nuestra App Móvil oficial:*
{enlace_app}
{nota_asesor}
Cualquier inquietud con tu dirección o el pago, ¡aquí estamos para ayudarte!`,
defaultContent: `{saludo} Qué gusto saludarte de parte de *{tienda_nombre} Colombia* 🇨🇴
Para confirmar tu pedido de las *{producto_nombre}* en talla *{talla}* (Horma Nacional) y despacharlo con total garantía y factura:
💎 *Precio Oficial:* {precio} COP
🚚 *Pago Contraentrega:* Separas con solo *$10.000* a través de Bold oficial (PSE o tarjetas) y el saldo restante lo cancelas contraentrega (en efectivo o mediante Bold) al recibir en tu puerta.
📦 *Envío:* El valor del flete y tiempos de entrega varían según tu ciudad de destino.
🛡️ *Garantía:* Garantía directa y cambio de talla según políticas de cobertura en tu ciudad.
🛒 *Por favor completa tus datos de entrega y anticipo seguro aquí:*
👉 {enlace_checkout}
📱 *O si prefieres, descárgate nuestra App Móvil oficial:*
{enlace_app}
{nota_asesor}
Cualquier inquietud con tu dirección o el pago, ¡aquí estamos para ayudarte!`,
availableVariables: [
{ key: 'saludo', label: 'Saludo Personalizado', example: '¡Hola Carlos! 👋', description: 'Saludo con nombre' },
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre comercial' },
{ key: 'producto_nombre', label: 'Nombre Producto', example: 'Nike Dunk Low Grey Fog', description: 'Modelo' },
{ key: 'talla', label: 'Talla', example: '41', description: 'Talla seleccionada' },
{ key: 'precio', label: 'Precio COP', example: '$135.000', description: 'Precio' },
{ key: 'enlace_checkout', label: 'Enlace Checkout Directo', example: 'https://drip-zone.online/checkout?...', description: 'Link de compra' },
{ key: 'enlace_app', label: 'Enlace Descarga App', example: 'https://drip-zone.online/app-dripzone.apk', description: 'Link App' },
{ key: 'nota_asesor', label: 'Nota Asesor (Opcional)', example: '📝 *Nota del Asesor:* Incluye cordones extra.', description: 'Nota personalizada' },
],
},
{
id: 'product_copy_generator',
title: 'Plantilla de Texto Comercial de Producto (Copy Automático)',
description: 'Estructura base para generar la descripción atractiva de nuevos modelos al importarlos o publicarlos en la tienda.',
category: 'catalog_marketing',
channel: 'whatsapp',
isActive: true,
content: `{gancho}
✨ *¿Por qué elegir este modelo?*
• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.
• ☁️ *Máximo Confort:* Plantilla ergonómica acolchada para máxima suavidad y comodidad al caminar.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del envío y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Separas tu pedido con anticipo por Bold oficial y cancelas el saldo restante en efectivo o con Bold al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Respaldo de fábrica y cambio de talla (sujeto a cobertura y políticas según tu ciudad).
⚠️ *Disponibilidad:* Pocas unidades por talla en inventario nacional. ¡Asegura tu par ahora!`,
defaultContent: `{gancho}
✨ *¿Por qué elegir este modelo?*
• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.
• ☁️ *Máximo Confort:* Plantilla ergonómica acolchada para máxima suavidad y comodidad al caminar.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del envío y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Separas tu pedido con anticipo por Bold oficial y cancelas el saldo restante en efectivo o con Bold al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Respaldo de fábrica y cambio de talla (sujeto a cobertura y políticas según tu ciudad).
⚠️ *Disponibilidad:* Pocas unidades por talla en inventario nacional. ¡Asegura tu par ahora!`,
availableVariables: [
{ key: 'gancho', label: 'Frase de Entrada (Gancho)', example: '🔥 ¡Lleva tu outfit al siguiente nivel con...', description: 'Introducción del producto' },
{ key: 'producto_nombre', label: 'Nombre Producto', example: 'Adidas Campus 00s', description: 'Modelo' },
{ key: 'marca', label: 'Marca', example: 'Adidas', description: 'Marca comercial' },
{ key: 'categoria', label: 'Categoría', example: 'Zapatillas', description: 'Tipo de producto' },
],
},
{
id: 'whatsapp_bot_inquiry',
title: 'Respuesta Automática del Bot ante Consulta de Producto',
description: 'Mensaje enviado por el bot de WhatsApp cuando un cliente consulta por un modelo del catálogo.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `👟 *{producto_nombre}*
━━━━━━━━━━━━━━━━━━━━━━
📏 *Tallas Disponibles:* {tallas} (Horma Nacional)
💵 *Precio Oficial:* *{precio} COP*
🚚 *Pago Contraentrega:* Pagas un anticipo de *$10.000* por Bold oficial para despacho garantizado y el saldo restante al recibir (en efectivo o mediante Bold).
📦 *Envío:* El costo del flete depende de la ciudad de destino.
🛡️ *Garantía:* Garantía de fábrica y cambio de talla según políticas de cobertura en tu ciudad.
🛒 *¿Cómo procesar tu pedido y pago seguro?*
Para tu seguridad, asignación de factura y reserva de tu talla, el pedido y pago del anticipo ($10.000 únicamente por Bold / PSE / Tarjetas) se procesan a través de nuestra plataforma:
👉 *Enlace directo de compra:* {enlace_checkout}
📱 *O pide en nuestra App Móvil:* {enlace_app}
Diligencia tus datos de envío en el enlace y hoy mismo programamos tu despacho. Si necesitas ayuda con tu talla habitual, ¡aquí estamos para asesorarte!`,
defaultContent: `👟 *{producto_nombre}*
━━━━━━━━━━━━━━━━━━━━━━
📏 *Tallas Disponibles:* {tallas} (Horma Nacional)
💵 *Precio Oficial:* *{precio} COP*
🚚 *Pago Contraentrega:* Pagas un anticipo de *$10.000* por Bold oficial para despacho garantizado y el saldo restante al recibir (en efectivo o mediante Bold).
📦 *Envío:* El costo del flete depende de la ciudad de destino.
🛡️ *Garantía:* Garantía de fábrica y cambio de talla según políticas de cobertura en tu ciudad.
🛒 *¿Cómo procesar tu pedido y pago seguro?*
Para tu seguridad, asignación de factura y reserva de tu talla, el pedido y pago del anticipo ($10.000 únicamente por Bold / PSE / Tarjetas) se procesan a través de nuestra plataforma:
👉 *Enlace directo de compra:* {enlace_checkout}
📱 *O pide en nuestra App Móvil:* {enlace_app}
Diligencia tus datos de envío en el enlace y hoy mismo programamos tu despacho. Si necesitas ayuda con tu talla habitual, ¡aquí estamos para asesorarte!`,
availableVariables: [
{ key: 'producto_nombre', label: 'Nombre Producto', example: 'Nike Air Force 1 07', description: 'Nombre' },
{ key: 'tallas', label: 'Tallas Disponibles', example: '38, 39, 40, 41, 42', description: 'Tallas' },
{ key: 'precio', label: 'Precio COP', example: '$125.000', description: 'Precio' },
{ key: 'enlace_checkout', label: 'Enlace Compra', example: 'https://drip-zone.online/checkout?...', description: 'Link checkout' },
{ key: 'enlace_app', label: 'Enlace Descarga App', example: 'https://drip-zone.online/app-dripzone.apk', description: 'Link App' },
],
},
{
id: 'whatsapp_bot_greeting',
title: 'Bienvenida Comercial Automática del Bot de WhatsApp',
description: 'Respuesta comercial del bot ante saludos o preguntas generales de compra en WhatsApp.',
category: 'customer_sales',
channel: 'whatsapp',
isActive: true,
content: `¡Hola! 👋 Te damos la bienvenida a *{tienda_nombre} Colombia* 🇨🇴
Tu tienda oficial de sneakers, zapatillas y streetwear con horma nacional.
━━━━━━━━━━━━━━━━━━━━━━
👀 *Puedes consultar nuestro catálogo y modelos aquí en WhatsApp o en nuestra tienda online:*
🌐 *Catálogo Completo:* {enlace_tienda}
🛒 *Procesar Pedido:* {enlace_checkout}
📱 *Descargar App Android:* {enlace_app}
💡 *¿Cómo funciona tu compra?*
1️⃣ Elige tu modelo y talla en el catálogo.
2️⃣ Los pedidos y anticipos se procesan en la web o app para asegurar tu factura y despacho inmediato.
3️⃣ Realizas un anticipo de *$10.000* únicamente por Bold oficial (PSE o tarjetas) y cancelas el saldo restante *contraentrega* al recibir en tu puerta (en efectivo o mediante Bold).
4️⃣ Envíos a todo el país con tiempos y flete según tu ciudad de destino.
5️⃣ Garantía directa y cambio de talla según políticas y cobertura de tu ciudad.
💬 *¿Te gustó algún modelo de nuestro catálogo de WhatsApp?* Indícanos el nombre o tu talla y con gusto te asesoramos y enviamos el enlace directo.`,
defaultContent: `¡Hola! 👋 Te damos la bienvenida a *{tienda_nombre} Colombia* 🇨🇴
Tu tienda oficial de sneakers, zapatillas y streetwear con horma nacional.
━━━━━━━━━━━━━━━━━━━━━━
👀 *Puedes consultar nuestro catálogo y modelos aquí en WhatsApp o en nuestra tienda online:*
🌐 *Catálogo Completo:* {enlace_tienda}
🛒 *Procesar Pedido:* {enlace_checkout}
📱 *Descargar App Android:* {enlace_app}
💡 *¿Cómo funciona tu compra?*
1️⃣ Elige tu modelo y talla en el catálogo.
2️⃣ Los pedidos y anticipos se procesan en la web o app para asegurar tu factura y despacho inmediato.
3️⃣ Realizas un anticipo de *$10.000* únicamente por Bold oficial (PSE o tarjetas) y cancelas el saldo restante *contraentrega* al recibir en tu puerta (en efectivo o mediante Bold).
4️⃣ Envíos a todo el país con tiempos y flete según tu ciudad de destino.
5️⃣ Garantía directa y cambio de talla según políticas y cobertura de tu ciudad.
💬 *¿Te gustó algún modelo de nuestro catálogo de WhatsApp?* Indícanos el nombre o tu talla y con gusto te asesoramos y enviamos el enlace directo.`,
availableVariables: [
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Tienda' },
{ key: 'enlace_tienda', label: 'Enlace Web', example: 'https://drip-zone.online', description: 'Página web' },
{ key: 'enlace_checkout', label: 'Enlace Checkout', example: 'https://drip-zone.online/checkout', description: 'Link compra' },
{ key: 'enlace_app', label: 'Enlace App Android', example: 'https://drip-zone.online/app-dripzone.apk', description: 'Descarga APK' },
],
},
{
id: 'shipping_city_policy_notice',
title: 'Política Oficial de Envíos y Fletes por Ciudad',
description: 'Texto explicativo para clientes informando que los envíos varían según la ciudad.',
category: 'guarantees_policies',
channel: 'whatsapp',
isActive: true,
content: `🚚 *Información de Envíos y Despachos - {tienda_nombre}*
📍 El costo de flete y el tiempo estimado de entrega dependen de la ciudad de destino:
• *Cali y Área Metropolitana:* Despacho express en 24 horas hábiles con mensajería local.
• *Otras Ciudades Principales e Intermedias:* De 2 a 4 días hábiles mediante transportadora nacional con seguimiento en línea.
💵 *Forma de Pago:* Separación con $10.000 por Bold oficial y saldo restante contraentrega en efectivo o mediante Bold al recibir.
¡Consulta la tarifa y tiempo exacto seleccionando tu ciudad en el checkout!`,
defaultContent: `🚚 *Información de Envíos y Despachos - {tienda_nombre}*
📍 El costo de flete y el tiempo estimado de entrega dependen de la ciudad de destino:
• *Cali y Área Metropolitana:* Despacho express en 24 horas hábiles con mensajería local.
• *Otras Ciudades Principales e Intermedias:* De 2 a 4 días hábiles mediante transportadora nacional con seguimiento en línea.
💵 *Forma de Pago:* Separación con $10.000 por Bold oficial y saldo restante contraentrega en efectivo o mediante Bold al recibir.
¡Consulta la tarifa y tiempo exacto seleccionando tu ciudad en el checkout!`,
availableVariables: [
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre marca' },
],
},
{
id: 'exchange_city_policy_notice',
title: 'Política de Garantía y Cambio de Talla según Ciudad',
description: 'Mensaje claro para clientes indicando que la cobertura de cambio de talla depende de la ciudad.',
category: 'guarantees_policies',
channel: 'whatsapp',
isActive: true,
content: `🛡️ *Políticas de Garantía y Cambio de Talla - {tienda_nombre}*
👟 *Horma Nacional:* Todos nuestros modelos cuentan con horma nacional colombiana estándar.
🔄 *Cambios de Talla:* La posibilidad y condiciones del cambio de talla dependen de la cobertura logística de cada ciudad:
• *Cali y cobertura metropolitana:* Primer cambio de talla coordinado con nuestro mensajero local.
• *Nivel Nacional:* Cambio de talla garantizado sujeto a disponibilidad de inventario; el flete logístico del reenvío se coordina según la ciudad de destino.
✅ *Garantía de Fábrica:* Respaldo total por defectos de manufactura en todos los envíos.`,
defaultContent: `🛡️ *Políticas de Garantía y Cambio de Talla - {tienda_nombre}*
👟 *Horma Nacional:* Todos nuestros modelos cuentan con horma nacional colombiana estándar.
🔄 *Cambios de Talla:* La posibilidad y condiciones del cambio de talla dependen de la cobertura logística de cada ciudad:
• *Cali y cobertura metropolitana:* Primer cambio de talla coordinado con nuestro mensajero local.
• *Nivel Nacional:* Cambio de talla garantizado sujeto a disponibilidad de inventario; el flete logístico del reenvío se coordina según la ciudad de destino.
✅ *Garantía de Fábrica:* Respaldo total por defectos de manufactura en todos los envíos.`,
availableVariables: [
{ key: 'tienda_nombre', label: 'Nombre Tienda', example: 'DripZone', description: 'Nombre marca' },
],
},
];
/**

View File

@ -208,20 +208,20 @@ export function formatProductForWhatsAppCatalog(product: Product) {
// Resolver Colección Oficial en WhatsApp
const collection = resolveProductCollection(product);
// Descripción optimizada para WhatsApp Catalog con mención a la Colección
const catalogDescription = (
`Colección: ${collection.icon} *${collection.name} DripZone*\n` +
`${product.description || `${collection.name} ${title} exclusivas en horma nacional de alta calidad.`}\n\n` +
`📏 Tallas disponibles: ${sizesList} (Horma Nacional)\n` +
`💎 Precio oficial: ${formattedPrice} COP\n` +
`🚚 Pago Contraentrega disponible en toda Colombia\n` +
`🛡️ 1er Cambio de Talla sin costo adicional\n\n` +
`🛒 ¿CÓMO REALIZAR TU PEDIDO Y PAGO SEGURO?\n` +
`La atención comercial y asesoría es por este WhatsApp. Para garantizar tu despacho con factura y seguimiento en línea, el pedido y pago del anticipo ($10.000 por Bold / PSE / Nequi / Tarjetas) se procesan a través de nuestra plataforma:\n` +
`👉 Enlace directo de compra: ${directCheckoutUrl}\n` +
`📱 O descarga la App Móvil oficial: ${DOMAIN}/app-dripzone.apk\n\n` +
`💬 ¿Dudas con tu talla o envío? Escríbenos a este chat y un asesor te atenderá al instante.`
).trim();
// Descripción optimizada para WhatsApp Catalog utilizando la plantilla configurable
const fallbackProductDesc =
product.description || `${collection.name} ${title} exclusivas en horma nacional.`;
const catalogDescription = dataService.renderMessageTemplate('catalog_product_desc', {
tienda_nombre: 'DripZone',
coleccion_icono: collection.icon,
coleccion_nombre: collection.name,
descripcion_producto: fallbackProductDesc,
tallas: sizesList,
precio: formattedPrice,
enlace_compra: directCheckoutUrl,
enlace_app: `${DOMAIN}/app-dripzone.apk`,
}).trim();
const isAvailable = product.isActive !== false && product.inStock !== false;

View File

@ -244,7 +244,9 @@ export type MessageTemplateCategory =
| 'logistics_dispatch' // 🚚 Logística y Despachos
| 'suppliers_warehouses' // 🏭 Proveedores y Bodegas
| 'security_auth' // 🔐 Seguridad y Accesos (OTP)
| 'guarantees_policies'; // 🛡️ Garantías y Políticas
| 'guarantees_policies' // 🛡️ Garantías y Políticas
| 'catalog_marketing'; // 🏷️ Catálogo & Textos Comerciales
export interface MessageTemplateVariable {
key: string; // e.g. 'cliente_nombre'

View File

@ -0,0 +1,136 @@
import paramiko
import os
import urllib.request
import json
import ssl
import sys
import io
import time
import subprocess
if sys.platform == 'win32':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
HOST = "161.97.93.156"
USER = "carlos"
PASSWORD = "Innova1978+*?"
REMOTE_BASE = "/home/carlos/apps/dripzone-app"
LOCAL_APK = r"c:\Users\Carlos\dev\almeira-web\dripzone-app\public\DripZone.apk"
REMOTE_APK = f"{REMOTE_BASE}/public/DripZone.apk"
EVOLUTION_API_URL = "https://evolution.almeira.com.co"
ALMEIRA_INSTANCE_NAME = "AutomataAlmeira"
ALMEIRA_API_KEY = "EE49029EEB85-4568-8F81-C9FDFC6E2943"
TARGET_PHONE = "573167455877"
APK_URL = "https://drip-zone.online/DripZone.apk"
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
def main():
print("[1/5] Verificando APK local...")
if not os.path.exists(LOCAL_APK):
print(f" [ERROR] El archivo {LOCAL_APK} no existe.")
sys.exit(1)
size_mb = os.path.getsize(LOCAL_APK) / (1024 * 1024)
print(f" -> APK local verificado: {LOCAL_APK} ({size_mb:.2f} MB)")
print("[2/5] Guardando cambios y pusheando a Gitea...")
try:
subprocess.run(["git", "add", "."], cwd=r"c:\Users\Carlos\dev\almeira-web", check=False)
msg = "feat: plantillas configurables de catalogo/marketing, pago de separacion exclusivo por Bold, textos de calzado saneados y envio/garantia dependiente de ciudad"
subprocess.run(["git", "commit", "-m", msg], cwd=r"c:\Users\Carlos\dev\almeira-web", check=False)
push_res = subprocess.run(["git", "push", "origin", "main"], cwd=r"c:\Users\Carlos\dev\almeira-web", capture_output=True, text=True)
print(" -> Git push:", push_res.stdout.strip() or push_res.stderr.strip())
except Exception as e:
print(" [WARN Git]:", e)
print("[3/5] Subiendo APK a VPS 161.97.93.156 vía SFTP...")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=HOST, username=USER, password=PASSWORD, timeout=30)
sftp = ssh.open_sftp()
try:
sftp.mkdir(f"{REMOTE_BASE}/public")
except:
pass
def progress_cb(transferred, total):
pct = (transferred / total) * 100
if transferred % (1024 * 1024 * 5) < 32768 or transferred == total:
print(f" -> Progreso SFTP: {transferred / (1024*1024):.1f} MB / {total / (1024*1024):.1f} MB ({pct:.0f}%)")
sftp.put(LOCAL_APK, REMOTE_APK, callback=progress_cb)
sftp.close()
print(" -> APK subido exitosamente al VPS.")
print("[4/5] Copiando APK a contenedores Docker...")
find_cmd = "docker ps --filter 'name=dripzone' --format '{{.ID}} {{.Names}}'"
stdin, stdout, stderr = ssh.exec_command(find_cmd)
containers = stdout.read().decode().strip().splitlines()
for line in containers:
if not line.strip():
continue
cid = line.split()[0]
cname = line.split()[1] if len(line.split()) > 1 else cid
print(f" -> Copiando a contenedor {cname} ({cid})...")
cp_cmd = f"docker cp {REMOTE_APK} {cid}:/app/public/DripZone.apk"
ssh.exec_command(cp_cmd)
ssh.close()
print(" -> Despliegue en VPS completado con éxito.")
print("[5/5] Enviando notificación y APK a WhatsApp de Carlos (+57 316 745 5877)...")
text_payload = {
"number": TARGET_PHONE,
"text": (
"✅ *Actualización DripZone Aplicada con Éxito*\n\n"
"1. 🏷️ *Plantillas Configurables:* Todos los textos (descripción de catálogo de WhatsApp, mensajes de asesor con link de pago, copys automáticos de producto y bot) están ahora en la sección de *Plantillas* para editarlos a discreción.\n"
"2. 👟 *Textos Saneados:* Se eliminaron por completo las menciones a 'costuras reforzadas' y 'Calidad G5 / 1.1' tanto en el generador como en todos los productos existentes en la base de datos.\n"
"3. 💳 *Métodos de Pago:* Anticipo de $10.000 únicamente por *Bold* (PSE, tarjetas o QR Bre-B). El saldo contraentrega es en efectivo o mediante Bold al recibir. Se retiró Nequi y toda información personal.\n"
"4. 🚚 *Envíos y Garantía:* Se ajustó para indicar claramente que el valor del envío, tiempo de entrega y cambio de talla dependen de la ciudad de destino.\n\n"
"📲 *Enlace directo al APK actualizado:*\n"
f"{APK_URL}"
)
}
req_text = urllib.request.Request(
f"{EVOLUTION_API_URL}/message/sendText/{ALMEIRA_INSTANCE_NAME}",
data=json.dumps(text_payload).encode('utf-8'),
headers={"apikey": ALMEIRA_API_KEY, "Content-Type": "application/json"}
)
try:
with urllib.request.urlopen(req_text, context=ctx, timeout=15) as resp:
print(f" -> Mensaje de texto enviado a WhatsApp (Status: {resp.status})")
except Exception as e:
print(" [WARN WhatsApp Text]:", e)
# Enviar documento APK
media_payload = {
"number": TARGET_PHONE,
"mediatype": "document",
"mimetype": "application/vnd.android.package-archive",
"fileName": "DripZone-v2.6-Plantillas-Bold.apk",
"caption": "📲 *DripZone Android v2.6 - Plantillas Configurables & Bold Oficial*",
"media": APK_URL
}
req_media = urllib.request.Request(
f"{EVOLUTION_API_URL}/message/sendMedia/{ALMEIRA_INSTANCE_NAME}",
data=json.dumps(media_payload).encode('utf-8'),
headers={"apikey": ALMEIRA_API_KEY, "Content-Type": "application/json"}
)
try:
with urllib.request.urlopen(req_media, context=ctx, timeout=60) as resp:
print(f" -> Archivo APK adjunto enviado a WhatsApp (Status: {resp.status})")
except Exception as e:
print(" [WARN WhatsApp Document]:", e)
print("\n🎉 ¡DESPLIEGUE Y NOTIFICACIÓN COMPLETADOS!")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,173 @@
const https = require('https');
const fs = require('fs');
const path = require('path');
const endpoint = 'https://appwrite.almeira.com.co/v1';
const projectId = '69b84df5003bd8957c5c';
const apiKey = 'standard_cce3cdb866ea6433888d40cedd24dc45987372308fdc3dd0697de08648c0e5c7e04b02c3bcee271403fd656b00a5820f04c08b51631284a6e8a3582d8aed2aa33234f3c29cc777e9b162eb54810b789251b0d006a9a3b081ebc2da53b9baa94614b124b3508ad849fd9a4187cc6094f506d4b57f409b69d9562a74df594f3ec3';
const dbId = 'sneakers_multistore_db';
function appwriteReq(apiPath, method = 'GET', data = null) {
return new Promise((resolve) => {
const url = new URL(endpoint + apiPath);
const body = data ? JSON.stringify(data) : null;
const options = {
hostname: url.hostname,
port: url.port || 443,
path: url.pathname + url.search,
method: method,
rejectUnauthorized: false,
headers: {
'X-Appwrite-Project': projectId,
'X-Appwrite-Key': apiKey,
'Content-Type': 'application/json',
...(body ? { 'Content-Length': Buffer.byteLength(body) } : {})
}
};
const req = https.request(options, (res) => {
let chunks = '';
res.on('data', (d) => chunks += d);
res.on('end', () => {
try {
resolve(JSON.parse(chunks));
} catch (e) {
resolve({ status: res.statusCode, raw: chunks });
}
});
});
req.on('error', (err) => resolve({ error: err.message }));
if (body) req.write(body);
req.end();
});
}
async function run() {
console.log('🚀 Iniciando sincronización en Appwrite Cloud...');
// 1. Extraer plantillas de templates-service.ts
const tplFile = fs.readFileSync(path.resolve(__dirname, '../dripzone-app/src/lib/templates-service.ts'), 'utf-8');
// Extraemos objetos { id: '...', title: '...', description: '...', category: '...', channel: '...', isActive: ..., content: `...`, ... }
const regex = /\{\s*id:\s*'([^']+)',\s*title:\s*'([^']+)',\s*description:\s*'([^']+)',\s*category:\s*'([^']+)',\s*channel:\s*'([^']+)',\s*isActive:\s*(true|false),\s*content:\s*`([\s\S]*?)`,\s*defaultContent:/g;
let m;
const templates = [];
while ((m = regex.exec(tplFile)) !== null) {
templates.push({
id: m[1],
title: m[2],
description: m[3],
category: m[4],
channel: m[5],
isActive: m[6] === 'true',
content: m[7]
});
}
console.log(`📋 ${templates.length} plantillas extraídas de templates-service.ts`);
for (const t of templates) {
const payload = {
title: t.title,
description: t.description,
category: t.category,
channel: t.channel,
content: t.content,
isActive: t.isActive,
updatedAt: new Date().toISOString()
};
// Intentar actualizar
const upd = await appwriteReq(`/databases/${dbId}/collections/message_templates/documents/${t.id}`, 'PATCH', payload);
if (upd && (upd.code === 404 || upd.error === 404 || upd.message?.includes('could not be found'))) {
// Crear
const created = await appwriteReq(`/databases/${dbId}/collections/message_templates/documents`, 'POST', {
documentId: t.id,
data: payload
});
console.log(` [+] Creada en Appwrite: ${t.id} (${t.title})`);
} else {
console.log(` [✓] Actualizada en Appwrite: ${t.id} (${t.title})`);
}
}
// 2. Sanear colección products de Appwrite
console.log('\n🧹 Saneando descripciones en colección products de Appwrite...');
let totalCleaned = 0;
let totalChecked = 0;
let cursor = null;
while (true) {
let q = '?limit=100';
if (cursor) {
q += `&queries[]=cursorAfter("${cursor}")`;
}
const res = await appwriteReq(`/databases/${dbId}/collections/products/documents${q}`);
const docs = res.documents || [];
if (!docs.length) break;
for (const p of docs) {
totalChecked++;
let desc = p.description || '';
let modified = false;
if (desc.includes('costuras reforzadas') || desc.includes('G5') || desc.includes('1.1')) {
desc = desc
.replace(/• 💎 \*Calidad G5 \/ 1\.1 Prémium:\* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables\./g,
'• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.')
.replace(/• 💎 \*Calidad G5 \/ 1\.1 Prémium:\*/g, '• 💎 *Materiales Seleccionados:*')
.replace(/• 💎 \*Calidad Prémium Garantizada:\* Materiales de alto rendimiento, costuras reforzadas y acabados de lujo\./g,
'• 💎 *Materiales Seleccionados:* Materiales de alto rendimiento, acabados prémium y silueta impecable.')
.replace(/costuras reforzadas/g, 'acabados prémium')
.replace(/Calidad G5 \/ 1\.1 Prémium/g, 'Materiales Seleccionados');
modified = true;
}
if (desc.includes('costuras de seguridad')) {
desc = desc.replace(/costuras de seguridad/g, 'herrajes reforzados');
modified = true;
}
if (desc.includes('Despachamos en 24 horas hábiles a cualquier ciudad de Colombia')) {
desc = desc.replace(
/• 🚚 \*Despacho Prioritario Nacional:\* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia\./g,
'• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del flete y tiempos de entrega varían según la ciudad de destino).'
);
modified = true;
}
if (desc.includes('Pago 100% Contraentrega: Realizas tu pedido con total tranquilidad')) {
desc = desc.replace(
/• 💵 \*Pago 100% Contraentrega:\* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta\./g,
'• 💵 *Pago Contraentrega:* Separas tu pedido con anticipo por Bold oficial y cancelas el saldo restante en efectivo o mediante Bold al recibir en tu puerta.'
);
modified = true;
}
if (desc.includes('1er Cambio de Talla sin costo adicional')) {
desc = desc.replace(
/🛡️ 1er Cambio de Talla sin costo adicional/g,
'🛡️ Garantía de fábrica y cambio de talla (sujeto a políticas de cobertura según ciudad)'
);
modified = true;
}
if (modified) {
await appwriteReq(`/databases/${dbId}/collections/products/documents/${p.$id}`, 'PATCH', {
description: desc
});
totalCleaned++;
process.stdout.write(`.`);
}
}
cursor = docs[docs.length - 1].$id;
if (docs.length < 100) break;
}
console.log(`\n🎉 Finalizado con éxito: ${totalCleaned} productos saneados de ${totalChecked} inspeccionados.`);
}
run();

View File

@ -0,0 +1,200 @@
import urllib.request
import json
import ssl
import sys
import os
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
endpoint = 'https://appwrite.almeira.com.co/v1'
project_id = '69b84df5003bd8957c5c'
api_key = 'standard_cce3cdb866ea6433888d40cedd24dc45987372308fdc3dd0697de08648c0e5c7e04b02c3bcee271403fd656b00a5820f04c08b51631284a6e8a3582d8aed2aa33234f3c29cc777e9b162eb54810b789251b0d006a9a3b081ebc2da53b9baa94614b124b3508ad849fd9a4187cc6094f506d4b57f409b69d9562a74df594f3ec3'
db_id = 'sneakers_multistore_db'
headers = {
'X-Appwrite-Project': project_id,
'X-Appwrite-Key': api_key,
'Content-Type': 'application/json'
}
def appwrite_request(path, method='GET', data=None):
url = f'{endpoint}{path}'
body = json.dumps(data).encode('utf-8') if data else None
req = urllib.request.Request(url, data=body, headers=headers, method=method)
try:
with urllib.request.urlopen(req, context=ctx, timeout=30) as resp:
return json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
err_body = e.read().decode()
return {'error': e.code, 'message': err_body}
except Exception as e:
return {'error': 500, 'message': str(e)}
print('🚀 Iniciando sincronización de plantillas y saneamiento de productos...')
# 1. Cargar plantillas desde templates-service.ts
# Usaremos Node para extraer DEFAULT_MESSAGE_TEMPLATES con precisión
import subprocess
node_code = """
const fs = require('fs');
const path = require('path');
const ts = fs.readFileSync(path.resolve(__dirname, '../dripzone-app/src/lib/templates-service.ts'), 'utf-8');
// Extraer el array DEFAULT_MESSAGE_TEMPLATES
const startIdx = ts.indexOf('export const DEFAULT_MESSAGE_TEMPLATES: MessageTemplate[] = [');
if (startIdx === -1) {
console.error('No se encontró DEFAULT_MESSAGE_TEMPLATES');
process.exit(1);
}
// Transpilar básico o evaluar
// Crearemos un archivo temporal js rápido
"""
# Ejecutar node script para leer templates directamente
extract_script = """
const fs = require('fs');
const path = require('path');
const content = fs.readFileSync('dripzone-app/src/lib/templates-service.ts', 'utf-8');
// Obtenemos los bloques de id, title, description, category, channel, content, availableVariables
const tplRegex = /\\{\\s*id:\\s*'([^']+)',[\\s\\S]*?title:\\s*'([^']+)',[\\s\\S]*?description:\\s*'([^']+)',[\\s\\S]*?category:\\s*'([^']+)',[\\s\\S]*?channel:\\s*'([^']+)',[\\s\\S]*?isActive:\\s*(true|false),[\\s\\S]*?content:\\s*`([\\s\\S]*?)`,[\\s\\S]*?availableVariables:\\s*(\\[[\\s\\S]*?\\]),/g;
let matches;
const list = [];
while ((matches = tplRegex.exec(content)) !== null) {
try {
const id = matches[1];
const title = matches[2];
const description = matches[3];
const category = matches[4];
const channel = matches[5];
const isActive = matches[6] === 'true';
const tplContent = matches[7];
list.push({ id, title, description, category, channel, isActive, content: tplContent });
} catch(e) {}
}
console.log(JSON.stringify(list));
"""
with open('scripts/scratch_extract_tpls.js', 'w', encoding='utf-8') as f:
f.write(extract_script)
res = subprocess.run(['node', 'scripts/scratch_extract_tpls.js'], capture_output=True, text=True, cwd=os.getcwd())
templates = json.loads(res.stdout or '[]')
print(f'✅ {len(templates)} plantillas extraídas desde templates-service.ts.')
# 2. Sincronizar en Appwrite Cloud
for t in templates:
doc_id = t['id']
payload = {
'title': t['title'],
'description': t['description'],
'category': t['category'],
'channel': t['channel'],
'content': t['content'],
'isActive': t['isActive'],
'updatedAt': '2026-09-10T22:20:00.000Z'
}
# Intentar actualizar o crear
upd = appwrite_request(f'/databases/{db_id}/collections/message_templates/documents/{doc_id}', method='PATCH', data=payload)
if 'error' in upd and upd.get('error') == 404:
# Crear documento
create_payload = {'documentId': doc_id, 'data': payload}
c_res = appwrite_request(f'/databases/{db_id}/collections/message_templates/documents', method='POST', data=create_payload)
print(f' [+] Creada plantilla en Appwrite: {doc_id}')
else:
print(f' [✓] Actualizada plantilla en Appwrite: {doc_id}')
# 3. Sanear descripciones de productos existentes en Appwrite
print('\\n🧹 Saneando descripciones en colección catalog_products de Appwrite...')
cursor = None
cleaned_count = 0
total_inspected = 0
while True:
q = '?limit=100'
if cursor:
q += f'&queries[]=cursorAfter("{cursor}")'
docs_resp = appwrite_request(f'/databases/{db_id}/collections/catalog_products/documents{q}')
if 'error' in docs_resp or 'documents' not in docs_resp:
print('Error o fin de lista de productos:', docs_resp)
break
docs = docs_resp.get('documents', [])
if not docs:
break
for p in docs:
total_inspected += 1
desc = p.get('description', '')
if not desc:
continue
modified = False
new_desc = desc
# Eliminar costuras reforzadas y calidad G5 / 1.1
if 'Calidad G5 / 1.1 Prémium:' in new_desc or 'Calidad G5 / 1.1' in new_desc or 'costuras reforzadas' in new_desc:
new_desc = new_desc.replace(
'• 💎 *Calidad G5 / 1.1 Prémium:* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables.',
'• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.'
).replace(
'• 💎 *Calidad G5 / 1.1 Prémium:*',
'• 💎 *Materiales Seleccionados:*'
).replace(
'costuras reforzadas',
'acabados prémium'
)
modified = True
# Eliminar costuras de seguridad
if 'costuras de seguridad' in new_desc:
new_desc = new_desc.replace('costuras de seguridad', 'herrajes reforzados')
modified = True
# Reemplazar despacho fijo a cualquier ciudad
if 'Despachamos en 24 horas hábiles a cualquier ciudad de Colombia' in new_desc:
new_desc = new_desc.replace(
'• 🚚 *Despacho Prioritario Nacional:* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia.',
'• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del flete y tiempos de entrega varían según la ciudad de destino).'
)
modified = True
# Reemplazar pago 100% contraentrega incondicional
if 'Pago 100% Contraentrega: Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.' in new_desc:
new_desc = new_desc.replace(
'• 💵 *Pago 100% Contraentrega:* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.',
'• 💵 *Pago Contraentrega:* Separas tu pedido con anticipo por Bold oficial y cancelas el saldo restante en efectivo o mediante Bold al recibir en tu puerta.'
)
modified = True
# Reemplazar 1er cambio de talla sin costo adicional incondicional
if '1er Cambio de Talla sin costo adicional' in new_desc:
new_desc = new_desc.replace(
'🛡️ 1er Cambio de Talla sin costo adicional',
'🛡️ Garantía de fábrica y cambio de talla (sujeto a políticas de cobertura según ciudad)'
)
modified = True
if modified:
p_id = p['$id']
upd_res = appwrite_request(
f'/databases/{db_id}/collections/catalog_products/documents/{p_id}',
method='PATCH',
data={'description': new_desc}
)
if 'error' not in upd_res:
cleaned_count += 1
else:
print(f'Error actualizando producto {p_id}:', upd_res)
cursor = docs[-1]['$id']
if len(docs) < 100:
break
print(f'🎉 Proceso completado: {cleaned_count} productos saneados de {total_inspected} inspeccionados en Appwrite.')

View File

@ -27,11 +27,11 @@ export function generateAttractiveProductCopy(product: {
return `${selectedHook}
✨ *¿Por qué todos las eligen?*
• 💎 *Calidad G5 / 1.1 Prémium:* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables.
• 💎 *Materiales Seleccionados:* Materiales de alto rendimiento, acabados prémium y silueta impecable.
• ☁️ *Confort Inigualable:* Plantilla acolchada ergonómica para máxima suavidad al caminar o entrenar.
• 🚚 *Despacho Prioritario Nacional:* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia.
• 💵 *Pago 100% Contraentrega:* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Revisas tu producto y verificas tu talla con total respaldo.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del flete y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Realizas tu pedido y pagas al recibir en tu puerta según cobertura.
• 🛡️ *Garantía Directa:* Revisas tu producto y cuentas con garantía de fábrica y cambio de talla.
⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla en bodega nacional. ¡Asegura tu par ahora antes de que se agoten!`;
}

View File

@ -26,7 +26,7 @@ export function generateAttractiveProductCopy(product: {
const cat = (product.category || '').toLowerCase();
let hook = '';
let bullet1 = '• 💎 *Calidad Prémium Garantizada:* Materiales de alto rendimiento, costuras reforzadas y acabados de lujo.';
let bullet1 = '• 💎 *Materiales Seleccionados:* Materiales de alto rendimiento, acabados prémium y silueta impecable.';
let bullet2 = '• ☁️ *Máximo Confort y Ergonomía:* Diseñado para acompañarte todo el día con total comodidad.';
let cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles en inventario nacional. ¡Asegura el tuyo ahora antes de que se agoten!';
@ -37,7 +37,7 @@ export function generateAttractiveProductCopy(product: {
cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla. ¡Pide tus chanclas hoy mismo!';
} else if (cat.includes('carriel') || cat.includes('bandolera') || cat.includes('riñonera') || cat.includes('crossbody')) {
hook = `🔥 ¡Lleva tus esenciales con el auténtico estilo y practicidad del ${cleanName}! Múltiples compartimientos, cierres de alta durabilidad y correa ajustable ergonómica.`;
bullet1 = '• 💎 *Materiales de Alta Resistencia:* Acabados prémium, costuras de seguridad y cierres metálicos fluidos.';
bullet1 = '• 💎 *Materiales de Alta Resistencia:* Acabados prémium, herrajes reforzados y cierres metálicos fluidos.';
bullet2 = '• 👝 *Distribución Inteligente:* Espacio seguro para celular, billetera, llaves y documentos con fácil acceso.';
cta = '⚠️ *Edición Exclusiva:* Pocas unidades en bodega. ¡Haz tu pedido y paga al recibir en tu casa!';
} else if (cat.includes('malet') || cat.includes('morral') || cat.includes('mochila') || cat.includes('tula')) {
@ -63,7 +63,7 @@ export function generateAttractiveProductCopy(product: {
} else {
// Por defecto: Zapatillas / Sneakers
hook = `🔥 ¡Lleva tu outfit al siguiente nivel con las icónicas ${cleanName}! Diseñadas para quienes no negocian entre estilo de alto impacto y máxima comodidad para el día a día.`;
bullet1 = '• 💎 *Calidad G5 / 1.1 Prémium:* Materiales de alto rendimiento, costuras reforzadas y terminaciones impecables.';
bullet1 = '• 💎 *Materiales Seleccionados:* Construcción de alta resistencia, acabados prémium y silueta impecable.';
bullet2 = '• ☁️ *Confort Inigualable:* Plantilla acolchada ergonómica para máxima suavidad al caminar o entrenar.';
cta = '⚠️ *Disponibilidad Limitada:* Pocas unidades disponibles por talla en inventario nacional. ¡Asegura tu par ahora antes de que se agoten!';
}
@ -73,9 +73,9 @@ export function generateAttractiveProductCopy(product: {
✨ *¿Por qué todos lo eligen?*
${bullet1}
${bullet2}
• 🚚 *Despacho Prioritario Nacional:* Despachamos en 24 horas hábiles a cualquier ciudad de Colombia.
• 💵 *Pago 100% Contraentrega:* Realizas tu pedido con total tranquilidad y pagas al recibir en tu puerta.
• 🛡️ *Garantía Directa:* Revisas tu producto al llegar con total respaldo.
• 🚚 *Envíos a Nivel Nacional:* Despachos a toda Colombia (el valor del flete y tiempos de entrega varían según la ciudad de destino).
• 💵 *Pago Contraentrega:* Pagas al recibir en tu puerta según cobertura de tu ciudad.
• 🛡️ *Garantía Directa:* Respaldo de fábrica y opción de cambio de talla según políticas locales.
${cta}`;