Configuración
UruFacturaConfig es un record inmutable que se pasa al construir el cliente. El constructor la valida (lanza UruFacturaException con todos los errores) y carga el certificado, así que una configuración incorrecta falla al iniciar la aplicación y no al emitir.
using var client = new UruFacturaClient(config);Emisor (config.Emisor)
Section titled “Emisor (config.Emisor)”| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
Rut |
string |
✅ | RUT del emisor: 12 dígitos con dígito verificador válido (ej: "219999820013") |
RazonSocial |
string |
✅ | Razón social (hasta 150 caracteres) |
DomicilioFiscal |
string |
✅ | Domicilio fiscal (hasta 70) |
Ciudad / Departamento |
string |
✅ | Hasta 30 caracteres cada uno |
NombreComercial |
string? |
— | Nombre de fantasía (hasta 30) |
Giro |
string? |
— | Actividad económica (hasta 100) |
CodigoSucursal |
int |
— | CdgDGISucur asignado por la DGI (1-9999, default 1) |
Sucursal |
string? |
— | Nombre de la sucursal (EmiSucursal, hasta 20) |
Telefonos |
IReadOnlyList<string> |
— | Hasta 2, de hasta 20 caracteres |
Correo / InfoAdicional |
string? |
— | Correo (hasta 80) e información adicional (hasta 150) |
FechaIncorporacion |
string? |
— | Leyenda “Fecha emisor” del pie impreso (fecha o Res. N/año) |
UrlVerificacion |
string? |
— | Sitio de verificación impreso en los e-Tickets (por defecto el de la DGI) |
Un Cfe puede usar otro emisor (por ejemplo, otra sucursal) con Emisor = config.Emisor with { CodigoSucursal = 3 }; el RUT tiene que ser el mismo.
Certificado
Section titled “Certificado”| Propiedad | Tipo | Descripción |
|---|---|---|
RutaCertificado |
string? |
Ruta del .p12 / .pfx |
PasswordCertificado |
string? |
Su contraseña |
Certificado |
X509Certificate2? |
Certificado ya cargado, con clave privada (Azure Key Vault, HSM, …). Tiene prioridad sobre la ruta; el cliente no lo libera |
Se requiere uno de los dos. Un archivo inexistente, una contraseña incorrecta o un certificado sin clave privada lanzan FirmaDigitalException al construir el cliente.
| Propiedad | Tipo | Default | Descripción |
|---|---|---|---|
Ambiente |
Ambiente |
Homologacion |
Ambiente de la DGI |
UrlEnvio |
string? |
servicio de prueba | URL de ws_efactura (sobres, reporte diario, estado del envío). Obligatoria en Producción |
UrlConsultas |
string? |
servicio de prueba | URL de ws_consultas (estado de un CFE). Obligatoria en Producción |
AlgoritmoFirma |
AlgoritmoFirma |
Sha256 |
Firma del CFE y de WS-Security (Sha1 si la DGI rechaza SHA-256) |
Timeout |
TimeSpan |
30 s | Timeout de las llamadas a la DGI |
OmitirValidacionSsl |
bool |
false |
Deshabilita la validación TLS del servidor. Solo en Homologación con una CA no reconocida: en Producción la configuración no es válida |
ValorUnidadIndexada |
decimal? |
— | Si se informa, los e-Tickets con neto mayor a 5.000 UI deben identificar al receptor |
| Ambiente | Servicios |
|---|---|
Ambiente.Homologacion |
Envío: https://efactura.dgi.gub.uy:6443/ePrueba/ws_eprueba · Consultas: https://efactura.dgi.gub.uy:6460/ePrueba/ws_consultasPrueba |
Ambiente.Produccion |
Configurar UrlEnvio y UrlConsultas con las URL que entrega la DGI al habilitar el ambiente |
Ejemplo completo
Section titled “Ejemplo completo”var produccion = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production";
var config = new UruFacturaConfig{ Emisor = new Emisor { Rut = "219999820013", RazonSocial = "Mi Empresa S.A.", DomicilioFiscal = "Av. 18 de Julio 1234, Apto. 201", Ciudad = "Montevideo", Departamento = "Montevideo", Telefonos = ["29001234"], },
RutaCertificado = Environment.GetEnvironmentVariable("CERT_PATH"), PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD"),
Ambiente = produccion ? Ambiente.Produccion : Ambiente.Homologacion, // Obligatorias en Producción; en Homologación, si quedan vacías, se usan los servicios de prueba. UrlEnvio = Environment.GetEnvironmentVariable("DGI_URL_ENVIO"), UrlConsultas = Environment.GetEnvironmentVariable("DGI_URL_CONSULTAS"),};Desde appsettings.json
Section titled “Desde appsettings.json”La configuración se puede leer con el binder de .NET (las propiedades init se completan igual):
{ "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", "Timeout": "00:00:45" }}// Program.cs — la contraseña llega por User Secrets o por la variable de entorno// UruFactura__PasswordCertificado, que el binder lee igual que el appsettings.var config = builder.Configuration.GetSection("UruFactura").Get<UruFacturaConfig>()!;
builder.Services.AddSingleton<IUruFacturaClient>(_ => new UruFacturaClient(config));