Primeros pasos
Instale AssetHub en cPanel, Hostinger o su propio VPS en menos de 10 minutos.
Usuarios y Roles
5 roles preconfigurados con permisos Spatie, ajustables por usuario.
Funciones del producto
Activos, flujos de trabajo, mantenimiento, depreciación, auditoría y más.
Personalización
Añade campos personalizados ilimitados, cambia branding, idiomas y temas.
Configuración de Hostinger
Despliegue paso a paso en el plan compartido Single más económico.
Configuración de cPanel
Despliegue paso a paso en hosting compartido cPanel estándar — sin necesidad de Terminal.
Seguridad y QR
HTTPS, webhooks firmados con HMAC, auditoría y escáner QR vía cámara.
Reportes y Exportación
8 reportes integrados con exportación Excel + PDF y filtros por fecha.
Alertas por correo
Recordatorios de garantía, mantenimiento, vencimiento de documentos y checkouts vencidos.
Preguntas frecuentes
¿Puedo ejecutar AssetHub en el plan más barato Hostinger Single?
Sí — AssetHub es totalmente compatible con Hostinger Single (~$2.99/mes). Single incluye PHP 8.3, MySQL, Cron Jobs nativos y SSL gratuito — todo lo que AssetHub necesita. Sin SSH, sin Composer, sin línea de comandos. Consulta la sección Configuración de Hostinger para la guía paso a paso.
¿Necesito conocimientos técnicos para instalarlo?
No. El instalador web se encarga de todo: verificación de requisitos, configuración de base de datos, migraciones y creación de cuenta admin. Solo sube los archivos, visita /install en tu navegador y sigue el asistente.
¿Cómo funcionan los correos programados (alertas de garantía/mantenimiento)?
AssetHub utiliza el programador de Laravel. Solo configura un cron job que se ejecute cada minuto, y Laravel distribuye internamente cada tarea en su momento correcto (diario 08:00, mensual, etc.). Para cPanel, configúrelo en Advanced → Cron Jobs. Para Hostinger, use hPanel → Advanced → Cron Jobs. Consulte Configuración de cPanel → Paso 7 o Configuración de Hostinger → Paso 5. Si su host no tiene cron, use la URL de Cron de la aplicación con el servicio gratuito cron-job.org.
¿Qué métodos de depreciación se soportan?
Tres métodos: Línea recta (depreciación anual igual), Saldo decreciente (acelerada, común para impuestos), y Unidades de producción (basada en uso, para equipo de fabricación). Los valores de activos se actualizan automáticamente el día 1 de cada mes.
¿El escáner QR funciona en teléfonos móviles?
Sí — utiliza la cámara del navegador a través de html5-qrcode y funciona en cualquier navegador moderno de teléfono/tableta/escritorio. El único requisito es HTTPS. cPanel AutoSSL y Hostinger Let's Encrypt SSL funcionan de inmediato.
¿Puedo añadir campos propios sin programar?
Sí. Admin → Campos personalizados te permite añadir atributos ilimitados (texto, número, fecha, selección, área de texto, archivo, casilla), limitarlos a categorías específicas, marcarlos como obligatorios y reordenarlos arrastrando — todo desde la interfaz.
¿Cuántos idiomas soporta AssetHub?
11 locales listos para usar: inglés, vietnamita, español, francés, alemán, chino, japonés, portugués (BR), ruso, árabe (con soporte RTL completo) e hindi (हिन्दी). Los administradores gestionan las traducciones desde Administration → Translations (requiere el permiso manage translations).
¿Puedo instalar AssetHub en un hosting compartido cPanel?
Sí — AssetHub funciona en cualquier plan de hosting compartido cPanel estándar con PHP 8.2+, MySQL y Cron Jobs. No se requiere Composer ni Node.js en el servidor — el paquete se envía pre-construido. Muchos hosts cPanel no incluyen una Terminal web; eso está bien. Consulte la sección Configuración de cPanel para obtener la guía completa paso a paso (incluyendo cómo generar APP_KEY sin Terminal).
¿Cómo rebrandear AssetHub (página de login, título de pestaña y colores)?
AssetHub puede rebrandearse por completo desde el panel de administración — sin editar código ni npm run build. Desde v3.1.0, el logo, footer y badge del login siguen Settings → Branding → App Name. v4.0 añade el título de pestaña del navegador en tiempo real y la pestaña Appearance para colores globales en modo claro y oscuro.
auth.login_subtitle por idioma → personalice colores en Settings → Appearance.
Referencia rápida:
| Elemento | Ejemplo | Cómo cambiar |
|---|---|---|
| Top-left logo & wordmark | VimoticFAR | Settings → Branding → App Name |
| Login subtitle | Enter your credentials to access AssetHub | Administration → Translations → auth.login_subtitle |
| Footer copyright | © 2026 VimoticFAR | Settings → Branding → App Name |
| Right panel badge | VIMOTICFAR | Settings → Branding → App Name |
| Browser page title (tab) | YourAppName | Settings → Branding → App Name (v4.0+) |
| App colors (buttons, sidebar, badges…) | Custom green / blue palette | Settings → Appearance (v4.0+) |
1. Logo and wordmark:
- Sign in as an administrator.
- Go to Settings → Branding.
- Update App Name (and optionally upload a logo).
- Save.
This name appears on the login page (logo, footer, badge), in the sidebar, and — since v4.0 — in the browser tab title on every page.
2. Browser page title (v4.0):
The text shown in the browser tab follows Settings → Branding → App Name at runtime. Change App Name, save, and refresh — no .env edit or rebuild needed. The title updates on the login screen and after sign-in.
3. Login subtitle: the line below the main heading uses the translation key auth.login_subtitle (not App Name).
- In the app (recommended): Administration → Translations → select language → group auth → key
login_subtitle→ replaceAssetHubwith your app name → Save. Repeat for each language. - In code: edit
lang/{locale}/auth.php— e.g.'login_subtitle' => 'Enter your credentials to access YourAppName',
4. Footer and right-panel badge: since v3.1.0, the footer (© {year} …) and the uppercase badge on the right column use the same App Name as the logo. Change it once under Settings → Branding and refresh the login page.
5. App colors — Appearance (v4.0):
The Appearance tab lets you change the color scheme for the entire application — buttons, sidebar highlights, badges, links, and themed text — separately for light and dark mode. Colors are saved to the database.
- Open: Sidebar → Settings → Appearance (requires manage settings permission).
- Color groups: Brand & Accent (primary UI), Success / Warning / Danger / Info (status badges), Primary / Secondary / Muted / Link (text).
- Light & dark: use the Editing: Light / Dark toggle — configure both if your team uses dark mode. Live Preview on the right.
- Save: click Save appearance to apply app-wide. Reset to defaults restores AssetHub's built-in palette (save afterward to persist).
Branding vs Appearance: Branding = app name, logo, page title. Appearance = colors only. For a complete visual rebrand, update both tabs.
Notes:
- Changing App Name does not update translation strings — edit
auth.login_subtitle(and otherauth.*keys) per language. - Translation overrides in Administration → Translations are stored in the database and survive app updates.
- The login page right column (headline, features) uses other
auth.*keys — edit them under the same auth group if needed. - If colors do not update after saving Appearance, hard-refresh (Ctrl+F5) and confirm you are editing the correct light/dark palette.
- After upgrading from an older package, upload the full current
source/files (including pre-builtpublic/build/) if branding features are missing.
Resumen
AssetHub es un sistema completo de gestión de activos construido con Laravel 11, Vue 3 y Tailwind CSS. La versión 3.0 añade un Translation Editor completo, locales personalizados, importación/exportación CSV y localización efectiva de zona horaria/moneda — sobre la base de v2 (seguimiento batch/lot, asignaciones, disposiciones y páginas públicas de entrega QR).
Seguimiento con QR
Genera códigos QR automáticos para cada activo. Escanea con cualquier cámara del navegador.
Depreciación
3 métodos: línea recta, saldo decreciente, unidades de producción.
Campos personalizados
Añade atributos personalizados ilimitados — texto, fecha, selección, archivo, casilla.
Hooks web
15 tipos de eventos con firma HMAC y reintentos automáticos.
Registro de auditoría
Cada cambio registrado con visor completo de diferencias.
Reportes
12 reportes con gráficos y exportación Excel y PDF.
Requisitos del servidor
- PHP 8.2 o superior
- MySQL 5.7+ o MariaDB 10.3+
- Composer 2.x
- Node.js 18+ y npm 9+
- Servidor web: Apache o Nginx
Extensiones PHP requeridas
- OpenSSL, PDO, PDO_MySQL, Mbstring, Tokenizer, XML, Ctype, JSON, GD, Fileinfo
Espacio en disco
~ 200 MB mínimo. Reserva espacio adicional para fotos de activos y archivos adjuntos.
Instalación
Opción A — Instalador web (Recomendado)
- Sube los archivos del proyecto a tu servidor web.
- Apunta el document root del dominio a
public/. - Configura permisos:
storage/ybootstrap/cache/deben tener escritura (chmod 775). - Copie
.env.examplea.envy establezcaAPP_KEY(ejecutephp artisan key:generatesi tiene SSH/Terminal, o consulte Configuración de cPanel → Paso 5 para alternativas del Administrador de Archivos). - Visita
https://yourdomain.com/installen tu navegador. - Sigue el asistente — Requirements → Database → Migrate → Admin Account → Done.
Opción B — Instalación por CLI
# 1. Instalar dependencias
composer install --no-dev --optimize-autoloader
npm install
npm run build
# 2. Configurar entorno
cp .env.example .env
php artisan key:generate
# 3. Editar .env para credenciales de BD
# DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
# 4. Crear tablas y datos iniciales
php artisan migrate --seed
# 5. Crear enlace simbólico storage para uploads
php artisan storage:link
# 6. Cachear config para producción
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 7. Marcar como instalado
echo "Installed" > storage/installed.lock
public/. Para Apache, el .htaccess incluido maneja la reescritura de URLs. Para Nginx, consulta la guía de despliegue Laravel.
Asistente Paso 2 — Configuración de la base de datos
Cuando el asistente llegue al Paso 2, debe ingresar los datos de conexión MySQL de la base de datos que creó en su panel de hosting. La base de datos debe existir ya (puede estar vacía — el siguiente paso del asistente creará las tablas).
| Campo | Predeterminado / Ejemplo | Notas |
|---|---|---|
| Host | 127.0.0.1 | Funciona en el 99 % de los hosts compartidos (Hostinger, cPanel, Plesk). Mantenga este valor predeterminado a menos que su hosting proporcione un hostname MySQL personalizado (servicios de BD gestionados como AWS RDS, DigitalOcean Managed Database). |
| Port | 3306 | Puerto MySQL estándar. Solo cámbielo si su proveedor usa un puerto no estándar (poco frecuente). |
| Nombre de la base de datos | uXXXXXX_assethub | El nombre completo que aparece en su panel de hosting. La mayoría de los hosts compartidos lo prefijan con su ID de usuario (p. ej. Hostinger: u287094729_assethub). |
| Nombre de usuario | uXXXXXX_assethub | Usuario MySQL con permisos en la base de datos anterior. No use root — los hosts compartidos no lo permiten. |
| Contraseña | (su contraseña de BD) | La contraseña que estableció o copió al crear el usuario MySQL. La mayoría de los hosts la muestran una sola vez al crearla — use "View / Reset" si no la guardó. |
Dónde encontrar estas credenciales según el panel de hosting
- Hostinger: hPanel → Databases → Management → haga clic en su base de datos. La página muestra el nombre, el usuario y un botón "Show password".
- cPanel: cPanel → MySQL Databases. La lista de bases de datos muestra los nombres; los usuarios aparecen abajo. Use "Change Password" si es necesario.
- Plesk: Plesk → Databases → haga clic en el nombre de la base de datos. La página de detalle muestra las credenciales y ofrece restablecimiento de contraseña.
- DirectAdmin: DirectAdmin → MySQL Management → haga clic en la base de datos. Las credenciales y el restablecimiento de contraseña están en la página de detalle.
- BD externa / gestionada: AWS RDS, DigitalOcean Managed Database, etc. Use el hostname personalizado, el puerto (a menudo
3306, pero verifique), el nombre de la BD, el usuario y la contraseña de su consola en la nube. Asegúrese de que la IP del servidor esté en la lista blanca del firewall de la BD.
Errores comunes y cómo solucionarlos
| Mensaje de error | Causa y solución |
|---|---|
SQLSTATE[HY000] [1045] Access denied | Usuario o contraseña incorrectos, o el usuario no tiene acceso a esta base de datos. Verifique la ortografía (incluido el prefijo del usuario en hosts compartidos). Restablezca la contraseña en el panel de hosting si no está seguro. |
SQLSTATE[HY000] [1049] Unknown database | El nombre de la base de datos es incorrecto, o aún no la ha creado en su panel de hosting. Créela primero y vuelva a ingresar el nombre exacto (incluido cualquier prefijo). |
SQLSTATE[HY000] [2002] Connection refused | No se puede alcanzar el servidor MySQL. Verifique Host y Port. En hosts compartidos pruebe localhost en lugar de 127.0.0.1 o viceversa. Para BD gestionadas, asegúrese de que la IP del servidor esté en la lista blanca. |
SQLSTATE[42S02] Base table not found: sessions | Ocurre cuando SESSION_DRIVER=database o CACHE_STORE=database está configurado en .env antes de que existan las tablas. Edite .env y cambie ambos a file, guarde y recargue el asistente. Puede volver a database después de la instalación si lo prefiere. |
could not find driver | Falta la extensión de PHP pdo_mysql o está deshabilitada. Habilítela en su panel de hosting (Configuración de PHP → Extensiones). En cPanel: MultiPHP INI Editor → Extensiones o Select PHP Version → Extensiones. En Hostinger: hPanel → Advanced → PHP Configuration → pestaña PHP Extensions. |
127.0.0.1 y 3306) — déjelos así en hosting compartido. Solo necesita escribir el nombre de la base de datos, el usuario y la contraseña. Haga clic en Test & Save → para verificar la conexión y pasar al Paso 3.
Localhost (Desarrollo local)
Guía rápida para ejecutar AssetHub en tu computadora para pruebas o desarrollo antes de desplegar a producción. Elige el entorno que coincide con tu sistema operativo.
Opción 1 — Laravel Herd (Recomendado, macOS y Windows)
Laravel Herd es el entorno local oficial del equipo de Laravel — gratis, nativo, sin Docker. Incluye PHP 8.2/8.3/8.4, Nginx y (en Herd Pro) MySQL/Redis.
- Descarga e instala Laravel Herd desde herd.laravel.com.
- Coloca la carpeta del proyecto AssetHub dentro de
~/Herd/(macOS) o%USERPROFILE%\Herd\(Windows). Herd crea automáticamente un dominio.test— p. ej.http://assethub.test. - Abre Herd → Sites y confirma que la versión PHP sea 8.2 u 8.3. Clic derecho en el sitio → Secure para habilitar HTTPS (necesario para el escáner QR).
- Crea una base de datos MySQL. Con Herd Pro, usa Services → MySQL → Open in TablePlus. Si no, instala MySQL Community o usa SQLite (
DB_CONNECTION=sqlite,touch database/database.sqlite). - Copia
.env.examplea.env, completa las credenciales de la BD y ejecutaphp artisan key:generateen la raíz del proyecto. - Abre
http://assethub.test/installen tu navegador y sigue el asistente del instalador.
Opción 2 — XAMPP (Windows, macOS, Linux)
XAMPP empaqueta Apache, MySQL/MariaDB y PHP. Gratis y multiplataforma. Asegúrate de elegir una versión con PHP 8.2 o superior.
- Descarga XAMPP 8.2+ de apachefriends.org e instálalo.
- Copia el proyecto AssetHub a
C:\xampp\htdocs\AssetHub\(Windows) o/Applications/XAMPP/htdocs/AssetHub/(macOS). - Abre XAMPP Control Panel e inicia Apache y MySQL. Si los puertos están ocupados, usa Config → service.conf para cambiar Apache a 8080.
- Ve a
http://localhost/phpmyadmin→ Nuevo → crea una base de datosassethubcon cotejamiento utf8mb4. - En la carpeta del proyecto: copia
.env.examplea.env, estableceDB_DATABASE=assethub,DB_USERNAME=root, dejaDB_PASSWORDvacío (predeterminado de XAMPP). Ejecutaphp artisan key:generate. - Visita
http://localhost/AssetHub/public/installpara ejecutar el asistente del instalador.
/public/: crea un virtual host en C:\xampp\apache\conf\extra\httpd-vhosts.conf apuntando DocumentRoot a la carpeta public/ del proyecto, luego añade 127.0.0.1 assethub.local a tu archivo hosts.
Opción 3 — Laragon (Windows)
Laragon es un stack portátil para Windows diseñado para Laravel — vhosts automáticos, URLs limpias, MySQL/MariaDB y HeidiSQL incluido.
- Descarga Laragon Full de laragon.org e instálalo.
- En Laragon: Menú → PHP → Versión — cambia a PHP 8.2 u 8.3.
- Copia el proyecto AssetHub a
C:\laragon\www\AssetHub\. - Haz clic en Start All. Laragon crea automáticamente el vhost:
http://assethub.test(apuntando a la carpetapublic/). - Abre HeidiSQL (incluido) → crea la base de datos
assethub. Credenciales predeterminadas: usuarioroot, contraseña vacía. - Edita
.envcon las credenciales de la BD, ejecutaphp artisan key:generate, luego visitahttp://assethub.test/install.
Opción 4 — Servidor PHP integrado (sin servidor web)
La opción más simple: Laravel incluye artisan serve, que inicia un servidor PHP de desarrollo. No requiere Apache ni Nginx. Ideal para pruebas rápidas.
# Instalar dependencias y configurar
cd /path/to/AssetHub
composer install
cp .env.example .env
php artisan key:generate
# Ejecutar migraciones y semillas iniciales
php artisan migrate --seed
# Iniciar el servidor de desarrollo
php artisan serve
# Luego visita: http://127.0.0.1:8000/install
Problemas comunes en localhost
El escáner QR no abre la cámara en http://
Las APIs de cámara del navegador requieren HTTPS, con una excepción: http://localhost y http://127.0.0.1 se tratan como contextos seguros. Si accedes a AssetHub vía tu IP LAN (p. ej. http://192.168.1.10), la cámara se negará. Usa localhost para dev o habilita HTTPS vía Herd / mkcert.
Permission denied en storage (macOS / Linux)
Si ves errores de escritura cuando la app intenta loguear o cachear, corrige los permisos: chmod -R 775 storage bootstrap/cache. En Windows normalmente no es necesario.
Puerto ya en uso
Si el puerto 8000 está ocupado por otra app, usa un puerto diferente:
php artisan serve --port=8001
Probar emails localmente
El SMTP real no está disponible en la mayoría de configuraciones locales. Dos opciones seguras: (1) establece MAIL_MAILER=log en .env — los emails se vuelcan a storage/logs/laravel.log en vez de enviarse; o (2) usa Mailtrap / MailHog para capturar el correo saliente en una bandeja falsa.
MAIL_MAILER=log
# Todos los emails se escriben en storage/logs/laravel.log
Assets frontend (Vite / Tailwind)
El frontend Vue/Tailwind de AssetHub viene pre-compilado en el paquete. Si editas componentes Vue o el config de Tailwind, necesitarás Node.js 18+:
npm install
npm run dev # Hot-reload durante el desarrollo
npm run build # Build de producción (ejecutar antes de desplegar)
Desplegar en Hostinger Single (Alojamiento compartido)
Esta es la ruta recomendada para usuarios sin VPS o experiencia técnica. AssetHub es totalmente compatible con el plan Hostinger Single Web Hosting más barato (~$2.99/mes). Sin SSH, sin Composer, sin línea de comandos — Single incluye cron jobs nativos, PHP 8.3 y SSL gratuito.
Paso 1 — Prepara tu hosting
- Inicia sesión en Hostinger hPanel.
- Ve a Hosting → Administrar para tu dominio.
- Establece la versión de PHP a 8.2 u 8.3 vía Avanzado → Configuración PHP.
- Asegúrate de que estas extensiones PHP estén activas (normalmente por defecto):
- OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
Paso 2 — Crear base de datos MySQL
- En hPanel, ve a Bases de datos → MySQL Databases.
- Haz clic en Crear nueva base de datos.
- Anota estos 3 valores:
Nombre de la base de datos— p. ej.u123_AssetHubUsuario— p. ej.u123_adminContraseña— autogenerada, guárdala bien
Paso 3 — Subir archivos
- Ve a Archivos → File Manager en hPanel.
- Navega a
public_html/(es la raíz de tu dominio). - Elimina cualquier
index.htmlodefault.phppredeterminado en esa carpeta. - Haz clic en Subir archivos y sube todo
source.zipdel paquete.
O sube el contenido de la carpeta/source/directamente vía FTP si prefieres. - Si subiste un ZIP, clic derecho → Extraer. Tras extraer, todos los archivos deben quedar en la raíz de
public_html/. - Verifica que
public_html/contenga:app/,public/,vendor/,.htaccess,index.php(enpublic/),.env, etc.
.htaccess exista en la raíz de public_html/. Contiene las reglas de reescritura de URL. Si el File Manager oculta los archivos ocultos, haz clic en Configuración → Mostrar archivos ocultos.
Paso 4 — Ejecutar el instalador
- Abre tu navegador y ve a
https://yourdomain.com/install. - Verás el AssetHub Installer.
- Paso 1: Requirements — Todas las verificaciones deben pasar (verde). Si alguna falla, contacta al soporte de Hostinger para activar la extensión PHP faltante.
- Paso 2: Database — Ingresa las credenciales del Paso 2 anterior:
- Host:
localhost - Puerto:
3306 - Base de datos:
u123_AssetHub - Usuario:
u123_admin - Contraseña: (la que Hostinger generó)
- Host:
- Paso 3: Migrate — Haz clic en "Run Migrations & Seed". Toma ~10 segundos. No refresques.
- Paso 4: Admin — Crea tu cuenta de administrador. Usa una contraseña fuerte.
- ¡Listo! — Verás la URL Cron (¡guárdala!) y un botón para iniciar sesión.
Paso 5 — Configurar alertas automáticas vía Hostinger Cron
AssetHub usa el scheduler de Laravel para tareas en segundo plano: alertas de garantía, recordatorios de mantenimiento, vencimiento de documentos, refresco de depreciación y checkouts vencidos. Configura un cron job en hPanel y Laravel decide qué tarea ejecutar y cuándo.
- En hPanel, ve a Avanzado → Cron Jobs.
- Haz clic en Crear Cron job.
- Selecciona tipo: Custom (no "PHP" — necesitamos pasar un argumento).
- Para el comando, ingresa (reemplaza
uXXXXXXcon tu usuario de Hostinger):
Consejo: abre File Manager, ubica el archivo/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:runartisan(raíz de tu proyecto), clic derecho → Propiedades para copiar la ruta completa. - Establece el horario a Cada minuto — los cinco campos (Minuto, Hora, Día, Mes, Día de la semana) en
*. - Haz clic en Guardar.
Listo — AssetHub ahora envía automáticamente recordatorios de checkout vencido, alertas de mantenimiento, vencimiento de documentos, garantías y refresca los valores de depreciación. Laravel programa internamente cada job a su frecuencia correcta (diario 08:00, mensual, etc.).
public_html/public/? Sin problema — tu código Laravel sigue en la raíz de public_html/, así que la ruta del cron sigue siendo /home/uXXXX/public_html/artisan (no añadas /public/).
- Inicia sesión como admin → Configuración → pestaña Sistema → copia tu URL Cron.
- Regístrate gratis en cron-job.org.
- Crea un cronjob, pega la URL, configura Cada 15 minutos, guarda.
Paso 6 — Configurar correo (SMTP)
Hostinger proporciona cuentas de correo con cada plan. Para usarlas en las notificaciones de AssetHub:
- En hPanel, ve a Correos → Cuentas de correo y crea una (p. ej.
noreply@yourdomain.com). - Edita el archivo
.envenpublic_html/vía File Manager:MAIL_MAILER=smtp MAIL_HOST=smtp.hostinger.com MAIL_PORT=587 MAIL_USERNAME=noreply@yourdomain.com MAIL_PASSWORD=your_email_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=noreply@yourdomain.com MAIL_FROM_NAME="Your Company Name" - Guarda el archivo.
- Inicia sesión en AssetHub → Configuración → pestaña Email → Enviar correo de prueba. Si lo recibes, listo.
Problemas comunes en Hostinger Single
"500 Internal Server Error" después de subir
- Verifica que
.htaccessexista en la raíz depublic_html/y contenga las reglas de reescritura. - Verifica que la versión PHP esté en 8.2 u 8.3 en hPanel.
- Revisa
storage/logs/laravel.logvía File Manager para ver el error real.
"Permission denied" en uploads
Hostinger normalmente configura los permisos correctamente, pero si no:
- Clic derecho en
storage/en File Manager → Permisos → establece a755recursivamente. - Lo mismo para
bootstrap/cache/.
El escáner QR no abre la cámara
Las APIs de cámara del navegador requieren HTTPS. Hostinger ofrece SSL gratis vía Let's Encrypt — actívalo en hPanel bajo SSL → Administrar.
Los correos programados no se envían
- En hPanel → Cron Jobs → revisa la columna Last run en tu entrada de cron. Si está vacía, el cron no se está ejecutando — verifica que la ruta de artisan sea correcta.
- Prueba el comando manualmente: abre Terminal en hPanel (si está disponible) y ejecuta el comando cron. Si falla, el mensaje de error indicará el problema (versión PHP equivocada, ruta equivocada, etc.).
- Verifica que SMTP esté correctamente configurado (Configuración → Email → Enviar prueba).
- Revisa
storage/logs/laravel.logen busca de errores del scheduler.
Rendimiento lento
Hostinger Single tiene CPU/RAM compartidos. Si tu equipo es de más de 20 usuarios, considera:
- Subir a Premium (~$3.99/mes) — servidores más rápidos, más recursos, varias bases de datos.
- O Business (~$5.99/mes) — recursos dedicados, copias diarias, entorno staging.
Desplegando en cPanel (Hosting compartido)
Esta guía cubre el hosting compartido cPanel estándar (Namecheap, Bluehost, GoDaddy y la mayoría de los hosts económicos). AssetHub se envía con vendor/ y activos de frontend pre-construidos — no se requiere Composer, npm ni Terminal web. Si su cPanel carece de Terminal, use SSH Access o las alternativas del Administrador de Archivos a continuación.
/home/CPANELUSER/ — verifique la barra lateral en cPanel bajo Información General.
Paso 1 — Establecer versión de PHP y extensiones
- Inicie sesión en cPanel.
- Abra MultiPHP Manager (o Select PHP Version) y configure su dominio a PHP 8.2 o 8.3.
- Abra MultiPHP INI Editor o PHP Extensions y confirme que estas estén habilitadas:
- OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
- Si falta una extensión, habilítela en la lista de extensiones o contacte al soporte de su host.
Paso 2 — Habilitar SSL (HTTPS)
- Vaya a SSL/TLS Status (o Let's Encrypt SSL / AutoSSL).
- Ejecute AutoSSL o instale un certificado gratuito para su dominio.
- HTTPS es obligatorio para que el escáner QR del navegador acceda a la cámara.
https://sudominio.com para confirmar que aparece el icono del candado.
Paso 3 — Crear base de datos MySQL y usuario
- Abra Manage My Databases (bajo Bases de datos).
- En Crear nueva base de datos, ingrese un nombre (ej.
assethub) y haga clic en Crear. cPanel agrega el prefijo de su cuenta automáticamente — el nombre completo se verá comocpaneluser_assethub. - En Usuarios MySQL, cree un usuario con una contraseña segura. Copie el nombre de usuario completo con prefijo.
- En Añadir usuario a la base de datos, seleccione el usuario y la base de datos, haga clic en Añadir, luego otorgue TODOS LOS PRIVILEGIOS. Este paso es fácil de olvidar — sin él obtendrá errores
Access denied (1045). - Anote estos tres valores exactamente como se muestran en cPanel:
Nombre de la base de datos— p. ej.u123_AssetHubUsuario— p. ej.u123_adminContraseña— autogenerada, guárdala bien
Paso 4 — Subir archivos
- Abra el Administrador de archivos y vaya a
public_html/(raíz del documento de su dominio). - Habilite Configuración → Mostrar archivos ocultos para que pueda ver
.htaccessy.env. - Elimine cualquier
index.htmlpredeterminado enpublic_html/si está presente. - Suba el paquete
source.zipy Extráigalo, o suba el contenido de la carpeta/source/vía FTP. - Después de la extracción,
public_html/debe contenerapp/,public/,vendor/, el.htaccessraíz yartisanal mismo nivel.
.htaccess raíz redirige todas las solicitudes a la carpeta public/ — no necesita cambiar la raíz del documento manualmente en la mayoría de los hosts.
Paso 5 — Preparar .env antes de ejecutar el instalador
Complete este paso antes de visitar /install. Laravel requiere una APP_KEY válida y configuraciones de base de datos correctas en .env.
- En el Administrador de archivos, copie
.env.examplea.env(misma carpeta queartisan). - Edite
.envy configure como mínimo:APP_NAME=AssetHub APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=cpaneluser_assethub DB_USERNAME=cpaneluser_admin DB_PASSWORD="your_password" SESSION_DRIVER=file CACHE_STORE=file - Establezca
DB_CONNECTION=mysql— el.env.examplepredeterminado usa SQLite; el hosting compartido requiere MySQL. - Establezca
SESSION_DRIVER=fileyCACHE_STORE=fileantes de la primera migración (evita errores de "tabla de sesiones no encontrada"). - Envuelva
DB_PASSWORDen comillas dobles si contiene caracteres especiales (#,$,!, etc.).
Generar APP_KEY (no se requiere Terminal)
Muchos planes de cPanel no incluyen una Terminal web. Use uno de estos métodos:
- SSH Access (cPanel → Seguridad → SSH Access): conéctese con PuTTY o PowerShell, luego ejecute
cd ~/public_html && php artisan key:generate. - Ayudante del Administrador de archivos — cree
public/genkey.phptemporalmente, visítelo en su navegador, copie el resultado enAPP_KEY=, luego elimine el archivo inmediatamente.<?php echo 'base64:' . base64_encode(random_bytes(32)); - En su PC — si PHP está instalado localmente, ejecute
php -r "echo 'base64:'.base64_encode(random_bytes(32));"y pegue el resultado en.env.
genkey.php tan pronto como copie la clave. Nunca deje scripts de ayuda en un servidor de producción.
- Establezca los permisos de
storage/ybootstrap/cache/a 755 (recursivo) si el instalador informa errores de escritura.
Paso 6 — Ejecutar el instalador web
- Abra
https://sudominio.com/installen su navegador. - Paso 1: Requisitos — todas las comprobaciones deben pasar (verde). Corrija cualquier extensión de PHP que falte en el Paso 1 anterior.
- Paso 2: Base de datos — ingrese los nombres exactos con prefijo del Paso 3:
- Host:
127.0.0.1orlocalhost - Puerto:
3306 - Base de datos:
cpaneluser_assethub - Usuario:
cpaneluser_admin - Contraseña: (your MySQL password)
- Host:
- Paso 3: Migrar — haga clic en "Run Migrations & Seed". Tarda unos 10 segundos. No recargue la página.
- Desmarque Include demo data para una instalación de producción limpia.
- Paso 4: Admin — cree su cuenta de administrador.
- ¡Hecho! — guarde la URL de Cron que se muestra en la pantalla final.
Paso 7 — Configurar Cron Jobs para alertas por correo
AssetHub necesita un cron job ejecutándose cada minuto para que Laravel pueda enviar alertas de garantía, recordatorios de mantenimiento y otros correos programados.
- En cPanel, vaya a Advanced → Cron Jobs.
- En Añadir nuevo cron job, establezca el horario a Cada minuto (
* * * * *). - Ingrese el comando (reemplace
CPANELUSERcon su nombre de usuario de cPanel de Información General):
Consejo: la ruta de PHP puede ser/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run/usr/local/bin/phpo/usr/bin/php— pregunte a su host si no está seguro. La ruta de artisan es donde subió el proyecto (usualmente/home/CPANELUSER/public_html/artisan). - Haga clic en Añadir nuevo cron job para guardar.
public_html/public/? El cron sigue apuntando a /home/CPANELUSER/public_html/artisan — no añada /public/.
- Inicie sesión como admin → Configuración → Sistema → copie la URL de Cron.
- Regístrese en cron-job.org (gratis).
- Cree una tarea que visite esa URL cada 15 minutos.
Paso 8 — Configurar correo (SMTP)
Cree una cuenta de correo de cPanel para las notificaciones salientes:
- Vaya a Cuentas de correo electrónico → cree ej.
noreply@sudominio.com. - Edite
.enven el Administrador de archivos:MAIL_MAILER=smtp MAIL_HOST=mail.yourdomain.com MAIL_PORT=587 MAIL_USERNAME=noreply@yourdomain.com MAIL_PASSWORD=your_email_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=noreply@yourdomain.com MAIL_FROM_NAME="Your Company Name" - Guarde, luego en AssetHub: Configuración → Correo electrónico → Enviar correo de prueba.
Problemas comunes en cPanel
"Access denied for user" (SQLSTATE 1045)
- Copie el nombre de la base de datos y el usuario exactamente de cPanel — incluyendo el prefijo de la cuenta.
- Confirme que completó Añadir usuario a la base de datos con TODOS LOS PRIVILEGIOS.
- Restablezca la contraseña de MySQL en cPanel y actualice
.env— use comillas alrededor deDB_PASSWORDsi contiene caracteres especiales.
La migración falla después de que el paso de Base de datos pasó
- El instalador prueba las credenciales del formulario, pero Migrate lee de
.env. Asegúrese de que ambos coincidan. - Elimine
bootstrap/cache/config.phpsi existe, luego reintente. - Asegúrese de que
DB_CONNECTION=mysqlesté configurado en.env(no sqlite).
"Invalid default value" durante la migración (1067)
Corregido en AssetHub v2.1.0+ (la tabla checkouts usa columnas dateTime). Si tiene una copia más antigua, actualice el archivo de migración o descargue el paquete más reciente de CodeCanyon.
"500 Internal Server Error" después de subir
- Verifique que el
.htaccessraíz exista y que PHP sea 8.2+. - Revise
storage/logs/laravel.logpara ver el error real. - Confirme que
APP_KEYesté configurado en.env— una clave vacía causa errores 500.
No hay Terminal en cPanel
Esto es normal en muchos planes compartidos. Use SSH Access (si está habilitado), el método temporal genkey.php en el Paso 5, o genere la clave en su PC local.
La cámara del escáner QR no abre
Habilite SSL a través de SSL/TLS Status → AutoSSL y acceda al sitio a través de https://.
Configuración
Archivo .env
| Clave | Descripción | Ejemplo |
|---|---|---|
APP_NAME | Nombre de la aplicación mostrado en la barra de título | AssetHub |
APP_URL | URL pública de tu instalación | https://assets.example.com |
APP_DEBUG | Establece a false en producción | false |
DB_* | Detalles de conexión a la base de datos | mysql, 127.0.0.1, 3306, ... |
MAIL_MAILER | Driver de correo | smtp, log, mailgun |
MAIL_HOST | Hostname del servidor SMTP | smtp.gmail.com |
MAIL_PORT | Puerto SMTP | 587 |
MAIL_USERNAME | Usuario SMTP | your@email.com |
MAIL_PASSWORD | Contraseña SMTP o app token | ********** |
MAIL_FROM_ADDRESS | Dirección From por defecto | noreply@example.com |
Configuración en la aplicación
La mayoría de las opciones no sensibles son configurables desde Admin → Configuración:
- General: nombre/correo/teléfono de empresa, prefijo de asset tag
- Email: enviar correo de prueba para verificar SMTP
- Notificaciones: umbrales de alerta de garantía, ventana de recordatorio de mantenimiento
- Localización: zona horaria (lista con búsqueda, incl.
Europe/Skopje), formato de fecha, código de moneda (incl.MKD— Denar macedonio), símbolo y posición del símbolo — aplicados en toda la app tras guardar - General → Public Asset Page: visibilidad del QR (público / inicio de sesión / desactivado) y regenerar todos los códigos QR tras cambios de URL
- La pestaña Localización enlaza a Administration → Translations para el Translation Editor completo (solo admin)
- Branding: nombre y logo — actualiza logo de login, footer, badge y título de pestaña del navegador (v4.0+). Subtítulo de login: edite
auth.login_subtitleen Administration → Translations - Appearance (v4.0+): personalice colores de marca, estado y texto para modos claro y oscuro — ver la guía de rebrand en las FAQ
Soporte multi-idioma
AssetHub incluye 11 idiomas listos para usar, incluido árabe RTL e hindi. Los usuarios cambian de idioma mediante el desplegable de banderas en la esquina superior derecha.
Idiomas incluidos
| Código | Idioma | Dirección |
|---|---|---|
en | English (default) | LTR |
vi | Tiếng Việt | LTR |
es | Español | LTR |
fr | Français | LTR |
de | Deutsch | LTR |
zh | 简体中文 | LTR |
ja | 日本語 | LTR |
pt-BR | Português (Brasil) | LTR |
ru | Русский | LTR |
ar | العربية | RTL |
hi | हिन्दी | LTR |
Cómo cambiar de idioma
- Haz clic en el icono de bandera (esquina superior derecha) para abrir el menú.
- Selecciona tu idioma de la lista.
- La página se recarga; todas las etiquetas, fechas y formatos de moneda cambian.
- Tu elección se guarda en tu cuenta de usuario y en una cookie (1 año).
/locale/{code}, lo cual solo funciona cuando hay un servidor PHP en ejecución. Accede siempre por tu dominio real (producción) o http://localhost:8000 (desarrollo con php artisan serve). Los archivos de documentación como este, en cambio, son totalmente independientes y se pueden abrir directamente.
Añadir un idioma personalizado (admin)
Vaya a Administration → Translations (usuarios admin con permiso manage translations):
- Haga clic en "Add Locale" — proporcione un código (p. ej.
mkpara macedonio), nombre para mostrar, nombre nativo, nombre de archivo SVG de bandera, dirección (LTR/RTL) y un locale base del que copiar traducciones. - El nuevo locale aparece en el selector de idioma y en la lista de idioma predeterminado de Settings → Localization.
- Las traducciones almacenadas en BD anulan automáticamente las traducciones de archivos en
lang/{code}/.
Translation Editor
El editor lista cada clave de traducción agrupada por archivo (p. ej. assets, nav, settings). Las claves muestran la línea base del archivo y cualquier anulación en BD.
- Filtre por locale, grupo de traducción o texto de búsqueda.
- Haga clic en un valor para editarlo inline; los cambios se guardan en la base de datos de inmediato.
- Restablezca una clave para volver a la línea base del archivo.
- Los locales integrados (en, vi, es, …) se pueden editar; los locales personalizados dependen totalmente de la BD.
- Solo los usuarios con el permiso manage translations pueden acceder a esta página.
CSV import / export
- Export — descargue todas las claves de un locale como CSV (
group,key,value). - Import — suba un CSV con las mismas columnas; las anulaciones existentes en BD se actualizan y las claves nuevas se insertan.
Idioma predeterminado por usuario
Cada usuario tiene una columna locale. Las notificaciones por correo se envían automáticamente en el idioma preferido del destinatario gracias al contrato HasLocalePreference de Laravel.
El idioma predeterminado del sitio se configura en Settings → Localization → Default Language. Los usuarios individuales lo anulan mediante el selector de idioma del encabezado.
Lista de funciones
Gestión de activos
- Asset tags autogenerados
- Múltiples imágenes por activo
- Generación de códigos QR
- Seguimiento de estado y condición
- Importar/exportar masivo
- Clonar activo
- Seguimiento de cantidad por lote / batch (v2)
Flujos de trabajo
- Asignar / Devolver / Transferir
- Solicitudes con aprobación
- Reserva Check-in / Check-out
- Detección de conflictos
Mantenimiento
- Programar preventivo/correctivo
- Vista calendario
- Auto-programar siguiente
- Seguimiento de costos
- Recordatorios por correo
Documentos
- Adjuntar facturas, manuales
- Vista previa en línea
- Alertas de vencimiento
- Múltiples tipos de documento
Depreciación
- 3 métodos de cálculo
- Auto-actualizar valor
- Gráfico de cronograma
- Resumen anual
Reportes
- 12 tipos de reportes
- Exportar Excel + PDF
- Gráficos y paneles
- Filtros de fecha
Operativo (v2)
- Activos por lote / batch con conciliación en vivo
- Asignaciones a empleados, departamentos y almacén
- Disposiciones con aprobación y separación de funciones
- Página pública de entrega QR en /a/{tag}
Localización y traducciones (v3)
- 11 idiomas de interfaz integrados + locales personalizados
- Translation Editor con búsqueda, filtro por grupo y edición inline
- Importación/exportación CSV para actualizaciones masivas de traducciones
- Configuración de zona horaria y moneda aplicada en toda la app
Marca y apariencia (v4)
- El título de la pestaña del navegador se actualiza desde Configuración → Marca → Nombre de la aplicación
- Personalice los colores en Configuración → Apariencia (modo claro y oscuro)
Usuarios y Roles
AssetHub viene con 5 roles preconfigurados:
| Rol | Capacidades |
|---|---|
| Admin | Acceso total al sistema — usuarios, departamentos, configuración, auditoría, webhooks, traducciones |
| IT Manager | Gestionar activos (individuales + batch/lot), categorías, mantenimiento y solicitudes; aprobar transferencias; ver reportes y depreciación |
| Contador | Gestionar activos y depreciación, ejecutar auditorías de inventario, aprobar transferencias y disposiciones, acceso completo a reportes (enfoque financiero) |
| Supervisor | Aprobar solicitudes del departamento, gestionar checkouts, participar en auditorías, ver reportes |
| Empleado | Ver activos asignados, crear solicitudes, gestionar checkouts propios |
Los permisos se almacenan como roles Spatie — los administradores pueden ajustarlos por permiso vía la base de datos.
Gestión de activos
Crear activos
- Navega a Activos → Nuevo activo.
- Completa nombre, categoría, marca, modelo, número de serie.
- Añade fecha de compra y precio (obligatorio para depreciación).
- Sube imágenes (varios archivos soportados, máx. 5 MB cada uno).
- Guarda — el asset tag y el código QR se generan automáticamente.
Formato de Asset Tag
Por defecto: {PREFIX}-{YEAR}-{NNNN}, p. ej. AS-2026-0001. Configurable vía Configuración → General → Prefijo de Asset Tag.
Importación masiva
- Haz clic en Importar en la página de Activos.
- Descarga la plantilla Excel.
- Completa tus datos — columnas obligatorias:
name,category_name. - Sube el archivo.
Activos por lote / batch (v2)
Para artículos idénticos en cantidad (sillas, teclados, uniformes), elija Tipo de seguimiento → Batch / Lot en el formulario Nuevo activo en lugar de crear registros duplicados.
- Ingrese la cantidad y la unidad (pieza, juego, caja). Al guardar, el stock se coloca en el almacén general.
- Abra el activo → pestaña Allocations → Allocate para asignar unidades a un empleado o departamento.
- Use Return, Adjust (dañado/perdido/reparación) o acciones de disposición — el resumen en vivo debe conciliar con la cantidad total.
- Los activos batch admiten solo precio unitario; la depreciación es opcional y desactivada por defecto para una configuración más rápida.
php artisan migrate después de actualizar a v2 — sin pérdida de datos.Códigos QR
Cada activo recibe automáticamente un código QR al crearse. Al escanearlo se abre la página pública o autenticada del activo (véase abajo). El escaneo en la app salta directamente a la pantalla de detalle del activo.
Imprimir etiquetas
- Etiqueta única: Haz clic en el icono de impresora en cualquier fila de activo.
- Formato PDF: A4, 2 etiquetas por fila, incluye asset tag, nombre, marca, serie.
Escaneo
Haz clic en Escanear QR en la página de Activos. Permite el acceso a la cámara. El escáner usa html5-qrcode y funciona en cualquier navegador moderno. Nota: el acceso a cámara requiere HTTPS o localhost.
Página pública de entrega QR (v2)
Cada activo también tiene una URL pública imprimible en /a/{asset_tag} — útil para entregas físicas sin iniciar sesión.
- Configure en Settings → General → Public Asset Page: Público, Inicio de sesión requerido o Desactivado.
- La página muestra la foto, los campos clave y (para lotes) el desglose de cantidad. Los usuarios pueden imprimirla como hoja de entrega.
- Tras cambiar
APP_URL, haga clic en Regenerate all QR codes en el mismo panel de configuración.
Flujos de trabajo
Asignación de activos
- Abre una página de detalle de activo.
- Haz clic en Asignar (visible si el activo está disponible).
- Elige un usuario, fecha de devolución opcional, notas.
- Envía — se crea la transacción y se envía notificación por correo.
Solicitudes de activos
Los empleados pueden enviar solicitudes para activos que necesiten. Las solicitudes tienen 4 estados: pending → approved → fulfilled, o rejected. Los correos de aprobación se envían automáticamente.
Check-in / Check-out
Para activos compartidos (cámaras, proyectores, vehículos). Las reservas tienen rangos de fechas; el sistema evita checkouts superpuestos. La vista calendario muestra todas las reservas de un vistazo.
Disposiciones — Baja formal (v2)
Los artículos desgastados o dañados se dan de baja en lotes documentados con separación de funciones (proponente ≠ aprobador). Requiere los permisos manage disposals y approve disposals.
- Barra lateral → Disposals → New Disposal. Establezca título y período (Q1–Q4, anual o ad-hoc).
- Abra el borrador → Add items — unidades batch dañadas elegibles o activos individuales en condición Poor.
- Haga clic en Submit for approval — el lote se bloquea.
- Un aprobador distinto hace clic en Approve & execute — los activos/unidades se marcan como disposed.
- Imprima el disposal minutes (PDF) para registros de cumplimiento.
Depreciación
AssetHub calcula la depreciación de activos usando uno de tres métodos:
| Método | Fórmula | Caso de uso |
|---|---|---|
| Línea recta | (Cost - Salvage) / Useful Life | Más común; depreciación anual igual |
| Saldo decreciente | 2 / Useful Life × Book Value | Acelerada; para impuestos |
| Unidades de producción | Basado en uso | Equipo de fabricación |
Los valores predeterminados se heredan de la categoría del activo. Las entradas de cronograma se generan mensualmente. El current_value del activo se actualiza automáticamente el día 1 de cada mes.
Campos personalizados
Admin → Campos personalizados te permite añadir atributos personalizados ilimitados a los activos:
- Tipos: texto, número, fecha, selección (dropdown), área de texto, archivo, casilla
- Alcance: aplicar a todas las categorías o una específica
- Reordenar: arrastra el asa
- Los campos obligatorios se validan al guardar el activo
Reportes
Doce reportes integrados, accesibles desde el menú Reportes:
- Resumen de activos — totales por estado, condición, categoría, departamento
- Depreciación — pérdida de valor por categoría, activos más depreciados
- Transacciones — actividad de asignación, devolución, transferencia en el tiempo
- Costo de mantenimiento — gasto por mes, categoría, tipo
- Vencimiento de garantías — activos que requieren atención en 30/60/180 días
- Activos por departamento — distribución y utilización presupuestal por departamento
- Activos por origen — distribución entre compras, proyecto, donación, transferencias
- Resumen de auditoría de inventario — discrepancias entre ciclos periódicos de auditoría
- Asignaciones a empleados (v2) — quién tiene qué, incluidas asignaciones batch
- Departamento / Ubicación (v2) — activos y cantidades por departamento o ubicación
- Conciliación de inventario (v2) — stock vs asignado vs dañado/perdido/disposed
- Activos dañados (v2) — artículos marcados para reparación o baja
Todos los reportes admiten exportación Excel y PDF mediante botones en el encabezado de la página. Los reportes v2 son conscientes de la cantidad (recuento de activos + unidades totales).
Hooks web
AssetHub puede notificar a servicios externos en eventos clave.
Eventos disponibles
asset.created,asset.updated,asset.deletedasset.assigned,asset.returned,asset.transferredrequest.created,request.approved,request.rejected,request.fulfilledmaintenance.scheduled,maintenance.started,maintenance.completedcheckout.created,checkout.returned
Formato de Payload
{
"event": "asset.assigned",
"timestamp": "2026-05-05T08:00:00+00:00",
"data": {
"asset_id": 1,
"asset_tag": "AS-2026-0001",
"asset_name": "HP EliteDesk 800",
"to_user_id": 4,
"transaction_id": 12
}
}
Verificación de firma
Si se configura un secret, las solicitudes incluyen el encabezado X-AssetHub-Signature con HMAC-SHA256 del cuerpo. Verifica en tu lado:
$expected = hash_hmac('sha256', $rawBody, $secret);
if (hash_equals($expected, $request->header('X-AssetHub-Signature'))) {
// válido
}
Política de reintentos
Las entregas fallidas se reintentan 3 veces con 200 ms de retraso. Tras 10 fallos consecutivos, el webhook se desactiva automáticamente.
Tareas programadas
AssetHub usa el scheduler de Laravel para jobs en segundo plano. Solo necesitas una entrada de cron — Laravel despacha internamente cada job en el momento correcto.
Hosting compartido (Interfaz de Cron Jobs de cPanel / Hostinger)
Consulte la sección Configuración de cPanel → Paso 7 o Configuración de Hostinger → Paso 5 para obtener instrucciones con capturas de pantalla. En resumen: Advanced → Cron Jobs, comando:
/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
Horario: cada minuto (* en los cinco campos).
Comando cron de cPanel
Reemplace CPANELUSER con su nombre de usuario de cPanel:
/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run
VPS / servidor dedicado (crontab)
Ejecuta crontab -e como tu usuario web (a menudo www-data) y añade:
* * * * * cd /path/to/AssetHub && php artisan schedule:run >> /dev/null 2>&1
Alternativa: pinger de URL externo
Si tu host no tiene cron, usa la URL Cron en la app (Configuración → pestaña Sistema) con cron-job.org (gratis, cada 15 min).
Jobs que se ejecutan automáticamente
| Hora | Comando | Propósito |
|---|---|---|
| Diario 08:00 | send-overdue-checkout-alerts | Recordatorios por correo de checkouts vencidos |
| Diario 08:30 | send-maintenance-reminders | Recordatorios de mantenimiento próximo |
| Diario 09:00 | send-document-expiry-alerts | Documentos venciendo en 30/14/7/1 días |
| Diario 09:30 | send-warranty-alerts | Alertas de vencimiento de garantía + seguro |
| Diario 10:00 | assethub:send-depreciation-end-alerts | Alertas cuando los activos llegan al fin de vida útil |
| Diario 10:30 | send-inventory-audit-reminders | Recordatorios de auditorías de inventario activas |
| Mensual día 1, 02:00 | update-asset-values | Refrescar current_value de activos desde depreciación |
Upgrade Guides
Step-by-step guides for updating an existing installation. Open the guide that matches your current version.
- v3.1 → v4.0 — Full upgrade guide — Appearance settings, browser tab title from Branding. No migration required.
- v3.0 → v3.1 — Full upgrade guide — Visible languages checklist in navbar picker. No migration required.
- v2.x → v3.0 — Full upgrade guide — Translation Editor, custom locales, localization settings.
- v1.x → v2.0 — Full upgrade guide — Batch assets, disposals, public QR page, operational reports.
Resolución de problemas
"Permission denied" en storage
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
El escáner QR no abre la cámara
Las APIs de cámara del navegador requieren HTTPS. Instala un certificado SSL o usa localhost para pruebas.
Los correos no llegan
Revisa storage/logs/laravel.log en busca de errores. Usa Configuración → Email → Enviar correo de prueba para verificar credenciales SMTP. Asegúrate de que tu servidor SMTP permita la IP emisora.
Base de datos "Access denied" (1045) en cPanel
Usuario/contraseña incorrectos, falta la asignación de usuario a la base de datos, o caracteres especiales en la contraseña que rompen el análisis de .env. Consulte Configuración de cPanel → Problemas comunes.
Error de migración 1067 (Invalid default value)
El modo estricto de MySQL en hosting compartido rechaza múltiples columnas timestamp NOT NULL. Corregido en v2.1.0+. Actualice su paquete o cambie checkout_date / expected_return_date a dateTime en la migración de checkouts.
Falta APP_KEY / Error 500 antes de la instalación
Laravel requiere APP_KEY en .env antes de que la aplicación se cargue. Si cPanel no tiene Terminal, consulte Configuración de cPanel → Paso 5 para métodos de SSH, genkey.php o generación local.
Reiniciar instalación
Elimina storage/installed.lock y visita /install de nuevo. Los datos existentes se borrarán si vuelves a ejecutar migraciones.
Rendimiento — lista de activos lenta
Ejecuta php artisan optimize para cachear config, rutas, vistas. Asegúrate de que MySQL tenga índices en assets.asset_tag, assets.serial_number, assets.status (creados automáticamente por las migraciones).
Upgrading from v3.0.x to v3.1
Download the v3.1 package from CodeCanyon, replace application files (keep your .env and storage/ uploads). No new migrations are required. The new visible_locales setting is optional — if unset, all languages remain visible in the navbar picker.
v3.0 → v3.1 — Full upgrade guide
Actualización de v2.x a v3.0
Descargue el ZIP v3 de CodeCanyon, reemplace los archivos de la aplicación (conserve su .env y las cargas en storage/), luego ejecute php artisan migrate. Las nuevas tablas para locales personalizados y anulaciones de traducción se añaden automáticamente. La configuración y los activos existentes se conservan.
v2.x → v3.0 — Full upgrade guide
Actualización de v1.x a v2.0
Descargue el ZIP v2 de CodeCanyon, reemplace los archivos de la aplicación (conserve su .env y las cargas en storage/), luego ejecute php artisan migrate. La actualización no rompe la compatibilidad — los activos individuales existentes siguen funcionando; las nuevas tablas batch/disposal se añaden automáticamente.
Registro de cambios
v3.1.0 — Visible Language Picker (2026-06)
- Settings → Localization: checklist to choose which languages appear in the navbar language dropdown (built-in + custom locales)
- Default language is always visible; picker auto-hides when only one language is selected
- Backend validates locale switches; users on a hidden locale fall back to the default language
- No database migration required — upgrade is file-replace only
- Branding del login: footer y badge siguen Settings → Branding → App Name (sin editar código)
v3.0.0 — Localización y Translation Editor (2026-06)
- Interfaz del Translation Editor en Administration → Translations (Add Locale, edición inline, búsqueda/filtro por grupo)
- Locales personalizados almacenados en BD — código, nombre para mostrar, nombre nativo, SVG de bandera, dirección, locale base
- Importación/exportación CSV para actualizaciones masivas de traducciones
- Configuración de zona horaria y moneda aplicada en toda la app (config/localization.php incl. Europe/Skopje, MKD)
- Settings → Localization: desplegables de zona horaria/moneda con búsqueda y soporte de valores personalizados
- Hindi (hi) añadido como 11.º locale integrado; date_format respetado en las páginas Vue
- manage translations con control de permisos; las anulaciones de BD se fusionan con la línea base de archivos lang/
v2.0.0 — Lanzamiento operativo (2026-06)
- Activos por lote / batch — seguimiento de cantidad, asignaciones, devoluciones, conciliación en vivo
- 4 reportes operativos: Employee Assignments, Department/Location, Inventory Reconciliation, Damaged Assets
- Módulo de disposiciones — lotes de baja, aprobación con separación de funciones, acta PDF imprimible
- Página pública de activos QR en
/a/{tag}con visibilidad configurable - Reportes heredados actualizados para mostrar recuento de activos + unidades totales
- Los códigos QR enlazan a la página pública de entrega; el registro de transacciones guarda la cantidad en movimientos batch
- Datos demo actualizados, guía de usuario (incluida por separado en
documentation/) y cadenas i18n
v1.0.0 — Lanzamiento inicial (2026-05)
- CRUD de activos con generación automática de QR
- 5 roles de usuario (Admin, IT Manager, Contador, Supervisor, Empleado) con permisos granulares
- Seguimiento de Origen de activo (compra centralizada, descentralizada, proyecto de inversión, donación, transferencia interna)
- Flujos de asignación y devolución con notificaciones por correo
- Flujo de aprobación de transferencias (pending → approved/rejected) con control de permisos
- Flujo de aprobación de solicitudes de activos
- Check-in/check-out con vista calendario
- Programación de mantenimiento con auto-renovación
- Adjuntos de documentos con alertas de vencimiento
- Depreciación con 3 métodos de cálculo + alertas de fin de vida útil
- Módulo de Auditoría de inventario — recuento periódico con seguimiento de discrepancias
- Campos personalizados con 7 tipos de entrada y orden drag-drop
- 8 reportes con gráficos, exportación Excel y PDF (incl. Activos por origen, Resumen de auditoría)
- Log de auditoría vía Spatie Activitylog con visor de diferencias
- Webhooks con firma HMAC y reintentos automáticos
- Interfaz multi-idioma: 10 idiomas (en, vi, es, fr, de, zh, ja, pt-BR, ru, ar con RTL)
- UI de Configuración para empresa, email, notificaciones, localización, traducciones
- Asistente de instalación web
- Modo oscuro con paleta emerald-teal
Créditos
Bibliotecas open-source utilizadas
- Laravel 11 — MIT
- Vue 3 — MIT
- Inertia.js — MIT
- Tailwind CSS — MIT
- Spatie Permission, Media Library, Activitylog — MIT
- Phosphor Icons — MIT (duotone weight)
- ApexCharts — MIT
- html5-qrcode — Apache 2.0
- Simple QrCode — MIT
- Laravel Excel — MIT
- Laravel DomPDF — MIT