Skip to content

Instalación

  • .NET 10 SDK o superior (descargar)
  • Un certificado digital (.p12 / .pfx) emitido por una CA reconocida por AGESIC y vinculado al RUT del emisor
  • Un CAE vigente otorgado por la DGI para cada tipo de CFE que vayas a emitir

Paquete Contenido Cuándo
UruFactura Emisión, firma, numeración con CAE, comunicación con la DGI y reporte diario. Sin dependencias de terceros Siempre
UruFactura.Pdf PDF A4, térmico (80 mm) y QR (FluentReport + SkiaSharp + ZXing) Si imprimís o enviás el PDF
UruFactura.EntityFrameworkCore Almacenamiento en base de datos: numeración durable y segura entre instancias, CFE emitidos para el reporte diario En producción

Los paquetes de EF Core no traen proveedor: agregá el de tu base (Npgsql.EntityFrameworkCore.PostgreSQL, Microsoft.EntityFrameworkCore.SqlServer, …).

Terminal window
dotnet add package UruFactura
dotnet add package UruFactura.Pdf
dotnet add package UruFactura.EntityFrameworkCore

  1. Importar el namespace — todo lo público está en uno solo:

    using UruFactura;
  2. Crear la configuración

    var config = new UruFacturaConfig
    {
    Emisor = new Emisor
    {
    Rut = "219999820013", // 12 dígitos, sin puntos ni guión
    RazonSocial = "Mi Empresa S.A.",
    DomicilioFiscal = "Av. 18 de Julio 1234",
    Ciudad = "Montevideo",
    Departamento = "Montevideo",
    },
    Ambiente = Ambiente.Homologacion, // ← Homologación para pruebas
    RutaCertificado = "/ruta/al/certificado.p12",
    PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD"),
    };
  3. Crear el cliente — valida la configuración y carga el certificado (si algo está mal, falla acá y no al emitir):

    using var client = new UruFacturaClient(config);
  4. Registrar los CAE

    await client.RegistrarCaeAsync(new Cae
    {
    NumeroAutorizacion = "90110001945", // CAE_ID entregado por la DGI
    TipoCfe = TipoCfe.ETicket,
    Serie = "A",
    RangoDesde = 1,
    RangoHasta = 1000,
    FechaVencimiento = new DateOnly(2027, 12, 31),
    });

El cliente es thread-safe: registralo como singleton. En producción, con el almacenamiento de EF Core:

Program.cs
var config = builder.Configuration.GetSection("UruFactura").Get<UruFacturaConfig>()!;
builder.Services.AddDbContextFactory<UruFacturaDbContext>(o => o.UseNpgsql(connectionString));
builder.Services.AddSingleton<IUruFacturaClient>(sp => new UruFacturaClient(
config,
store: new EfUruFacturaStore<UruFacturaDbContext>(sp.GetRequiredService<IDbContextFactory<UruFacturaDbContext>>())));
// appsettings.json (la contraseña, por User Secrets o la variable UruFactura__PasswordCertificado)
{
"UruFactura": {
"Emisor": {
"Rut": "219999820013",
"RazonSocial": "Mi Empresa S.A.",
"DomicilioFiscal": "Av. 18 de Julio 1234",
"Ciudad": "Montevideo",
"Departamento": "Montevideo"
},
"Ambiente": "Homologacion",
"RutaCertificado": "/ruta/al/certificado.p12"
}
}