Programación y cargas
Carga inicial vs incremental diaria, entidades opcionales, rangos históricos y ejemplo de cronograma.
Una vez implementado el adapter y los módulos sync, los jobs se ejecutan manualmente durante el onboarding y luego se automatizan. Podés usar el Programador de tareas de Windows, cron, systemd, Ansible Semaphore, CI o Docker según tu entorno.
Antes de programar nada, revisá Inicio rápido, los flags CLI y, si empaquetás ejecutables, CI / PyInstaller.
Los comandos exactos dependen de tu sync_registry.py. Las tablas siguientes cubren el template estándar y extensiones habituales en proyectos cliente.
Tres modos de carga
| Modo | Flags | Cuándo |
|---|---|---|
| A. Sin filtro de fechas | Sin -from / -to | Las vistas o consultas de tu fuente ya están acotadas al período acordado, o querés refrescar todo lo que devuelve la fuente hoy |
| B. Onboarding histórico | -from YYYYMMDD -to YYYYMMDD (rango amplio) | Primera carga productiva de un período definido (ej. 2 años de tickets) |
| C. Incremental diaria | -from y -to (misma fecha) | Jobs programados después del onboarding |
Importante: omitir fechas no significa automáticamente “todo el histórico”. Significa que tu adapter corre sin filtro de fechas y trae lo que devuelve la consulta o vista en ese momento. Acordá con Brightmarket la ventana de onboarding antes de la primera carga.
Podés acotar los datos de dos formas — elegí una por entidad y mantené consistencia:
- En el script: pasá
-fromy-tocon el rango acordado. - En la fuente: filtrá en vistas o SQL para que, aun sin fechas en el CLI, solo salga el período acordado.
Reglas de fechas:
-fromy-toson un par: si usás uno, el otro es obligatorio.- Formato siempre
YYYYMMDD. - Ejecutá
-testantes de cualquier carga productiva.
Entidades opcionales
Solo ejecutá y programá lo que tu cliente implementa. Si un comando no aplica, omitilo — evita confusiones en onboarding.
| Comando | ¿Opcional? | Cuándo omitir |
|---|---|---|
-rewards | Sí | No hay campañas de rewards en la fuente |
-points_movements | Sí | No hay programa de puntos / loyalty |
-stock_adjustments | Sí | No hay sync de stock absoluto desde la fuente |
-set_points_balance | Sí | No hay programa de puntos; migración única |
-purchaseorders | Sí | El cliente no usa órdenes de compra |
-reposition_orders | Sí | El cliente no usa órdenes de reposición |
-weekly_promos | Sí | El cliente no usa promos semanales |
-pricings extendido | Sí | No hay sync de precios separada |
Entidades núcleo en la mayoría de clientes: -payment_methods o -accepted_payment_methods, -clients, -skus, -promotions, -tickets.
Onboarding histórico (ejemplo: 2 años de tickets)
Un requisito habitual es cargar ~2 años de tickets, con clientes, SKUs y promociones alineados a ese mismo período. En ese caso usá el modo B con un rango amplio — no hace falta una “carga completa sin fechas”.
python -m src.main -test
# Ejemplo: últimos 2 años (ajustá fechas a tu ventana de onboarding)
python -m src.main -clients -from 20240619 -to 20260619
python -m src.main -skus -from 20240619 -to 20260619
python -m src.main -promotions -from 20240619 -to 20260619
# Preferí -file para onboarding histórico (un JSONL + import async)
python -m src.main -tickets -file -from 20240619 -to 20260619Las entidades relacionadas deben cubrir la misma ventana de negocio que los tickets: clientes, SKUs y promociones referenciados en esos tickets tienen que existir en Brightmarket antes o durante la carga de tickets.
Orden típico: medios de pago → clientes → SKUs → promociones → tickets. Cada paso puede usar el mismo rango de fechas en lugar de omitir fechas.
Para cargas históricas grandes de tickets, usá -tickets -file (escribe temp/tickets-….jsonl y lo sube a tickets/import/upload). Con -generate-only solo genera el archivo. El default -tickets (sin -file) sigue enviando un POST por ticket.
Si el rango es muy grande, partilo en trozos (por mes o trimestre) con el mismo patrón de -from/-to.
Carga inicial (onboarding)
Seguí este orden durante la puesta en marcha. Las filas extendido aplican solo si tu proyecto registra ese comando en sync_registry.py.
| Paso | Comando | Opcional | Opciones de ejecución inicial | Notas |
|---|---|---|---|---|
| 0 | -test | No | una vez | Solo conectividad |
| 1 | -payment_methods o -accepted_payment_methods | No | sin fechas o según tu fuente | Antes de tickets y promociones |
| 2 | -branch_offices extendido | Sí | -branch_offices 001,002 | Si aplica |
| 3 | -clients | No | sin fechas o -from … -to … | Ventana de onboarding acordada |
| 4 | -update_clients extendido | Sí | sin fechas o -from … -to … | Si separás altas de modificaciones |
| 5 | -skus | No | sin fechas o -from … -to … | Alinear con ventana de tickets |
| 6 | -promotions | No | sin fechas o -from … -to … | Puede ser pesado; monitoreá runtime |
| 7 | -rewards | Sí | sin fechas o -from … -to … | Solo si aplica |
| 8 | -points_movements | Sí | sin fechas o -from … -to … | Solo con programa de puntos |
| 9 | -set_points_balance extendido | Sí | una vez | Migración única; no programar |
| 10 | -tickets | No | sin fechas o -from … -to …; preferí -file en históricos | Después de clientes, SKUs y medios de pago |
| 11 | -pricings extendido | Sí | sin fechas o -from … -to … | Solo si aplica |
| 12 | -purchaseorders extendido | Sí | sin fechas o -from … -to … | Solo si aplica |
| 13 | -reposition_orders extendido | Sí | sin fechas o -from … -to … | Solo si aplica |
No programes jobs diarios hasta que la carga inicial de cada entidad (en la ventana acordada) haya terminado correctamente y los datos se vean bien en Brightmarket.
Carga diaria (programada)
Después del onboarding, usá el modo C: misma fecha en -from y -to.
python -m src.main -clients -from 20260619 -to 20260619| Comando | Ejemplo programado | Soporta fechas | Patrón diario |
|---|---|---|---|
-clients | -clients -from 20260619 -to 20260619 | Sí | Incremental del día |
-update_clients extendido | -update_clients -from 20260619 -to 20260619 | Sí | Incremental del día |
-skus | -skus -from 20260619 -to 20260619 | Sí | Incremental del día |
-tickets | -tickets -from 20260619 -to 20260619 | Sí | A menudo el día anterior en horario madrugada |
-promotions | -promotions -from 20260619 -to 20260619 | Sí | Incremental del día |
-rewards | -rewards -from 20260619 -to 20260619 | Sí | Solo si aplica |
-points_movements | -points_movements -from 20260619 -to 20260619 | Sí | Solo si aplica |
-pricings extendido | -pricings -from 20260619 -to 20260619 | Sí | Solo si aplica |
-purchaseorders extendido | -purchaseorders -from 20260619 -to 20260619 | Sí | Solo si aplica |
-reposition_orders extendido | -reposition_orders -from 20260619 -to 20260619 | Sí | Solo si aplica |
-payment_methods | -payment_methods | No | Carga completa; no es diaria |
-accepted_payment_methods extendido | -accepted_payment_methods 001,002,... | No | Cuando cambien sucursales o métodos |
-weekly_promos extendido | -weekly_promos | No | Semanal; solo si aplica |
-branch_offices extendido | -branch_offices 001,002,... | No | Bajo demanda |
-set_points_balance extendido | no programar | No | Migración única |
Qué fecha pasar (hoy vs ayer) es una decisión de negocio: alineala con cómo filtra tu adapter y cuándo la fuente cierra los datos del día.
Ejemplo de cronograma diario
Programá solo las entidades que usa tu cliente — omití filas opcionales si no aplican.
Horarios de referencia para repartir carga sobre la BD y la API:
| Tarea (ejemplo) | Horario | Comando diario |
|---|---|---|
| Clientes | 00:30 | -clients -from YYYYMMDD -to YYYYMMDD |
| Tickets | 01:00 | -tickets -from YYYYMMDD -to YYYYMMDD |
| Órdenes de reposición (opcional) | 04:00 | -reposition_orders -from YYYYMMDD -to YYYYMMDD |
| SKUs | 18:00 | -skus -from YYYYMMDD -to YYYYMMDD |
| Precios (opcional) | 18:30 | -pricings -from YYYYMMDD -to YYYYMMDD |
| Promociones | 19:00 | -promotions -from YYYYMMDD -to YYYYMMDD |
| Órdenes de compra (opcional) | 21:00 | -purchaseorders -from YYYYMMDD -to YYYYMMDD |
| Rewards (opcional) | 22:00 | -rewards -from YYYYMMDD -to YYYYMMDD |
| Promos semanales (opcional) | Mar 08:00 | -weekly_promos (semanal, sin fechas) |
Recomendaciones:
- Escaloná los jobs para reducir contención en BD y API.
- Una tarea por entidad facilita monitoreo y reintentos.
- No actives la programación diaria hasta completar y verificar la carga inicial de esa entidad.
Fechas dinámicas en el programador
En lugar de hardcodear la fecha en cada tarea, usá un script wrapper que calcule YYYYMMDD y llame a python -m src.main.
Bash (Linux / macOS / cron):
#!/usr/bin/env bash
set -euo pipefail
cd /ruta/a/tu/proyecto
source .venv/bin/activate
DATE=$(date +%Y%m%d)
python -m src.main -clients -from "$DATE" -to "$DATE"Para sincronizar el día anterior:
DATE=$(date -d "yesterday" +%Y%m%d) # GNU date
# macOS: DATE=$(date -v-1d +%Y%m%d)
python -m src.main -tickets -from "$DATE" -to "$DATE"PowerShell (Windows Task Scheduler):
Set-Location C:\ruta\a\tu\proyecto
$date = Get-Date -Format "yyyyMMdd"
& .\.venv\Scripts\python.exe -m src.main -clients -from $date -to $dateEn cualquier programador:
- Definí el directorio de trabajo del proyecto.
- Activá el entorno virtual o usá el ejecutable PyInstaller.
- Asegurate de que
.envesté disponible (misma carpeta o variables del sistema).
Operación, backfill y reprocesos
El onboarding histórico (modo B) y el reproceso/backfill usan el mismo mecanismo: -from y -to con un rango amplio. La programación diaria (modo C) empieza solo cuando la ventana acordada está cargada y verificada en Brightmarket.
- Logs: el runner del SDK escribe en archivos de log; configurá el prefijo en
main.pyconconfigure_logging. - Fallos: revisá el código de salida del proceso; configurá reintentos y alertas según tu plataforma.
- Rangos grandes: partí en meses o trimestres si una sola corrida es demasiado pesada.
- Orden de entidades: consultá la Guía de implementación para dependencias entre syncs.