# FichajeApp

Plataforma interna de fichaje y gestión laboral:

- **Fichaje de entrada/salida**, restringido al dispositivo vinculado de cada empleado.
- **Login con Office 365** (Microsoft Entra ID) — sin contraseñas propias.
- **Horas del curso**: horas trabajadas vs. horas objetivo del curso escolar.
- **Calendario laboral**: festivos y días no lectivos.
- **Nóminas**: cada empleado descarga las suyas; RRHH las sube.
- **Permisos**: solicitud y flujo de aprobación.
- **Auditoría**: todo fichaje, permiso y cambio de nómina queda registrado.

## 1. Requisitos

- Node.js 20+ (ya instalado en este equipo).
- Una cuenta de administrador en vuestro tenant de Microsoft 365 / Azure AD (Entra ID) — necesaria una sola vez, para el paso 2.

## 2. Registrar la app en Microsoft Entra ID (una sola vez)

Esto permite que los empleados inicien sesión con su cuenta de Office 365 del centro.

1. Ve a [entra.microsoft.com](https://entra.microsoft.com) e inicia sesión como administrador.
2. **Identity → Applications → App registrations → New registration**.
3. Nombre: `FichajeApp`. Tipo de cuenta: **Single tenant** (solo cuentas de vuestra organización).
4. **Redirect URI**: tipo *Web*, valor `http://localhost:3000/api/auth/callback/microsoft-entra-id` (en local). Cuando despleguéis en producción, añadid también `https://vuestro-dominio/api/auth/callback/microsoft-entra-id`.
5. Tras crearla, copia:
   - **Application (client) ID** → será `AUTH_MICROSOFT_ENTRA_ID_ID`.
   - **Directory (tenant) ID** → se usa en `AUTH_MICROSOFT_ENTRA_ID_ISSUER`.
6. Ve a **Certificates & secrets → New client secret**, créalo y copia el **Value** inmediatamente (no se vuelve a mostrar) → será `AUTH_MICROSOFT_ENTRA_ID_SECRET`.
7. Ve a **API permissions** y confirma que están `openid`, `profile`, `email` (suelen venir por defecto). No hace falta consentimiento de admin para estos permisos básicos.

## 3. Configurar el proyecto

```bash
cp .env.example .env
```

Rellena en `.env`:

```
AUTH_MICROSOFT_ENTRA_ID_ID="<Application (client) ID>"
AUTH_MICROSOFT_ENTRA_ID_SECRET="<client secret value>"
AUTH_MICROSOFT_ENTRA_ID_ISSUER="https://login.microsoftonline.com/<Directory (tenant) ID>/v2.0"
```

Genera el secreto de sesión:

```bash
npx auth secret
```

(esto añade `AUTH_SECRET` a tu `.env` automáticamente).

## 4. Base de datos

En desarrollo se usa SQLite (un fichero local, sin instalar nada):

```bash
npx prisma generate
npx prisma migrate dev --name init
```

## 5. Arrancar en local

```bash
npm run dev
```

Abre `http://localhost:3000` — te redirige a `/login`. Al iniciar sesión con Office 365, **el primer usuario que entra se convierte automáticamente en administrador**. El resto de personas entran como "Empleado"; desde **Administración** puedes cambiarles el rol y asignarles las horas objetivo del curso.

## Cómo funciona la restricción de dispositivo

Cada empleado sólo puede fichar desde el primer dispositivo (móvil u ordenador) desde el que fichó por primera vez — queda vinculado automáticamente. Si intenta fichar desde otro dispositivo, se bloquea y se le pide que contacte con un administrador. Desde **Administración**, un admin puede "Desvincular" el dispositivo de una persona (p. ej. si cambia de móvil); en su siguiente fichaje, el nuevo dispositivo quedará vinculado.

## Nóminas: almacenamiento de archivos

En desarrollo, las nóminas subidas se guardan en la carpeta local `./uploads` (fuera del control de versiones). **Antes de desplegar en producción, cambia el almacenamiento** a un proveedor de blobs (recomendado: [Vercel Blob](https://vercel.com/docs/storage/vercel-blob), ya que aloja el resto de la app) — toda la lógica de guardado/lectura de ficheros está aislada en [src/lib/storage.ts](src/lib/storage.ts), así que sólo hay que sustituir esas dos funciones.

## Despliegue recomendado

Con este tamaño de equipo (<20 personas), la opción más sencilla y barata es:

1. **Vercel** para alojar la app (gratis en el plan Hobby o unos pocos euros/mes en Pro), con un subdominio del vuestro, p. ej. `fichaje.arrupeetxea.eus`.
2. **Neon** o **Vercel Postgres** como base de datos (cambia `provider = "sqlite"` por `"postgresql"` en `prisma/schema.prisma` y actualiza `DATABASE_URL`).
3. **Vercel Blob** para las nóminas (ver punto anterior).
4. Añade la URL de producción como **Redirect URI** en la app de Entra ID (paso 2.4) y actualiza `NEXTAUTH_URL`.

## Cumplimiento legal (España)

El registro horario diario es obligatorio (Real Decreto-ley 8/2019). Esta plataforma guarda cada fichaje de forma permanente e inmutable (tabla `TimeEntry` + `AuditLog`), exportable en caso de inspección. Revisa con vuestra asesoría laboral el periodo de conservación (mínimo 4 años) y quién debe tener acceso a los registros agregados.
