# mbcxp_jav

## Ejecución con Docker

Este proyecto incluye un entorno de desarrollo basado en Docker con PHP 8.2 y Symfony 7.3.

### Requisitos previos

- [Docker](https://www.docker.com/) y [Docker Compose](https://docs.docker.com/compose/) instalados en la máquina anfitriona.

### Pasos básicos

1. Instalar las dependencias del proyecto:

   ```bash
   composer install
   npm install
   ```

2. Copiar el archivo `.env` en caso de necesitar variables personalizadas y ajustar la cadena de conexión a la base de datos. Si la contraseña contiene caracteres especiales (por ejemplo `$`), encierre la URL completa entre comillas simples:

   ```dotenv
   DATABASE_URL='mysql://usuario:contra$eña@host:puerto/basedatos?serverVersion=8.0&charset=utf8mb4'
   ```

3. Construir las imágenes y levantar los servicios:

   ```bash
   docker-compose up -d --build
   ```

4. La aplicación estará disponible en <http://localhost:8080>.

### Migraciones y pruebas de conexión

Para inicializar la base de datos y verificar la conexión ejecute:

```bash
docker-compose exec app php bin/console doctrine:migrations:migrate --no-interaction
docker-compose exec app php bin/console doctrine:database:info
```

La salida del último comando confirma que la aplicación puede comunicarse con la base de datos.

## Despliegue por cliente (multi‑instancia)

Este proyecto soporta dos modos:

- Instancia por cliente (recomendado): una pila Docker por cada cliente con su propia base de datos.
- Multi‑tenant dinámico: una BD "maestra" con credenciales por cliente y selección dinámica (ya incluido en el código).

Para el modo instancia por cliente, configure estas variables de entorno en el contenedor del cliente (por ejemplo en `docker-compose.yml` o en un `.env` por cliente):

```
TENANT_DATABASE_URL='mysql://USUARIO:P%24SS@HOST:PUERTO/BASE?charset=utf8mb4'
TENANT_CLIENTE_ID=1   # opcional: filtra por cliente_id en consultas
```

Notas:
- Si la contraseña contiene `$`, codifíquela como `%24` o encierre toda la URL entre comillas simples.
- Cuando `TENANT_DATABASE_URL` está definida, el login se valida directamente contra la tabla `usuarios` de esa base, y no se usa la conexión "maestra".
- Si prefiere el modo multi‑tenant dinámico (una sola instancia para varios clientes), configure `DATABASE_URL` apuntando a la BD maestra que tenga las tablas `usuarios` y `clientes` con las columnas usadas en `src/Controller/SecurityController.php`.

### Instalación rápida con Composer (por cliente)

Puedes provisionar la base de datos del cliente (crear DB opcional, aplicar esquema y seed, crear usuario admin) con un solo comando utilizando Composer:

1) Exporta la URL del cliente (o pásala como `--dsn`):

```
export TENANT_DATABASE_URL='mysql://USUARIO:P%24SS@HOST:PUERTO/BASE?charset=utf8mb4'
```

2) Ejecuta la instalación (usa los SQL en `sql/`):

```
# Solo esquema + usuario admin "admin"/"admin"
composer run client:install -- --create-db --admin-user=admin --admin-pass=admin

# Esquema + seed + usuario admin personalizado
composer run client:install:seed -- --create-db --admin-user=mb --admin-pass='TuP4ss!'
```

Opciones del comando `app:client:install`:

- `--dsn` DSN del cliente (si no usas `TENANT_DATABASE_URL`).
- `--create-db` crea la base si no existe (MySQL).
- `--schema` ruta del SQL de esquema (por defecto `sql/schema_cxp_gt.sql`).
- `--seed` aplica datos semilla (usa `--seed-file`, por defecto `sql/seed_cxp_gt.sql`).
- `--admin-user`, `--admin-pass` credenciales del usuario inicial.

Una vez provisionada la base, levanta la instancia Docker del cliente con la misma `TENANT_DATABASE_URL` y accede a `/login`.

## Instalador Web (sin prompts en consola)

`docker compose up -d --build` no puede hacer prompts interactivos (por ser modo detach). Para que “pida credenciales” al arrancar, este proyecto incluye un instalador web:

- Al primer arranque, cualquier ruta redirige a `/_install` → en nuestro caso `/install`.
- Completa host, puerto, DB, usuario y contraseña.
- Opcional: aplicar esquema base (`sql/schema_cxp_gt.sql`) y seed (`sql/seed_cxp_gt.sql`).
- El instalador escribe `TENANT_DATABASE_URL` en `/.env.local`, ejecuta la provisión y crea `var/install.lock`.
- Luego te redirige a `/login`.

Si prefieres no usar el instalador, define `TENANT_DATABASE_URL` desde Compose y el instalador no intervendrá (queda bloqueado al existir `var/install.lock`).
