PHPackages                             lopezsoft/ubl21dian - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. lopezsoft/ubl21dian

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

lopezsoft/ubl21dian
===================

Core for electronic invoicing pre-validation - DIAN UBL 2.1

3.6.8(2mo ago)417441MITPHPPHP &gt;= 8.0

Since May 17Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/lopezsoft/ubl21dian)[ Packagist](https://packagist.org/packages/lopezsoft/ubl21dian)[ Docs](https://matias-api.com)[ RSS](/packages/lopezsoft-ubl21dian/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (6)Dependencies (2)Versions (32)Used By (1)

UBL 2.1 DIAN
============

[](#ubl-21-dian)

Core for electronic invoicing pre-validation - DIAN UBL 2.1.

Latest Release
--------------

[](#latest-release)

### Version 3.6.8 (2026-02-24)

[](#version-368-2026-02-24)

**🔄 CHANGE**: Fallback automático al endpoint de producción cuando `To` está vacío.

#### Changed

[](#changed)

- **Client**: Si `$template->To` llega vacío o nulo, se asigna automáticamente `https://vpfe.dian.gov.co/WcfDianCustomerServices.svc?wsdl` en lugar de lanzar una excepción.

---

### Version 3.6.7 (2026-02-24)

[](#version-367-2026-02-24)

**🐛 FIX**: Validación del endpoint en `Client.php` antes de ejecutar cURL.

#### Fixed

[](#fixed)

- **Client**: Cuando `$template->To` llega vacío o nulo, ahora se lanza una excepción descriptiva inmediatamente, en lugar de fallar con el críptico `cURL errno 3. URL:` sin contexto.
    - Antes: `cURL errno 3. URL: ` (no indica la causa raíz)
    - Ahora: `La URL del servicio (To) no puede estar vacía. Verifique que está configurando correctamente el endpoint de la DIAN.`

---

### Version 3.6.6 (2026-02-23)

[](#version-366-2026-02-23)

**🐛 FIX**: Mejorado el mensaje de error en `Client.php` cuando `curl_error()` retorna vacío.

#### Fixed

[](#fixed-1)

- **Client**: Cuando cURL falla y `curl_error()` no tiene descripción textual, el mensaje de error ahora incluye el `errno` de cURL y la URL destino, facilitando el diagnóstico de fallos de conectividad con los servicios DIAN.
    - Antes: `Exception: Exception: Class Lopezsoft\UBL21dian\Client: `
    - Ahora: `Exception: Class Lopezsoft\UBL21dian\Client: cURL errno 7. URL: https://...`

---

### Version 3.6.5 (2025-12-03)

[](#version-365-2025-12-03)

**🐛 FIX**: Corrección de métodos públicos `ConsultarCUDS()` y `ConsultarCUDE()` en `SignDocumentSupport.php`.

#### Fixed

[](#fixed-2)

- **ConsultarCUDS()**: Ahora usa `buildDocumentSupportHashString()` con valores truncados a 2 decimales
- **ConsultarCUDE()**: Ahora usa `buildInvoiceHashString()` con valores truncados a 2 decimales
- Agregada validación de `$this->pin` con excepción en ambos métodos
- Agregado tipo de retorno `string` a ambos métodos

#### Technical Details

[](#technical-details)

Los métodos públicos `ConsultarCUDS()` y `ConsultarCUDE()` no estaban aplicando el truncado a 2 decimales, lo que podía generar hashes incorrectos si el usuario los llamaba directamente.

**⚠️ Actualización recomendada** si utiliza los métodos `ConsultarCUDS()` o `ConsultarCUDE()` directamente.

---

### Version 3.6.4 (2025-11-21)

[](#version-364-2025-11-21)

**✅ SOLUCIÓN DEFINITIVA**: Corrección final del método `truncateDecimals()` eliminando completamente el uso de `number_format()` en el resultado.

#### Fixed

[](#fixed-3)

- **Truncado definitivo sin redondeo**: Solución basada en manipulación pura de strings
    - Problema en v3.6.2 y v3.6.3: Uso final de `number_format()` que siempre redondea
    - Solución: Algoritmo basado en `rtrim()` + `substr()` + `str_pad()` sin operaciones matemáticas
    - **Garantiza**: Truncado exacto a 2 decimales, nunca redondeo
    - **Resuelve definitivamente error FAD06**: "Valor del CUFE no está calculado correctamente"

#### Changed

[](#changed-1)

- Método `truncateDecimals()` reescrito usando SOLO string manipulation:
    1. `number_format($value, 6, '.', '')` - Conversión inicial con máxima precisión
    2. `rtrim($stringValue, '0')` - Elimina ceros del final
    3. `rtrim($stringValue, '.')` - Elimina punto si es entero
    4. `substr($decimalPart, 0, 2)` - Trunca (NO redondea) a 2 decimales
    5. `str_pad($decimalPart, 2, '0')` - Rellena con ceros si es necesario
    6. **NO** usa `number_format()` en el resultado final

#### Technical Details

[](#technical-details-1)

```
// Casos de prueba garantizados:
truncateDecimals(33000)      → "33000.00"  ✅
truncateDecimals(30555.55)   → "30555.55"  ✅
truncateDecimals(12037.046)  → "12037.04"  ✅ (trunca, NO redondea a .05)
truncateDecimals(2444.4)     → "2444.40"   ✅
```

#### Affected Files

[](#affected-files)

- `SignInvoice.php` - CUFE/CUDE con truncado definitivo
- `SignAttachedDocument.php` - CUFE/CUDE con truncado definitivo
- `SignDocumentSupport.php` - CUDS/CUDE/Eventos con truncado definitivo
- `SignPayroll.php` - CUNE con truncado definitivo

**⚠️ Actualización CRÍTICA**: Esta es la solución definitiva después de 4 intentos. Implementa exactamente la especificación DIAN: "con decimales a dos (2) dígitos truncados".

---

### Version 3.6.3 (2025-11-19)

[](#version-363-2025-11-19)

**🐛 HOTFIX**: Corregido bug crítico de precisión flotante en `truncateDecimals()`.

#### Fixed

[](#fixed-4)

- **Bug en truncateDecimals()**: La versión anterior causaba errores de precisión con operaciones de punto flotante
    - Problema: `floor(value * 100) / 100` generaba imprecisiones como `3055556.0000000001`
    - Solución: Nueva implementación usando `sprintf()` + `substr()` para truncado exacto basado en strings
    - **Impacto**: CUFEs incorrectos cuando valores no tenían decimales (ej: `33000`) o tenían exactamente 2 decimales

#### Changed

[](#changed-2)

- Método `truncateDecimals()` completamente reescrito en todos los archivos XAdES
- Algoritmo mejorado: String manipulation en lugar de operaciones flotantes
- Proceso: `sprintf('%.10f')` → `substr()` → `number_format()`

#### Example

[](#example)

```
// ❌ Antes (con bug de precisión flotante)
33000 * 100 / 100 = 33000.0000000001 → CUFE incorrecto

// ✅ Ahora (truncado exacto con strings)
sprintf('%.10f', 33000) = "33000.0000000000"
substr() = "33000.00" → CUFE correcto
```

**⚠️ Actualización urgente recomendada** si sus documentos contienen valores sin decimales o con exactamente 2 decimales.

---

### Version 3.6.2 (2025-11-18)

[](#version-362-2025-11-18)

**🔧 CORRECCIÓN CRÍTICA**: Implementación de truncado en lugar de redondeo para valores monetarios según especificación DIAN.

#### Fixed

[](#fixed-5)

- **Truncado correcto según DIAN**: Cambio de `number_format()` (redondeo) a `truncateDecimals()` (truncado)
    - Especificación DIAN: "con decimales a dos (2) dígitos truncados"
    - Nuevo método `truncateDecimals()` que usa `floor()` para truncar valores sin redondear
    - **Ejemplo**: 12037.046 → 12037.04 (antes redondeaba a 12037.05)
    - **Resuelve error FAD06**: "Valor del CUFE no está calculado correctamente"

#### Changed

[](#changed-3)

- Aplicado en **TODOS los archivos XAdES**:
    - `SignInvoice.php` - CUFE/CUDE con truncado
    - `SignAttachedDocument.php` - CUFE/CUDE con truncado
    - `SignDocumentSupport.php` - CUDS/CUDE/Eventos con truncado
    - `SignPayroll.php` - CUNE con truncado

#### Technical

[](#technical)

- Implementación: `floor(value * 100) / 100` para truncar a 2 decimales
- Cumplimiento total con especificación técnica de generación del CUFE

**⚠️ Importante**: Esta corrección puede cambiar CUFEs/CUDEs existentes, pero es necesaria para cumplir con la especificación de la DIAN.

---

### Version 3.6.1 (2025-11-17)

[](#version-361-2025-11-17)

**Extensión del fix crítico**: Esta versión extiende la corrección de formateo a 2 decimales a TODOS los archivos de firma XAdES.

#### Changed

[](#changed-4)

- **Formateo completo a 2 decimales en todos los tipos de documentos**:
    - `SignAttachedDocument.php` - CUFE/CUDE formateados correctamente
    - `SignDocumentSupport.php` - CUDS, CUDE y eventos formateados correctamente
    - `SignPayroll.php` - CUNE con valores de nómina formateados a 2 decimales

#### Added

[](#added)

- Métodos auxiliares reutilizables en `SignAttachedDocument.php`
- Métodos auxiliares completos en `SignDocumentSupport.php` (CUDS + eventos)
- Método específico `buildDocumentSupportHashString()` para documentos soporte

#### Improved

[](#improved)

- Refactorización completa aplicada a todos los archivos XAdES
- Consistencia total en formateo de 2 decimales en todos los tipos de documentos
- Código más limpio y mantenible en toda la librería

---

### Version 3.6.0 (2025-11-17)

[](#version-360-2025-11-17)

**⚠️ BREAKING FIX**: Corrección del cálculo de CUFE/CUDE para cumplir con la especificación de la DIAN (2 decimales exactos en `SignInvoice.php`).

#### Changed

[](#changed-5)

- **Formateo correcto de valores monetarios**: Todos los valores monetarios y de impuestos ahora se formatean con exactamente 2 decimales en el cálculo de CUFE/CUDE
    - `LineExtensionAmount` y `PayableAmount` formateados a 2 decimales
    - Todos los impuestos (`TaxAmount`) formateados a 2 decimales
    - Previene errores cuando los XML contienen valores con hasta 6 decimales

#### Added

[](#added-1)

- Métodos auxiliares privados para mejorar mantenibilidad y reutilización de código
- Mejor arquitectura interna siguiendo principios SOLID y DRY

#### Improved

[](#improved-1)

- Refactorización completa de generación de CUFE/CUDE
- Código más limpio, testeable y mantenible
- Eliminación de duplicación de código

**Nota**: Si anteriormente usaba valores con más de 2 decimales, el CUFE/CUDE generado será diferente (ahora correcto según especificación DIAN).

---

Tags
====

[](#tags)

- **3.6.8**: Change - Fallback automático al endpoint de producción DIAN cuando To está vacío.
- **3.6.7**: Fix - Validación de URL vacía en Client antes de ejecutar cURL. Excepción descriptiva cuando To está vacío.
- **3.6.6**: Fix - Mensaje de error cURL enriquecido con errno y URL cuando curl\_error() está vacío.
- **3.6.5**: Fix - Corrección métodos públicos ConsultarCUDS() y ConsultarCUDE() con truncado a 2 decimales.
- **3.6.4**: Fix - Solución definitiva de truncateDecimals() eliminando number\_format() del resultado.
- **3.6.3**: Hotfix - Bug de precisión flotante en truncateDecimals corregido. Actualización urgente recomendada.
- **3.6.2**: Fix crítico - Truncado (no redondeo) según especificación DIAN. Resuelve error FAD06.
- **3.6.1**: Extensión del fix - Formateo a 2 decimales en TODOS los archivos XAdES (AttachedDocument, DocumentSupport, Payroll).
- **3.6.0**: Fix crítico - Formateo correcto a 2 decimales para CUFE/CUDE. Refactorización de código.
- **3.5.1**: Ajustes en la nómina de ajustes de eliminación.
- **3.5.0**: Calcular y setear SoftwareSecurityCode, CUNE, URL de consulta CUNE en CodigoQR, función para obtener información del QR.
- **3.4.0**: GetAcquirer para obtener datos de entidad adquirente (Resolución 000202 de 2025).
- **3.2.11**: FIX - Formato dateTime en XML para SigningTime. Feature - Mejora descripción errores DIAN.
- **3.2.6**: Ajustes en SignInvoice para generar acuse de recibo.
- **3.2.3**: Ajustes en SignInvoice para obtener CUFE y QR.
- **3.2.0**: Control de errores en las solicitudes.
- **3.1.9**: Ajustes en la firma de eventos.
- **3.1.5-3.1.8**: Eventos para envío de facturas, notas crédito y débito.
- **2.0**: Notas débito y estándar de nombres de documentos.
- **1.3**: Licencia LGPL.
- **1.2**: Notas crédito y cálculo del CUDE.
- **1.1.1**: Solución error canonización.
- **1.1**: Templates para Web Service, require curl.
- **1.0**: Tests válidos con binary security token (SOAP) y firma XAdES (XML) con sha1, sha256, sha512.

Resources
=========

[](#resources)

- [Documentation](https://docs.matias-api.com)
- [CHANGELOG](CHANGELOG.md)

Installation
------------

[](#installation)

```
composer require lopezsoft/ubl21dian
```

Requirements
------------

[](#requirements)

- PHP &gt;= 8.0
- Extensions: dom, xml, curl, libxml, openssl, xmlwriter, json
- nesbot/carbon ^2.19 || ^3.8

Authors
-------

[](#authors)

- [Lewis Lopez](https://github.com/lopezsoft/)

License
-------

[](#license)

MIT License - see [LICENSE](LICENSE) file for details

Support
-------

[](#support)

- Issues:
- Source:

###  Health Score

47

—

FairBetter than 94% of packages

Maintenance84

Actively maintained with recent releases

Popularity20

Limited adoption so far

Community15

Small or concentrated contributor base

Maturity60

Established project with proven stability

 Bus Factor1

Top contributor holds 75% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~33 days

Recently: every ~23 days

Total

31

Last Release

84d ago

PHP version history (3 changes)3.0.0PHP &gt;= 5.4

3.1.0PHP &gt;= 7.0

3.2.0PHP &gt;= 8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/d53b507bd672a04ef105e1d15082e0472c422780b2aac811bd7eca509cf4ec85?d=identicon)[lopezsoft](/maintainers/lopezsoft)

---

Top Contributors

[![lopezsoft](https://avatars.githubusercontent.com/u/12355118?v=4)](https://github.com/lopezsoft "lopezsoft (51 commits)")[![dazza-dev](https://avatars.githubusercontent.com/u/21293561?v=4)](https://github.com/dazza-dev "dazza-dev (11 commits)")[![LEWISLOPEZGOMEZ](https://avatars.githubusercontent.com/u/173327063?v=4)](https://github.com/LEWISLOPEZGOMEZ "LEWISLOPEZGOMEZ (6 commits)")

---

Tags

xmlweb servicecoreubldiansoap dian

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/lopezsoft-ubl21dian/health.svg)

```
[![Health](https://phpackages.com/badges/lopezsoft-ubl21dian/health.svg)](https://phpackages.com/packages/lopezsoft-ubl21dian)
```

###  Alternatives

[masterminds/html5

An HTML5 parser and serializer.

1.8k242.8M229](/packages/masterminds-html5)[jms/serializer

Library for (de-)serializing data of any complexity; supports XML, and JSON.

2.3k135.8M851](/packages/jms-serializer)[jms/metadata

Class/method/property metadata management in PHP

1.8k152.8M88](/packages/jms-metadata)[jms/serializer-bundle

Allows you to easily serialize, and deserialize data of any complexity

1.8k89.3M627](/packages/jms-serializer-bundle)[sabre/xml

sabre/xml is an XML library that you may not hate.

52832.2M131](/packages/sabre-xml)[goetas-webservices/xsd2php-runtime

Convert XSD (XML Schema) definitions into PHP classes

4910.9M36](/packages/goetas-webservices-xsd2php-runtime)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
