IUruFacturaStore? store =null, // obligatorio en Producción; en Homologación, por defecto InMemoryStore
HttpClient? httpClient =null, // p. ej. de IHttpClientFactory
IDgiClient? dgiClient =null, // transporte propio (tests, proxy)
TimeProvider? reloj =null) // reloj de las fechas fiscales
Valida la configuración (UruFacturaException, también si falta el almacenamiento en Producción) y carga el certificado (FirmaDigitalException). Con un httpClient propio, su handler debe tener el certificado de cliente TLS y la validación del servidor configurados; no se combina con dgiClient.
Registra un CAE (o actualiza uno existente: mismo tipo, serie y comienzo de rango). CaeException si los datos no son correctos o el rango se superpone con otro CAE del mismo tipo y serie
Valida (CfeValidationException), toma el próximo número del CAE vigente (CaeException si no hay), genera el XML, lo firma y lo registra junto con el número en una operación atómica: si algo falla, no se consume ningún número. CfeDuplicadoException si ya se emitió uno del mismo tipo con el mismo NroInterno. No envía
Envía el CFE en un sobre EnvioCFE. El acuse indica si la DGI recibió el sobre. InvalidOperationException si el CFE ya fue recibido o tiene resultado (no se reenvía)
Resultado de cada comprobante del sobre (por tipo, serie y número o, si la DGI no los informa, por Nro_ordinal); actualiza su EstadoDgi y lo guarda. InvalidOperationException si el sobre no fue recibido
Reporte diario firmado con los CFE emitidos en la fecha, tomados del almacenamiento. secEnvio 1 el primero; para corregir uno ya recibido, la secuencia anterior + 1
Records inmutables: se arman con inicializadores y se modifican con with. Las colecciones son IReadOnlyList<T> y se asignan con [ … ]; EmitirAsync las copia, así que cambiar después una lista propia no altera lo emitido.
Campo es la ruta de la propiedad dentro del Cfe (Detalle[0].PrecioUnitario, Receptor.Documento, Referencias[1].Serie, …), para mostrar el error junto al dato. Todo CFE sin errores produce un XML válido contra los XSD de la DGI.
TipoCfe, Serie, NroCfe (1-9999999), FechaCfe (DateOnly, no posterior a la emisión), MontoCfeRef y MonedaCfeRef (obligatorios en notas), TipoCambioCfeRef, Razon (hasta 90)
Mandante
TipoDocumento, CodigoPais (default UY), Documento, Nombre
DescuentoRecargoGlobal
Tipo (Descuento/Recargo), Glosa, Monto (sin IVA), IndFact (base de IVA), Codigo
El resultado de EmitirAsync. Los datos fiscales son inmutables; el estado ante la DGI lo actualiza el cliente al enviar y consultar (desde afuera solo se fija al construirlo, por ejemplo en un almacenamiento propio).
Propiedad
Tipo
Descripción
Documento
Cfe
Contenido emitido, con FechaEmision y Emisor resueltos
Tipo, Serie, Numero, FechaEmision, Emisor
Identificación
Cae
Cae
CAE con el que se numeró
Totales
Totales
Totales informados
Xml
string
XML firmado (conservarlo durante el plazo legal)
FechaFirma
DateTimeOffset
TmstFirma
CodigoSeguridad
string
DigestValue de la firma; los primeros 6 caracteres se imprimen
UrlQr
string
Contenido del código QR
IdReceptorDgi, TokenDgi
string?
Sobre en que se envió
EstadoDgi
EstadoCfe?
Aceptado (AE), Rechazado (BE), Observado (CE) o Reliquidado (FE); null sin resultado
MensajeDgi
string?
Motivos del estado, o el mensaje del rechazo del sobre
AceptadoPorDgi, Enviado
bool
EstadoDgi == EstadoCfe.Aceptado / se envió en un sobre recibido
IAsyncEnumerable<CfeEmitido> ListarCfesAsync(DateOnly fechaEmision, CancellationToken ct =default); // de a uno
RegistrarEmisionAsync es la numeración: avanza el CAE del CFE a su número y guarda el CFE en una sola operación atómica, siempre que el CAE siga con el UltimoNroUsado leído; si otra emisión lo usó antes, devuelve false sin guardar nada y el cliente vuelve a numerar. ListarCfesAsync lanza UruFacturaException si el almacenamiento no tiene completos los CFE de la fecha (para no enviar un reporte diario incompleto).
InMemoryStore(TimeProvider? reloj = null) conserva los CFE de los últimos DiasRetencionCfe días (default 7, contando desde hoy) y no tiene los anteriores a su creación. EfUruFacturaStore hace el UPDATE condicional (token de concurrencia) y el INSERT en la misma transacción; MaxIntentos (default 100) acota la reserva del número de envío. Sus entidades (CaeEntity, CfeEntity con ToCfeEmitido()) son públicas para consultas propias.
Verifica la firma de un CFE (por ejemplo, de un proveedor) y devuelve el certificado firmante, o null si no es válida. Comprobá que el certificado sea del emisor: la firma sola no lo prueba
moneda.CodigoIso()
Código ISO 4217 de la moneda (UYU, USD, EUR)
Rut.EsValido(string? rut)
12 dígitos y dígito verificador (módulo 11) correcto
HoraUruguay.Hoy() / Ahora()
Fecha y hora de Uruguay (UTC−03:00): usalas en lugar de DateTime.Today / Now