- hana_manager.get_delivery ahora busca en ODLN y, si no encuentra, en OWTR - sapb1_manager resuelve StockTransfers -> Orders (via U_IDC_NUMOV) para validar precios de flete cuando la guia es un traslado de inventario - se corrige el orden de parametros tipo/serie/numero (sin cruces) en get_delivery, get_delivery_notes y _get_delivery_entries - se agrega sapb1_manager.obtener_condicion_pago (BusinessPartners + PaymentTermsTypes) y pipeline._calcular_fecha_vencimiento para que DocDueDate del draft sea fecha de contabilizacion + dias de la condicion de pago del proveedor - se agrega variante de regex para "VALOR REFER" truncado en sunat_schema.py - se actualiza documentacion (docs/) reflejando estos cambios Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
42 lines
1.6 KiB
Markdown
42 lines
1.6 KiB
Markdown
# Validar Precios
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
A["factura con lineas[]"] --> B["Obtener maestro zonas<br>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<br>get_delivery_notes()"]
|
|
I --> I2{"¿Guía encontrada en<br>ODLN o en OWTR?"}
|
|
I2 -->|ODLN| I3["Documento = DeliveryNotes(DocEntry)"]
|
|
I2 -->|OWTR| I4["Documento = StockTransfers(DocEntry)<br>→ leer U_IDC_NUMOV<br>→ Documento = Orders(U_IDC_NUMOV)"]
|
|
I3 --> J["Por cada documento<br>(DeliveryNote u Orden de Venta)"]
|
|
I4 --> J
|
|
|
|
J --> K["Obtener zona desde<br>U_IDC_DESTINO"]
|
|
K --> L["Extraer WarehouseCode<br>de DocumentLines[0]"]
|
|
L --> M["Acumular Weight1<br>de DocumentLines[0]"]
|
|
M --> N["Por cada línea FL* en<br>DocumentLines"]
|
|
|
|
|
|
N --> O["Sumar LineTotal"]
|
|
O --> P["Máx Quantity"]
|
|
P --> Q["Sumar PriceAfterVAT"]
|
|
Q --> R["Construir guias_lt[]<br>para cada guía:<br>line_total, quantity,<br>price_after_vat_sum,<br>warehouse_code, zona, weight1"]
|
|
|
|
R --> S["Comparar total_linea (XML)<br>vs sap_total (FL*)"]
|
|
S --> T{"abs(diff) < 0.01?"}
|
|
T -->|Sí| U["ok = True<br>use_sap_prices si qty==1<br>y total_sap_qty≠1"]
|
|
T -->|No| V["ok = False"]
|
|
|
|
U --> W["Resultado por línea:<br>ok, draft_price, sap_price,<br>draft_cantidad, guias_lt[]"]
|
|
V --> W
|
|
W --> C
|
|
C --> X["todas_coinciden = all(ok)"]
|
|
```
|