# Comando `app:create-admin-user`

Este documento describe el comando de consola para crear usuarios administrativos en el sistema.

Archivo fuente: `src/Command/CreateAdminUserCommand.php`

## Objetivo

Crear un usuario con:

- Tipo de usuario: `ADMIN` (`UserTypeEnum::ADMIN`)
- Rol Symfony: `ROLE_ADMIN`
- Agencia asignada automáticamente: primera agencia `MASTER` activa de la empresa
- **Empresa fija:** siempre `maincompany` con **ID 1** (no se pasa por consola)
- **Correo:** no se pide; se genera como `{username-saneado}.{hash10}@create-admin-user.internal` (evita colisiones si dos usernames sanean igual)
- **Teléfono:** no se usa (queda `null` en el usuario)

Este comando es útil para alta inicial de accesos administrativos (dashboard/configuración), recuperación operativa, o bootstrap de ambientes.

## Firma del comando

```bash
php bin/console app:create-admin-user <username> <name> <lastname> <password>
```

## Parámetros requeridos

- `username`: usuario de login (debe ser único globalmente)
- `name`: nombre
- `lastname`: apellido
- `password`: contraseña en texto plano (evita dejarla en el historial del shell cuando puedas)

Ejemplo:

```bash
php bin/console app:create-admin-user admin1 "Nombre" "Apellido" 'MiClaveSegura123'
```

Si Symfony agota memoria al arrancar en tu máquina:

```bash
php -d memory_limit=512M bin/console app:create-admin-user admin1 "Nombre" "Apellido" 'MiClaveSegura123'
```

## Reglas y validaciones que aplica

El comando valida lo siguiente antes de crear:

1. **Empresa existente**
   - Busca `maincompany` por ID fijo **1**.
   - Si no existe: error y termina con `FAILURE`.

2. **Username único**
   - Usa `UserRepository::findUsersByUsername($username)`.
   - Si ya existe: error y termina con `FAILURE`.

3. **Agencia por defecto**
   - Resuelve automáticamente con `AgencyRepository::getFirstMasterAgency($maincompany)`.
   - Debe existir una agencia `MASTER` activa para esa empresa.
   - Si no existe: error y termina con `FAILURE`.

4. **Contraseña**
   - No puede ser vacía (viene como argumento obligatorio).

## Lógica de rol `ROLE_ADMIN`

El comando asegura que el rol exista:

- Busca rol por nombre exacto `ROLE_ADMIN` (`UserRolesTypesEnum::ROLE_ADMIN`).
- Si no existe, lo crea automáticamente en tabla `role` con:
  - `name = ROLE_ADMIN`
  - `description = Administrador (ROLE_ADMIN) — creado por app:create-admin-user`
  - `visible = true`
  - `category = Admin`
  - `creationdate = now`

Esto evita fallos en ambientes donde la semilla de roles no esté completa.

## Qué persiste en base de datos

Cuando pasa validaciones, crea el usuario vía `UserRepository::createUser(...)` con:

- `type = ADMIN`
- `company = maincompany` (id 1)
- `agency = agencia MASTER activa resuelta`
- `agent = null`
- `getRoles = [ROLE_ADMIN]`
- `email` = generado (ver arriba)
- `phonenumber` = `null`

Después incrementa contador de empresa con:

- `MaincompanyRepository::increaseUserCount($maincompany)`

## Salida esperada (éxito)

Muestra mensaje de éxito y listado con:

- ID de usuario
- Username
- Email (generado)
- Tipo (`ADMIN`)
- Rol asignado (`ROLE_ADMIN` y su id)
- Empresa (nombre e id)
- Agencia (nombre e id)

## Códigos de salida

- `Command::SUCCESS` (`0`): usuario creado correctamente.
- `Command::FAILURE` (`1`): error de validación/negocio (empresa inexistente, username duplicado, sin agencia MASTER, password vacía, etc.).

## Errores frecuentes y solución

### 1) `Maincompany with ID 1 not found`
- Verifica que exista la empresa con id 1 en la BD del entorno (`DATABASE_URL`).

### 2) `Username '...' is already in use`
- Usa otro `username`.

### 3) `No hay agencia MASTER activa...`
- Crea una agencia de tipo `MASTER` para esa empresa o reactívala.

## Recomendaciones de operación

- Ejecutar en `--env=prod` en servidores productivos.
- Evitar exponer contraseñas en historial shell; en scripts preferir variables de entorno leídas por tu propio wrapper si lo necesitas.
- Registrar en bitácora interna quién/por qué creó el usuario.

## Ver ayuda rápida

```bash
php bin/console app:create-admin-user --help
```
