|
|
@@ -0,0 +1,268 @@
|
|
|
+/**
|
|
|
+ * Códigos de error del SRI con descripciones y soluciones sugeridas
|
|
|
+ * Basado en la documentación oficial del SRI
|
|
|
+ */
|
|
|
+
|
|
|
+interface ErrorSRI {
|
|
|
+ codigo: string
|
|
|
+ descripcion: string
|
|
|
+ motivo: string
|
|
|
+ solucion?: string
|
|
|
+ validacion: 'RECEPCIÓN' | 'AUTORIZACIÓN' | 'EMISOR' | 'EMISOR/RECEPCIÓN'
|
|
|
+}
|
|
|
+
|
|
|
+export const ERRORES_SRI: Record<string, ErrorSRI> = {
|
|
|
+ '2': {
|
|
|
+ codigo: '2',
|
|
|
+ descripcion: 'RUC del emisor se encuentra NO ACTIVO',
|
|
|
+ motivo: 'El número de RUC no está activo en el registro del SRI',
|
|
|
+ solucion: 'Verifica que tu RUC esté en estado ACTIVO en el portal del SRI',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '10': {
|
|
|
+ codigo: '10',
|
|
|
+ descripcion: 'Establecimiento del emisor se encuentra Clausurado',
|
|
|
+ motivo: 'El establecimiento emisor ha sido clausurado',
|
|
|
+ solucion: 'Espera a que concluya la clausura del establecimiento. El servicio se habilitará automáticamente',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '26': {
|
|
|
+ codigo: '26',
|
|
|
+ descripcion: 'Tamaño máximo superado',
|
|
|
+ motivo: 'El tamaño del archivo supera lo establecido',
|
|
|
+ solucion: 'Reduce el tamaño del archivo o la cantidad de detalles en la factura',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '27': {
|
|
|
+ codigo: '27',
|
|
|
+ descripcion: 'Clase no permitida',
|
|
|
+ motivo: 'La clase del contribuyente no puede emitir comprobantes electrónicos',
|
|
|
+ solucion: 'Verifica tu tipo de contribuyente en el SRI',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '28': {
|
|
|
+ codigo: '28',
|
|
|
+ descripcion: 'Acuerdo de medios electrónicos no aceptado',
|
|
|
+ motivo: 'No has aceptado el acuerdo de medios electrónicos del SRI',
|
|
|
+ solucion: 'Ingresa al portal del SRI y acepta el acuerdo de medios electrónicos',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '35': {
|
|
|
+ codigo: '35',
|
|
|
+ descripcion: 'Documento inválido',
|
|
|
+ motivo: 'El XML no cumple con la estructura del esquema XSD del SRI',
|
|
|
+ solucion: 'Verifica que todos los campos requeridos estén completos y con el formato correcto',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '36': {
|
|
|
+ codigo: '36',
|
|
|
+ descripcion: 'Versión esquema descontinuada',
|
|
|
+ motivo: 'La versión del esquema XML no es la correcta',
|
|
|
+ solucion: 'Actualiza la versión del esquema XML en tu factura (usar versión 1.1.0 o superior)',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '37': {
|
|
|
+ codigo: '37',
|
|
|
+ descripcion: 'RUC sin autorización de emisión',
|
|
|
+ motivo: 'El RUC no cuenta con autorización para emitir comprobantes electrónicos',
|
|
|
+ solucion: 'Solicita la autorización de emisión de comprobantes electrónicos en el portal del SRI',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '39': {
|
|
|
+ codigo: '39',
|
|
|
+ descripcion: 'Firma inválida',
|
|
|
+ motivo: 'La firma electrónica no es válida o el certificado no es de tipo firma digital',
|
|
|
+ solucion: 'Verifica que estés usando un certificado de firma digital válido (no de SSL/TLS). Debe ser emitido por una entidad certificadora autorizada en Ecuador',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '40': {
|
|
|
+ codigo: '40',
|
|
|
+ descripcion: 'Error en el certificado',
|
|
|
+ motivo: 'No se encontró el certificado o no se puede convertir en certificado X509',
|
|
|
+ solucion: 'Verifica que el archivo del certificado (.p12) sea válido y esté en el formato correcto',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '43': {
|
|
|
+ codigo: '43',
|
|
|
+ descripcion: 'Clave de acceso registrada',
|
|
|
+ motivo: 'La clave de acceso ya existe en el sistema del SRI',
|
|
|
+ solucion: 'Genera una nueva factura con un secuencial diferente. No reenvíes la misma factura',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '45': {
|
|
|
+ codigo: '45',
|
|
|
+ descripcion: 'Secuencial registrado',
|
|
|
+ motivo: 'El secuencial del comprobante ya fue usado',
|
|
|
+ solucion: 'Incrementa el secuencial para generar una nueva factura',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '46': {
|
|
|
+ codigo: '46',
|
|
|
+ descripcion: 'RUC no existe',
|
|
|
+ motivo: 'El RUC del emisor no existe en el Registro Único de Contribuyentes',
|
|
|
+ solucion: 'Verifica que el RUC esté escrito correctamente (13 dígitos)',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '47': {
|
|
|
+ codigo: '47',
|
|
|
+ descripcion: 'Tipo de comprobante no existe',
|
|
|
+ motivo: 'El código de tipo de comprobante no es válido',
|
|
|
+ solucion: 'Verifica que el código de documento (codDoc) sea correcto (01 para facturas)',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '48': {
|
|
|
+ codigo: '48',
|
|
|
+ descripcion: 'Esquema XSD no existe',
|
|
|
+ motivo: 'No existe esquema para el tipo de comprobante enviado',
|
|
|
+ solucion: 'Verifica el tipo de comprobante y la versión del esquema',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '49': {
|
|
|
+ codigo: '49',
|
|
|
+ descripcion: 'Argumentos nulos',
|
|
|
+ motivo: 'Se enviaron argumentos nulos al servicio web',
|
|
|
+ solucion: 'Verifica que todos los campos requeridos tengan valores',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '50': {
|
|
|
+ codigo: '50',
|
|
|
+ descripcion: 'Error interno general',
|
|
|
+ motivo: 'Error inesperado en el servidor del SRI',
|
|
|
+ solucion: 'Espera unos minutos e intenta nuevamente. Si persiste, contacta al SRI',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '52': {
|
|
|
+ codigo: '52',
|
|
|
+ descripcion: 'Error en diferencias',
|
|
|
+ motivo: 'Error en los cálculos matemáticos del comprobante',
|
|
|
+ solucion: 'Verifica que los subtotales, impuestos y total estén calculados correctamente',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '56': {
|
|
|
+ codigo: '56',
|
|
|
+ descripcion: 'Establecimiento cerrado',
|
|
|
+ motivo: 'El establecimiento desde el cual se genera el comprobante está cerrado',
|
|
|
+ solucion: 'Verifica el estado del establecimiento en el portal del SRI',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '57': {
|
|
|
+ codigo: '57',
|
|
|
+ descripcion: 'Autorización suspendida',
|
|
|
+ motivo: 'La autorización para emitir comprobantes electrónicos está suspendida',
|
|
|
+ solucion: 'Contacta al SRI para regularizar tu situación tributaria',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '58': {
|
|
|
+ codigo: '58',
|
|
|
+ descripcion: 'Error en la estructura de clave de acceso',
|
|
|
+ motivo: 'Los componentes de la clave de acceso no coinciden con los datos del comprobante',
|
|
|
+ solucion: 'Verifica que la fecha de emisión, RUC, establecimiento y secuencial sean correctos',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '63': {
|
|
|
+ codigo: '63',
|
|
|
+ descripcion: 'RUC clausurado',
|
|
|
+ motivo: 'El RUC del emisor está clausurado',
|
|
|
+ solucion: 'Regulariza tu situación tributaria con el SRI',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '65': {
|
|
|
+ codigo: '65',
|
|
|
+ descripcion: 'Fecha de emisión extemporánea',
|
|
|
+ motivo: 'El comprobante no fue enviado dentro del tiempo permitido',
|
|
|
+ solucion: 'Los comprobantes deben enviarse máximo 24 horas después de su emisión',
|
|
|
+ validacion: 'EMISOR/RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '67': {
|
|
|
+ codigo: '67',
|
|
|
+ descripcion: 'Fecha inválida',
|
|
|
+ motivo: 'Error en el formato de la fecha',
|
|
|
+ solucion: 'Verifica que la fecha esté en formato dd/MM/yyyy',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '70': {
|
|
|
+ codigo: '70',
|
|
|
+ descripcion: 'Clave de acceso en procesamiento',
|
|
|
+ motivo: 'El comprobante ya fue enviado y aún está siendo procesado',
|
|
|
+ solucion: 'Espera a que termine el procesamiento del comprobante anterior',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '80': {
|
|
|
+ codigo: '80',
|
|
|
+ descripcion: 'Error en la estructura de clave de acceso',
|
|
|
+ motivo: 'La clave de acceso tiene formato incorrecto (más de 49 dígitos o caracteres no numéricos)',
|
|
|
+ solucion: 'Verifica que la clave de acceso tenga exactamente 49 dígitos numéricos',
|
|
|
+ validacion: 'AUTORIZACIÓN'
|
|
|
+ },
|
|
|
+ '82': {
|
|
|
+ codigo: '82',
|
|
|
+ descripcion: 'Error en la fecha de inicio de transporte',
|
|
|
+ motivo: 'La fecha de inicio de transporte es menor a la fecha de emisión',
|
|
|
+ solucion: 'Verifica que la fecha de inicio de transporte sea igual o posterior a la fecha de emisión',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ },
|
|
|
+ '92': {
|
|
|
+ codigo: '92',
|
|
|
+ descripcion: 'Error al validar monto de devolución del IVA',
|
|
|
+ motivo: 'El valor de devolución del IVA no corresponde al autorizado',
|
|
|
+ solucion: 'Verifica el monto de devolución del IVA con el servicio web DIG',
|
|
|
+ validacion: 'RECEPCIÓN'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Obtiene información detallada sobre un código de error del SRI
|
|
|
+ */
|
|
|
+export function getErrorInfo(codigo: string): ErrorSRI | null {
|
|
|
+ return ERRORES_SRI[codigo] || null
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Formatea un mensaje de error del SRI de manera amigable para el usuario
|
|
|
+ */
|
|
|
+export function formatSRIError(
|
|
|
+ codigo: string,
|
|
|
+ mensajeOriginal: string,
|
|
|
+ infoAdicional?: string
|
|
|
+): string {
|
|
|
+ const errorInfo = getErrorInfo(codigo)
|
|
|
+
|
|
|
+ if (!errorInfo) {
|
|
|
+ // Si no tenemos información del código, mostrar el mensaje original
|
|
|
+ let mensaje = `Error ${codigo}: ${mensajeOriginal}`
|
|
|
+ if (infoAdicional) {
|
|
|
+ mensaje += `\n${infoAdicional}`
|
|
|
+ }
|
|
|
+ return mensaje
|
|
|
+ }
|
|
|
+
|
|
|
+ // Construir mensaje amigable
|
|
|
+ let mensaje = `${errorInfo.descripcion}\n\n`
|
|
|
+ mensaje += `Motivo: ${errorInfo.motivo}\n`
|
|
|
+
|
|
|
+ if (infoAdicional) {
|
|
|
+ mensaje += `Detalle (Respuesta API): ${infoAdicional}\n`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (errorInfo.solucion) {
|
|
|
+ mensaje += `\nSolución: ${errorInfo.solucion}`
|
|
|
+ }
|
|
|
+
|
|
|
+ return mensaje
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Verifica si un código de error es crítico (no se puede resolver sin intervención del SRI)
|
|
|
+ */
|
|
|
+export function isCriticalError(codigo: string): boolean {
|
|
|
+ const criticalCodes = ['2', '10', '27', '37', '46', '56', '57', '63']
|
|
|
+ return criticalCodes.includes(codigo)
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Verifica si un código de error es recuperable (se puede solucionar ajustando el documento)
|
|
|
+ */
|
|
|
+export function isRecoverableError(codigo: string): boolean {
|
|
|
+ const recoverableCodes = ['35', '43', '45', '52', '58', '65', '67', '80']
|
|
|
+ return recoverableCodes.includes(codigo)
|
|
|
+}
|