# CLAUDE.md

Comunicación con el usuario en **español**.

## Proyecto

`medis-tools` es un monorepo en Go con herramientas para Medis365. Cada herramienta vive en su propio subdirectorio (actualmente solo `exportador-expedientes/`). No hay tests.

Ruta del módulo: `gitlab.com/medis365/medis-tools`.

## Repos hermanos

- **medis-back** (`../medis-back`, checkout hermano) — backend CodeIgniter 3.2 / PHP ^8.4 / MySQL 8 (`utf8mb4_0900_ai_ci`). Define el esquema de BD que consultan las herramientas de este repo.
- **medis-web** (`../medis-web`, checkout hermano) — frontend React 16.14 / Material-UI v4 / Node.js 16 que consume medis-back.

## Comandos

```bash
make dev        # go run ./exportador-expedientes/ (uso local)
make exec       # compila (incremental) y corre el binario; es el que invoca medis-back
make tidy       # limpia go.mod / go.sum
```

Ambos propagan las variables `accion`, `db`, `modules`, `medic`, `password` como flags. **medis-back invoca `make exec`** (compila el binario y lo corre); `make dev` (go run) queda para uso local. Ejemplo: `make exec accion=exportar db=clinica_db modules=expedientes`.

**Verificar que compila**: `go vet ./...`. Evita `go build ./...`: el binario por defecto se llamaría `exportador-expedientes` y choca con el directorio de ese nombre (`build output ... already exists and is a directory`). Para producir binario usa `go build -o bin/exportador-expedientes ./exportador-expedientes/` o `make exec`.

Conexión MySQL y nombre de la base central se leen de `config.json` en la raíz (ignorado por git, obligatorio para acciones con BD; ver README). El nombre de la BD a exportar viene del flag `-db`. Zona horaria fija: Ciudad de México.

## Flujo de exportación

`accion=exportar` genera PDFs de clínica, médicos y pacientes; luego itera pacientes produciendo `{cod} - Expediente.pdf` y `{cod} - Caja.pdf`; empaqueta todo en `exportaciones/{db}.zip` y escribe `exportaciones/estatus.json`. `accion=estatus` solo devuelve ese JSON.

`exportar` **no** sobreescribe una exportación previa: si ya existe `exportaciones/{db}.zip` (marcador de exportación completada) aborta con `logFatal`; una carpeta `exportaciones/{db}/` sin zip es residuo de una corrida fallida y sí se limpia para permitir el reintento. `accion=eliminar` borra `exportaciones/{db}.zip` y la carpeta `exportaciones/{db}/` (para poder generar de nuevo); solo opera dentro de `exportaciones/`, nunca toca la carpeta de archivos fuente del cliente (`config.clientes_dir`), no lee `config.json` ni escribe `estatus.json`, e imprime `{"success":true,"db":...}` en stdout (error a stderr + exit≠0).

## Archivos clave (`exportador-expedientes/`)

| Archivo | Responsabilidad |
|---|---|
| `main.go` | Entrada, orquestación, construcción de registros |
| `db_helper.go` | MySQL, parseo de SQL embebido, ejecución de queries |
| `pdf_helper.go` | Generación de PDFs con fpdf |
| `*.sql` | Queries embebidas vía `//go:embed` |

## Convenciones no obvias

- **SQL embebido**: los `.sql` se parsean por bloques separados con un comentario `-- nombreQuery` al inicio de cada query. El resultado es un `map[string]string` referenciado por nombre.
- **Config y BD central**: `config.json` se lee solo en `exportar` (flujo que toca BD); `estatus` no lo requiere. Las queries referencian la base central como `CENTRAL.TABLA`; si `config.central` difiere de `CENTRAL`, se sustituye el prefijo `CENTRAL.` en las queries antes de ejecutarlas.
- **Columnas con prefijo `_`**: metadatos internos (p. ej. `_id`, `_sort`, `_detalle`, `_id_orden`, `_id_nota`, `_codigo`). Se filtran antes de renderizar en PDF y cumplen roles específicos en el layout (ordenamiento, agrupación, etiquetado).
- **Tablas embebidas en PDF**: dentro de un registro, un valor con tab-separated values se renderiza como tabla.
- **Fuente PDF**: LiberationSerif (4 variantes TTF embebidas desde `assets/`).
- **`logFatal()`**: antes de `os.Exit(1)` escribe `"ESTATUS": "ERROR"` en `estatus.json`. Úsalo siempre para fallos terminales — el frontend depende de ese estado.

## Estilo

- Go 1.26.2, tabs, LF, UTF-8.
- Binarios en `bin/`, salida en `exportaciones/` (ambos fuera de git).
- Texto visible al usuario final siempre en español.
- Variables de una sola letra solo para índices de bucle (`i`, `j`, `k`); en cualquier otro contexto, nombres descriptivos.
