# Manual de PHPStan para `mbinv`

## Objetivo

Instalar y ejecutar PHPStan en `mbinv` sin tocar el `composer.json` principal ni el `vendor/` de la aplicacion.

## Contexto tecnico de este proyecto

- Repo: `C:\xampp\htdocs\mbinv`
- Framework base: Symfony `2.7`
- Plataforma declarada en Composer principal: PHP `5.6.40`
- PHP real detectado en esta PC: `C:\xampp\php\php.exe`
- Version real detectada en esta PC: `PHP 7.1.33`
- `php` no esta en el `PATH`
- `composer` no esta en el `PATH`

## Decision tecnica

No se instalo PHPStan dentro del `composer.json` principal porque este repo es legado y mezclar la herramienta con las dependencias de produccion aumenta el riesgo de romper el entorno.

Por eso se dejo una instalacion aislada en:

- `tools/composer-2.2.phar`
- `tools/phpstan/composer.json`
- `tools/phpstan/vendor/`
- `tools/phpstan.bat`
- `phpstan.neon.dist`

## Versiones elegidas

- Composer: `2.2.26`
- PHPStan: `0.12.100`

## Por que esas versiones

- `Composer 2.2 LTS` sigue siendo compatible con `PHP 7.1`.
- `PHPStan 0.12.100` sigue siendo compatible con `PHP 7.1`.
- Versiones mas nuevas de PHPStan ya exigen versiones de PHP mas recientes.

## Archivos involucrados

- Wrapper de ejecucion: `tools\phpstan.bat`
- Configuracion: `phpstan.neon.dist`
- Toolchain aislada: `tools\phpstan\composer.json`

## Instalacion paso a paso en una PC nueva

### 1. Verificar PHP de XAMPP

```powershell
& 'C:\xampp\php\php.exe' -v
```

Resultado esperado:

- Debe responder con la version de PHP
- En esta PC devolvio `PHP 7.1.33`

### 2. Verificar el `php.ini` cargado

```powershell
& 'C:\xampp\php\php.exe' --ini
```

Resultado esperado:

- Debe mostrar el archivo `php.ini` cargado
- En esta PC fue `C:\xampp\php\php.ini`

### 3. Descargar Composer local al repo

Ubicado en la raiz de `mbinv`:

```powershell
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri 'https://getcomposer.org/installer' -OutFile 'tools\composer-setup.php'
& 'C:\xampp\php\php.exe' 'tools\composer-setup.php' --2.2 --install-dir=tools --filename=composer-2.2.phar
& 'C:\xampp\php\php.exe' 'tools\composer-2.2.phar' --version
```

Resultado esperado:

- Debe quedar creado `tools\composer-2.2.phar`
- Debe mostrar una version `2.2.x`

### 4. Instalar PHPStan en la carpeta aislada

```powershell
Set-Location 'C:\xampp\htdocs\mbinv\tools\phpstan'
& 'C:\xampp\php\php.exe' '..\composer-2.2.phar' install --no-interaction
```

Resultado esperado:

- Debe instalar `phpstan/phpstan`
- Debe quedar creado `tools\phpstan\vendor\bin\phpstan`

### 5. Volver a la raiz del repo

```powershell
Set-Location 'C:\xampp\htdocs\mbinv'
```

## Como se ejecuta

### Analizar todo `src`

```powershell
.\tools\phpstan.bat
```

Nota:

- En este proyecto puede agotar memoria aunque uses `1536M`
- La forma recomendada para analisis completo es por lotes

### Analizar todo `src` por lotes

```powershell
Set-Location 'C:\xampp\htdocs\mbinv'
$env:PHPSTAN_MEMORY_LIMIT = '1536M'
.\tools\phpstan-lotes.ps1
```

Ventaja:

- Divide el analisis en bloques mas pequenos
- Reduce el riesgo de `Allowed memory size exhausted`

### Analizar una carpeta

```powershell
.\tools\phpstan.bat src\MB\ProductoBundle\Clases\Reportes
```

### Analizar un archivo

```powershell
.\tools\phpstan.bat src\MB\ProductoBundle\Clases\Reportes\Habladores.php
```

### Ver la version instalada

```powershell
& 'C:\xampp\php\php.exe' 'tools\phpstan\vendor\bin\phpstan' --version
```

## Variables utiles

### Definir manualmente la ruta del PHP

Usar solo si XAMPP no esta en `C:\xampp`.

```powershell
$env:PHP_EXE = 'D:\xampp\php\php.exe'
.\tools\phpstan.bat
```

### Subir memoria para analisis grandes

El wrapper ya usa `1024M` por defecto, pero se puede subir.

```powershell
$env:PHPSTAN_MEMORY_LIMIT = '1536M'
.\tools\phpstan.bat
```

### Limpiar variables temporales de la sesion

```powershell
Remove-Item Env:PHP_EXE -ErrorAction SilentlyContinue
Remove-Item Env:PHPSTAN_MEMORY_LIMIT -ErrorAction SilentlyContinue
```

## Pruebas recomendadas

Las pruebas listas para copiar y pegar quedaron en:

- `tools\phpstan-pruebas.md`

## Problemas comunes

### Error: `PHP no encontrado`

Causa:

- `PHP_EXE` apunta a una ruta que no existe
- o XAMPP no esta instalado en la ruta esperada

Solucion:

```powershell
$env:PHP_EXE = 'C:\xampp\php\php.exe'
.\tools\phpstan.bat
```

### Error de memoria

Ejemplo:

- `Allowed memory size exhausted`

Solucion:

```powershell
$env:PHPSTAN_MEMORY_LIMIT = '1536M'
.\tools\phpstan.bat
```

Si aun falla:

```powershell
$env:PHPSTAN_MEMORY_LIMIT = '2048M'
.\tools\phpstan.bat
```

Alternativa recomendada para este repo:

```powershell
$env:PHPSTAN_MEMORY_LIMIT = '1536M'
.\tools\phpstan-lotes.ps1
```

### Mensaje sobre `wmic`

Ejemplo:

- `'wmic' is not recognized as an internal or external command`

Interpretacion:

- Es ruido de una version vieja de PHPStan en Windows
- No significa por si solo que el analisis haya fallado

### Warning de version vieja de PHPStan

Ejemplo:

- `You're running a really old version of PHPStan`

Interpretacion:

- Es esperado
- Se uso esa version por compatibilidad con el PHP de esta maquina

## Limitacion importante

Aunque `mbinv` declara `PHP 5.6.40` en Composer, el analisis en esta PC queda amarrado a `PHP 7.1` porque ese es el CLI disponible en XAMPP.

En esta instalacion:

- `phpstan.neon.dist` usa `phpVersion: 70100`
- no se logro simular `phpVersion: 50600` con esta combinacion de herramientas

## Resumen rapido para otra PC

1. Instalar XAMPP
2. Confirmar que exista `C:\xampp\php\php.exe`
3. Clonar o copiar `mbinv`
4. Descargar `Composer 2.2` en `tools\`
5. Instalar `PHPStan` en `tools\phpstan`
6. Ejecutar `.\tools\phpstan.bat` para archivos puntuales
7. Ejecutar `.\tools\phpstan-lotes.ps1` para analisis grande
