# Traspaso a Claude Code

Este documento es el punto de partida en Claude Code. `CLAUDE.md` tiene el contexto técnico permanente; aquí van el estado actual y el plan de trabajo en orden.

## Primer mensaje para Claude Code

> Lee CLAUDE.md, PARA_CLAUDE_CODE.md y servidor/DESPLIEGUE.md. Revisa la estructura del proyecto y dime qué necesitas para probar el modo servidor en esta computadora. Después empezamos con la tarea 1 del plan.

## Estado al 8 de octubre de 2026

**Ya funciona y está probado** (MariaDB 10.11 + PHP 8.3):

- **Plano:** leído del DWG del 29/08/2026, con 12,444 parcelas en su contorno real y 123 sectores.
- **Versiones del plano:** índice en `plano/versiones.json`, comparación entre versiones y reporte de cambios.
- **Base de datos:** tablas `ub_*` e importador que conserva el id de cada parcela entre versiones del DWG.
- **API** (`servidor/api.php`):
  - lectura del plano, con ETag;
  - guardado de sectores, vendedores y calibración GPS;
  - importación de versiones del plano.
- **Subir un plano nuevo desde la computadora al servidor:** `python3 scripts/actualizar_plano.py plano.dwg --publicar`.
- **Acceso por claves:** lectura (personal del parque), edición (supervisores) e importación (solo el script). Sin clave, la app muestra una pantalla de acceso.
- **App:**
  - búsqueda tolerante a errores;
  - capas, con los vendedores ocultos;
  - editor de sectores con lazo;
  - capa de cambios del plano;
  - guía GPS y calibración.

**Lo que todavía no está:**

- Los fallecidos reales. Hoy hay 0, o 2,407 de ejemplo si se cargan con `--ejemplos`.
- El login con Google de Control de Planta. Por ahora se entra con claves.
- La protección completa del plano. Ver la tarea 1.

## Plan de trabajo, en orden

### 1. Que nadie pueda llevarse el plano completo

Hoy el servidor ya no regala la página: `servidor/index.html` no trae datos, y sin clave la API responde 403. **Pero quien entra con clave recibe el plano entero en una sola petición** (`accion=plano`, unos 2 MB). Además, la app descarga la lista completa de fallecidos para buscar en el navegador. Lo que falta:

1. **Login con Google** usando la sesión de Control de Planta. Reemplaza `ub_puede_editar()` y `ub_puede_leer()` en `api.php` por la revisión de la sesión, con roles: personal (leer) y supervisor (editar).
2. **Búsqueda en el servidor.** Nuevo `accion=buscar&q=…&anio=…&cerca=…`, que devuelve como máximo 30 resultados. Hay que llevar a PHP la búsqueda tolerante de la app (funciones `strip`, `phon`, `lev1` y `score`), con una columna `nombre_fonetico` indexada en `ub_fallecido`. La app deja de recibir `people` completo.
3. **Plano por zonas.** Al importar, partir el dibujo en cuadros de 25 m (tabla `ub_dibujo_zona`: `version_id`, `zx`, `zy`, `json`). Nuevo `accion=zona&zx=…&zy=…`; la app pide solo los cuadros que están en pantalla. Con el mapa alejado, se manda una vista general simplificada: muros, sectores y nombres de jardín, sin números ni rótulos. La app hoy usa los arreglos globales `TXT` y `LOT` para dibujar, buscar, el editor y la capa de cambios. Hay que cambiarlos a cachés por zona, y conviene ir por partes probando cada función.
4. **Límite de peticiones y bitácora de accesos:** quién pidió qué zonas y cuántas. Si una sesión pide muchas zonas en poco tiempo, se bloquea un rato.
5. **Sin caché en el navegador ni modo sin conexión** para los datos del plano (`Cache-Control: no-store` en `zona` y `buscar`).

Límite honesto: lo que se ve en pantalla siempre se puede fotografiar o capturar. El objetivo es que nadie pueda descargar un archivo con el plano completo y usarlo sin el servidor, no impedir una captura de pantalla.

### 2. Cargar los fallecidos reales

**Avance 8/10/2026:** hecho `scripts/inhumados.mjs` (lee PDF + Excel y cruza con el plano) y `servidor/importar_fallecidos.php` (columnas nuevas en `ub_fallecido`; sin probar contra MariaDB todavía). De 17,170 registros: 12,133 ubicados exactos, 91 por cuenta SOF, 1,043 aproximados (sector hermano o fracción sin letra), 1,217 ambiguos, 2,037 sin parcela, 373 con sector que no está en el plano (C01–C11, MAC, JAR, 000…), 276 sin sector/fracción. El detalle queda en `plano/inhumados/reporte.md`. Pendiente: revisar con Adiel los sectores con muchas faltas (89, 95, 97, 101, 2, 5A: el plano tiene pocas parcelas asignadas a ellos) y qué significan C01–C11, MAC, JAR, MO y 000; decidir cómo marcar los trasladados (la fila vieja sigue en el registro).


- Adiel exporta el registro actual a CSV.
- Script `servidor/importar_fallecidos.php`:
  - resuelve sector + lote → `parcela_id`;
  - guarda la cuenta SOF;
  - genera un reporte de filas sin ubicar, con sector inexistente o con número repetido dentro del sector (hay unos 1,250 casos en el plano).
- Opcional: cruzar la cuenta SOF con los rótulos del plano, que dicen qué SOF está en qué ficha, para resolver ambigüedades.

### 3. Pantalla de fallecidos

Alta, edición y traslado de parcela, solo para supervisores, con bitácora. Desde la ficha de una parcela: "Agregar fallecido aquí".

### 3b. Georreferencia sobre satélite (hecho 8/10/2026)

Botón **Satélite** en el mapa y panel **Ajustar sobre satélite**: pares de puntos plano/foto, ajuste fino con flechas y carga de KML/GeoJSON de Google Earth o My Maps. Usa Esri World Imagery; con `UB.googleTilesKey` (Map Tiles API) usa las imágenes de Google. Falta: que Adiel haga el ajuste real con 3–4 puntos y luego afinarlo en campo con Calibrar GPS.

### 4. Despliegue

Seguir `servidor/DESPLIEGUE.md`:

- subdominio con https;
- `config.php` con claves largas;
- importar el plano con `--publicar`;
- calibrar el GPS en campo con dos puntos;
- incrustar con `<iframe allow="geolocation">` o como módulo de Control de Planta.

### 5. Fase 2: memorial digital

Foto, muro de recuerdos, audios y código QR en la lápida que abra la ficha pública del fallecido. Esto requiere una vista pública separada que muestre solo esa ficha, nunca el plano.

## Reglas para trabajar en este proyecto

- `servidor/index.html` y `vista_local/index.html` se generan con `python3 scripts/armar_app.py`; se edita `app/plantilla.html`.
- **`vista_local/` nunca se sube al hosting:** trae el plano completo adentro.
- `servidor/config.php` y `plano/publicar.json` tienen claves: no van a Git.
- En Hostwinds, las llamadas a la API van en secuencia, no en paralelo.
- Entregar a Adiel ZIP de parche con solo los archivos modificados.
- Probar cada cambio en el navegador antes de darlo por hecho.
