Añade env de ingesta, SMTP y webhooks + dependencia nodemailer

Variables nuevas (todas opcionales vía zod, sin romper build/demo):
- FUNNEL_API_KEY: clave Bearer del EP de ingesta.
- SMTP_* + EMAIL_FROM: envío de email del presupuesto/enlace.
- PERFIL/WHATSAPP/WHATSAPP_START webhook URLs: señales al flujo externo.
- APP_URL: base para enlaces absolutos.
Helpers emailConfigurado()/perfilWebhookConfigurado()/whatsappWebhookConfigurado()/
whatsappStartConfigurado(). nodemailer como dep directa (stack: Email SMTP).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-06-03 19:01:15 +02:00
parent b9dd90f4ef
commit 737496ed89
4 changed files with 88 additions and 0 deletions

View File

@@ -12,12 +12,36 @@ const schema = z.object({
RETELL_API_KEY: opcional,
RETELL_AGENT_ID: opcional,
RETELL_FROM_NUMBER: opcional,
// EP de ingesta del lead: clave compartida que valida al llamante externo.
FUNNEL_API_KEY: opcional,
// SMTP para enviar el presupuesto y el enlace al formulario.
SMTP_HOST: opcional,
SMTP_PORT: opcional,
SMTP_USER: opcional,
SMTP_PASS: opcional,
EMAIL_FROM: opcional,
// Webhooks salientes hacia el flujo externo (generación, entrega y arranque de WhatsApp).
PERFIL_WEBHOOK_URL: opcional,
WHATSAPP_WEBHOOK_URL: opcional,
WHATSAPP_START_WEBHOOK_URL: opcional,
// Base pública de la app, para construir enlaces (ej. el enlace al formulario en el email).
APP_URL: opcional,
});
export const env = schema.parse({
RETELL_API_KEY: process.env.RETELL_API_KEY,
RETELL_AGENT_ID: process.env.RETELL_AGENT_ID,
RETELL_FROM_NUMBER: process.env.RETELL_FROM_NUMBER,
FUNNEL_API_KEY: process.env.FUNNEL_API_KEY,
SMTP_HOST: process.env.SMTP_HOST,
SMTP_PORT: process.env.SMTP_PORT,
SMTP_USER: process.env.SMTP_USER,
SMTP_PASS: process.env.SMTP_PASS,
EMAIL_FROM: process.env.EMAIL_FROM,
PERFIL_WEBHOOK_URL: process.env.PERFIL_WEBHOOK_URL,
WHATSAPP_WEBHOOK_URL: process.env.WHATSAPP_WEBHOOK_URL,
WHATSAPP_START_WEBHOOK_URL: process.env.WHATSAPP_START_WEBHOOK_URL,
APP_URL: process.env.APP_URL,
});
// Mínimo para lanzar una llamada saliente: clave de API + número de origen. El agente puede
@@ -26,3 +50,21 @@ export const env = schema.parse({
export function retellConfigurado(): boolean {
return Boolean(env.RETELL_API_KEY && env.RETELL_FROM_NUMBER);
}
// Mínimo para enviar email: host SMTP + remitente. Sin esto el envío degrada a no-op.
export function emailConfigurado(): boolean {
return Boolean(env.SMTP_HOST && env.EMAIL_FROM);
}
// Cada webhook saliente es opcional: si falta su URL, la señal correspondiente no se manda.
export function perfilWebhookConfigurado(): boolean {
return Boolean(env.PERFIL_WEBHOOK_URL);
}
export function whatsappWebhookConfigurado(): boolean {
return Boolean(env.WHATSAPP_WEBHOOK_URL);
}
export function whatsappStartConfigurado(): boolean {
return Boolean(env.WHATSAPP_START_WEBHOOK_URL);
}