Certificación DGI
Esta guía cubre el proceso oficial de la DGI para habilitar la emisión de CFEs en producción.
Resumen del proceso
Section titled “Resumen del proceso”Inscripción → Certificado Digital → Solicitar CAE → Homologación → Producción1. Inscripción como emisor electrónico
Section titled “1. Inscripción como emisor electrónico”-
Ingresar a DGI en línea con usuario y contraseña del contribuyente.
-
Ir a Gestión CFE → Inscripción como Emisor Electrónico.
-
Completar los datos de la empresa y los tipos de CFE a emitir.
-
Esperar la aprobación de DGI (generalmente días hábiles).
2. Obtener certificado digital
Section titled “2. Obtener certificado digital”El certificado debe ser:
- Formato X.509 en archivo
.p12/.pfx - Emitido por una CA reconocida por AGESIC
- Vinculado al RUT del emisor
Proveedores habilitados
Section titled “Proveedores habilitados”| Proveedor | Contacto |
|---|---|
| ABITAB | abitab.com.uy |
| Correo Uruguayo | correo.com.uy |
| CertiSur | certisur.com |
Configurar en el SDK
Section titled “Configurar en el SDK”var config = new UruFacturaConfig{ RutaCertificado = "/ruta/certificado.p12", PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD")!, // ...};3. Solicitar el CAE
Section titled “3. Solicitar el CAE”-
Ingresar a DGI en línea → Gestión CFE → Solicitud de CAE.
-
Seleccionar el tipo de CFE (ej: e-Ticket 101).
-
Indicar la cantidad de comprobantes necesarios.
-
DGI devuelve el CAE con número de serie, rango y fecha de vencimiento.
-
Registrar en el SDK:
client.Cae.RegistrarCae(new Cae{NroSerie = "CAE2025001",TipoCfe = TipoCfe.ETicket,RangoDesde = 1,RangoHasta = 1000,FechaVencimiento = new DateOnly(2026, 12, 31),});
4. Homologación (ambiente de pruebas)
Section titled “4. Homologación (ambiente de pruebas)”La DGI exige un proceso de homologación antes de habilitar producción. El SDK usa el endpoint de homologación automáticamente con Ambiente.Homologacion.
var config = new UruFacturaConfig{ // ... Ambiente = Ambiente.Homologacion, // https://efacturahomologacion.dgi.gub.uy/...};Pasos de homologación
Section titled “Pasos de homologación”-
Emitir los CFE de prueba requeridos (tipos y cantidades según instructivo DGI):
var eticket = client.CrearETicket();eticket.Numero = 1;eticket.Detalle.Add(new LineaDetalle{NroLinea = 1,NombreItem = "Servicio de prueba",Cantidad = 1,PrecioUnitario = 100m,IndFactIva = TipoIva.Basico,});var respuesta = await client.EnviarCfeAsync(eticket);Console.WriteLine(respuesta.Exitoso ? "✅ Aceptado" : $"❌ {respuesta.Mensaje}"); -
Enviar el Reporte Diario de prueba:
var resultado = await client.EnviarReporteDiarioAsync(DateTime.Today,new[] { eticket }); -
Consultar el estado de cada CFE:
var estado = await client.ConsultarEstadoCfeAsync(eticket);Console.WriteLine($"Estado DGI: {estado.Mensaje}"); -
Notificar a DGI la finalización de las pruebas vía portal DGI en línea.
5. Habilitación en producción
Section titled “5. Habilitación en producción”Una vez aprobada la homologación por DGI:
var config = new UruFacturaConfig{ // ... Ambiente = Ambiente.Produccion, // https://efactura.dgi.gub.uy/...};Obligaciones operativas continuas
Section titled “Obligaciones operativas continuas”| Obligación | Periodicidad |
|---|---|
| Reporte Diario | Diario (obligatorio aunque sea 1 CFE) |
| Resguardo de XML | Conservar 5+ años |
| Renovar CAE | Antes del vencimiento o agotamiento |
| Renovar certificado | Cada 1-3 años (según proveedor) |
Endpoints DGI
Section titled “Endpoints DGI”| Ambiente | URL |
|---|---|
| Homologación | https://efacturahomologacion.dgi.gub.uy/ePresentacionSoap/service |
| Producción | https://efactura.dgi.gub.uy/ePresentacionSoap/service |
Flujo completo en producción
Section titled “Flujo completo en producción”Ejemplo end-to-end de un e-Ticket configurado, firmado, enviado y renderizado como PDF:
// 1. Configurarvar config = new UruFacturaConfig{ RutEmisor = "210000000012", RazonSocialEmisor = "Mi Empresa S.A.", DomicilioFiscal = "Av. 18 de Julio 1234", Ciudad = "Montevideo", Departamento = "Montevideo", Ambiente = Ambiente.Produccion, RutaCertificado = "/ruta/certificado.p12", PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD")!,};
using var client = new UruFacturaClient(config);
// 2. Registrar CAEclient.Cae.RegistrarCae(new Cae{ NroSerie = "CAE2025001", TipoCfe = TipoCfe.ETicket, RangoDesde = 1, RangoHasta = 1000, FechaVencimiento = new DateOnly(2026, 12, 31),});
// 3. Crear comprobantevar eticket = client.CrearETicket();eticket.Numero = 1;eticket.Detalle.Add(new LineaDetalle{ NroLinea = 1, NombreItem = "Servicio de consultoría", Cantidad = 1, PrecioUnitario = 5000m, IndFactIva = TipoIva.Basico,});
// 4. Calcular, firmar y enviareticket.CalcularTotales();var respuesta = await client.EnviarCfeAsync(eticket);
if (!respuesta.Exitoso) throw new Exception($"DGI rechazó el CFE: {respuesta.Mensaje}");
// 5. Generar representación impresabyte[] pdf = client.GenerarPdfA4(eticket);await File.WriteAllBytesAsync("eticket_001.pdf", pdf);Recursos oficiales DGI
Section titled “Recursos oficiales DGI”| Recurso | Enlace |
|---|---|
| Portal DGI en línea | dgi.gub.uy |
| Esquemas XML CFE | Factura Electrónica — DGI |
| Instructivo técnico | Portal DGI → Gestión CFE |
| AGESIC (CAs habilitadas) | agesic.gub.uy |
| Soporte DGI | Contacto |
Códigos de respuesta DGI
Section titled “Códigos de respuesta DGI”| Código | Significado |
|---|---|
00 | ✅ Aceptado |
01 | ⚠️ Aceptado con observaciones |
05 | ❌ Rechazado |
06 | ❌ RUT emisor no habilitado |
09 | ❌ Número de CAE inválido o vencido |
11 | ❌ Error en la firma digital |
99 | ❌ Error interno del servidor DGI |
Ver Códigos DGI completos para más detalles.