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:
parent
e4820668cb
commit
7d051d2d83
@ -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!`;
|
||||
}
|
||||
|
||||
@ -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 (
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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');
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@ -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];
|
||||
|
||||
|
||||
@ -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' },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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'
|
||||
|
||||
136
scripts/deploy_templates_and_payment_fix.py
Normal file
136
scripts/deploy_templates_and_payment_fix.py
Normal 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()
|
||||
173
scripts/sync_templates_and_sanitize_products.js
Normal file
173
scripts/sync_templates_and_sanitize_products.js
Normal 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();
|
||||
200
scripts/sync_templates_and_sanitize_products.py
Normal file
200
scripts/sync_templates_and_sanitize_products.py
Normal 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.')
|
||||
@ -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!`;
|
||||
}
|
||||
|
||||
@ -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}`;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user