Instalación
Requisitos previos
Section titled “Requisitos previos”- .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
Paquetes
Section titled “Paquetes”| 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, …).
dotnet add package UruFacturadotnet add package UruFactura.Pdfdotnet add package UruFactura.EntityFrameworkCore<PackageReference Include="UruFactura" Version="2.0.0" /><PackageReference Include="UruFactura.Pdf" Version="2.0.0" /><PackageReference Include="UruFactura.EntityFrameworkCore" Version="2.0.0" />Configuración básica
Section titled “Configuración básica”-
Importar el namespace — todo lo público está en uno solo:
using UruFactura; -
Crear la configuración
var config = new UruFacturaConfig{Emisor = new Emisor{Rut = "219999820013", // 12 dígitos, sin puntos ni guiónRazonSocial = "Mi Empresa S.A.",DomicilioFiscal = "Av. 18 de Julio 1234",Ciudad = "Montevideo",Departamento = "Montevideo",},Ambiente = Ambiente.Homologacion, // ← Homologación para pruebasRutaCertificado = "/ruta/al/certificado.p12",PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD"),}; -
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); -
Registrar los CAE
await client.RegistrarCaeAsync(new Cae{NumeroAutorizacion = "90110001945", // CAE_ID entregado por la DGITipoCfe = TipoCfe.ETicket,Serie = "A",RangoDesde = 1,RangoHasta = 1000,FechaVencimiento = new DateOnly(2027, 12, 31),});
ASP.NET Core
Section titled “ASP.NET Core”El cliente es thread-safe: registralo como singleton. En producción, con el almacenamiento de EF Core:
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" }}Próximos pasos
Section titled “Próximos pasos”- Uso Rápido → — Emitir tu primer CFE
- Configuración → — Todas las opciones