Hola,
Estoy integrando una aplicación externa con Dolibarr mediante la API REST y he detectado que el IRPF español (localtax2) no se calcula cuando se crean o actualizan líneas de facturas de proveedor a través de la API. La misma línea guardada desde la interfaz web sí se calcula correctamente.
ENTORNO
- Dolibarr 23.0.3
- País de la empresa: España
- El diccionario de tasas de IVA (España) tiene una fila: tasa 21, código IVA+IRPF15, localtax2 = -15, tipo 5
- El tercero (proveedor) está sujeto a IRPF
RESULTADO ESPERADO
Base 150,00, IVA 31,50, IRPF -22,50, total 159,00 (lo que produce la interfaz web con la misma línea).
RESULTADO OBTENIDO
Base 150,00, IVA 31,50, IRPF 0,00, total 181,50.
PASOS PARA REPRODUCIRLO
1) POST /api/index.php/supplierinvoices
{
"socid": 23,
"ref_supplier": "12345",
"date": "2026-10-02",
"multicurrency_code": "EUR",
"cond_reglement_id": 2,
"mode_reglement_id": 2,
"fk_account": 2
}
2) POST /api/index.php/supplierinvoices/{id}/lines
{
"description": "Summary of lines",
"pu_ht": 150,
"qty": 1,
"tva_tx": "21 (IVA+IRPF15)",
"localtax1_tx": 0,
"localtax2_tx": -15,
"remise_percent": 0,
"product_type": 1
}
3) GET /api/index.php/supplierinvoices/{id}
La línea se guarda con vat_src_code = IVA+IRPF15, tva_tx = 21 y localtax2_type = 5, pero con localtax2_tx = 0.0000 y total_localtax2 = 0.00000000. En la factura, total_localtax2 = 0 y total_ttc = 181.5.
PRUEBAS ADICIONALES
- PUT /supplierinvoices/{id}/lines/{lineid} con los mismos datos: la línea conserva localtax2_tx = -15 y localtax2_type = 5, pero total_localtax2 sigue en 0.
- POST /supplierinvoices/{id}/validate: validar la factura no recalcula nada; los totales no cambian.
- POST /supplierinvoices con las líneas dentro del cuerpo: mismo resultado, el IRPF no se calcula.
- Crear la misma línea a mano en la interfaz web, o abrir en la interfaz una línea creada por API y guardarla sin cambios, sí calcula el IRPF (total_localtax2 = -22,5 y total_ttc = 159).
Por tanto, la configuración (diccionario, tercero, país de la empresa) es correcta, y el problema solo aparece al usar la API REST.
¿Podéis confirmarme si es un fallo conocido, o si existe una forma recomendada de crear líneas de facturas de proveedor con IRPF a través de la API? Si es un fallo, puedo abrir también una incidencia en GitHub si lo preferís.
Muchas gracias por vuestra ayuda.
Un saludo,
IRPF
Hola Pau.
Lo hemos reproducido con tu mismo JSON y es un bug de Dolibarr, no te falta nada de configuración ni hay una combinación de parámetros que lo evite.
El problema es que la API no carga el proveedor antes de calcular los impuestos. En postLine() y putLine() (fourn/class/api_supplier_invoices.class.php) se hace un fetch() de la factura y se llama directamente a addline()/updateline(). Pero fetch() deja el tercero vacío, y addline()/updateline() calculan el IRPF con ese tercero. Al no haber proveedor, Dolibarr toma a tu propia empresa como vendedor y, en el caso de España, acaba devolviendo un IRPF vacío. Por eso se guardan bien el código IVA+IRPF15 y el tipo 5, pero el importe sale a 0.
Desde la web funciona porque la pantalla sí carga el proveedor antes de guardar la línea. Por eso, al abrir y guardar la línea desde la interfaz, se corrige sola. Y por lo mismo el PUT te conserva el -15 pero con total 0: updateline guarda el tipo que le mandas, pero el cálculo sigue saliendo a cero.
Mientras no lo corrijan, el arreglo es cargar el tercero antes del cálculo. En fourn/class/fournisseur.facture.class.php, dentro de addline() y también dentro de updateline(), justo antes de la línea $localtaxes_type = getLocalTaxesFromRate(...), añade:
Con eso, tu mismo POST de la línea nos da IRPF -22,50 y total 159,00, y un PUT de la línea corrige también las facturas que ya tengas mal.
Por si te afecta: en facturas de cliente pasa lo mismo con el IRPF, por el mismo motivo.
Un saludo.
Lo hemos reproducido con tu mismo JSON y es un bug de Dolibarr, no te falta nada de configuración ni hay una combinación de parámetros que lo evite.
El problema es que la API no carga el proveedor antes de calcular los impuestos. En postLine() y putLine() (fourn/class/api_supplier_invoices.class.php) se hace un fetch() de la factura y se llama directamente a addline()/updateline(). Pero fetch() deja el tercero vacío, y addline()/updateline() calculan el IRPF con ese tercero. Al no haber proveedor, Dolibarr toma a tu propia empresa como vendedor y, en el caso de España, acaba devolviendo un IRPF vacío. Por eso se guardan bien el código IVA+IRPF15 y el tipo 5, pero el importe sale a 0.
Desde la web funciona porque la pantalla sí carga el proveedor antes de guardar la línea. Por eso, al abrir y guardar la línea desde la interfaz, se corrige sola. Y por lo mismo el PUT te conserva el -15 pero con total 0: updateline guarda el tipo que le mandas, pero el cálculo sigue saliendo a cero.
Mientras no lo corrijan, el arreglo es cargar el tercero antes del cálculo. En fourn/class/fournisseur.facture.class.php, dentro de addline() y también dentro de updateline(), justo antes de la línea $localtaxes_type = getLocalTaxesFromRate(...), añade:
Código: Seleccionar todo
if (empty($this->thirdparty) || !is_object($this->thirdparty)) {
$this->fetch_thirdparty();
}Por si te afecta: en facturas de cliente pasa lo mismo con el IRPF, por el mismo motivo.
Un saludo.
EasySoft Tech S.L. — módulos, adaptaciones, integraciones y ERP en la nube sobre Dolibarr
Contabilidad ES (EasyConta), VeriFactu, SII, Facturae y API REST.
https://easysoft.es | Guías: https://wiki.easysoft.es
Contabilidad ES (EasyConta), VeriFactu, SII, Facturae y API REST.
https://easysoft.es | Guías: https://wiki.easysoft.es
