|
@@ -1,5 +1,6 @@
|
|
|
import { NextRequest, NextResponse } from 'next/server'
|
|
import { NextRequest, NextResponse } from 'next/server'
|
|
|
import { sendDocToSRI } from '@/lib/sri-utils'
|
|
import { sendDocToSRI } from '@/lib/sri-utils'
|
|
|
|
|
+import { formatSRIError, isCriticalError, isRecoverableError } from '@/lib/sri-error-codes'
|
|
|
|
|
|
|
|
export async function POST(request: NextRequest) {
|
|
export async function POST(request: NextRequest) {
|
|
|
try {
|
|
try {
|
|
@@ -19,11 +20,56 @@ export async function POST(request: NextRequest) {
|
|
|
// Enviar el documento firmado al SRI
|
|
// Enviar el documento firmado al SRI
|
|
|
const result = await sendDocToSRI(signedXml, ambienteValido)
|
|
const result = await sendDocToSRI(signedXml, ambienteValido)
|
|
|
|
|
|
|
|
|
|
+ const respuestaRecepcion = result.RespuestaRecepcionComprobante
|
|
|
|
|
+ const estado = respuestaRecepcion.estado
|
|
|
|
|
+
|
|
|
|
|
+ // Extraer mensajes y clave de acceso si el documento fue devuelto
|
|
|
|
|
+ let mensajes: any[] = []
|
|
|
|
|
+ let claveAcceso: string | undefined
|
|
|
|
|
+
|
|
|
|
|
+ if (respuestaRecepcion.comprobantes?.comprobante) {
|
|
|
|
|
+ const comprobante = Array.isArray(respuestaRecepcion.comprobantes.comprobante)
|
|
|
|
|
+ ? respuestaRecepcion.comprobantes.comprobante[0]
|
|
|
|
|
+ : respuestaRecepcion.comprobantes.comprobante
|
|
|
|
|
+
|
|
|
|
|
+ claveAcceso = comprobante.claveAcceso
|
|
|
|
|
+
|
|
|
|
|
+ if (estado === 'DEVUELTA' && comprobante.mensajes?.mensaje) {
|
|
|
|
|
+ const mensajesRaw = Array.isArray(comprobante.mensajes.mensaje)
|
|
|
|
|
+ ? comprobante.mensajes.mensaje
|
|
|
|
|
+ : [comprobante.mensajes.mensaje]
|
|
|
|
|
+
|
|
|
|
|
+ mensajes = mensajesRaw.map((m: any) => ({
|
|
|
|
|
+ identificador: m.identificador,
|
|
|
|
|
+ mensaje: m.mensaje,
|
|
|
|
|
+ tipo: m.tipo as "INFORMATIVO" | "ADVERTENCIA" | "ERROR",
|
|
|
|
|
+ informacionAdicional: m.informacionAdicional,
|
|
|
|
|
+ // Agregar información formateada para mostrar al usuario
|
|
|
|
|
+ mensajeFormateado: formatSRIError(m.identificador, m.mensaje, m.informacionAdicional),
|
|
|
|
|
+ esCritico: isCriticalError(m.identificador),
|
|
|
|
|
+ esRecuperable: isRecoverableError(m.identificador)
|
|
|
|
|
+ }))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Determinar el estado para el frontend
|
|
|
|
|
+ let estadoFrontend = 'enviando'
|
|
|
|
|
+ if (estado === 'RECIBIDA') {
|
|
|
|
|
+ estadoFrontend = 'verificando'
|
|
|
|
|
+ } else if (estado === 'DEVUELTA') {
|
|
|
|
|
+ estadoFrontend = 'devuelto'
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return NextResponse.json({
|
|
return NextResponse.json({
|
|
|
success: true,
|
|
success: true,
|
|
|
- estado: result.RespuestaRecepcionComprobante.estado,
|
|
|
|
|
- mensaje: 'Documento enviado al SRI exitosamente',
|
|
|
|
|
- respuesta: result
|
|
|
|
|
|
|
+ estado: estadoFrontend,
|
|
|
|
|
+ estadoRecepcion: estado,
|
|
|
|
|
+ mensaje: estado === 'RECIBIDA'
|
|
|
|
|
+ ? 'Documento recibido por el SRI, verificando estado...'
|
|
|
|
|
+ : 'Documento devuelto por el SRI',
|
|
|
|
|
+ claveAcceso,
|
|
|
|
|
+ mensajes,
|
|
|
|
|
+ respuestaCompleta: result
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
} catch (error) {
|
|
} catch (error) {
|