> ## Documentation Index
> Fetch the complete documentation index at: https://www.finseed.es/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Precisión en cálculos y redondeos

> Cómo garantizamos que los importes de las facturas coincidan exactamente con los totales de tus pedidos en PrestaShop.

Finseed garantiza que los importes que aparecen en tus facturas coincidan exactamente con lo que PrestaShop registró y mostró a tus clientes. Esta página explica cómo gestionamos los redondeos de PrestaShop para asegurar precisión total.

## El problema del redondeo

PrestaShop utiliza reglas de redondeo específicas al calcular totales de pedidos. Estas reglas varían según:

* Configuración de la tienda (parámetros `round_mode` y `round_type`)
* Métodos de cálculo de impuestos
* Configuración de precisión de divisas
* Interacciones entre múltiples artículos

Debido a esto, recalcular totales a partir de precios unitarios y cantidades puede producir discrepancias de redondeo que no coinciden con los valores que PrestaShop almacenó y mostró a tus clientes.

### Ejemplo práctico

Un producto que cuesta 16,819 € (con IVA incluido) con cantidad de 9:

* Multiplicación simple: 16,819 × 9 = 151,371 €
* Total que PrestaShop calculó: 151,370 €

La diferencia de 0,001 € parece pequeña, pero estos pequeños errores se acumulan a lo largo de múltiples artículos y pueden causar fallos en la validación de facturas. Esto es especialmente crítico con requisitos estrictos como el sistema Verifactu de España.

## Cómo se calculan los importes con precisión

En lugar de recalcular los totales, utilizamos exactamente los valores que PrestaShop ya calculó y almacenó. Nuestro sistema trabaja con tres categorías de datos:

### Líneas de producto (order\_details)

Cada producto del pedido se lee directamente de la tabla `order_details` de PrestaShop:

* Leemos `total_price_tax_incl` y `total_price_tax_excl` de cada línea de pedido.
* **NUNCA recalculamos** multiplicando `unit_price × quantity`.
* Los precios unitarios que mostramos en la factura se calculan dividiendo el total entre la cantidad, pero solo para visualización.
* Los importes de impuestos se derivan de la diferencia: `total_price_tax_incl - total_price_tax_excl`.

Esto respeta exactamente cómo PrestaShop aplicó sus reglas de redondeo a cada línea de producto.

### Componentes a nivel de pedido

Estos elementos NO son líneas de producto, sino totales que se añaden como líneas separadas en la factura:

* **Envío**: Usa `total_shipping_tax_incl` del objeto order.
* **Descuentos/Cupones**: Usa `total_discounts_tax_incl` del objeto order.
* **Wrapping/Gift wrap**: Usa `total_wrapping_tax_incl` del objeto order.

Estos valores ya incorporan los redondeos y reglas de impuestos configuradas en PrestaShop.

### Notas de crédito (order\_slips)

Cuando se emite un reembolso en PrestaShop, **el pedido original nunca se modifica**. En su lugar:

* PrestaShop crea un `order_slip` (nota de crédito) como entidad separada.
* Los detalles del reembolso se almacenan en `order_slip_details`.
* Cada entrada en `order_slip_details` referencia una línea específica de `order_details` mediante `id_order_detail`.
* Nuestro sistema resta estos importes de reembolso de los totales originales para calcular el importe neto.

**Ejemplo:**

```
Pedido original: 150 € (permanece sin cambios en la base de datos)
→ order_slip creado: -50 €
→ Sistema calcula neto: 150 € - 50 € = 100 €
```

El pedido siempre muestra `total_paid = 150 €`, pero el sistema agrega todos los `order_slips` asociados para determinar el importe neto real.

## Gestión de notas de crédito (order\_slips)

La arquitectura de reembolsos en PrestaShop es fundamental para entender cómo se mantiene la precisión en las facturas.

### Cómo funciona PrestaShop con reembolsos

Cuando se procesa un reembolso (parcial o total) en PrestaShop:

1. **El pedido original permanece intacto**: Los campos `total_paid`, `total_paid_tax_incl`, y `total_paid_tax_excl` nunca cambian.
2. **Se crea un order\_slip independiente**: Este documento representa el reembolso.
3. **Los detalles se vinculan**: La tabla `order_slip_details` contiene las líneas reembolsadas, cada una referenciando el `id_order_detail` correspondiente.

Esta arquitectura garantiza trazabilidad completa y auditoría precisa.

### Múltiples reembolsos parciales

Un pedido puede tener varios `order_slips` asociados. Por ejemplo:

```
Pedido original: 200 €
→ Cliente devuelve producto A: order_slip #1 por -50 €
→ Cliente devuelve producto B: order_slip #2 por -30 €
→ Importe neto final: 200 € - 50 € - 30 € = 120 €
```

Nuestro sistema:

* **Agrega todos los order\_slips** asociados al pedido.
* **Calcula el neto** restando los reembolsos del total original.
* **Emite factura rectificativa** del importe original completo.
* **Emite nueva factura** por el importe neto actualizado.

### Vinculación técnica

La relación entre tablas es:

```
ps_orders (pedido original)
    ↓
ps_order_detail (líneas de producto originales)
    ↓ (referenciado por id_order_detail)
ps_order_slip_detail (líneas reembolsadas)
    ↓
ps_order_slip (nota de crédito)
```

Esta estructura permite:

* Reembolsos parciales de líneas específicas.
* Múltiples reembolsos del mismo producto.
* Preservación del historial completo de transacciones.

## Por qué este enfoque es robusto

**Fuente única de verdad**

Utilizamos exactamente los valores que PrestaShop muestra a tus clientes. Las facturas siempre coinciden perfectamente con los pedidos.

**Respeta la configuración de tu tienda**

Tus parámetros específicos de redondeo (`round_mode`, `round_type`) se honran automáticamente porque PrestaShop ya los aplicó. No necesitas configurar nada en Finseed: simplemente heredamos la configuración de tu tienda.

**Evita errores de punto flotante**

Al no recalcular, eliminamos el riesgo de acumular errores de aritmética de punto flotante a lo largo de múltiples artículos.

**Crítico para cumplimiento Verifactu**

El sistema Verifactu de la Agencia Tributaria requiere **precisión absoluta hasta el céntimo**. Cualquier discrepancia entre:

* Los totales que PrestaShop muestra al cliente
* Los importes en la factura generada
* Los datos enviados a la Agencia Tributaria

...puede resultar en rechazos y problemas de cumplimiento normativo. Usar los totales precalculados de PrestaShop garantiza esta precisión obligatoria.

**Gestiona casos especiales**

PrestaShop a veces aplica redondeos especiales en escenarios como:

* Descuentos por volumen
* Precios con impuestos incluidos y descuentos porcentuales
* Múltiples tipos de impuestos en un único pedido
* Conversiones de divisas

Usando sus totales precalculados, estos casos se manejan correctamente sin necesidad de lógica especial.

**Consistencia en auditorías**

Los importes en las facturas generadas coinciden exactamente con lo que se almacena en tu base de datos de PrestaShop, lo que facilita auditorías financieras y reconciliación. Esta trazabilidad perfecta es especialmente importante cuando:

* Tienes múltiples reembolsos parciales (varios `order_slips` por pedido).
* Necesitas demostrar el historial completo de transacciones.
* Tu asesor fiscal requiere conciliación entre PrestaShop y facturas emitidas.

## Implementación técnica

Nuestro sistema procesa los datos de PrestaShop en tres categorías distintas:

### 1. Líneas de producto (order\_details)

Para cada línea de producto en el pedido:

* Lee `total_price_tax_incl` y `total_price_tax_excl` de la tabla `ps_order_detail`.
* Calcula precios unitarios dividiendo el total entre la cantidad (solo para visualización en la factura).
* Obtiene importes de impuestos: `total_price_tax_incl - total_price_tax_excl`.
* **NO recalcula** usando `unit_price × quantity` para evitar discrepancias de redondeo.

### 2. Componentes a nivel de pedido (order)

Para elementos que afectan al total del pedido:

* Lee `total_shipping_tax_incl` y `total_shipping_tax_excl` del objeto order para los gastos de envío.
* Lee `total_discounts_tax_incl` y `total_discounts_tax_excl` para descuentos y cupones.
* Lee `total_wrapping_tax_incl` y `total_wrapping_tax_excl` para envoltorio de regalo.

Estos se añaden como líneas separadas en la factura, no como ajustes a líneas de producto.

### 3. Ajustes de notas de crédito (order\_slips)

Para reembolsos y devoluciones:

* Consulta la tabla `ps_order_slip` para encontrar todas las notas de crédito asociadas al pedido.
* Para cada `order_slip`, lee `ps_order_slip_detail` para obtener los importes reembolsados por línea.
* Vincula cada `order_slip_detail` con su `order_detail` original mediante `id_order_detail`.
* Resta los importes reembolsados de los totales originales para calcular el importe neto.
* Agrega múltiples `order_slips` si existen varios reembolsos parciales.

### Flujo de cálculo completo

```
1. Suma líneas de producto (de order_details)
2. Añade componentes de pedido (shipping, discounts, wrapping)
3. Resta reembolsos agregados (de order_slips)
4. Resultado = Importe neto facturado
```

Esto garantiza que cada céntimo coincida entre tu tienda de PrestaShop y tus facturas generadas, proporcionando precisión completa para cumplimiento fiscal y reportes financieros.

***

Con esta arquitectura, puedes confiar en que tus facturas son precisas hasta el último céntimo, independientemente de cómo PrestaShop esté configurado o cuán complejos sean tus productos y descuentos.

Si tienes preguntas sobre cálculos específicos o necesitas entender cómo se aplica esto a tu configuración particular, consulta las [Preguntas frecuentes sobre PrestaShop](/docs/prestashop/preguntas-frecuentes).
