import { baseTemplate, heading, infoBox, primaryButton, BRAND_COLORS as C } from './base.js'; export interface DocumentoSubidoData { /** Kind: para el título/subject. */ kind: 'declaracion' | 'extra' | 'obligacion_evidencia'; /** Quién subió el documento (email). */ subidoPor: string; /** RFC del contribuyente. */ contribuyenteRfc: string; /** Razón social / nombre del contribuyente. */ contribuyenteNombre: string; /** Nombre del despacho (opcional, se incluye en el body cuando existe). */ despachoNombre?: string; /** Si es declaración: periodo + tipo + impuestos + monto. */ declaracion?: { periodo: string; // "Abril 2026" tipo: 'normal' | 'complementaria'; impuestos: string[]; // ['IVA', 'ISR'] montoPago: number | null; }; /** Si es extra: nombre del documento + categoria. */ extra?: { nombre: string; descripcion?: string | null; categoria?: string | null; }; /** Si es evidencia de obligación fiscal. */ evidencia?: { obligacionNombre: string; periodo: string; tipoDocumento: string; filename: string; }; /** URL al sistema (ej. https://despachos.horuxfin.com/documentos). */ link: string; /** Solo para declaraciones: los adjuntos se omitieron por exceder el límite de tamaño. */ attachmentsOmitted?: boolean; } export function documentoSubidoEmail(data: DocumentoSubidoData): string { const titulo = data.kind === 'declaracion' ? 'Nueva declaración subida' : data.kind === 'obligacion_evidencia' ? 'Nueva evidencia de obligación fiscal' : 'Nuevo documento subido'; const contenidoEspecifico = data.kind === 'declaracion' && data.declaracion ? declaracionBlock(data.declaracion) : data.kind === 'obligacion_evidencia' && data.evidencia ? evidenciaBlock(data.evidencia) : data.extra ? extraBlock(data.extra) : ''; return baseTemplate(` ${heading(titulo)}

${escapeHtml(data.subidoPor)} subió ${data.kind === 'obligacion_evidencia' ? 'una evidencia de obligación fiscal' : data.kind === 'declaracion' ? 'un acuse de declaración' : 'un documento'} para ${escapeHtml(data.contribuyenteNombre)}.

${infoBox(`

Contribuyente

${escapeHtml(data.contribuyenteNombre)}

RFC

${escapeHtml(data.contribuyenteRfc)}

${contenidoEspecifico}

Fecha

${new Date().toLocaleString('es-MX')}

`)}
${primaryButton('Ver en el sistema', data.link)}
${data.kind === 'declaracion' && data.attachmentsOmitted ? `

Los documentos no se adjuntaron porque exceden el tamaño permitido por correo. Puedes descargarlos desde el sistema.

` : ''} `); } function declaracionBlock(d: NonNullable): string { const impuestosStr = d.impuestos.join(', '); const tipoLabel = d.tipo === 'complementaria' ? 'Complementaria' : 'Normal'; const montoLabel = d.montoPago == null ? '—' : d.montoPago === 0 ? 'Sin pago' : formatCurrency(d.montoPago); return `

Periodo

${escapeHtml(d.periodo)}

Tipo

${tipoLabel}

Impuestos

${escapeHtml(impuestosStr)}

Monto a pagar

${montoLabel}

`; } function evidenciaBlock(e: NonNullable): string { return `

Obligación

${escapeHtml(e.obligacionNombre)}

Periodo

${escapeHtml(e.periodo)}

Tipo de documento

${escapeHtml(e.tipoDocumento)}

Archivo

${escapeHtml(e.filename)}

`; } function extraBlock(e: NonNullable): string { return `

Documento

${escapeHtml(e.nombre)}

${e.categoria ? `

Categoría

${escapeHtml(e.categoria)}

` : ''} ${e.descripcion ? `

Descripción

${escapeHtml(e.descripcion)}

` : ''} `; } function formatCurrency(n: number): string { return n.toLocaleString('es-MX', { style: 'currency', currency: 'MXN', minimumFractionDigits: 2 }); } function escapeHtml(s: string): string { return s.replace(/[&<>"']/g, (ch) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', })[ch]!); }