Solución a problemas con la nueva Resolución General ARCA N° 5.616/2024:

Crear factura electrónica de ARCA en C#

Con pocas líneas de código

Ivan Muñoz oct 15, 2024 - Ultima edicion feb 22, 2025
.NET

Crear factura electrónica de ARCA en C#

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 C# 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.

Vamos a usar Newtonsoft.Json para trabajar con JSON.

dotnet add package Newtonsoft.Json

Obtener la autorización

Lo primero que tenemos hacer es obtener el “Token authorization”, que seria la autorización en ARCA.

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.

Debemos ejecutar una solicitud POST al endpoint

https://app.afipsdk.com/api/v1/afip/auth
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Newtonsoft.Json;


var client = new HttpClient();

// Paso 1: Obtener el Token y Sign
var authUrl = "https://app.afipsdk.com/api/v1/afip/auth";
var authData = new
{
    environment = "dev",
    tax_id = "20409378472", // CUIT a utilizar
    wsid = "wsfe"
};

var authJsonContent = JsonConvert.SerializeObject(authData);
var authContent = new StringContent(authJsonContent, Encoding.UTF8, "application/json");

var authResponse = await client.PostAsync(authUrl, authContent);

if (!authResponse.IsSuccessStatusCode)
{
    Console.WriteLine($"Error en la autorización: {authResponse.StatusCode}");
    return;
}

var authResponseBody = await authResponse.Content.ReadAsStringAsync();
dynamic auth = JsonConvert.DeserializeObject(authResponseBody);

string token = auth.token;
string sign = auth.sign;

Console.WriteLine($"Token: {token}");
Console.WriteLine($"Sign: {sign}");

Ahora tenemos token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.

Crear la factura

Vamos a crear una Factura B por un importe de $121. En el main de nuestra clase añadimos el siguiente codigo:

Debemos ejecutar una solicitud POST al endpoint

https://app.afipsdk.com/api/v1/afip/requests
// Paso 2: Crear la factura con el Token y Sign obtenidos
var invoiceUrl = "https://app.afipsdk.com/api/v1/afip/requests";
var invoiceData = new
{
    environment = "dev",
    method = "FECAESolicitar",
    wsid = "wsfe",
    @params = new
    {
        Auth = new
        {
            Token = token, // Token obtenido previamente
            Sign = sign,   // Sign obtenido previamente
            Cuit = "20409378472" // CUIT que estamos utilizando
        },
        FeCAEReq = new
        {
            FeCabReq = new
            {
                CantReg = 1,    // Cantidad de comprobantes a registrar
                PtoVta = 1,     // Punto de venta
                CbteTipo = 6    // Tipo de comprobante
            },
            FeDetReq = new
            {
                FECAEDetRequest = new
                {
                    Concepto = 1,     // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
                    DocTipo = 99,     // Tipo de documento del comprador (99 consumidor final)
                    DocNro = 0,       // Número de documento del comprador (0 consumidor final)
                    CbteDesde = 1,    // Número de comprobante
                    CbteHasta = 1,    // Número de comprobante
                    CbteFch = DateTime.Now.ToString("yyyyMMdd"), // Fecha del comprobante (yyyyMMdd)
                    ImpTotal = 121,   // Importe total del comprobante
                    ImpTotConc = 0,   // Importe neto no gravado
                    ImpNeto = 100,    // Importe neto gravado
                    ImpOpEx = 0,      // Importe exento de IVA
                    ImpIVA = 21,      // Importe total de IVA
                    ImpTrib = 0,      // Importe total de tributos
                    MonId = "PES",    // Tipo de moneda usada en el comprobante
                    MonCotiz = 1,     // Cotización de la moneda usada
                    Iva = new[]
                    {
                        new { Id = 5, BaseImp = 100, Importe = 21 } // Alícuota de IVA (5 para 21%)
                    }
                }
            }
        }
    }
};

var invoiceJsonContent = JsonConvert.SerializeObject(invoiceData);
var invoiceContent = new StringContent(invoiceJsonContent, Encoding.UTF8, "application/json");

var invoiceResponse = await client.PostAsync(invoiceUrl, invoiceContent);

if (!invoiceResponse.IsSuccessStatusCode)
{
    Console.WriteLine($"Error al crear la factura: {invoiceResponse.StatusCode}");
    return;
}

var invoiceResponseBody = await invoiceResponse.Content.ReadAsStringAsync();
dynamic invoice = JsonConvert.DeserializeObject(invoiceResponseBody);

Console.WriteLine($"Invoice: {invoice}");

En invoice tenemos el CAE y vencimiento correspondientes a la factura que acabamos de crear.

{
...
  "CAE": "12345678987654",
  "CAEFchVto": "20240327"
...
}

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

Certificados, código, tutoriales, soporte... todo lo que necesitas para usar los web services de ARCA en un solo lugar.