| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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 {
- const body = await request.json()
- const { signedXml, ambiente } = body
- if (!signedXml) {
- return NextResponse.json(
- { error: 'XML firmado es requerido' },
- { status: 400 }
- )
- }
- // Validar ambiente
- const ambienteValido = ambiente === 'produccion' ? 'produccion' : 'pruebas'
- // 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: estadoFrontend,
- estadoRecepcion: estado,
- mensaje: estado === 'RECIBIDA'
- ? 'Documento recibido por el SRI, verificando estado...'
- : 'Documento devuelto por el SRI',
- claveAcceso,
- mensajes,
- respuestaCompleta: result
- })
- } catch (error) {
- console.error('Error enviando documento al SRI:', error)
- return NextResponse.json(
- {
- error: 'Error al enviar el documento al SRI',
- details: error instanceof Error ? error.message : 'Error desconocido'
- },
- { status: 500 }
- )
- }
- }
|