# PLAFT Scanner — Servidor de licencias

Con esto los clientes **no tienen nada valioso en su PC**: ni las listas,
ni las claves de API, ni la lógica de búsqueda. La app que les entregas
solo envía el nombre y muestra el resultado que devuelve tu servidor.

---

## Por qué está diseñado así

Tres problemas que resuelve, y que no se resuelven de otra forma:

1. **"Si no ponen la URL, la usan gratis."** La URL va **fija en el
   código** de la versión que distribuyes (`LICENCIAS_URL_FIJA`). No es
   un campo editable. Y aunque alguien la borrara, la app se quedaría sin
   listas y sin claves: no le serviría de nada.
2. **"Si tienen las listas en su PC, buscan sin pagar."** Las listas ya no
   se descargan al cliente: viven en tu servidor y se actualizan solas con
   un cron diario.
3. **"Pueden descompilar el .exe."** Pueden, pero adentro no hay nada:
   ni claves, ni listas, ni el prompt del análisis. Todo eso está en tu
   servidor, detrás del login.

---

## Instalación (una sola vez)

### 1. Base de datos
cPanel → **Bases de datos MySQL** → crea la base `plaft` → crea un usuario
nuevo → asígnalo a esa base con **todos los privilegios**. Anota los tres
datos (nombre de base, usuario y contraseña, con su prefijo).

> Usa una base **nueva**, separada de la del ERP de RARS.

### 2. Tablas
cPanel → **phpMyAdmin** → selecciona la base → **Importar** →
`1_esquema.sql`.

### 3. Subdominio
cPanel → **Subdominios** → crea `licencias` sobre tu dominio.

### 4. Configurar y subir
En `config.php` completa: `DB_NAME`, `DB_USER`, `DB_PASS`, una
`CLAVE_ADMIN` larga que inventes, tus claves generales de
`GEMINI_API_KEYS` y `TAVILY_API_KEY`, y el `UE_TOKEN`.

> **Sobre el token de la Unión Europea:** pega SOLO el token (lo que va
> después de `token=` en tu URL de EU Login), no la URL completa. Si lo
> dejas vacío, esa lista simplemente se omite y las demás siguen
> funcionando. Nunca compartas ese token: es tu credencial personal.

Sube al subdominio: `config.php`, `login.php`, `consumir_busqueda.php`,
`buscar_listas.php`, `analizar_pep.php`, `cron_actualizar_listas.php`,
`admin.php`, `esquema_pep.json`.

### 5. HTTPS
cPanel → **SSL/TLS Status** → confirma que el subdominio tenga
certificado. Sin esto las contraseñas viajarían sin cifrar.

### 6. Cargar las listas por primera vez
Abre en tu navegador:
`https://licencias.tudominio.com/cron_actualizar_listas.php?clave=TU_CLAVE_ADMIN`

Verás cuántos registros cargó de cada lista. Tarda unos minutos.

### 7. Programar la actualización diaria
cPanel → **Trabajos cron** → una vez al día (ej. 5:00 a.m.):

```
/usr/local/bin/php /home/TU_USUARIO/licencias.tudominio.com/cron_actualizar_listas.php
```

(La ruta exacta de PHP te la muestra cPanel en "Trabajos cron".)

### 8. Panel de administración
`https://licencias.tudominio.com/admin.php` — entras con tu `CLAVE_ADMIN`.

---

## Preparar la app para tus clientes

En `plaft_scanner.py`, arriba del todo:

```python
LICENCIAS_URL_FIJA = "https://licencias.tudominio.com"
```

Compila **esa** versión con PyInstaller y es la que entregas. Al abrirla
pide correo y contraseña, y todo el trabajo lo hace tu servidor.

**Para tu propio uso**, mantén una copia con esa línea **vacía**
(`LICENCIAS_URL_FIJA = ""`): funciona en modo libre, con las listas
locales y sin límites, exactamente como hasta ahora.

---

## El panel: qué puedes hacer

- **Crear cuentas**: nombre, empresa, correo, contraseña, y los dos
  límites (por día y por mes).
- **Ver consumo** de hoy y del mes, con barras (ámbar al 80%, roja al tope).
- **Cambiar límites**, **cortar acceso** (desmarcar *Activo* bloquea al
  instante), **fecha de vencimiento**, **cambiar contraseña**.
- **"Liberar hoy"**: devuelve el cupo diario a quien lo agotó, sin tocar
  el mensual.
- **Claves de API por cliente**: si un cliente tiene sus propias claves de
  Gemini y Tavily, su consumo sale de su cuota y no de la tuya. Si las
  dejas vacías, usa las generales de `config.php`.

### Sobre las claves por cliente

Es la forma de escalar sin que un cliente grande te agote la cuota
compartida: le pides que cree sus propias claves gratuitas (Google AI
Studio y tavily.com, ambas gratis) y las pegas en su fila del panel.
Puedes mezclar: unos con claves propias y otros con las generales.

---

## Los reportes de tus clientes

Cada cliente genera y guarda **sus propios PDF en su PC**, igual que tú:
botón **"Generar reporte PDF"**, y se guardan en
`Reportes/<Proyecto>/DD_<nombre>.pdf` junto a la aplicación.

Esto es a propósito: sus reportes son documentos de cumplimiento de *su*
empresa, con datos de *sus* clientes. Que se queden en su equipo evita
que tú tengas que custodiar información personal de terceros — algo que
te sumaría obligaciones de protección de datos sin darte ningún
beneficio. Tu servidor solo procesa la consulta y devuelve el resultado.

En el **reporte masivo** es igual: un PDF por persona en la carpeta del
proyecto, más un CSV resumen del lote.

## Plantilla para la búsqueda masiva

La app tiene el botón **"Descargar plantilla para búsqueda masiva"**, que
genera un Excel listo con:

- Hoja **Clientes**: columnas *Nombre completo*, *DNI* y *Proyecto*, con
  dos filas de ejemplo.
- Hoja **Instrucciones**: cómo llenarlo.

El cliente lo llena, borra las filas de ejemplo, y lo sube con
"Reporte masivo (Excel)". El orden de las columnas no importa: se
reconocen por su nombre.

## Cómo se descuentan las búsquedas

- Una por cada consulta nueva; cuenta a la vez para el tope del día y el
  del mes.
- Un resultado servido desde la caché **no descuenta**.
- Si se acaba el cupo del día, la app avisa que puede seguir mañana e
  indica cuántas le quedan del mes.
- La validación ocurre siempre en tu servidor. Sin conexión, la app
  bloquea la búsqueda (si no, bastaría desconectar la red para saltarse
  el tope).
