Crear Factura Electrónica de ARCA en Anything
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 usar Anything para crear una app que emita una Factura B con el web service de factura electrónica (wsfe) usando Afip SDK API. Como Anything puede generar distintas arquitecturas, el prompt le pide una app full-stack con backend privado.
Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- Obtener un access_token de Afip SDK
- Tener acceso a Anything
- Configurar el token como secret o variable 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 Anything
La instrucción principal para Anything es que no deje el token en la pantalla. Todo lo que se conecta con Afip SDK API debe quedar en backend.
Creá un nuevo proyecto.
Prompt listo para pegar en Anything
Pegá este prompt:
Quiero crear una app para emitir Factura Electrónica de ARCA usando Afip SDK API.
La app debe quedar lista para completar un formulario, presionar un botón y emitir la factura. Generá toda la lógica necesaria.
Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener el CAE de ARCA.
- Mostrar número de comprobante, CAE y vencimiento del CAE.
Reglas:
- Crear una app full-stack con frontend y backend.
- El frontend no debe llamar directamente a Afip SDK API.
- El access token debe quedar como secret privado.
- La app debe limitarse a emitir el comprobante y mostrar el resultado.
Variables privadas:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Frontend:
- Crear una pantalla llamada "Emitir Factura Electrónica de ARCA".
- Agregar formulario con:
- Punto de venta: default 1.
- Tipo de comprobante: default 6.
- 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.
- Agregar botón "Emitir factura".
- Mostrar loading mientras se emite.
- Mostrar resultado con número de comprobante, CAE y vencimiento.
- Mostrar errores con texto claro.
Backend:
Crear un endpoint privado `POST /api/facturas/emitir`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
Usar `token` y `sign` de la respuesta.
2. Consultar último comprobante autorizado:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
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
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
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. Extraer de la respuesta:
- Número de comprobante: `CbteDesde`.
- CAE.
- Vencimiento del CAE: `CAEFchVto`.
5. Responder al frontend con esos datos.
Manejo de errores:
- Si falta el token, explicar que falta configurar `AFIP_SDK_ACCESS_TOKEN`.
- Si ARCA devuelve error, mostrar el mensaje recibido.
- Para error 10016, mostrar que debe reintentarse porque el comprobante debe usar el próximo número autorizado.
- Para error 10242, mostrar que falta la condición IVA receptor.
La app debe quedar lista para probar con los valores iniciales y emitir una factura de prueba de $121.
Configurar el token
Configurá AFIP_SDK_ACCESS_TOKEN como secret o variable privada del proyecto.
No lo pongas en la pantalla ni en código que se ejecute en el navegador. El backend debe leerlo desde el entorno.
Probar la emisión
Con los valores iniciales, Anything debería emitir una Factura B de prueba por $121 en ambiente dev.
Al finalizar, la pantalla debe mostrar:
- 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.