Representación Impresa (RI) del e-CF¶
Implementación de la RI conforme a la norma DGII. Fuente normativa: Informe Técnico e-CF v1.0
§18 (páginas impresas 31–37) y la columna de impresión del Formato Comprobante Fiscal
Electrónico (e-CF) V1.0 (N = no obligatoria, I = obligatoria, P = en palabras).
Modelos ilustrativos: resources/dgii/pdf/informe-descripcion-tecnica/Representación Impresa (Modelos ilustrativos).pdf.
Dónde vive qué¶
| Pieza | Ubicación |
|---|---|
| Resolución de datos + URL del timbre | app/Ecf/UtilPdfClient.php (endpoint-rd) |
| Job que la genera tras aceptación | app/Jobs/GenerateEcfPdf.php |
| Maquetación (mPdf) | apps/util.pdf → app/Services/RdEcfPdfService.php |
| Plantillas | apps/util.pdf → resources/views/rd/ecf.blade.php + rd/partials/{encabezado,timbre,estilos}.blade.php |
| Tests | tests/Feature/RiPayloadTest.php, GenerateEcfPdfTest |
División de responsabilidades: endpoint-rd resuelve TODO el contenido (catálogos en palabras, municipio/provincia, fecha de vencimiento, ITBIS por línea, agregados de ISC/CDT/propina, columnas aplicables, URL del timbre); util.pdf sólo maqueta. Así la app de PDF no necesita conocer la DGII.
Estructura implementada (§18.2)¶
- Encabezado A (superior derecha): tipo de e-CF en palabras,
e-NCF,Fecha Vencimiento,NCF Modificado+ descripción del código de modificación en palabras. - Encabezado B (superior izquierda): nombre comercial, razón social, sucursal, RNC, dirección,
municipio y provincia (en palabras, derivados de
companies.province_municipality_codecontra el catálogoprovinces_municipalities),Fecha Emisión. - Encabezado C (inferior izquierda):
Razón Social Cliente,RNC Cliente(oIdentificador Extranjero). Se omite cuando el payload no trae comprador (facturas de consumo). - Detalle: columnas en el orden normativo, sólo las aplicables:
Cantidad,Descripción(con la letraEa la izquierda si el ítem es exento),Unidad de Medida(en palabras),Grados Alcohol en %,PVP,Precio,ISC Específico,ISC Ad-Valorem,ITBIS,Descuento,Recargo,Valor. - Totales:
Subtotal Gravado,Subtotal Exento,Total ISC,Total ITBIS,CDT,Propina legal,Total(+ descuentos/recargos globales y otra moneda). - Timbre (§18.2.3): QR de 24×24 mm (mínimo normativo 22), 3 mm de quiet zone, a 24 mm
del borde izquierdo y 21,4 mm del inferior (mínimo 20). Debajo:
Código de SeguridadyFecha Firma. El encabezado y el timbre se repiten en cada página.
Reglas condicionales¶
- Fecha Vencimiento: se imprime en todos los tipos excepto 32 y 34 (nota al pie 43).
- Timbre del RFCE: se decide por la vía de transmisión persistida (
documents.reception_service), no por el tipo/monto. Si el e-CF se transmitió porrecepcion_rfce, el timbre usaconsultatimbrefcen el hostfccon solo 4 parámetros (rncemisor,encf,montototal,codigoseguridad); en cualquier otro caso usaconsultatimbrecon 7. (Razón: un e-CF 32 transmitido como documento completo apuntaría a un servicio FC que nunca lo recibió.) Hoy el envío RFCE no está implementado, así que todos los documentos llevan el timbre general. - Impuestos adicionales: el importe de cada fila es
isc_especifico + isc_advalorem + otros(fórmula del campo 104 del Formato). Se totalizan por separado:001→Propina legal,002→CDT,006+→Total ISC, y003/004/005→Otros Impuestos Adicionales. - Escapado del timbre: reservados en porcentaje (
S/DQdu→S%2FDQdu), pero la hora defechafirmaconserva los:y el espacio va como%20, igual que el ejemplo normativo. - ITBIS por línea: el XML del e-CF no lo transporta por línea, así que se deriva del
indicador de facturación (1→18 %, 2→16 %, 3→0 %; 0 y 4 sin ITBIS) sobre la base
Monto Ítem + ISC de la línea: - el Monto Ítem va tal cual porque por el campo 39 del Formato
(
Precio × Cantidad − Descuento + Recargo) ya trae aplicados el descuento y el recargo; - el ISC se suma antes de aplicar la tasa, como exige el campo 101 (sólo los códigos 006-039).
Sin ISC coincide exactamente con los montos de los modelos ilustrativos de la DGII.
- Paginación (nota al pie 56): con más de una página, todas llevan Subtotal Gravado/Exento/ITBIS/
Impuesto Adicional Página y Monto Total Página, excepto la última, que lleva los totales del
e-CF completo. Página No. X de N en el pie. El corte se decide en el servicio
(ITEMS_POR_PAGINA_DEFAULT) para poder calcular los subtotales por página.
Coherencia XML ↔ RI ↔ QR (importante)¶
FechaEmision y FechaHoraFirma se persisten antes de construir el XML
(SubmitEcfToDgii fija issued_at/signed_at, y el XmlBuilder los lee de ahí). Antes el XML usaba
now() en cada construcción, de modo que el fechafirma del QR no habría coincidido con el valor
firmado y el timbre no habría validado en la DGII.
Decisiones ante contradicciones de la norma¶
| Tema | Documentos en conflicto | Decisión |
|---|---|---|
Unidad de Medida |
§18.2.2 y col. P exigen palabras; los modelos imprimen la abreviatura (CAJ, PZA) |
Se imprime en palabras (texto normativo explícito; los modelos son "exclusivos para fines ilustrativos") |
| Etiqueta del NCF modificado | La norma dice "e-NCF Modificado"; los modelos imprimen NCF Modificado: |
Se usa NCF Modificado: (lo que se ve impreso, y el documento modificado puede ser no electrónico) |
Fecha Vencimiento en Nota de Débito (33) |
El Formato la marca obligatoria; el modelo 1.5 no la muestra | Se imprime (se sigue el Formato) |
| Versión 8 del QR | La norma pide versión 8 (49×49); su propia URL de ejemplo excede esa capacidad | Se usa corrección L para minimizar la versión; el codificador elige la mínima que contenga la URL (≥ 8) |
| Códigos de modificación | §18 lista 4; el Formato define 5 | Se resuelve contra el catálogo modification_codes (5 filas) |
Fuera de alcance (pendiente, documentado)¶
- Columnas de productores de alcohol (
Grados Alcohol en %,PVP,ISC Específico,ISC Ad-Valorem): la plantilla ya las soporta, pero el contrato JSON y elXmlBuilderaún no aceptan esos campos por línea (grados_alcohol,precio_unitario_referencia,isc_*). El ISC por línea no es representable en el XSD del e-CF (sólo agregado), así que sería un dato exclusivo de la RI. - Papel continuo / punto de venta (modelo 2.3): formato de una columna, no implementado.
- Modalidades de contingencia y envío diferido (modelos 3.x y 4.x) y sus leyendas obligatorias: requieren marcar esas modalidades en el negocio, que aún no existen en el dominio.
- Logo del emisor:
companies.logo_pathexiste y los modelos lo muestran, pero la norma no lo exige. - Límite de líneas (1.000; 10.000 en consumo <RD$250k): aún no se valida al recibir el e-CF.
- Prorrateo del descuento/recargo GLOBAL en el ITBIS por línea (procedimiento del Informe Técnico
§15): no implementado. Con descuento global, la columna
ITBISdel detalle puede no cuadrar al centavo con elTotal ITBIS(que sí sale del payload). La suma del ISC a la base imponible ya está implementada (ver reglas-transversales-ecf.md). - Sección
Paginacionen el XML: la RI pagina y emite subtotales por página, pero elXmlBuilderno escribe todavía la sección de paginación del e-CF, así que esos subtotales no tienen respaldo en el XML firmado. Al implementarlo, el corte debería decidirse en endpoint-rd (una sola fuente). - Alineación del corte de página: el corte lo decide el servicio por número de líneas
(
ITEMS_POR_PAGINA_DEFAULT). El total impreso usa el contador real de mPdf ({nb}), así que el "Página No. X de N" nunca miente; pero si un bloque con descripciones muy largas se partiera, sus subtotales de página quedarían en la segunda mitad del bloque.