v1.0 Guía de Instalación
📦 Systema ERP

Guía de Instalación

Todo lo que necesitas para instalar Systema v1.0 en un servidor nuevo, desde cero hasta tener el sistema operativo con licencia activa.

PHP 7.4+ MySQL 8.x Apache / Nginx Licencias v1.0 VeriFactu Fase A

Requisitos del servidor

Antes de empezar
ComponenteMínimoRecomendadoEstado
PHP7.48.1+Obligatorio
MySQL5.78.xObligatorio
Extensión PDO MySQLObligatorio
Extensión cURLObligatorio para licencias
Extensión OpenSSLObligatorio para licencias
Extensión GDRecomendado para QR
Extensión ZipArchiveRecomendado para bulk PDF
allow_url_fopenOpcional (usa cURL)
Memory limit128M256M+Para dompdf
HTTPSMuy recomendado
💡
Puedes verificar todas estas extensiones desde el panel de Status de Systema en tudominio.com/systema/status.php una vez instalado.

Ficheros incluidos en el ZIP

Referencia

El ZIP de Systema v1.0 contiene estos ficheros. Todos van dentro de una carpeta en el servidor, por ejemplo public_html/systema/.

systema/
├── index.php ← Login con validación de licencia
├── dashboard.php · leads.php · clientes.php
├── facturacion.php · presupuestos.php · resultados.php
├── configuracion.php · presentador.php
├── status.php ← Panel de mantenimiento
├── layout.php · layout_end.php · auth.php · logout.php
├── activate.php · check.php · reset_password.php · kpi_engine.php
├── actualizaciones.php · historial.php · changelog.php
├── resultado_publico.php ← Portal contable por token, sin login
├── config/
│ ├── settings.php ← Se genera automáticamente. NO subir a git.
│ └── version.php ← Versión y changelog interno
├── assets/
│ └── core.css · core.js · favicon.png
├── PHPMailer/
│ └── PHPMailer.php · SMTP.php · Exception.php
├── modules/
│ ├── _db.php
│ ├── facturacion/ create · update · delete · duplicate · get_items · pdf_render · pdf_export · send_email · track_open · update_estado · update_vencimiento · import · import_sql
│ ├── presupuestos/ create · update · delete · duplicate · get_items · convert · pdf_render · pdf_export · send_email · track_open · update_estado
│ ├── clientes/ create · update · delete · update_estado · import · export
│ ├── leads/ create · update · delete · convert
│ ├── configuracion/ save_fiscal · save_smtp · save_plantilla · save_marca · delete_marca · save_verifactu · save_seguridad · save_acceso · save_db · save_php · save_ui · get_marcas · test_smtp · test_db · mark_seen
│ ├── resultados/ create · delete · generate · get_facturas · send · status · cleanup · update
│ └── presentador/ calcular · calcular_inline · generar_pdf · generar_txt · pdf_publico · historial
├── vendor/ ← fpdf186 · FPDI-master · dompdf* · masterminds* · phpmailer*
* dompdf y masterminds se instalan aparte (ver Paso 5)
├── assets/resultados/ ← Se crea automáticamente. Almacena ZIPs fiscales ({año}/T1.zip ... T4.zip)
└── presentador/templates/ ← m303.pdf · m130.pdf · m390.pdf (plantillas AEAT)
⚠️
config/settings.php nunca se sube a git. Contiene credenciales de BD, contraseña de acceso y token de licencia. Añádelo al .gitignore.

Paso 1 — Subir ficheros por FTP

FTP / File Manager
1
Descomprime el ZIP en local Extrae el contenido en tu ordenador. Verás una carpeta llamada systema/ con todos los ficheros.
2
Conéctate al servidor por FTP Usa FileZilla, Cyberduck, o el File Manager de tu hosting. Navega hasta public_html/ (o www/ según el hosting).
3
Sube la carpeta entera Arrastra la carpeta systema/ al directorio raíz del dominio. Quedará accesible en tudominio.com/systema/. Si quieres que sea la raíz del dominio, sube el contenido directamente en public_html/.
4
Verifica permisos La carpeta config/ necesita permisos de escritura para que PHP pueda crear settings.php. Permisos recomendados: 755 en carpetas, 644 en ficheros.
💡
Si al acceder a tudominio.com/systema/ ves la pantalla de Configuración en lugar del login, es normal — significa que no hay settings.php todavía y el sistema te pide que lo configures. Continúa con el Paso 3.

Paso 2 — Crear BD e importar el schema

phpMyAdmin

Crear la base de datos

1
Entra en phpMyAdmin Normalmente en tudominio.com/phpmyadmin o desde el panel de control de tu hosting (cPanel, Plesk, etc.).
2
Crea una BD nueva Pestaña Bases de datos → nombre, por ejemplo systema_db → cotejamiento utf8mb4_unicode_ciCrear.
3
Crea un usuario MySQL En tu hosting (cPanel → MySQL Databases), crea un usuario con una contraseña segura y dale todos los permisos sobre la BD recién creada. Anota: host, usuario, contraseña y nombre de la BD — los necesitarás en el Paso 3.
4
Importa el schema v0.5.5 Selecciona la BD en phpMyAdmin → pestaña Importar → elige el fichero systema_5.0.5.sql que está en la raíz del ZIP → Continuar. Verás que se crean 12 tablas y 2 vistas.
Tablas que deben aparecer tras la importación: clientes, configuracion, email_tracking, facturas, factura_items, leads, marcas, presentaciones_historial, presupuestos, presupuesto_items, series_numeracion, resultados_anuales Nueva v0.5.5. Más las vistas v_dashboard_facturas y v_dashboard_presupuestos.
⚠️
Usa siempre systema_5.0.5.sql. Incluye todas las columnas actualizadas: public_token en facturas, prefijo_factura y siguiente_factura en marcas, claves VeriFactu QR en configuración, y la nueva tabla resultados_anuales con sus 12 campos. No uses ficheros SQL de versiones anteriores.

¿Actualizas desde v0.5? Ejecuta solo el ALTER:
ALTER TABLE resultados_anuales ADD COLUMN zip_status ENUM('procesando','preparado','error') DEFAULT NULL, ADD COLUMN zip_generado_at DATETIME DEFAULT NULL, ADD COLUMN zip_expires_at DATETIME DEFAULT NULL;
O importa directamente el systema_5.0.5.sql completo en una instalación nueva.

Paso 3 — Configurar config/settings.php

Crítico

El fichero config/settings.php es el cerebro de la instalación. Contiene las credenciales de BD, la contraseña de acceso al sistema y los datos de licencia. Tienes dos formas de crearlo:

Opción A — Desde el panel web (recomendado)

Accede a tudominio.com/systema/. Si no hay settings.php, el sistema redirige automáticamente a configuracion.php donde puedes introducir las credenciales de BD desde el navegador. El fichero se crea solo.

Opción B — Directamente por FTP

Crea el fichero config/settings.php manualmente con este contenido exacto:

<?php
return array (
  // ── Base de datos ─────────────────────────────
  'db_host'      => 'localhost',          // host MySQL de tu hosting
  'db_port'      => '3306',
  'db_user'      => 'tu_usuario_bd',      // usuario MySQL
  'db_pass'      => 'tu_password_bd',     // contraseña MySQL
  'db_name'      => 'systema_db',         // nombre de la BD

  // ── Acceso al sistema ─────────────────────────
  'password'     => 'TU_PASSWORD_ACCESO', // contraseña para entrar en Systema
  'admin_nombre' => 'Nombre Apellido',
  'admin_email'  => '[email protected]',

  // ── Licencia (se rellena automáticamente) ─────
  'licencia_secret' => 'Sy5t3m4_L1c_S3cr3t0_R4f3lG1l_2026_xK9mP2qW',
  'licencia_token'  => '',   // se inyecta automáticamente desde el panel de licencias
  'licencia_domain' => '',   // se rellena automáticamente
  'licencia_cache'  => 0,    // timestamp de última validación (0 = forzar validación)
);
🔴
La clave licencia_secret debe ser idéntica a la constante LIC_SECRET del fichero config.php del servidor central de licencias en rafelgil.com/licencias/. Si no coinciden, la validación siempre fallará.

Verificar que funciona

Accede a tudominio.com/systema/. Debe aparecer el login con el fondo de fotos rotativas y el formulario de contraseña. Si redirige a configuracion.php, las credenciales de BD son incorrectas o la BD no está creada.

💡
¿Olvidaste la contraseña? La pantalla de login incluye el enlace "He olvidado mi contraseña". Al introducir el email asociado a la licencia, el sistema genera una contraseña temporal segura y la envía por email automáticamente. No es necesario intervención del administrador.

Paso 4 — Configurar desde el panel

Configuración → Panel

Una vez dentro del sistema, ve a Configuración y rellena estas secciones en orden:

Datos Fiscales

Razón social, NIF/CIF, dirección completa, email, teléfono, IBAN y forma de pago. Estos datos aparecen en todas las facturas emitidas.

Email SMTP

Configura el servidor de correo para enviar facturas a clientes. Necesitas:

CampoEjemplo
Host SMTPsmtp.tuhosting.com
Puerto587 (TLS) · 465 (SSL)
Usuario[email protected]
ContraseñaContraseña del email
Cifradotls o ssl
Nombre remitenteTu Empresa
Email From[email protected]

Usa el botón Test SMTP en Status para verificar la conexión antes de enviar facturas reales.

Plantilla PDF

Pega el HTML de tu plantilla de factura. Usa los marcadores {{numero}}, {{cliente_nombre}}, {{total}}, etc. Para activar el QR de VeriFactu añade {{qr_code}} donde quieras que aparezca.

Marcas

Crea al menos una marca emisora. La marca define el prefijo de numeración de facturas (ej: RG{YEAR}-RG2026-0001) y el prefijo de presupuestos.

💡
El marcador {YEAR} en el prefijo se sustituye automáticamente por el año actual. Así F{YEAR}- genera F2026-0001, F2026-0002, etc.

Interfaz UI — Zoom Nuevo v0.5.5

En Configuración → Interfaz UI puedes ajustar el zoom de la interfaz (70%–125%) para adaptarlo a tu pantalla. El valor se guarda en el servidor y en el navegador — no se pierde al limpiar caché.

PantallaZoom recomendado
Portátil 13" / 14"80%
Portátil 15" / 16"85% – 90%
Monitor 24"100% – 110%
Monitor 27" o más110% – 125%

Paso 5 — Instalar dompdf

Necesario para exportar PDF

dompdf no está incluido en el ZIP principal por su tamaño. Sin él, el visor HTML de facturas funciona pero la exportación a PDF no.

Opción A — Instaladores web (recomendado)

El ZIP incluye el fichero systema_PDF_install_dompdf-mm.v03.zip. Extráelo y encontrarás dos instaladores PHP. Súbelos a la raíz de Systema y ábrelos desde el navegador — instalan dompdf y Masterminds automáticamente.

Opción B — FTP manual

Descarga dompdf v2.0.4 y Masterminds html5-php v2.7.6 desde GitHub y súbelos a:

💡
Después de instalar, verifica en status.php → Sector E · PDF Engine que aparecen DomPDF v2: INSTALLED y Masterminds HTML5: INSTALLED.

Paso 6 — Configurar el cron de mantenimiento

Nuevo v0.5.5Plesk / cPanel

Systema v0.5.5 incluye un cron job para limpiar automáticamente los ZIPs de resultados anuales que han caducado (más de 14 días). Sin este cron los archivos se acumulan en disco indefinidamente.

Configurar en Plesk

1
Accede a Plesk → Tareas programadas En el panel de tu dominio, busca "Tareas programadas" o "Cron jobs".
2
Crea una nueva tarea Tipo: Ejecutar un comando. Introduce el comando:
/usr/bin/php -f /var/www/vhosts/SERVIDOR/DOMINIO/systema/modules/resultados/cleanup.php
Sustituye SERVIDOR y DOMINIO por los valores reales de tu hosting. En Hostalia la ruta suele ser /var/www/vhosts/XXXXXXXX.servicio-online.net/tudominio.com/systema/.
3
Schedule: estilo cron Usa el formato crontab: 0 3 * * * — se ejecutará cada día a las 3:00 AM.
Verifica con "Ejecutar ahora" Usa el botón de ejecución manual. La salida debe mostrar: 0 resultado(s) limpiados. si no hay nada caducado — eso confirma que el cron funciona correctamente.

¿Qué limpia el cron?

💡
Los ZIPs caducan a los 14 días de su generación. El portal del contable detecta automáticamente los ZIPs caducados y muestra "No disponible" en lugar del botón de descarga. Puedes regenerarlos en cualquier momento desde Resultados en el panel.

Sistema de licencias — Cómo funciona

Nuevo v0.5

Systema v1.0 incorpora un sistema de licencias que te permite controlar qué instalaciones están activas. Si un cliente deja de pagar, puedes pausar su licencia desde el panel central y a los 7 días el sistema dejará de funcionar para él.

🌐 Servidor central

En rafelgil.com/licencias/ vive el panel de gestión. Aquí creas, activas y pausas licencias.

🔑 Token por instalación

Cada cliente tiene un token único generado con HMAC-SHA256. Sin token válido no puede entrar.

⚡ Caché de 7 días

El cliente no llama al servidor central en cada login. La validación se cachea 7 días para máxima velocidad y resiliencia.

👻 Invisible al cliente

El sistema es completamente transparente. El cliente solo ve un mensaje genérico si la licencia expira.

Flujo completo

1
Tú instalas Systema en el servidor del cliente Subes los ficheros por FTP, creas la BD, configuras settings.php con las credenciales y el licencia_secret.
2
Creas la licencia en el panel central Entras en rafelgil.com/licencias/, creas la licencia para el dominio del cliente y pulsas Inyectar.
3
El token se inyecta automáticamente El panel central llama a activate.php en el servidor del cliente y escribe el token directamente en config/settings.php. Sin FTP adicional.
El cliente puede entrar En cada login, Systema valida la licencia con el servidor central (o usa la caché de 7 días si ya validó recientemente).

Configurar el servidor central de licencias

rafelgil.com/licencias/Hacer una sola vez

Esta configuración se hace una sola vez en rafelgil.com y no se toca más.

1 · Crear la BD de licencias

En phpMyAdmin de rafelgil.com, crea una BD nueva llamada rafelgil_licencias (o el nombre que quieras). Importa el fichero licencias_bd.sql. Se crean dos tablas: licencias y licencias_log.

2 · Subir los ficheros del panel central

Sube estos tres ficheros a rafelgil.com/licencias/:

rafelgil.com/licencias/
├── config.php ← clave privada + contraseña del panel + credenciales BD
├── check.php ← endpoint silencioso que consultan los clientes
└── index.php ← tu panel de gestión completo

3 · Editar config.php

Abre licencias/config.php y rellena:

define('LIC_SECRET', 'Sy5t3m4_L1c_S3cr3t0_R4f3lG1l_2026_xK9mP2qW'); // NO cambiar

define('LIC_PANEL_PASS', '$2y$12$...');  // hash bcrypt de tu contraseña
// Contraseña por defecto: Systema2026! — CÁMBIALA

define('LIC_DB_HOST', 'localhost');
define('LIC_DB_NAME', 'rafelgil_licencias');
define('LIC_DB_USER', 'tu_usuario');
define('LIC_DB_PASS', 'tu_password');
🔴
LIC_SECRET nunca debe cambiar una vez en producción. Si lo cambias, todos los tokens de todos los clientes dejan de funcionar inmediatamente y tendrás que reinyectarlos a todos.

4 · Cambiar la contraseña del panel

La contraseña por defecto es Systema2026!. Para cambiarla, genera un nuevo hash y sustitúyelo en config.php:

// Ejecuta esto en cualquier servidor PHP para generar el hash:
echo password_hash('TU_NUEVA_PASSWORD', PASSWORD_DEFAULT);

Pega el resultado en config.php como valor de LIC_PANEL_PASS.

5 · Verificar acceso al panel

Entra en https://rafelgil.com/licencias/. Debes ver el formulario de login. Introduce tu contraseña y verás el panel de gestión con la tabla de licencias vacía.

Acceso para clientes cloud — Login Landing

Los clientes en la modalidad cloud no necesitan recordar la URL de su instalación. Desde systemafacil.com, el cliente introduce su email y es redirigido automáticamente a su instalación. Este sistema funciona mediante LOGIN LANDING/lookup.php que consulta la URL de instalación en la base de datos central de licencias.

Instalar Systema en un cliente nuevo

Por cada cliente

Este es el proceso completo cada vez que instalas Systema para un cliente nuevo.

1
Sube los ficheros por FTP Igual que el Paso 1. La carpeta systema/ va en el servidor del cliente.
2
Crea la BD en el hosting del cliente En el phpMyAdmin del cliente: nueva BD, importar systema.sql, crear usuario MySQL con permisos.
3
Crea config/settings.php Con las credenciales de BD del cliente. Incluye obligatoriamente la clave licencia_secret:
'licencia_secret' => 'Sy5t3m4_L1c_S3cr3t0_R4f3lG1l_2026_xK9mP2qW',
'licencia_token'  => '',
'licencia_domain' => '',
'licencia_cache'  => 0,
4
Crea la licencia en el panel central Entra en rafelgil.com/licencias/+ Nueva licencia → introduce el dominio del cliente (ej: susana.com) → fecha de fin opcional → notas → Crear licencia.
5
Inyecta el token automáticamente En la fila del cliente recién creado, pulsa Inyectar → introduce la URL completa de Systema (ej: https://susana.com/systema) → Inyectar. El panel llama a activate.php y escribe el token en el settings.php del cliente sin que tengas que hacer nada más.
Instalación completa El cliente puede entrar, configurar sus datos fiscales, SMTP, plantilla PDF y empezar a facturar.
💡
¿Qué pasa si la inyección falla? Si el activate.php del cliente no es accesible (firewall, URL incorrecta, permisos), el panel te mostrará el error. En ese caso, copia el token manualmente desde la columna de la licencia y pégalo en el settings.php del cliente como 'licencia_token' => 'TOKEN_AQUI'.

Panel de licencias — Funcionalidades

rafelgil.com/licencias/
AcciónQué hace
+ Nueva licenciaCrea una licencia para un dominio. Genera el token automáticamente. Permite añadir fecha de fin y notas.
InyectarLlama al activate.php del cliente y escribe el token en su settings.php automáticamente.
PausarCambia el estado a pausada. El servidor dejará de validar esa licencia. El cliente tiene hasta 7 días de caché antes de que el login falle.
ActivarReactiva una licencia pausada o expirada.
EditarModifica las notas internas y la fecha de fin de la licencia.
LogMuestra el historial de eventos de esa licencia: activaciones, pausas, checks del cliente, inyecciones de token.

Columnas del panel

ColumnaDescripción
DominioEl dominio del cliente tal como se registró (sin www, sin https).
EstadoActiva Pausada Expirada
Último checkÚltima vez que el Systema del cliente validó su licencia con el servidor central.
Fecha finFecha de caducidad automática. Si está vacía, no caduca nunca.
NotasNotas internas — nombre del cliente, plan contratado, observaciones.

Pausar, renovar o expirar una licencia

Gestión de impagos

Cuando un cliente deja de pagar

1
Entra en el panel y pulsa Pausar El estado cambia a Pausada. A partir de este momento el servidor central responde "inactivo" a ese dominio.
2
El cliente tiene 7 días de margen La caché en su settings.php sigue siendo válida hasta 7 días desde la última validación exitosa. Durante ese tiempo puede seguir entrando con normalidad.
3
A los 7 días el login falla La próxima vez que intente hacer login, el sistema validará con el servidor central, recibirá "inactivo" y mostrará el mensaje: "Licencia caducada o no válida. Contacta con el administrador: [email protected]".

Si el cliente paga y quieres reactivar

Pulsa Activar en el panel. La próxima vez que el cliente intente entrar, la validación será exitosa y podrá acceder con normalidad. La caché se actualiza automáticamente.

Caducidad automática por fecha

Si configuraste una Fecha fin al crear la licencia, el servidor central la marca automáticamente como Expirada cuando se supera esa fecha. No necesitas hacer nada manualmente.

💡
Caché y urgencia. Si necesitas que el cliente pierda acceso de inmediato sin esperar los 7 días, tendrás que borrar manualmente la clave licencia_cache de su settings.php (ponerla a 0) por FTP. Con eso, el siguiente intento de login valida en tiempo real.

Módulo Resultados Anuales

Nuevo v0.5.5Mejorado v0.5.6

El módulo de Resultados permite generar cierres fiscales anuales y enviarlos al contable con un portal seguro de descarga. No requiere configuración adicional — funciona con la BD y SMTP ya configurados.

Requisitos previos

Cómo generar el primer resultado

1
Accede a Resultados en el sidebar Haz click en + Nuevo resultado, selecciona el ejercicio (año), introduce el email y nombre del contable.
2
El sistema genera en background El estado cambia a Procesando. Se generan los PDFs de todas las facturas del año y se comprimen en 4 ZIPs (T1-T4). Con 100-150 facturas tarda entre 3 y 8 minutos.
3
Estado: Preparado El estado cambia a Preparado. El botón de envío al contable se activa. Los ZIPs estarán en assets/resultados/{año}/T1.zip ... T4.zip.
4
Enviar al contable Haz click en el icono de email. El contable recibe un email con enlace al portal seguro (resultado_publico.php?token=XYZ) donde puede ver y descargar los ZIPs por trimestre.

Novedades v0.5.6

ALTER TABLE requerido para v0.5.6

Si vienes de v0.5.5, ejecuta este SQL en phpMyAdmin antes de usar el módulo:

ALTER TABLE `resultados_anuales`
  ADD COLUMN `email_tracking_id` VARCHAR(64) NULL AFTER `enviado_at`,
  ADD COLUMN `email_abierto`     TINYINT(1)  NOT NULL DEFAULT 0 AFTER `email_tracking_id`,
  ADD COLUMN `email_abierto_at`  DATETIME    NULL AFTER `email_abierto`;
⚠️
Los ZIPs caducan a los 14 días. Configura el cron del Paso 6 para que la limpieza sea automática. Si no tienes cron, puedes acceder manualmente a modules/resultados/cleanup.php para limpiar.

Activar VeriFactu QR

Fase A — Operativo

VeriFactu Fase A genera un QR en cada factura que apunta a un visor en el propio servidor donde el cliente o Hacienda pueden verificar la factura.

1
Activar desde el panel Ve a Configuración → VeriFactu → activa el toggle QR activo.
2
Configurar la URL base del visor Introduce la URL completa hacia pdf_render.php:
https://tudominio.com/systema/modules/facturacion/pdf_render.php
3
Añadir {{qr_code}} en la plantilla En Configuración → Plantilla PDF, coloca el marcador {{qr_code}} donde quieras que aparezca el QR en la factura. Normalmente en la cabecera junto al número de factura.
Listo Todas las facturas nuevas incluirán el QR. Las facturas antiguas sin public_token generan el token automáticamente la primera vez que se exportan o envían.

Verificar la instalación con Status

status.php

Una vez instalado, accede a tudominio.com/systema/status.php y pulsa REFRESH. El panel escanea 9 sectores del sistema y te dice exactamente qué está bien y qué no.

SectorQué verificaResultado esperado
A · DB EngineConexión MySQL, versión, uptimeNOMINAL
B · Index IntegrityLos 20 índices de rendimiento v0.4NOMINAL todos en verde
C · Table SizesTamaño y filas de cada tablaNOMINAL
D · SMTP StackConfiguración SMTP, trackingNOMINAL si has configurado SMTP
E · PDF Enginedompdf, Masterminds, FPDF, FPDI, /tmpNOMINAL si instalaste dompdf
F · AEAT PresentadorPlantillas M303, M130, M390NOMINAL
G · PHP RuntimeVersión PHP, memoria, timeoutsNOMINAL con PHP 7.4+
H · ExtensionsPDO, cURL, OpenSSL, mbstring, JSON, GDNOMINAL todas en verde
I · Disk & StorageEspacio libre, /tmp escribible, configNOMINAL
J · Core File ManifestLista los 94 archivos del core con indicador verde/rojo de existencia en disco en tiempo realNOMINAL todos en verde
💡
El chip global ✓ TODO NOMINAL en verde significa que la instalación está completamente operativa. Cualquier sector en amarillo o rojo indica algo que revisar.

Problemas frecuentes

Troubleshooting

El login redirige a configuracion.php

Las credenciales de BD en settings.php son incorrectas o la BD no está creada. Verifica db_host, db_user, db_pass y db_name. En algunos hostings el host no es localhost sino algo como PMYSQL112.dns-servicio.com.

La exportación PDF no funciona

dompdf no está instalado. Verifica en status.php → Sector E. Instala dompdf siguiendo el Paso 5.

El login muestra "Licencia caducada"

Causas posibles:

La inyección del token falla

Comprueba que activate.php está en la raíz de Systema y que la URL introducida en el panel es exactamente https://dominio.com/systema (sin barra final, con https). Si el hosting del cliente bloquea llamadas entrantes, inyecta el token manualmente en settings.php.

El envío de emails no funciona

Usa el botón SMTP HANDSHAKE en status.php para verificar conectividad TCP, y luego TEST SEND EMAIL para verificar autenticación completa. El email de prueba llega a tu dirección email_from configurada.

El QR de VeriFactu aparece roto en el PDF

La extensión GD no está instalada (necesaria para generar el QR), o la verifactu_qr_base_url en Configuración no está bien configurada. Verifica ambas cosas en status.php.

Índices en rojo en status.php → Sector B

Usa el botón REINDEX ALL v0.5 en el Sector B del panel de status. Confirma en el modal de confirmación. Los índices se recrean automáticamente.

El estado del resultado se queda en "Procesando" v0.5.5

El generate.php falló silenciosamente. Causas habituales:

Para depurar, accede directamente a: tudominio.com/systema/modules/resultados/generate.php?id=1 y observa si hay error.

Los ZIPs del resultado no se descargan v0.5.5

El estado es "Preparado" pero los botones de descarga no aparecen en el portal del contable. Comprueba que los archivos T1.zip-T4.zip existen en assets/resultados/{año}/ vía FTP. Si no existen, regenera el resultado.

El cron de limpieza da error v0.5.5

Verifica que la ruta en el cron es correcta. La ruta completa en Hostalia/Plesk suele ser /var/www/vhosts/XXXXX.servicio-online.net/tudominio.com/systema/modules/resultados/cleanup.php. Usa el botón "Ejecutar ahora" en la tarea programada para ver la salida y confirmar que la ruta es correcta.

El email al contable da error 500 v0.5.6

Los campos SMTP en BD deben llamarse usuario, password, puerto y cifrado. Si actualizas desde v0.5.5, verifica en Configuración → SMTP que los datos están guardados. El botón SMTP HANDSHAKE en status.php confirma la conectividad.

El enlace del email al contable da 404 v0.5.6

El sistema generaba URLs con /modules/resultado_publico.php en lugar de /resultado_publico.php. Actualiza modules/resultados/send.php a v0.5.6 para corregirlo.

El estado del resultado se queda en «Procesando» en hosting sin exec() v0.5.6

En hostings compartidos como Hostalia, exec() y pcntl_fork() están desactivados. La v0.5.6 resuelve esto generando el ZIP en el mismo proceso PHP. Actualiza modules/resultados/create.php a v0.5.6.

El Sector J de status.php muestra archivos en rojo v0.5.6

Algún archivo del core no está en el servidor. El Sector J lista los 94 archivos con indicador verde/rojo en tiempo real. Sube los archivos en rojo por FTP y recarga la página.

Si después de revisar estos puntos el problema persiste, contacta en [email protected] con una captura del panel de Status y el error exacto.