Resolución N° 5.616/2024. Más información

Crear factura electrónica de ARCA en Java

Con pocas líneas de código

Ivan Muñoz oct 07, 2024 - Ultima edicion jun 04, 2026

Crear factura electrónica de ARCA en Java

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

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 en Java es obtener el Código de Autorización Electrónico o CAE.

Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.

Requisitos previos

Para poder seguir esta guía, primero necesitarás:

Instalación

Lo primero es instalar la librería afip.java

Maven

<dependency>
    <groupId>com.afipsdk</groupId>
    <artifactId>afip-sdk-java</artifactId>
    <version>1.0.0</version>
</dependency>

Gradle

implementation 'com.afipsdk:afip-sdk-java:1.0.0'

Creamos una instancia de la clase Afip

Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT 20409378472 sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.

Te dejo este enlace por si luego quieres usar tu propio certificado para desarrollo.

import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;

AfipOptions options = new AfipOptions();
options.setCuit("20409378472"); // CUIT vinculado al certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN");

Afip afip = new Afip(options);

Obtener el número del último comprobante

Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto evita el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar.

int puntoDeVenta = 1;
int tipoDeFactura = 6;

int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);
int numeroDeFactura = lastVoucher + 1;

System.out.println("Próximo número de comprobante: " + numeroDeFactura);

Crear la factura

Vamos a crear una Factura B por un importe de $121 usando el número de comprobante obtenido en el paso anterior

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

// Fecha del comprobante (yyyyMMdd)
int fechaActual = Integer.parseInt(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));

Map<String, Object> data = new LinkedHashMap<>();
data.put("CantReg", 1);     // Cantidad de comprobantes a registrar
data.put("PtoVta", puntoDeVenta);   // Punto de venta
data.put("CbteTipo", tipoDeFactura); // Tipo de comprobante (ver tipos disponibles)
data.put("Concepto", 1);    // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
data.put("DocTipo", 99);    // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
data.put("DocNro", 0);      // Número de documento del comprador (0 consumidor final)
data.put("CbteDesde", numeroDeFactura); // Número de comprobante obtenido
data.put("CbteHasta", numeroDeFactura); // Número de comprobante obtenido
data.put("CbteFch", fechaActual); // Fecha del comprobante (yyyyMMdd)
data.put("ImpTotal", 121);  // Importe total del comprobante
data.put("ImpTotConc", 0);  // Importe neto no gravado
data.put("ImpNeto", 100);   // Importe neto gravado
data.put("ImpOpEx", 0);     // Importe exento de IVA
data.put("ImpIVA", 21);     // Importe total de IVA
data.put("ImpTrib", 0);     // Importe total de tributos
data.put("MonId", "PES");   // Tipo de moneda usada en el comprobante ('PES' para pesos argentinos)
data.put("MonCotiz", 1);    // Cotización de la moneda usada (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", 5); // Condición frente al IVA del receptor (ver tipos disponibles)

// (Opcional) Alícuotas asociadas al comprobante
List<Map<String, Object>> iva = new ArrayList<>();
Map<String, Object> alicuota = new LinkedHashMap<>();
alicuota.put("Id", 5);        // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
alicuota.put("BaseImp", 100); // Base imponible
alicuota.put("Importe", 21);  // Importe
iva.add(alicuota);
data.put("Iva", iva);

Map<String, Object> res = afip.electronicBilling().createVoucher(data);

Y por último mostramos el CAE y su vencimiento por pantalla.

System.out.println(res.get("CAE"));       // CAE asignado al comprobante
System.out.println(res.get("CAEFchVto")); // Fecha de vencimiento del CAE (yyyy-mm-dd)

Ejemplos de otros tipos de comprobantes

Problemas comunes

Si estas teniendo el error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar te recomiendo leer este artículo.

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar

Pasos para resolver este error

Si estas teniendo el error (10242) El campo Condicion IVA receptor es obligatorio. Consular metodo FEParamGetCondicionIvaReceptor te recomiendo leer este artículo.

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio

Pasos para resolver este error

Con la autorizacion creada ya podemos proceder a crear el PDF para presentarle a nuestro cliente. Podes usar como base esta factura o ticket de ejemplo.

Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/


Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la Comunidad Afip SDK. Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.

Conéctate a ARCA hoy mismo

Evitá la complejidad de ARCA. Con Afip SDK integrás tu sistema en minutos y te enfocás en hacer crecer tu negocio.