Cuando algunos proyectos de vtiger 8.2 corren sobre PHP 8.x, el módulo Reportes puede caer en un HTTP 500 apenas se abre la lista. El log muestra algo como:

PHP Fatal error:  Duplicate declaration of static variable $mod_query_details
in modules/Reports/ReportRun.php on line XXXX

A continuación te explico síntomas, causa y solución (con snippet listo para copiar/pegar).

Síntomas

  • Al entrar a Reportes: pantalla en blanco o HTTP ERROR 500.
  • En el log de PHP (/var/www/html/logs/php_error.log) aparece Duplicate declaration of static variable $mod_query_details.

Si aún no tienes logs, activa en config.inc.php:

ini_set(‘display_errors’, 0);
ini_set(‘log_errors’, 1);
ini_set(‘error_log’, __DIR__ . ‘/logs/php_error.log’);

Causa

Dentro de la función GenerateReport() (archivo modules/Reports/ReportRun.php) se dejó más de una línea con:

static $mod_query_details = array(); // o []

En PHP 8.x, declarar dos veces la misma variable estática dentro de la misma función es fatal.

Solución (2–3 minutos)

  1. Respalda el archivo

cp modules/Reports/ReportRun.php modules/Reports/ReportRun.php.bak

  1. Edita modules/Reports/ReportRun.php y ve a la función GenerateReport().
  2. Deja una sola línea de inicialización estática y elimina las repetidas.
    Debe quedar solamente la primera:

// dentro de GenerateReport()
static $mod_query_details = [];
// … resto del código …

Si encuentras otras variables estáticas duplicadas dentro de la misma función

(por ejemplo $mod_fields, $modules_query, etc.), aplica el mismo criterio:

una sola declaración static por variable y por función.

  1. Guarda y reinicia el servicio web (o el contenedor).

service apache2 restart
# o
docker restart <nombre_del_contenedor_web>

  1. Verifica
  • Abre Reportes de nuevo.
  • Revisa el log: tail -n 50 logs/php_error.log.
    No debería reaparecer el fatal.

Snippet orientativo (cómo debe verse)

function GenerateReport(/* … */) {
    // ✔ Solo una declaración estática
    static $mod_query_details = [];

// Lógica de armado de queries…
    // $mod_query_details[‘Accounts’] = ‘SELECT …’;
    // …
}

Buenas prácticas relacionadas

  • Mantén los logs activos (sin mostrarlos en pantalla) para detectar rápido errores en PHP 8.x.
  • Si usas Monolog 2.x y tu wrapper de logger llama métodos antiguos (getLogLevel()), actualiza a isHandling()/getLevel() para evitar fatales.
  • Antes de actualizar de PHP 7.x a 8.x, corre un grep para detectar posibles duplicados:

    grep -nE “static\s+\$[a-zA-Z0-9_]+\s*=” modules/Reports/ReportRun.php

Conclusión

Este fix es simple pero crítico: una única declaración static por variable dentro de la función. Con eso el módulo Reportes vuelve a funcionar en Vtiger 8.2 bajo PHP 8.x y evitas caídas 500 difíciles de rastrear.