upadrian / cfe
Constructor y validador de Comprobantes Fiscales Electrónicos (CFE) para DGI Uruguay
v0.0.1
2026-09-17 11:44 UTC
Requires
- php: >=8.1
- ext-dom: *
- ext-libxml: *
- ext-xmlwriter: *
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0 || ^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is not auto-updated.
Last update: 2026-09-17 14:45:44 UTC
README
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
- 📘 Guía Explicativa del CAE (Constancia de Autorización de Emisión): Explicación didáctica paso a paso para principiantes sobre qué es el CAE, ciclo de vida, diccionario completo de nodos XML (
RucE,Serie,DNro,HNro,CAE_ID, etc.), diferencias entre el documento CAE de DGI y la Zona G (<CAEData>), y reglas de validación.
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.xsdyCFEEmpresas.xsd), con inyección automática de placeholders para borradores.
- 🔒 Tipado Estricto y Enums Nativos (PHP 8.1+): Uso de
BackedEnumpara 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-xmlwriterext-domext-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ódigo | Tipo de CFE | Enum TipoCFE | Archivo de Ejemplo |
|---|---|---|---|
| 101 | e-Ticket | TipoCFE::E_TICKET | examples/ejemplo_eticket.php |
| 102 | Nota de Crédito de e-Ticket | TipoCFE::NOTA_CREDITO_E_TICKET | examples/ejemplo_nota_credito_eticket.php |
| 103 | Nota de Débito de e-Ticket | TipoCFE::NOTA_DEBITO_E_TICKET | examples/ejemplo_nota_debito_eticket.php |
| 111 | e-Factura | TipoCFE::E_FACTURA | examples/ejemplo_efactura.php |
| 112 | Nota de Crédito de e-Factura | TipoCFE::NOTA_CREDITO_E_FACTURA | examples/ejemplo_nota_credito_efactura.php |
| 113 | Nota de Débito de e-Factura | TipoCFE::NOTA_DEBITO_E_FACTURA | examples/ejemplo_nota_debito_efactura.php |
| 121 | e-Factura de Exportación | TipoCFE::E_FACTURA_EXPORTACION | examples/ejemplo_efactura_exportacion.php |
| 122 | Nota de Crédito de e-Factura Exportación | TipoCFE::NOTA_CREDITO_E_FACTURA_EXPORTACION | examples/ejemplo_nota_credito_exportacion.php |
| 123 | Nota de Débito de e-Factura Exportación | TipoCFE::NOTA_DEBITO_E_FACTURA_EXPORTACION | examples/ejemplo_nota_debito_exportacion.php |
| 124 | e-Remito de Exportación | TipoCFE::E_REMITO_EXPORTACION | examples/ejemplo_eremito_exportacion.php |
| 131 | e-Ticket Venta por Cuenta Ajena | TipoCFE::E_TICKET_VENTA_CUENTA_AJENA | examples/ejemplo_eticket_cuenta_ajena.php |
| 132 | Nota de Crédito de e-Ticket Venta Cuenta Ajena | TipoCFE::NOTA_CREDITO_E_TICKET_VENTA_CUENTA_AJENA | examples/ejemplo_nota_credito_eticket_cuenta_ajena.php |
| 133 | Nota de Débito de e-Ticket Venta Cuenta Ajena | TipoCFE::NOTA_DEBITO_E_TICKET_VENTA_CUENTA_AJENA | examples/ejemplo_nota_debito_eticket_cuenta_ajena.php |
| 141 | e-Factura Venta por Cuenta Ajena | TipoCFE::E_FACTURA_VENTA_CUENTA_AJENA | examples/ejemplo_efactura_cuenta_ajena.php |
| 142 | Nota de Crédito de e-Factura Venta Cuenta Ajena | TipoCFE::NOTA_CREDITO_E_FACTURA_VENTA_CUENTA_AJENA | examples/ejemplo_nota_credito_efactura_cuenta_ajena.php |
| 143 | Nota de Débito de e-Factura Venta Cuenta Ajena | TipoCFE::NOTA_DEBITO_E_FACTURA_VENTA_CUENTA_AJENA | examples/ejemplo_nota_debito_efactura_cuenta_ajena.php |
| 151 | e-Boleta de Entrada | TipoCFE::E_BOLETA_ENTRADA | examples/ejemplo_eboleta_entrada.php |
| 152 | Nota de Crédito de e-Boleta de Entrada | TipoCFE::NOTA_CREDITO_E_BOLETA_ENTRADA | examples/ejemplo_nota_credito_eboleta_entrada.php |
| 153 | Nota de Débito de e-Boleta de Entrada | TipoCFE::NOTA_DEBITO_E_BOLETA_ENTRADA | examples/ejemplo_nota_debito_eboleta_entrada.php |
| 181 | e-Remito | TipoCFE::E_REMITO | examples/ejemplo_eremito.php |
| 182 | e-Resguardo | TipoCFE::E_RESGUARDO | examples/ejemplo_resguardo.php |
| 211 | e-Factura Contingencia (CFC) | TipoCFE::E_FACTURA_CONTINGENCIA | examples/ejemplo_contingencia.php |
| — | Demostración Borrador sin Serie/CAE | — | examples/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.