# Construir Draft SAP B1 Función: `draft_sap.build_sap_draft(factura, resultados_val)` → dict listo para `POST /Drafts`. ```mermaid flowchart TD A["factura + resultados_val
(de validate_prices)"] --> B["ItemCode según fecha_emision:
C103002-A (mes anterior)
C103002 (mes actual)"] B --> B2["CardCode = PL + ruc_emisor
sapb1_manager.obtener_condicion_pago(CardCode)
(BusinessPartners.PayTermsGrpCode → PaymentTermsTypes)"] B2 --> B3["DocDueDate = fecha_contabilizacion (hoy) +
NumberOfAdditionalDays
(si es 0, NumberOfAdditionalMonths * 30)"] B3 --> C["Calcular cuotas
DocumentInstallments"] C --> D{"¿Tiene detracción?"} D -->|Sí| E["monto_detraccion = ceil(monto)
Cuota 1: monto_detraccion
U_VS_TIPOCUOTA = D
U_VS_TIPOSERVICIO = codigo + '02'"] E --> F["Cuota 2: neto = total - monto_detraccion
U_VS_TIPOCUOTA = N"] D -->|No| G["Cuota única por el total
U_VS_TIPOCUOTA = N"] F --> H["Por cada línea de factura (índice i)"] G --> H H --> I["guias_lt[] = resultados_val[i]['guias_lt']
(si no hay, se salta la línea)"] I --> K["Por cada item en guias_lt[]"] K --> L["PriceAfterVAT = draft_price
truncado a 6 decimales"] L --> M["Quantity = draft_quantity"] M --> N["Crear DocumentLine:
ItemCode, Quantity, PriceAfterVAT,
WarehouseCode, FreeText (descripción[:100]),
campos fijos U_* / Costing / TaxCode I18,
U_IDC_GRFLETE = tipo+serie-numero de la guía"] N --> K K --> P["U_IDC_VALREF = suma de valor_referencial
de las líneas del XML"] P --> Q["U_IDC_NUMGR = primera guía de la
última línea que tuvo guías"] Q --> R["Cabecera: DocType, DocDate = hoy,
DocDueDate, TaxDate = fecha_emision,
CardCode, NumAtCard, Comments,
U_VS_ANEXO_PDF / U_VS_ANEXO_XML
(rutas de red de copiar_a_red)"] R --> S["DocumentLines[] + DocumentInstallments[]"] S --> T["← Retornar dict para POST /Drafts"] ``` ## Notas - `draft_quantity` y `draft_price` los fija `validate_prices`: con `ok=True` salen de SAP (`int(max Quantity FL*)` y suma de `PriceAfterVAT` FL*); con `ok=False` salen del XML (`int(cantidad)` y `total_linea / cantidad`). Ver `validar_precios.md`. - El valor referencial del draft (`U_IDC_VALREF`) sale del XML SUNAT (`sunat_schema`), no de SAP. La comparación contra SAP (`Sp_ObtenerValorReferencial`, vía `hana_manager`) solo se muestra en el correo de notificación. - Las cuotas usan `fecha_emision` como `DueDate`; el vencimiento por condición de pago (`DocDueDate`) aplica solo a la cabecera. - Si `obtener_condicion_pago` no encuentra condición para el proveedor, `DocDueDate` = fecha de contabilización.