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')}
`)}Los documentos no se adjuntaron porque exceden el tamaño permitido por correo. Puedes descargarlos desde el sistema.
` : ''} `); } function declaracionBlock(d: NonNullablePeriodo
${escapeHtml(d.periodo)}
Tipo
${tipoLabel}
Impuestos
${escapeHtml(impuestosStr)}
Monto a pagar
${montoLabel}
`; } function evidenciaBlock(e: NonNullableObligación
${escapeHtml(e.obligacionNombre)}
Periodo
${escapeHtml(e.periodo)}
Tipo de documento
${escapeHtml(e.tipoDocumento)}
Archivo
${escapeHtml(e.filename)}
`; } function extraBlock(e: NonNullableDocumento
${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]!); }