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 su número de autorización, serie, rango y fecha de vencimiento.
-
Registrar en el SDK:
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),});
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. UruFactura usa el endpoint de homologación automáticamente con Ambiente.Homologacion.
var config = new UruFacturaConfig{ // ... Ambiente = Ambiente.Homologacion, // servicios de prueba de la DGI (puertos 6443 / 6460)};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 = await client.EmitirAsync(new Cfe(TipoCfe.ETicket){Detalle = [new LineaDetalle { NombreItem = "Servicio de prueba", Cantidad = 1, PrecioUnitario = 100m }],});var acuse = await client.EnviarAsync(eticket);Console.WriteLine(acuse.Recibido ? "✅ Sobre recibido (consultar el estado del CFE)" : $"❌ {acuse.Mensaje}"); -
Enviar el Reporte Diario de prueba:
// Resume los CFE emitidos en la fecha (de Uruguay, no la del servidor)var reporte = await client.EnviarReporteDiarioAsync(HoraUruguay.Hoy()); -
Consultar el estado de cada CFE:
await client.ConsultarEnvioAsync(acuse); // o client.ConsultarCfeAsync(eticket)Console.WriteLine($"Estado DGI: {eticket.EstadoDgi} {eticket.MensajeDgi}"); -
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, // En Producción no hay URL por defecto: usá las que entrega la DGI al habilitar el ambiente UrlEnvio = "https://…/ws_efactura", UrlConsultas = "https://…/ws_consultas",};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 | Servicio | URL |
|---|---|---|
| Homologación | Envío (ws_efactura) |
https://efactura.dgi.gub.uy:6443/ePrueba/ws_eprueba |
| Homologación | Consultas (ws_consultas) |
https://efactura.dgi.gub.uy:6460/ePrueba/ws_consultasPrueba |
| Producción | ambos | Configurar UrlEnvio y UrlConsultas con las URL que entrega la DGI al habilitar el ambiente |
Flujo completo en producción
Section titled “Flujo completo en producción”// 1. Configurar (en producción, con un almacenamiento durable: ver Gestión de CAE)var config = new UruFacturaConfig{ Emisor = new Emisor { Rut = "219999820013", RazonSocial = "Mi Empresa S.A.", DomicilioFiscal = "Av. 18 de Julio 1234", Ciudad = "Montevideo", Departamento = "Montevideo", }, Ambiente = Ambiente.Produccion, UrlEnvio = "https://…/ws_efactura", // obligatorias en Producción: UrlConsultas = "https://…/ws_consultas", // las entrega la DGI RutaCertificado = "/ruta/certificado.p12", PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD"),};
using var client = new UruFacturaClient(config, store: miStoreDurable);
// 2. Emitir: valida, numera, firma y registravar eticket = await client.EmitirAsync(new Cfe(TipoCfe.ETicket){ Detalle = [new LineaDetalle { NombreItem = "Servicio de consultoría", Cantidad = 1, PrecioUnitario = 5000m }],});
// 3. Enviar: acuse del sobre (AS / BS)var acuse = await client.EnviarAsync(eticket);if (!acuse.Recibido) throw new Exception($"DGI rechazó el sobre: {acuse.Mensaje}");
// 4. Resultado del comprobanteawait client.ConsultarEnvioAsync(acuse);if (!eticket.AceptadoPorDgi) throw new Exception($"DGI no aceptó el CFE ({eticket.EstadoDgi}): {eticket.MensajeDgi}");
// 5. Representación impresa (paquete UruFactura.Pdf)await File.WriteAllBytesAsync("eticket.pdf", CfePdf.GenerarA4(eticket));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”| Estado | Mensaje | Significado |
|---|---|---|
AS |
ACKSobre |
Sobre recibido (no implica que los CFE hayan sido aceptados) |
BS |
ACKSobre |
Sobre rechazado: ver los motivos (S01…S20) en acuse.Motivos |
BA |
ACKSobre / ACKRepDiario |
Archivo rechazado |
AR |
ACKRepDiario |
Reporte diario recibido |
BR |
ACKRepDiario |
Reporte diario rechazado |
AE |
ACKCFE |
Comprobante aceptado |
BE |
ACKCFE |
Comprobante rechazado (CFE): motivos en cfe.MensajeDgi y EstadoEnvio.Comprobantes[i].Motivos |
CE |
ACKCFE |
Comprobante observado (CFC) |
FE |
ACKCFE |
Comprobante reliquidado |
Ver Códigos DGI completos para más detalles.