DGII y e-CF
Emitir un e-CF

Emitir un e-CF

Una vez tu empresa está certificada y en producción, emitir un e-CF se reduce a tres acciones de tu lado:

  1. Crear la factura (líneas, cliente, totales).
  2. Confirmar el tipo (31, 32, 33, 34).
  3. Pulsar Emitir.

El resto lo hace FinMova en segundos. Esta página explica el ciclo completo para que sepas qué está pasando — y cómo leer el resultado.

El botón "Emitir" en detalle

Cuando pulsas Emitir en una factura en borrador, FinMova ejecuta en su servidor (en Edge Functions, no en tu navegador) la siguiente secuencia:

1 · Asignar el NCF/e-CF

FinMova toma el siguiente número disponible de tu secuencia NCF para el tipo (31, 32, 33, 34) y lo asigna a esta factura.

Importante. Las secuencias son por tenant y por tipo. Configurarlas se hace en Secuencias NCF.

2 · Generar el XML del e-CF

Construye el XML de acuerdo al esquema oficial DGII para el tipo correspondiente: emisor, comprador, líneas, ITBIS, retenciones, totales, referencias (si aplica).

3 · Validar el XML contra el XSD oficial

Ejecuta una validación de tres capas:

  • Sintaxis XSD oficial de DGII.
  • Reglas de negocio (totales coherentes, ITBIS calculado correcto).
  • Reglas específicas del tipo (NC/ND debe tener referencia, etc.).

Si alguna validación falla, FinMova no envía y te muestra el error con la línea problemática.

4 · Autenticarse ante DGII (semilla → firma → token)

  • Pide una semilla al endpoint GET {host}/fe/autenticacion/api/semilla.
  • Firma esa semilla con tu .p12 usando XMLDSig.
  • Envía la firma a POST {host}/fe/autenticacion/api/validacioncertificado.
  • DGII devuelve un token Bearer con ~1 hora de vigencia. FinMova lo cachea y lo renueva solo cuando vence.

5 · Firmar el e-CF

Firma el XML del comprobante con XMLDSig usando tu .p12.

6 · Enviar a DGII

POST al endpoint de recepción con Authorization: Bearer {token}. DGII responde con un trackId — el identificador único de esta emisión.

FinMova guarda:

  • invoices.dgii_track_id
  • invoices.dgii_status (inicialmente "en cola")
  • invoices.ncf (asignado en el paso 1)

7 · Polling de estado

Inmediatamente después, FinMova comienza a consultar el estado en consultaresultado/estado con el trackId. El polling dura hasta 55 segundos o hasta que llegue un veredicto terminal (Aceptado / Rechazado / Aceptado Condicional).

8 · Resultado

FinMova actualiza invoices.dgii_status y invoices.dgii_response.

ResultadoQué significa
AceptadoDGII reconoce el e-CF; la representación impresa pierde la marca de agua "sin validez fiscal".
Aceptado CondicionalDGII acepta con observaciones; revisa el detalle. Válido fiscalmente.
RechazadoEl e-CF no fue aceptado. Lee el motivo, corrige y reemite. La numeración asignada no se reutiliza (ver Estados y rechazos).

9 · Representación impresa con QR

FinMova arma el PDF con:

  • Datos del emisor y del comprador.
  • Detalle de líneas, ITBIS y totales.
  • Código QR que enlaza al validador público de DGII para que cualquiera (incluido tu cliente) verifique la autenticidad.
  • Marca de agua "SIN VALIDEZ FISCAL" mientras dgii_status no sea Aceptado.

10 · Envío opcional al cliente

Si la factura tiene email del cliente y eliges "enviar", la Edge Function de email envía el PDF + cuerpo del mensaje con tus colores y logo.

Detalle: Envío por email.

Lo que ves tú en la pantalla

Cuando pulsas Emitir:

  1. La factura cambia a estado "Enviando a DGII…" con un spinner.
  2. Pocos segundos después: "Aceptado" (verde) o "Rechazado" (rojo) con el motivo.
  3. El botón "Descargar PDF" queda activo.
  4. Si configuraste envío automático, el botón "Reenviar al cliente" también queda activo.

Buena práctica. No salgas de la pantalla durante el polling. Si pierdes conexión, FinMova sigue procesando del lado del servidor y al recargar verás el estado final.

Tiempos reales

OperaciónTiempo típico
Generar y validar XML< 1 s
Autenticarse (primera del día)1 – 3 s
Autenticarse (token cacheado)< 100 ms
Firmar XML< 1 s
Enviar y recibir trackId1 – 2 s
Polling hasta veredicto2 – 30 s
Total visible al usuario5 – 40 s

Volumen y concurrencia

FinMova procesa cada emisión en su propia Edge Function; emisiones simultáneas no se bloquean entre sí. Si tu negocio emite muchas facturas por minuto (por ejemplo, supermercado), no hay límite artificial en FinMova; el límite real es el throughput de DGII.

¿Y si DGII está caído?

Pasa raramente, pero pasa. Si DGII no responde:

  • FinMova reintenta automáticamente con backoff.
  • Si tras 55 segundos no hay veredicto, la factura queda en estado "En cola" con su trackId guardado.
  • Una tarea en segundo plano (Edge Function dgii-check-status) retoma el polling cada cierto tiempo hasta obtener veredicto.
  • Tu factura no se pierde; el trackId la mantiene rastreable.

Siguientes pasos

Manifiesto de capturas

  • assets/dgii/17-boton-emitir.png — factura en borrador con el botón "Emitir" resaltado.
  • assets/dgii/18-spinner-enviando.png — estado "Enviando a DGII…".
  • assets/dgii/19-aceptado-verde.png — factura aceptada (badge verde) con QR.
  • assets/dgii/20-pdf-con-qr.png — preview del PDF con QR de verificación.
¿Te resultó útil este artículo?

Última actualización: