Crear Factura Electrónica de ARCA en Bolt.new
Con prompt listo para pegar
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
Conectar tu sistema con la facturación electrónica de ARCA
Guía paso a paso
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a pedirle a Bolt.new que genere una app web con frontend y backend para emitir una Factura B usando el web service de factura electrónica (wsfe) con Afip SDK API.
Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- Obtener un access_token de Afip SDK
- Tener acceso a Bolt.new
- Configurar el token como variable de entorno privada
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT 20409378472 sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para usar tu propio certificado para desarrollo.
Crear el proyecto en Bolt.new
Bolt.new puede generar una app completa a partir de una descripción. Para este caso, conviene pedirle una app full-stack: pantalla para cargar la factura y endpoint backend para llamar a Afip SDK.
Creá un nuevo proyecto en Bolt.new.
Prompt listo para pegar en Bolt.new
Pegá este prompt:
Quiero crear una app full-stack en Bolt.new para emitir Factura Electrónica de ARCA usando Afip SDK API.
Necesito que generes todo: interfaz, endpoint backend, conexión con Afip SDK API, manejo de errores y resultado en pantalla.
Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener CAE y vencimiento del CAE.
- Mostrar el resultado al usuario.
Reglas obligatorias:
- El access token de Afip SDK debe estar solo en backend.
- No hacer llamadas a Afip SDK API desde el navegador.
- La app debe limitarse a emitir la factura y mostrar el CAE.
Variables de entorno privadas:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Crear:
- Una pantalla principal con formulario.
- Un endpoint backend `POST /api/facturas/emitir`.
- Manejo de loading, success y error.
Formulario:
- Punto de venta, default 1.
- Tipo de comprobante, default 6 para Factura B.
- Concepto, default 1.
- Tipo de documento, default 99.
- Número de documento, default 0.
- Importe neto gravado, default 100.
- IVA, default 21.
- Condición IVA receptor, default 5.
Flujo del backend:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
Guardar de la respuesta:
- token
- sign
2. Consultar último comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
Calcular:
nextVoucherNumber = FECompUltimoAutorizadoResult.CbteNro + 1.
3. Solicitar CAE:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
4. Leer la respuesta y mostrar:
- Número de comprobante (`CbteDesde`).
- CAE.
- Vencimiento del CAE (`CAEFchVto`).
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Para error 10016, sugerir reintentar porque el próximo número debe recalcularse.
- Para error 10242, indicar que la condición IVA receptor debe estar completa.
Diseño:
- Interfaz clara, simple y lista para usar.
- Valores iniciales cargados para emitir una factura de prueba por $121.
- Mensajes visibles para saber si la factura se emitió correctamente.
Configurar el token
Cuando Bolt.new genere el proyecto, configurá AFIP_SDK_ACCESS_TOKEN como variable privada.
No lo guardes en el frontend ni en archivos públicos. El endpoint backend debe leerlo desde el entorno.
Probar la emisión
Con los valores iniciales, la app debería emitir una Factura B de prueba por $121 en ambiente dev.
El resultado esperado es:
- Número de comprobante
- CAE
- Vencimiento del CAE
Ejemplos de otros tipos de comprobantes
Problemas comunes
Si estás teniendo el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar, te recomiendo leer este artículo.
Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar
Pasos para resolver este error
Si estás teniendo el error (10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor, te recomiendo leer este artículo.
Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio
Pasos para resolver este error
Luego, lo único que queda es pasar a modo producción. Podés seguir la guía para pasar a producción con Afip SDK.
Ante cualquier duda o pregunta, podés resolverla rápidamente en la Comunidad Afip SDK.