Search by

Constructor y validador de Comprobantes Fiscales Electrónicos (CFE) para DGI Uruguay

Package info

gitlab.com/upadrian/cfe

pkg:composer/upadrian/cfe

Statistics

Installs: 2

Dependents: 0

Suggesters: 1

Stars: 0

v0.0.1 2026-09-17 11:44 UTC

This package is not auto-updated.

Last update: 2026-09-17 14:45:44 UTC


README

PHP Version License Tests

Paquete Composer PHP moderno, robusto y fuertemente tipado para la construcción, cálculo automático de impuestos y validación de Comprobantes Fiscales Electrónicos (CFE) de acuerdo con el estándar oficial de DGI Uruguay (Formato de los CFE v25.2 y esquemas XSD v1.44.2).

Documentación y Guías

Características Principales

  • 🎯 Flujo de Borrador de Negocio (Pre-Validación): Genera CFE válidos listos para ser enviados a validar ante DGI o un proveedor de servicios electrónicos (integrador / PSE), omitiendo datos que son competencia exclusiva del validador (Serie, Número, CAE, timestamp de firma y firma digital XMLDSig).
  • 🧮 Cálculo Automático de Totales (TotalesCalculator): Deduce y calcula automáticamente todas las bases imponibles, tasas de IVA (Básica 22%, Mínima 10%, Exentos, Exportación, Retenciones, etc.) y montos a pagar a partir de las líneas de detalle y descuentos globales.
  • 💸 Descuentos y Recargos Globales (Zona D): Soporte completo para DscRcgGlobal (hasta 20 líneas en monto fijo o porcentaje) imputados por indicador de facturación con impacto automático en la base imponible.
  • 📝 Adenda Comercial (Zona J): Soporte para anexo de información comercial libre (CFE_Adenda) fuera del bloque firmado.
  • 🛡️ Validación Dual:
    • RuleValidator: Verificación exhaustiva de reglas de integridad de negocio de DGI.
    • XsdValidator: Validación sintáctica estricta contra el esquema XSD oficial (CFEDGI.xsd y CFEEmpresas.xsd), con inyección automática de placeholders para borradores.
  • 🔒 Tipado Estricto y Enums Nativos (PHP 8.1+): Uso de BackedEnum para tipos de CFE, formas de pago, tipos de documento de receptor, indicadores de facturación, monedas, tipos de descuento/recargo y CAE especial.

Requisitos

  • PHP: 8.1 o superior
  • Extensiones requeridas:
    • ext-xmlwriter
    • ext-dom
    • ext-libxml

Instalación

Instalar a través de Composer:

composer require upadrian/cfe

Guía Rápida de Uso

1. Emitir un Borrador de e-Factura

use Cfe\CfeBuilder;
use Cfe\Enums\FormaPago;
use Cfe\Enums\IndicadorFacturacion;
use Cfe\Enums\TipoCFE;
use Cfe\Enums\TipoDocumentoReceptor;
use Cfe\Enums\TipoDscRcg;

// 1. Crear el Builder
$cfe = CfeBuilder::create(TipoCFE::E_FACTURA)
  // 2. Identificación del Documento
  ->setIdDoc(
    fchEmis: new DateTimeImmutable('2026-09-16'),
    fmaPago: FormaPago::CONTADO
  )
  // 3. Emisor
  ->setEmisor(
    ruc: '219999990018',
    rznSoc: 'Mi Empresa S.A.',
    cdgDGISucur: 1,
    domFiscal: 'Av. 18 de Julio 1234',
    ciudad: 'Montevideo',
    departamento: 'Montevideo',
    giroEmis: 'Software y Consultoría'
  )
  // 4. Receptor
  ->setReceptor(
    tipoDoc: TipoDocumentoReceptor::RUC,
    codPais: 'UY',
    doc: '218888880012',
    rznSoc: 'Cliente Corporativo S.A.',
    dir: 'Rambla República de Chile 567',
    ciudad: 'Montevideo',
    depto: 'Montevideo'
  )
  // 5. Líneas de Detalle
  ->addItem(
    nomItem: 'Servicio de Consultoría',
    cantidad: 2.0,
    precioUnitario: 1000.0,
    indFact: IndicadorFacturacion::GRAVADO_IVA_TASA_BASICA
  )
  // 6. Descuento Global (Opcional - Zona D)
  ->addDescuentoGlobal(
    glosaDR: 'Descuento Comercial 10%',
    valorDR: 200.0,
    indFactDR: IndicadorFacturacion::GRAVADO_IVA_TASA_BASICA,
    tpoDR: TipoDscRcg::MONTO
  )
  // 7. Adenda Comercial (Opcional - Zona J)
  ->setAdenda('Orden de Compra: OC-98765');

// Totales calculados automáticamente:
// Base imponible: (2 * 1000) - 200 = 1800.00
// IVA 22%: 396.00
// Total a pagar: 2196.00

// 8. Validación de negocio y de esquema XSD
$cfe->validate();

// 9. Obtener XML listo para enviar
$xml = $cfe->toXml();

Validación

El paquete ofrece múltiples niveles de validación:

// Validación completa (Reglas de negocio DGI + Esquema XSD oficial)
$cfe->validate();

// Validar únicamente reglas de integridad de negocio
$cfe->validateRules();

// Validar únicamente contra el esquema XSD
$cfe->validateXsd();

// Comprobación booleana sin lanzar excepciones
if ($cfe->isValid()) {
  $xml = $cfe->toXml();
}

Tipos de Comprobantes Soportados y Ejemplos

CódigoTipo de CFEEnum TipoCFEArchivo de Ejemplo
101e-TicketTipoCFE::E_TICKETexamples/ejemplo_eticket.php
102Nota de Crédito de e-TicketTipoCFE::NOTA_CREDITO_E_TICKETexamples/ejemplo_nota_credito_eticket.php
103Nota de Débito de e-TicketTipoCFE::NOTA_DEBITO_E_TICKETexamples/ejemplo_nota_debito_eticket.php
111e-FacturaTipoCFE::E_FACTURAexamples/ejemplo_efactura.php
112Nota de Crédito de e-FacturaTipoCFE::NOTA_CREDITO_E_FACTURAexamples/ejemplo_nota_credito_efactura.php
113Nota de Débito de e-FacturaTipoCFE::NOTA_DEBITO_E_FACTURAexamples/ejemplo_nota_debito_efactura.php
121e-Factura de ExportaciónTipoCFE::E_FACTURA_EXPORTACIONexamples/ejemplo_efactura_exportacion.php
122Nota de Crédito de e-Factura ExportaciónTipoCFE::NOTA_CREDITO_E_FACTURA_EXPORTACIONexamples/ejemplo_nota_credito_exportacion.php
123Nota de Débito de e-Factura ExportaciónTipoCFE::NOTA_DEBITO_E_FACTURA_EXPORTACIONexamples/ejemplo_nota_debito_exportacion.php
124e-Remito de ExportaciónTipoCFE::E_REMITO_EXPORTACIONexamples/ejemplo_eremito_exportacion.php
131e-Ticket Venta por Cuenta AjenaTipoCFE::E_TICKET_VENTA_CUENTA_AJENAexamples/ejemplo_eticket_cuenta_ajena.php
132Nota de Crédito de e-Ticket Venta Cuenta AjenaTipoCFE::NOTA_CREDITO_E_TICKET_VENTA_CUENTA_AJENAexamples/ejemplo_nota_credito_eticket_cuenta_ajena.php
133Nota de Débito de e-Ticket Venta Cuenta AjenaTipoCFE::NOTA_DEBITO_E_TICKET_VENTA_CUENTA_AJENAexamples/ejemplo_nota_debito_eticket_cuenta_ajena.php
141e-Factura Venta por Cuenta AjenaTipoCFE::E_FACTURA_VENTA_CUENTA_AJENAexamples/ejemplo_efactura_cuenta_ajena.php
142Nota de Crédito de e-Factura Venta Cuenta AjenaTipoCFE::NOTA_CREDITO_E_FACTURA_VENTA_CUENTA_AJENAexamples/ejemplo_nota_credito_efactura_cuenta_ajena.php
143Nota de Débito de e-Factura Venta Cuenta AjenaTipoCFE::NOTA_DEBITO_E_FACTURA_VENTA_CUENTA_AJENAexamples/ejemplo_nota_debito_efactura_cuenta_ajena.php
151e-Boleta de EntradaTipoCFE::E_BOLETA_ENTRADAexamples/ejemplo_eboleta_entrada.php
152Nota de Crédito de e-Boleta de EntradaTipoCFE::NOTA_CREDITO_E_BOLETA_ENTRADAexamples/ejemplo_nota_credito_eboleta_entrada.php
153Nota de Débito de e-Boleta de EntradaTipoCFE::NOTA_DEBITO_E_BOLETA_ENTRADAexamples/ejemplo_nota_debito_eboleta_entrada.php
181e-RemitoTipoCFE::E_REMITOexamples/ejemplo_eremito.php
182e-ResguardoTipoCFE::E_RESGUARDOexamples/ejemplo_resguardo.php
211e-Factura Contingencia (CFC)TipoCFE::E_FACTURA_CONTINGENCIAexamples/ejemplo_contingencia.php
Demostración Borrador sin Serie/CAEexamples/ejemplo_sin_serie_cae.php

Pruebas y Análisis Estático

Para correr la suite completa de pruebas unitarias y de integración:

vendor/bin/phpunit

Para ejecutar el análisis estático con PHPStan:

vendor/bin/phpstan analyse src tests --level=5 --memory-limit=512M

Licencia

Distribuido bajo la Licencia MIT.