Saltar a contenido

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.pdfapp/Services/RdEcfPdfService.php
Plantillas apps/util.pdfresources/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_code contra el catálogo provinces_municipalities), Fecha Emisión.
  • Encabezado C (inferior izquierda): Razón Social Cliente, RNC Cliente (o Identificador 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 letra E a 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 Seguridad y Fecha 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ó por recepcion_rfce, el timbre usa consultatimbrefc en el host fc con solo 4 parámetros (rncemisor, encf, montototal, codigoseguridad); en cualquier otro caso usa consultatimbre con 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, y 003/004/005Otros Impuestos Adicionales.
  • Escapado del timbre: reservados en porcentaje (S/DQduS%2FDQdu), pero la hora de fechafirma conserva 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 el XmlBuilder aú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_path existe 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 ITBIS del detalle puede no cuadrar al centavo con el Total ITBIS (que sí sale del payload). La suma del ISC a la base imponible ya está implementada (ver reglas-transversales-ecf.md).
  • Sección Paginacion en el XML: la RI pagina y emite subtotales por página, pero el XmlBuilder no 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.