versión 1.2.1: la diferencia de importes con SAP se redondea a 2 decimales
La comparación abs(a - b) < 0.01 no era fiable por la coma flotante: el mismo céntimo se aceptaba o rechazaba según el importe (431.41 contra 431.40 se rechazaba y 624.39 contra 624.38 se aceptaba). pipeline_utils.importes_coinciden redondea la diferencia a 2 decimales, lo que muestra un comprobante, y admite hasta 1 céntimo. Se usa en la validación de precios y en la comparación del valor referencial. Con datos reales de SAP (49 líneas) ningún resultado cambió. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ca1550bced
commit
2b1a583fa1
11 files changed
+95
-17
No files matched your search
+4
-3
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
|
||||
|
||||
import sapb1_manager
|
||||
import hana_manager
|
||||
from pipeline_utils import log
|
||||
from pipeline_utils import importes_coinciden, log
|
||||
|
||||
|
||||
# ============================================================================
|
||||
@@ -253,7 +253,8 @@ def validate_prices(factura: dict) -> tuple[bool, list[dict]]:
|
||||
``line_total``, ``quantity``, ``price_after_vat_sum``,
|
||||
``warehouse_code`` y ``zona``.
|
||||
3. Determina si los precios coinciden (``ok``):
|
||||
``abs(total_linea - sap_total) < 0.01``.
|
||||
``importes_coinciden(total_linea, sap_total)``: la diferencia, redondeada a
|
||||
2 decimales, no supera 1 céntimo.
|
||||
4. Fija ``draft_quantity`` y ``draft_price`` de cada guía:
|
||||
si ``ok``, usa SAP (``int(quantity)`` y ``price_after_vat_sum``);
|
||||
si no, usa el XML (``int(cantidad)`` y ``total_linea / cantidad``).
|
||||
@@ -377,7 +378,7 @@ def validate_prices(factura: dict) -> tuple[bool, list[dict]]:
|
||||
|
||||
sap_total = sum(item["line_total"] for item in guias_lt)
|
||||
sin_sap = all(item["line_total"] == 0.0 and item["quantity"] == 0.0 for item in guias_lt)
|
||||
ok = all_ok and abs(total_linea - sap_total) < 0.01
|
||||
ok = all_ok and importes_coinciden(total_linea, sap_total)
|
||||
label = "Sin guías SAP" if sin_sap else "LineTotal (FL*) vs total_linea"
|
||||
grflete_str = "; ".join(f"{item['guia']['tipo']}{item['guia']['serie']}-{item['guia']['numero']}" for item in guias_lt)
|
||||
wh_str = ", ".join(sorted(all_wh)) if all_wh else "A-CENTRA"
|
||||
|
||||
Reference in new issue
Block a user