# Validar Precios
```mermaid
flowchart TD
A["factura con lineas[]"] --> B["Obtener maestro zonas
SAP U_IDC_ZONAS"]
B --> C["Por cada línea de factura"]
C --> D{"cantidad > 0?"}
D -->|No| E["Resultado: cantidad cero, sin validar"]
D -->|Sí| F{"¿Hay guías de remisión?"}
F -->|No| G["Resultado: sin guía de referencia"]
F -->|Sí| H["Por cada guía en guias[]"]
H --> I["Consultar SAP B1
get_delivery_notes()"]
I --> I2{"¿Guía encontrada en
ODLN o en OWTR?"}
I2 -->|ODLN| I3["Documento = DeliveryNotes(DocEntry)"]
I2 -->|OWTR| I4["Documento = StockTransfers(DocEntry)
→ leer U_IDC_NUMOV
→ Documento = Orders(U_IDC_NUMOV)"]
I3 --> J["Por cada documento
(DeliveryNote u Orden de Venta)"]
I4 --> J
J --> K["Obtener zona desde
U_IDC_DESTINO"]
K --> L["Extraer WarehouseCode
de DocumentLines[0]"]
L --> M["Acumular Weight1
de DocumentLines[0]"]
M --> N["Por cada línea FL* en
DocumentLines"]
N --> O["Sumar LineTotal"]
O --> P["Máx Quantity"]
P --> Q["Sumar PriceAfterVAT"]
Q --> R["Construir guias_lt[]
para cada guía:
line_total, quantity,
price_after_vat_sum,
warehouse_code, zona, weight1"]
R --> S["Comparar total_linea (XML)
vs sap_total (FL*)"]
S --> T{"abs(diff) < 0.01
y ninguna guía falló?"}
T -->|Sí| U["ok = True
draft_quantity = int(Quantity máx FL*)
draft_price = suma PriceAfterVAT FL*"]
T -->|No| V["ok = False
draft_quantity = int(cantidad XML)
draft_price = total_linea / cantidad"]
U --> W["Resultado por línea:
ok, draft_price, sap_price,
label, warehouse_code, guias_lt[]"]
V --> W
W --> C
C --> X["todas_coinciden = all(ok)"]
```
## Notas
- Si la consulta a SAP de una guía lanza error, esa guía queda con ceros y la línea completa se marca `ok = False` (se registra como `WARNING`).
- Si ninguna guía de la línea existe en SAP, el resultado lleva `label = "Sin guías SAP"` y se registra "línea saltada", pero igual queda `ok = False` (salvo que `total_linea` sea 0), por lo que `todas_coinciden` es falso y no se crea el draft.
- `weight1` (peso de la primera línea de cada guía) se sigue calculando y guardando en `guias_lt[]`, pero el draft ya no lo usa.
- Función: `draft_sap.validate_prices(factura)` → `(todas_coinciden, resultados)`.