# pqrint en local con Docker Desktop

Levanta el aplicativo **Paso de servicio (SREE) a CRAM** (`intraweb/pqrint`) en tu equipo con dos versiones de PHP lado a lado:

| Servicio | URL | PHP | Para qué |
|---|---|---|---|
| `php72` | http://localhost:8072/inicio/ | 7.2 + PDO_INFORMIX 1.3.3 | Igual que producción (`/serverApps/docker-images/php_ifx_72`). Referencia. |
| `php8` | http://localhost:8082/inicio/ | 8.2 por defecto (8.3/8.4 opcional) + PDO_INFORMIX 1.3.7 | Ver qué falla en PHP 8 y probar la migración. |

El código no se modifica: los archivos de configuración `lib/param.inc.php` de `pqrint` e `inicio` se reemplazan **solo dentro del contenedor** por las versiones de `config/`, que leen las credenciales del archivo `.env`.

> ⚠️ **Producción.** Si el túnel apunta al SICE y al MySQL de producción, todo lo que hagas en la app local es real: aprobar una solicitud genera movimientos de inventario en SICE. Usa un SICE y un MySQL de pruebas, o limítate a pantallas de consulta.

---

## 1. Requisitos

- Docker Desktop (Windows con WSL2, macOS o Linux). En Mac con Apple Silicon funciona en modo emulado `linux/amd64`, más lento.
- ~4 GB libres en disco para las dos imágenes.
- Acceso SSH a un servidor de AWS que llegue a SICE y a RDS (por ejemplo `ip-172-31-62-98`, que monta `/serverApps`).

## 2. Traer los archivos a tu equipo

Desde una terminal en tu equipo (PowerShell, macOS o Linux), reemplazando `<servidor>` por la IP o nombre con el que entras por SSH:

```bash
scp -r ejimenez@<servidor>:/serverApps/repos/ejimenez/pqrint-docker .
cd pqrint-docker
```

Código (pqrint, el login `inicio` y ADOdb, ~46 MB):

```bash
scp -r ejimenez@<servidor>:/serverApps/repos/intraweb/pqrint ejimenez@<servidor>:/serverApps/repos/intraweb/inicio ejimenez@<servidor>:/serverApps/repos/intraweb/adodb5 src/
```

SDK de IBM Informix (190 MB):

```bash
scp ejimenez@<servidor>:/serverApps/docker-images/php_ifx_72/ibm/ibm.csdk.4.50.FC1.LNX.tar vendor/ibm/
```

Resultado esperado:

```
pqrint-docker/
├── docker-compose.yml
├── .env.example
├── config/            inicio.param.inc.php, pqrint.param.inc.php
├── docker/            php72/Dockerfile, php8/Dockerfile, common/
├── vendor/pdo/        PDO_INFORMIX-1.3.3.tgz, PDO_INFORMIX-1.3.7.tgz
├── vendor/ibm/        ibm.csdk.4.50.FC1.LNX.tar
└── src/               pqrint/, inicio/, adodb5/
```

## 3. Configurar `.env`

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

Completa `IFX_APP_USER`, `IFX_APP_PASS`, `MYSQL_USER` y `MYSQL_PASS`. Pide estos datos al responsable de la intranet; **no los copies del código**, porque las credenciales escritas ahí deben rotarse.

## 4. Abrir el túnel a SICE y MySQL

Deja esta terminal abierta mientras uses la app:

```bash
ssh -N -L 65031:<ip-sice>:65031 -L 3307:db-atm-mysql.cje8y84nzyoe.us-east-1.rds.amazonaws.com:3306 ejimenez@<servidor>
```

- `<ip-sice>`: el SICE contra el que vas a probar. Producción es `172.31.60.37` (ver advertencia arriba).
- Los contenedores llegan al túnel por `host-gateway` / `host.docker.internal`.
- Si un contenedor no logra conectar, prueba el túnel con `-L 0.0.0.0:65031:...`. Solo hazlo en una red de confianza, porque expone el puerto en tu red local.

## 5. Construir y levantar

La primera construcción tarda de 10 a 20 minutos por imagen.

```bash
docker compose build
```

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

Entra a http://localhost:8072/inicio/ (PHP 7.2) o http://localhost:8082/inicio/ (PHP 8), inicia sesión con tu usuario SICE y abre "Cambio de servicio a CRAM" (`/pqrint/`).

Ver los errores de PHP y Apache:

```bash
docker compose logs -f php8
```

Comprobar la versión de PHP y que el driver de Informix cargó:

```bash
docker compose exec php8 php -v
```

```bash
docker compose exec php8 php -m
```

En la lista de `php -m` debe aparecer `pdo_informix`.

Probar PHP 8.4 en lugar de 8.2: cambia `PHP8_VERSION=8.4` en `.env` y reconstruye.

```bash
docker compose build php8
```

Apagar:

```bash
docker compose down
```

## 6. Ver los errores que oculta el código

`pqrint/lib/conex.php` y `pqrint/lib/seguridad.inc.php` llaman `error_reporting(0)`, lo que silencia los errores de PHP 8. En **tu copia local** (`src/pqrint/lib/`) comenta esas líneas para que los errores salgan en `docker compose logs`. No cambies los archivos del servidor.

## 7. Qué esperar en PHP 8 (resumen del análisis)

| Problema | Síntoma |
|---|---|
| Constructores estilo PHP 4 (71 clases) | Objetos DAO/VO vacíos: errores "Call to a member function … on null". |
| FPDF 1.6 | Error fatal al generar cualquier PDF (`each()`, `get_magic_quotes_runtime()`). |
| ADOdb 5.20.17 | Avisos o fallos de conexión; actualizar a 5.22+. |
| Smarty 3.1.8 / 2.6.18 | Errores al compilar plantillas; migrar a Smarty 4.5 o 5.x. |
| `count()` sobre null | `TypeError`. |

El análisis completo está en `/serverApps/repos/intraweb/pqrint/ANALISIS_PQRINT.md`.
