# novasis-soporte-ia

Agente de IA para soporte de Novasis ERP. Es un servicio **aislado**:
- no cambia código del backend del ERP;
- lee la base del ERP **solo a través de vistas** (`soporte_ro`), con un rol de solo lectura propio;
- valida la sesión con el mismo `JWT_SECRET` del ERP.

El diseño completo, las decisiones y el estado de cada fase están en [docs/plan-agente-soporte.md](docs/plan-agente-soporte.md).

## Puesta en marcha

1. **Roles y vistas en la base del ERP.** En un server (test o prod), un solo comando que corre como root y genera la contraseña de `soporte_ia` en el propio server (`/root/.soporte_ia_pw`):

   ```bash
   scp -r db <server>:/tmp/soporte-ia-db
   ssh <server> 'bash /tmp/soporte-ia-db/aplicar-en-servidor.sh <base> && rm -rf /tmp/soporte-ia-db'
   ```

   En local, a mano con un superusuario:

   ```bash
   psql -d <base_erp> -v soporte_ia_password="'<contraseña>'" -f db/roles.sql
   psql -d <base_erp> -f db/vistas/aplicar.sql
   psql -d <base_erp> -f db/vistas/verificar.sql   # todo ok=true / "ok:"
   ```

2. **Configuración.** Copiar `.env.example` a `.env` y completar `ERP_DATABASE_URL` (rol `soporte_ia`), `JWT_SECRET` y `HOLDING_EMPRESA_ID` (los dos últimos, iguales a los del backend). El servicio **no arranca** si el rol de la base es superusuario o tiene `BYPASSRLS`.

3. **Ejecutar:**

   ```bash
   pnpm install
   pnpm start:dev
   curl localhost:3020/api/v1/health
   ```

## Pruebas

```bash
pnpm test            # unitarias: normalizador, clasificador de mensajes SIFEN, diagnóstico
pnpm test:db         # contra una base real con roles y vistas (necesita ERP_ADMIN_DATABASE_URL LOCAL)
pnpm typecheck       # SWC compila con errores de tipos: correr antes de cada deploy
pnpm lint
```

## Golden set y reporte

- `pnpm golden`: compuerta antes de cambiar un prompt, un modelo o el effort (plan §9.2). Usa las respuestas marcadas como correctas en el reporte.
- `pnpm barrido`: diagnostica todos los documentos de la copia local y muestra cómo se reparten las situaciones.
- El reporte (`/api/v1/reporte/*`) responde solo al superadmin de la empresa holding.

## Si un deploy del ERP falla por las vistas

Postgres no deja borrar ni cambiar el tipo de una columna que usa una vista. Si `prisma migrate deploy` del backend falla con *"cannot alter type of a column used by a view"* o similar:

```bash
psql -d <base_erp> -c 'DROP SCHEMA soporte_ro CASCADE;'   # las vistas no guardan datos
# correr prisma migrate deploy en el backend
psql -d <base_erp> -f db/vistas/aplicar.sql               # (corregir la vista si la columna cambió)
psql -d <base_erp> -f db/vistas/verificar.sql
```

Después de `DROP SCHEMA` hay que volver a correr `db/roles.sql`, porque el esquema y sus permisos se crean ahí.
