# CLAUDE.md — Intranet FESAEM

Intranet de la **Federación Santafesina de Entidades Mutualistas** para la Federación y sus mutuales asociadas. Toda la comunicación y la UI en **español** (con acentos correctos).

## Stack
Laravel 13 · Livewire 4 · Pest 4 · Bootstrap 5.3 + `public/css/fesaem.css`. DB: MySQL (prod) / SQLite `:memory:` (tests) / `database.sqlite` (dev).

## Entorno de desarrollo (Windows + Laravel Herd)
PHP/Composer no están en el PATH del sistema. **Prefijar** todo comando:
```bash
export PATH="$HOME/.config/herd/bin:$PATH"
php.bat artisan test          # correr tests
php.bat artisan migrate        # migrar dev
```
Nunca usar comandos interactivos (cuelgan). `--filter="A|B"` rompe (cmd interpreta `|`): pasar archivos por ruta.

## Tests
Pest, **333 pasando**. Correr toda la suite tras cada cambio. Los tests usan SQLite en memoria + `RefreshDatabase`.

**Dev**: servir por Herd en `http://fesaem.test` (`herd link fesaem`), **no** `artisan serve` (un solo hilo en Windows → cuelga las subidas de Livewire).

## Convenciones de código
- **Roles** (`users.rol`): `admin` | `directivo` | `mutual`. Helpers `esAdmin/esMutual/esDirectivo/puedeGestionar()` (=admin||directivo). Middlewares: `admin` (SoloAdmin, acepta puedeGestionar), `mutual` (SoloMutual).
- **Multi-tenancy**: trait `PerteneceAMutual` + `MutualScope` (global scope filtra por `mutual_id`; gestión bypassa). Al leer datos de todas las mutuales de forma anónima, usar **query builder** sin exponer `mutual_id` (ver `RespuestasPublicas`).
- **Fotos** (galería): tabla por módulo (`evento_fotos`, `convenio_fotos`, `comunicado_fotos`) + controller autorizado que las sirve **inline** desde disco privado `local` (403 si no corresponde; autoriza antes de chequear existencia).
- **Documentos/adjuntos**: modelo **polimórfico** `Adjunto` (morphMany) reutilizado por Consulta, Respuesta y Comunicado. Descarga por `DescargaAdjuntoController` (autoriza según el dueño).
- **Estados tipo Evento** (borrador/publicado/archivado): patrón repetido en Evento, Convenio, Comunicado (scopes `publicados`/`visiblesPara`).
- Diseño: sistema **"Aurora mutualista"** en `fesaem.css` (navy #1b2a63 + espectro de 7 colores, `--spectrum-soft`). Encabezados de página con `<x-page-header>`. No animar propiedades de layout (usar transform/opacity).

## Flujo de trabajo
Feature en rama propia → TDD → **revisión final adversarial** (subagente) → merge `--no-ff` a `master` → borrar rama. Pulidos de diseño van directo a `master`. Trailer de commit:
```
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
```
Specs en `docs/superpowers/specs/`, planes en `docs/superpowers/plans/` (ver `docs/README.md`).

## Demo (dev)
`php.bat artisan serve` → `/login`.
Admin: `admin@federacion.test` / `Federacion.2026` · Mutual: `socio@mutualejemplo.test` / `Mutual.2026` (seeder `DemoSeeder`).
Si aparece "no such table X": la DB dev está atrasada → `migrate` (+ `db:seed --class=DemoSeeder`).

## Módulos (todos en master)
Auth/roles · Multi-tenancy · ABM Mutuales (perfil, servicios, logo, usuarios) · Comunicados (segmentados + fotos/documentos, feed) · Consultas (adjuntos, estados, editable) · Respuestas públicas (anónimas, base de conocimiento) · Eventos (feed tipo nota + galería) · Convenios/servicios de la Federación (precio/costo/modalidad + adhesión con historial) · Documentos · Estadísticas (incl. avance por servicio + punto de equilibrio) · Reuniones de Consejo Directivo (temario, resolución, integrantes, acta, buscador) · Consejo Directivo (ABM + página institucional; miembros con usuario `directivo` para reuniones) · Cuota Societaria (cuota mensual desglosada = base + servicios; `GeneradorCuotas` por período; escalas por cantidad de socios; la mutual informa el pago con comprobante, la Federación confirma) · Vencimientos INAES (globales de la Federación + propios de cada mutual; la mutual informa la presentación con comprobante, la Federación confirma) · Consultas/Trámites (`consultas.tipo` consulta|tramite; el trámite tiene workflow iniciado→en_proceso→resuelto/rechazado) · Calendario mensual unificado (eventos + reuniones + vencimientos + cuotas, según el rol) · Notificaciones.

**Padrón real** (`PadronFesaemSeeder`, datos en `database/data/padron_fesaem.php` generado desde el Excel oficial): 152 mutuales federadas + Consejo Directivo (24) + 4 servicios reales (Firma Electrónica, Asesoramiento UIF, Chatbot, Auditoría Seg. Informática) con sus adhesiones. El `DemoSeeder` lo invoca. Los miembros del consejo con email se crean como usuarios `directivo` (pass temporal, cambio obligatorio).
