route.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { NextRequest, NextResponse } from 'next/server'
  2. import { sendDocToSRI } from '@/lib/sri-utils'
  3. import { formatSRIError, isCriticalError, isRecoverableError } from '@/lib/sri-error-codes'
  4. export async function POST(request: NextRequest) {
  5. try {
  6. const body = await request.json()
  7. const { signedXml, ambiente } = body
  8. if (!signedXml) {
  9. return NextResponse.json(
  10. { error: 'XML firmado es requerido' },
  11. { status: 400 }
  12. )
  13. }
  14. // Validar ambiente
  15. const ambienteValido = ambiente === 'produccion' ? 'produccion' : 'pruebas'
  16. // Enviar el documento firmado al SRI
  17. const result = await sendDocToSRI(signedXml, ambienteValido)
  18. const respuestaRecepcion = result.RespuestaRecepcionComprobante
  19. const estado = respuestaRecepcion.estado
  20. // Extraer mensajes y clave de acceso si el documento fue devuelto
  21. let mensajes: any[] = []
  22. let claveAcceso: string | undefined
  23. if (respuestaRecepcion.comprobantes?.comprobante) {
  24. const comprobante = Array.isArray(respuestaRecepcion.comprobantes.comprobante)
  25. ? respuestaRecepcion.comprobantes.comprobante[0]
  26. : respuestaRecepcion.comprobantes.comprobante
  27. claveAcceso = comprobante.claveAcceso
  28. if (estado === 'DEVUELTA' && comprobante.mensajes?.mensaje) {
  29. const mensajesRaw = Array.isArray(comprobante.mensajes.mensaje)
  30. ? comprobante.mensajes.mensaje
  31. : [comprobante.mensajes.mensaje]
  32. mensajes = mensajesRaw.map((m: any) => ({
  33. identificador: m.identificador,
  34. mensaje: m.mensaje,
  35. tipo: m.tipo as "INFORMATIVO" | "ADVERTENCIA" | "ERROR",
  36. informacionAdicional: m.informacionAdicional,
  37. // Agregar información formateada para mostrar al usuario
  38. mensajeFormateado: formatSRIError(m.identificador, m.mensaje, m.informacionAdicional),
  39. esCritico: isCriticalError(m.identificador),
  40. esRecuperable: isRecoverableError(m.identificador)
  41. }))
  42. }
  43. }
  44. // Determinar el estado para el frontend
  45. let estadoFrontend = 'enviando'
  46. if (estado === 'RECIBIDA') {
  47. estadoFrontend = 'verificando'
  48. } else if (estado === 'DEVUELTA') {
  49. estadoFrontend = 'devuelto'
  50. }
  51. return NextResponse.json({
  52. success: true,
  53. estado: estadoFrontend,
  54. estadoRecepcion: estado,
  55. mensaje: estado === 'RECIBIDA'
  56. ? 'Documento recibido por el SRI, verificando estado...'
  57. : 'Documento devuelto por el SRI',
  58. claveAcceso,
  59. mensajes,
  60. respuestaCompleta: result
  61. })
  62. } catch (error) {
  63. console.error('Error enviando documento al SRI:', error)
  64. return NextResponse.json(
  65. {
  66. error: 'Error al enviar el documento al SRI',
  67. details: error instanceof Error ? error.message : 'Error desconocido'
  68. },
  69. { status: 500 }
  70. )
  71. }
  72. }