se agrega fallback OWTR y calculo de fecha de vencimiento por condicion de pago

- 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>
This commit is contained in:
georgeandClaude Sonnet 5 committed 2026-09-10 13:21:04 -05:00
1 parent 6b0ed6f519
commit 15e3b5079c
231 files changed
+21421 -475

No files matched your search

Executable → Regular
+6 -6
View File
@@ -11,7 +11,7 @@ from datetime import datetime, timedelta
from dotenv import load_dotenv
import database_utilities
import logger_utilities
import logger_manager
from pipeline import _procesar_un_correo, step_authenticate
@@ -45,13 +45,14 @@ def get_email_by_id(user_email: str, token: str, message_id: str) -> dict | None
# PIPELINE PARA IDS
# ============================================================================
def run_pipeline_for_ids(ids: list[str]) -> None:
load_dotenv(dotenv_path=".env.dev")
# Ruta absoluta: no depende del directorio de trabajo desde el que se lance el proceso
load_dotenv(dotenv_path=os.path.join(os.path.dirname(__file__), ".env"))
email_addr = os.getenv("EMAIL", "")
download_folder = os.getenv("DOWNLOAD_FOLDER", "adjuntos")
output_folder = os.getenv("OUTPUT_FOLDER", "resultado")
if not email_addr:
print("❌ EMAIL no configurado en .env.dev")
print("❌ EMAIL no configurado en .env")
return
database_utilities.init_db()
@@ -96,13 +97,12 @@ if __name__ == "__main__":
print(f"\n📋 Set: {args.set} — {descripcion}")
print(f" IDs a procesar: {len(ids)}")
log_path = logger_utilities.setup_logger()
logger_utilities.limpiar_logs_antiguos(dias=30)
logger_manager.setup_logging()
inicio = datetime.now()
print("\n" + "=" * 60)
print(f"🚀 INICIO DE EJECUCIÓN: {inicio.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"📄 Log guardado en: {log_path}")
print(f"📄 Log guardado en: {logger_manager.LOG_FILE}")
print("=" * 60)
run_pipeline_for_ids(ids)