tecsas3 batch run ejecuta una secuencia de operaciones contra la API TecsaS3 desde un archivo JSON. Es la vía oficial para ingestar datos en masa (migraciones, cargas iniciales, sincronización con sistemas legados) sin escribir un script de bash que concatene llamadas. Internamente cada item se enruta a una operación del CLI (<recurso>.<acción>, ver cli/src/tecsas3_cli/resources/batch.py:141-201).

Formatos aceptados

_parse_batch() (batch.py:106-138) acepta tres variantes:
  1. JSON array — un array de objetos, uno por operación.
  2. JSON Lines (JSONL) — un objeto JSON por línea.
  3. JSON object con clave operations — el resto del objeto se ignora.
El primer formato es el recomendado para tecsas3 por su legibilidad en git diffs. Los otros dos son útiles cuando la fuente de datos ya emite JSONL (logs, exports de otros sistemas).

Esquema de cada item

Cada operación es un objeto JSON con esta forma mínima:
op también acepta la clave alternativa "operation". El payload se pasa tal cual al endpoint HTTP subyacente. Las operaciones soportadas hoy (batch.py:151-161) son:

Ejemplo: 3 pacientes en un archivo

Guarda el siguiente contenido como pacientes.json:

Ejecución

Salida

La respuesta de batch run es siempre un objeto JSON con esta estructura (batch.py:88-97):
Si --stop-on-error está activo y se produce un fallo:
Cada item del batch se ejecuta con el mismo token, el mismo tenant y la misma configuración que la invocación principal. Eso tiene dos consecuencias operativas: un fallo de autenticación (token expirado, 401) o de tenant (403 tenant_context_required) aborta todo el batch, porque el orquestador no puede re-autenticarse a mitad de un lote. Antes de lanzar un batch grande, valida el contexto con tecsas3 auth whoami y comprueba que la membresía siga activa.

Flags y comportamiento

El exit_code del proceso es 0 si todos los items se ejecutaron sin error. Si hubo al menos un fallo, se eleva TecsaError(code="BATCH_FAILED") con details.first_error apuntando al primer fallo — útil para cortar pipelines en CI.

Patrones de uso

Carga inicial con conteo de progreso

Idempotencia con paciente.get previo

Cuando un batch es re-ejecutable, valida primero con un paciente.get por ID antes de intentar paciente.create. Esto convierte la operación en idempotente:

Batch + Pipeline

Combina batch run con pipe run para ingestar en un tenant y disparar notificaciones en otro. El placeholder ${batch_run.results[0].result.id} propaga el ID creado.

Errores frecuentes

Próximos pasos

  • Para workflows con dependencias entre steps (output de A alimenta a B), usa pipe run en su lugar.
  • Versiona los archivos batch en git y valida el formato en CI con jq . pacientes.json.
  • Para datasets grandes (>1k items), divide en chunks de 100 y usa --continue-on-error con checkpoints por índice.

Referencias

  • cli/src/tecsas3_cli/resources/batch.py:26-103batch_run (loop principal)
  • cli/src/tecsas3_cli/resources/batch.py:106-138_parse_batch() (formatos aceptados)
  • cli/src/tecsas3_cli/resources/batch.py:141-201_execute_op() (mapa recurso.acción)
  • cli/src/tecsas3_cli/resources/paciente.py:260-312paciente create (esquema del payload)