Explorar o código

handle reception errors

Matthew Trejo hai 1 mes
pai
achega
46cfcf4f5c

+ 49 - 3
src/app/api/send-to-sri/route.ts

@@ -1,5 +1,6 @@
 import { NextRequest, NextResponse } from 'next/server'
 import { sendDocToSRI } from '@/lib/sri-utils'
+import { formatSRIError, isCriticalError, isRecoverableError } from '@/lib/sri-error-codes'
 
 export async function POST(request: NextRequest) {
   try {
@@ -19,11 +20,56 @@ export async function POST(request: NextRequest) {
     // Enviar el documento firmado al SRI
     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({
       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) {

+ 4 - 2
src/components/envio-sri/EnvioStatus.tsx

@@ -85,12 +85,14 @@ export function EnvioStatus({ estadoEnvio, respuestaAutorizacion }: EnvioStatusP
         <CardDescription>{estadoInfo.description}</CardDescription>
       </CardHeader>
       <CardContent className="space-y-4">
-        {/* Información de autorización */}
+        {/* Información de autorización o recepción */}
         {respuestaAutorizacion && (
           <div className="space-y-3">
             {respuestaAutorizacion.numeroAutorizacion && (
               <div className="space-y-1">
-                <p className="text-sm font-medium">Número de Autorización</p>
+                <p className="text-sm font-medium">
+                  {estadoEnvio === "devuelto" ? "Clave de Acceso" : "Número de Autorización"}
+                </p>
                 <p className="text-sm font-mono bg-muted p-2 rounded">
                   {respuestaAutorizacion.numeroAutorizacion}
                 </p>

+ 20 - 4
src/hooks/envio-sri/useEnvioSRI.ts

@@ -84,11 +84,27 @@ export function useEnvioSRI() {
         throw new Error(data.details || data.error || "Error al enviar")
       }
 
-      toast.success("Documento enviado al SRI, verificando estado...")
-      setEstadoEnvio("verificando")
+      // Actualizar el estado según la respuesta del SRI
+      setEstadoEnvio(data.estado)
+
+      // Si hay mensajes (errores/advertencias), guardarlos en respuestaAutorizacion
+      if (data.mensajes && data.mensajes.length > 0) {
+        setRespuestaAutorizacion({
+          success: true,
+          estado: data.estado,
+          mensajes: data.mensajes,
+          numeroAutorizacion: data.claveAcceso, // Usamos la clave de acceso como referencia
+        })
+      }
+
+      if (data.estado === "devuelto") {
+        toast.error("Documento devuelto por el SRI. Revisa los mensajes de error.")
+      } else if (data.estado === "verificando") {
+        toast.success("Documento enviado al SRI, verificando estado...")
+        // Automáticamente verificar el estado
+        await handleVerificarEstado()
+      }
 
-      // Automáticamente verificar el estado
-      await handleVerificarEstado()
       return true
     } catch (error) {
       console.error(error)

+ 8 - 9
src/lib/sri-utils.ts

@@ -105,12 +105,13 @@ export async function sendDocToSRI(
 
                 // Extraer y formatear mensajes de error
                 const mensajes = result?.RespuestaRecepcionComprobante?.comprobantes?.comprobante
-                if (mensajes && Array.isArray(mensajes)) {
-                  mensajes.forEach((comp: any) => {
+                if (mensajes) {
+                  const mensajesArray = Array.isArray(mensajes) ? mensajes : [mensajes]
+                  mensajesArray.forEach((comp: any) => {
                     const msgs = comp.mensajes?.mensaje
                     if (msgs) {
-                      const mensajesArray = Array.isArray(msgs) ? msgs : [msgs]
-                      mensajesArray.forEach((msg: any) => {
+                      const mensajesMsgArray = Array.isArray(msgs) ? msgs : [msgs]
+                      mensajesMsgArray.forEach((msg: any) => {
                         const errorFormateado = formatSRIError(
                           msg.identificador,
                           msg.mensaje,
@@ -128,11 +129,9 @@ export async function sendDocToSRI(
                   })
                 }
 
-                reject(
-                  new Error(
-                    `El documento no fue recibido por el SRI. Estado: ${estado || 'DESCONOCIDO'}`
-                  )
-                )
+                // En lugar de rechazar, resolvemos para que el endpoint pueda manejar el estado
+                console.log(`⚠️  Documento con estado: ${estado} - El endpoint decidirá cómo manejarlo`)
+                resolve(result)
               } else {
                 console.log('✅ Documento recibido exitosamente')
                 resolve(result)