Skip to content

Guía de uso

Esta guía cubre los flujos de trabajo más comunes. Si buscas la referencia completa de comandos ve a CLI Reference.

Flujo básico: descargar normas de una institución

Section titled “Flujo básico: descargar normas de una institución”

El flujo estándar para empezar a trabajar con una institución nueva:

  1. Buscar la institución por nombre

    Terminal window
    python bcn_cli.py instituciones list --search "contraloria"

    Ejemplo de salida:

    ID Nombre
    ---- ------------------------------------------
    42 Contraloría General de la República
  2. Ver las normas disponibles sin descargar

    Terminal window
    python bcn_cli.py normas list 42 --limit 20
  3. Sincronizar un subset inicial

    Terminal window
    python bcn_cli.py normas sync 42 --limit 50
  4. Verificar con stats

    Terminal window
    python bcn_cli.py stats

La búsqueda usa PostgreSQL FTS con diccionario español, lo que significa que busca por raíces de palabras, no solo texto exacto.

Terminal window
# Busca "ambiental", "ambientales", "medioambiente", etc.
python bcn_cli.py normas search "medio ambiente"
# Limitar resultados
python bcn_cli.py normas search "decreto supremo" --limit 5

BCN Extractor detecta cambios automáticamente via hash MD5. Si corres sync dos veces sobre la misma institución, la segunda vez solo actualiza las normas que cambiaron:

Terminal window
# Primera vez: descarga todo
python bcn_cli.py normas sync 42
# Segunda vez: solo actualiza lo que cambió (mucho más rápido)
python bcn_cli.py normas sync 42

Para forzar la re-descarga de todo aunque no haya cambios detectados:

Terminal window
python bcn_cli.py normas sync 42 --force

Sincronizar múltiples instituciones con el Scheduler

Section titled “Sincronizar múltiples instituciones con el Scheduler”

El Scheduler permite programar la sincronización automática de cualquier conjunto de instituciones como un proceso independiente en background, sin bloquear la terminal.

Terminal window
# Iniciar el scheduler para las instituciones 17, 42 y 1041
python bcn_cli.py scheduler start --inst 17,42,1041
# Con horario específico (2:00 AM UTC, solo días de semana)
python bcn_cli.py scheduler start --inst 17,42 --hora 2 --minuto 0 --dia mon-fri
# Ver estado
python bcn_cli.py scheduler status
# Ver jobs y su último resultado
python bcn_cli.py scheduler list
# Agregar una institución sin reiniciar el scheduler
python bcn_cli.py scheduler add 89 --hora 3
# Detener
python bcn_cli.py scheduler stop

Los logs se escriben en logs/scheduler.log y el estado de cada ejecución queda en la tabla scheduler_jobs.


El pipeline NLP es una etapa opcional que corre después del sync. Extrae referencias entre normas, entidades nombradas (organismos, personas, lugares) y obligaciones con sus plazos.

Terminal window
# Analizar todas las normas ya sincronizadas de una institución
python bcn_cli.py nlp analizar-institucion 17
# Limitar el batch para empezar
python bcn_cli.py nlp analizar-institucion 17 --limit 50
# Re-analizar normas que ya tienen análisis
python bcn_cli.py nlp analizar-institucion 17 --forzar
Terminal window
# Referencias normativas que cita la norma (y su estado de resolución)
python bcn_cli.py nlp referencias 206396
# Grafo inverso: quién cita a esta norma
# (disponible en la TUI, tab "Citado por")
# Entidades nombradas, filtradas por tipo
python bcn_cli.py nlp entidades 206396 --tipo organismo
# Obligaciones detectadas
python bcn_cli.py nlp obligaciones 206396 --con-plazo

A medida que sincronizas más instituciones, las referencias que apuntaban a normas aún no descargadas se pueden vincular:

Terminal window
python bcn_cli.py nlp resolver

El tab NLP de la TUI muestra el análisis completo de la norma seleccionada, organizado en cuatro sub-tabs: Referencias, Citado por, Entidades y Obligaciones. Se actualiza automáticamente al cambiar de norma en el tab principal.


Levanta el servidor:

Terminal window
fastapi dev api/main.py
# o con uvicorn para producción:
uvicorn api.main:app --host 0.0.0.0 --port 8000

Luego puedes consultar la API directamente:

Terminal window
# Listar normas (paginado)
curl "http://localhost:8000/normas/?limit=10&offset=0"
# Buscar
curl "http://localhost:8000/normas/buscar/medio%20ambiente"
# Norma específica (live desde BCN)
curl http://localhost:8000/normas/1234567
# Normas de una institución (desde DB)
curl "http://localhost:8000/instituciones/17/normas?limit=20"
# Filtrar por estado
curl "http://localhost:8000/normas/estado/vigente"
# Filtrar por rango de fechas
curl "http://localhost:8000/normas/rango?start_date=2023-01-01&end_date=2023-12-31"

La documentación interactiva está en http://localhost:8000/docs.

Cada descarga y sincronización queda registrada en la tabla descargas. Puedes consultarla directo en PostgreSQL:

-- Últimas 20 operaciones
SELECT id_norma, tipo_descarga, estado, fecha_intento, error_mensaje
FROM descargas
ORDER BY fecha_intento DESC
LIMIT 20;
-- Solo errores
SELECT * FROM descargas
WHERE estado = 'error'
ORDER BY fecha_intento DESC;

O conéctate con cualquier cliente PostgreSQL (TablePlus, DBeaver, psql) usando las credenciales de tu .env.

Las normas descargadas se guardan en disco además de en la base de datos:

TipoRuta
XML originaldata/xml/<id_norma>.xml
Markdown generadodata/md/<id_norma>.md
Logsdata/logs/
Cachédata/cache/

Los archivos XML son el respaldo auditable — si el parser cambia en el futuro, puedes re-procesar sin volver a descargar desde la BCN.