AssetHub Documentación

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.

Checklist de rebrand completo: actualice App Name (logo, login, título de pestaña) → edite auth.login_subtitle por idioma → personalice colores en Settings → Appearance.

Referencia rápida:

ElementoEjemploCómo cambiar
Top-left logo & wordmarkVimoticFARSettings → Branding → App Name
Login subtitleEnter your credentials to access AssetHubAdministration → Translationsauth.login_subtitle
Footer copyright© 2026 VimoticFARSettings → Branding → App Name
Right panel badgeVIMOTICFARSettings → Branding → App Name
Browser page title (tab)YourAppNameSettings → Branding → App Name (v4.0+)
App colors (buttons, sidebar, badges…)Custom green / blue paletteSettings → Appearance (v4.0+)

1. Logo and wordmark:

  1. Sign in as an administrator.
  2. Go to Settings → Branding.
  3. Update App Name (and optionally upload a logo).
  4. 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 → replace AssetHub with 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 → SettingsAppearance (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 other auth.* 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-built public/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)

  1. Sube los archivos del proyecto a tu servidor web.
  2. Apunta el document root del dominio a public/.
  3. Configura permisos: storage/ y bootstrap/cache/ deben tener escritura (chmod 775).
  4. Copie .env.example a .env y establezca APP_KEY (ejecute php artisan key:generate si tiene SSH/Terminal, o consulte Configuración de cPanel → Paso 5 para alternativas del Administrador de Archivos).
  5. Visita https://yourdomain.com/install en tu navegador.
  6. 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
Configuración del servidor web: El document root debe apuntar al directorio 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).

CampoPredeterminado / EjemploNotas
Host127.0.0.1Funciona 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).
Port3306Puerto MySQL estándar. Solo cámbielo si su proveedor usa un puerto no estándar (poco frecuente).
Nombre de la base de datosuXXXXXX_assethubEl 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 usuariouXXXXXX_assethubUsuario 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 errorCausa y solución
SQLSTATE[HY000] [1045] Access deniedUsuario 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 databaseEl 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 refusedNo 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: sessionsOcurre 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 driverFalta 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.
Consejo: Los campos Host y Port están prellenados con los valores más comunes (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.

Recomendado: Laravel Herd es la ruta más rápida en macOS y Windows — sin Docker, sin configuración manual de Apache/MySQL. XAMPP y Laragon son buenas alternativas gratuitas si prefieres un stack tradicional.

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.

  1. Descarga e instala Laravel Herd desde herd.laravel.com.
  2. 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.
  3. 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).
  4. 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).
  5. Copia .env.example a .env, completa las credenciales de la BD y ejecuta php artisan key:generate en la raíz del proyecto.
  6. Abre http://assethub.test/install en 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.

  1. Descarga XAMPP 8.2+ de apachefriends.org e instálalo.
  2. Copia el proyecto AssetHub a C:\xampp\htdocs\AssetHub\ (Windows) o /Applications/XAMPP/htdocs/AssetHub/ (macOS).
  3. Abre XAMPP Control Panel e inicia Apache y MySQL. Si los puertos están ocupados, usa Config → service.conf para cambiar Apache a 8080.
  4. Ve a http://localhost/phpmyadminNuevo → crea una base de datos assethub con cotejamiento utf8mb4.
  5. En la carpeta del proyecto: copia .env.example a .env, establece DB_DATABASE=assethub, DB_USERNAME=root, deja DB_PASSWORD vacío (predeterminado de XAMPP). Ejecuta php artisan key:generate.
  6. Visita http://localhost/AssetHub/public/install para ejecutar el asistente del instalador.
URLs limpias sin /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.

  1. Descarga Laragon Full de laragon.org e instálalo.
  2. En Laragon: Menú → PHP → Versión — cambia a PHP 8.2 u 8.3.
  3. Copia el proyecto AssetHub a C:\laragon\www\AssetHub\.
  4. Haz clic en Start All. Laragon crea automáticamente el vhost: http://assethub.test (apuntando a la carpeta public/).
  5. Abre HeidiSQL (incluido) → crea la base de datos assethub. Credenciales predeterminadas: usuario root, contraseña vacía.
  6. Edita .env con las credenciales de la BD, ejecuta php artisan key:generate, luego visita http://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.

Probado en: planes Hostinger Single, Premium, Business (PHP 8.2+, MySQL 5.7+, Cron Jobs nativos incluidos en todos los planes).

Paso 1 — Prepara tu hosting

  1. Inicia sesión en Hostinger hPanel.
  2. Ve a Hosting → Administrar para tu dominio.
  3. Establece la versión de PHP a 8.2 u 8.3 vía Avanzado → Configuración PHP.
  4. 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

  1. En hPanel, ve a Bases de datos → MySQL Databases.
  2. Haz clic en Crear nueva base de datos.
  3. Anota estos 3 valores:
    • Nombre de la base de datos — p. ej. u123_AssetHub
    • Usuario — p. ej. u123_admin
    • Contraseña — autogenerada, guárdala bien

Paso 3 — Subir archivos

  1. Ve a Archivos → File Manager en hPanel.
  2. Navega a public_html/ (es la raíz de tu dominio).
  3. Elimina cualquier index.html o default.php predeterminado en esa carpeta.
  4. Haz clic en Subir archivos y sube todo source.zip del paquete.
    O sube el contenido de la carpeta /source/ directamente vía FTP si prefieres.
  5. Si subiste un ZIP, clic derecho → Extraer. Tras extraer, todos los archivos deben quedar en la raíz de public_html/.
  6. Verifica que public_html/ contenga: app/, public/, vendor/, .htaccess, index.php (en public/), .env, etc.
Importante: Asegúrate de que el archivo .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

  1. Abre tu navegador y ve a https://yourdomain.com/install.
  2. Verás el AssetHub Installer.
  3. Paso 1: Requirements — Todas las verificaciones deben pasar (verde). Si alguna falla, contacta al soporte de Hostinger para activar la extensión PHP faltante.
  4. 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ó)
  5. Paso 3: Migrate — Haz clic en "Run Migrations & Seed". Toma ~10 segundos. No refresques.
  6. Paso 4: Admin — Crea tu cuenta de administrador. Usa una contraseña fuerte.
  7. ¡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.

  1. En hPanel, ve a Avanzado → Cron Jobs.
  2. Haz clic en Crear Cron job.
  3. Selecciona tipo: Custom (no "PHP" — necesitamos pasar un argumento).
  4. Para el comando, ingresa (reemplaza uXXXXXX con tu usuario de Hostinger):
    /usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
    Consejo: abre File Manager, ubica el archivo artisan (raíz de tu proyecto), clic derecho → Propiedades para copiar la ruta completa.
  5. Establece el horario a Cada minuto — los cinco campos (Minuto, Hora, Día, Mes, Día de la semana) en *.
  6. 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.).

¿Document root configurado a 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/).
Alternativa para hosts sin cron: Si no usas Hostinger o tu proveedor no tiene cron jobs, AssetHub también expone una URL para activar vía webhook.
  1. Inicia sesión como admin → Configuración → pestaña Sistema → copia tu URL Cron.
  2. Regístrate gratis en cron-job.org.
  3. 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:

  1. En hPanel, ve a Correos → Cuentas de correo y crea una (p. ej. noreply@yourdomain.com).
  2. Edita el archivo .env en public_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"
  3. Guarda el archivo.
  4. Inicia sesión en AssetHub → Configuración → pestaña Email → Enviar correo de prueba. Si lo recibes, listo.
Límites SMTP en Single: Hostinger Single permite ~100 correos salientes por hora. Para despliegues mayores, usa un proveedor dedicado como SendGrid, Mailgun o Postmark (con planes gratuitos).

Problemas comunes en Hostinger Single

"500 Internal Server Error" después de subir

  • Verifica que .htaccess exista en la raíz de public_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.log ví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 a 755 recursivamente.
  • 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.log en 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.

Probado en: cPanel 110+ con PHP 8.2/8.3, MySQL 5.7+/MariaDB 10.3+, Apache y Cron Jobs nativos. El directorio de inicio suele ser /home/CPANELUSER/ — verifique la barra lateral en cPanel bajo Información General.

Paso 1 — Establecer versión de PHP y extensiones

  1. Inicie sesión en cPanel.
  2. Abra MultiPHP Manager (o Select PHP Version) y configure su dominio a PHP 8.2 o 8.3.
  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
  4. Si falta una extensión, habilítela en la lista de extensiones o contacte al soporte de su host.

Paso 2 — Habilitar SSL (HTTPS)

  1. Vaya a SSL/TLS Status (o Let's Encrypt SSL / AutoSSL).
  2. Ejecute AutoSSL o instale un certificado gratuito para su dominio.
  3. HTTPS es obligatorio para que el escáner QR del navegador acceda a la cámara.
Consejo: Espere unos minutos después de habilitar SSL, luego visite https://sudominio.com para confirmar que aparece el icono del candado.

Paso 3 — Crear base de datos MySQL y usuario

  1. Abra Manage My Databases (bajo Bases de datos).
  2. 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á como cpaneluser_assethub.
  3. En Usuarios MySQL, cree un usuario con una contraseña segura. Copie el nombre de usuario completo con prefijo.
  4. 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).
  5. Anote estos tres valores exactamente como se muestran en cPanel:
    • Nombre de la base de datos — p. ej. u123_AssetHub
    • Usuario — p. ej. u123_admin
    • Contraseña — autogenerada, guárdala bien

Paso 4 — Subir archivos

  1. Abra el Administrador de archivos y vaya a public_html/ (raíz del documento de su dominio).
  2. Habilite Configuración → Mostrar archivos ocultos para que pueda ver .htaccess y .env.
  3. Elimine cualquier index.html predeterminado en public_html/ si está presente.
  4. Suba el paquete source.zip y Extráigalo, o suba el contenido de la carpeta /source/ vía FTP.
  5. Después de la extracción, public_html/ debe contener app/, public/, vendor/, el .htaccess raíz y artisan al mismo nivel.
Importante: El .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.

  1. En el Administrador de archivos, copie .env.example a .env (misma carpeta que artisan).
  2. Edite .env y 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
  3. Establezca DB_CONNECTION=mysql — el .env.example predeterminado usa SQLite; el hosting compartido requiere MySQL.
  4. Establezca SESSION_DRIVER=file y CACHE_STORE=file antes de la primera migración (evita errores de "tabla de sesiones no encontrada").
  5. Envuelva DB_PASSWORD en 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.php temporalmente, visítelo en su navegador, copie el resultado en APP_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.
Seguridad: Elimine genkey.php tan pronto como copie la clave. Nunca deje scripts de ayuda en un servidor de producción.
  • Establezca los permisos de storage/ y bootstrap/cache/ a 755 (recursivo) si el instalador informa errores de escritura.

Paso 6 — Ejecutar el instalador web

  1. Abra https://sudominio.com/install en su navegador.
  2. Paso 1: Requisitos — todas las comprobaciones deben pasar (verde). Corrija cualquier extensión de PHP que falte en el Paso 1 anterior.
  3. Paso 2: Base de datos — ingrese los nombres exactos con prefijo del Paso 3:
    • Host: 127.0.0.1 or localhost
    • Puerto: 3306
    • Base de datos: cpaneluser_assethub
    • Usuario: cpaneluser_admin
    • Contraseña: (your MySQL password)
  4. Paso 3: Migrar — haga clic en "Run Migrations & Seed". Tarda unos 10 segundos. No recargue la página.
  5. Desmarque Include demo data para una instalación de producción limpia.
  6. Paso 4: Admin — cree su cuenta de administrador.
  7. ¡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.

  1. En cPanel, vaya a Advanced → Cron Jobs.
  2. En Añadir nuevo cron job, establezca el horario a Cada minuto (* * * * *).
  3. Ingrese el comando (reemplace CPANELUSER con su nombre de usuario de cPanel de Información General):
    /usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run
    Consejo: la ruta de PHP puede ser /usr/local/bin/php o /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).
  4. Haga clic en Añadir nuevo cron job para guardar.
¿Raíz del documento establecida en public_html/public/? El cron sigue apuntando a /home/CPANELUSER/public_html/artisan — no añada /public/.
¿No hay cron disponible? Use the URL de Cron de la aplicación en su lugar:
  1. Inicie sesión como admin → Configuración → Sistema → copie la URL de Cron.
  2. Regístrese en cron-job.org (gratis).
  3. 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:

  1. Vaya a Cuentas de correo electrónico → cree ej. noreply@sudominio.com.
  2. Edite .env en 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"
  3. Guarde, luego en AssetHub: Configuración → Correo electrónico → Enviar correo de prueba.
Límites de SMTP de hosting compartido: Muchos hosts cPanel limitan el correo saliente (~100–500/hora). Para equipos más grandes, use SendGrid, Mailgun o Postmark.

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 de DB_PASSWORD si 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.php si existe, luego reintente.
  • Asegúrese de que DB_CONNECTION=mysql esté 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 .htaccess raíz exista y que PHP sea 8.2+.
  • Revise storage/logs/laravel.log para ver el error real.
  • Confirme que APP_KEY esté 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

ClaveDescripciónEjemplo
APP_NAMENombre de la aplicación mostrado en la barra de títuloAssetHub
APP_URLURL pública de tu instalaciónhttps://assets.example.com
APP_DEBUGEstablece a false en producciónfalse
DB_*Detalles de conexión a la base de datosmysql, 127.0.0.1, 3306, ...
MAIL_MAILERDriver de correosmtp, log, mailgun
MAIL_HOSTHostname del servidor SMTPsmtp.gmail.com
MAIL_PORTPuerto SMTP587
MAIL_USERNAMEUsuario SMTPyour@email.com
MAIL_PASSWORDContraseña SMTP o app token**********
MAIL_FROM_ADDRESSDirección From por defectonoreply@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_subtitle en 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ódigoIdiomaDirección
enEnglish (default)LTR
viTiếng ViệtLTR
esEspañolLTR
frFrançaisLTR
deDeutschLTR
zh简体中文LTR
ja日本語LTR
pt-BRPortuguês (Brasil)LTR
ruРусскийLTR
arالعربيةRTL
hiहिन्दीLTR

Cómo cambiar de idioma

  1. Haz clic en el icono de bandera (esquina superior derecha) para abrir el menú.
  2. Selecciona tu idioma de la lista.
  3. La página se recarga; todas las etiquetas, fechas y formatos de moneda cambian.
  4. Tu elección se guarda en tu cuenta de usuario y en una cookie (1 año).
No abras los archivos .html de la app directamente. AssetHub es una aplicación Laravel + Vue del lado del servidor — el cambio de idioma hace POST a /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. mk para 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:

RolCapacidades
AdminAcceso total al sistema — usuarios, departamentos, configuración, auditoría, webhooks, traducciones
IT ManagerGestionar activos (individuales + batch/lot), categorías, mantenimiento y solicitudes; aprobar transferencias; ver reportes y depreciación
ContadorGestionar activos y depreciación, ejecutar auditorías de inventario, aprobar transferencias y disposiciones, acceso completo a reportes (enfoque financiero)
SupervisorAprobar solicitudes del departamento, gestionar checkouts, participar en auditorías, ver reportes
EmpleadoVer 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

  1. Navega a Activos → Nuevo activo.
  2. Completa nombre, categoría, marca, modelo, número de serie.
  3. Añade fecha de compra y precio (obligatorio para depreciación).
  4. Sube imágenes (varios archivos soportados, máx. 5 MB cada uno).
  5. 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

  1. Haz clic en Importar en la página de Activos.
  2. Descarga la plantilla Excel.
  3. Completa tus datos — columnas obligatorias: name, category_name.
  4. 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.

  1. Ingrese la cantidad y la unidad (pieza, juego, caja). Al guardar, el stock se coloca en el almacén general.
  2. Abra el activo → pestaña AllocationsAllocate para asignar unidades a un empleado o departamento.
  3. Use Return, Adjust (dañado/perdido/reparación) o acciones de disposición — el resumen en vivo debe conciliar con la cantidad total.
  4. Los activos batch admiten solo precio unitario; la depreciación es opcional y desactivada por defecto para una configuración más rápida.
Nota de actualización: Los activos individuales v1 existentes no cambian. Ejecute 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

  1. Abre una página de detalle de activo.
  2. Haz clic en Asignar (visible si el activo está disponible).
  3. Elige un usuario, fecha de devolución opcional, notas.
  4. 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.

  1. Barra lateral → DisposalsNew Disposal. Establezca título y período (Q1–Q4, anual o ad-hoc).
  2. Abra el borrador → Add items — unidades batch dañadas elegibles o activos individuales en condición Poor.
  3. Haga clic en Submit for approval — el lote se bloquea.
  4. Un aprobador distinto hace clic en Approve & execute — los activos/unidades se marcan como disposed.
  5. Imprima el disposal minutes (PDF) para registros de cumplimiento.
Sin reversión: Las disposiciones aprobadas no se pueden deshacer. Conserve el PDF firmado con su registro de auditoría.

Depreciación

AssetHub calcula la depreciación de activos usando uno de tres métodos:

MétodoFórmulaCaso de uso
Línea recta(Cost - Salvage) / Useful LifeMás común; depreciación anual igual
Saldo decreciente2 / Useful Life × Book ValueAcelerada; para impuestos
Unidades de producciónBasado en usoEquipo 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:

  1. Resumen de activos — totales por estado, condición, categoría, departamento
  2. Depreciación — pérdida de valor por categoría, activos más depreciados
  3. Transacciones — actividad de asignación, devolución, transferencia en el tiempo
  4. Costo de mantenimiento — gasto por mes, categoría, tipo
  5. Vencimiento de garantías — activos que requieren atención en 30/60/180 días
  6. Activos por departamento — distribución y utilización presupuestal por departamento
  7. Activos por origen — distribución entre compras, proyecto, donación, transferencias
  8. Resumen de auditoría de inventario — discrepancias entre ciclos periódicos de auditoría
  9. Asignaciones a empleados (v2) — quién tiene qué, incluidas asignaciones batch
  10. Departamento / Ubicación (v2) — activos y cantidades por departamento o ubicación
  11. Conciliación de inventario (v2) — stock vs asignado vs dañado/perdido/disposed
  12. 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.deleted
  • asset.assigned, asset.returned, asset.transferred
  • request.created, request.approved, request.rejected, request.fulfilled
  • maintenance.scheduled, maintenance.started, maintenance.completed
  • checkout.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

HoraComandoPropósito
Diario 08:00send-overdue-checkout-alertsRecordatorios por correo de checkouts vencidos
Diario 08:30send-maintenance-remindersRecordatorios de mantenimiento próximo
Diario 09:00send-document-expiry-alertsDocumentos venciendo en 30/14/7/1 días
Diario 09:30send-warranty-alertsAlertas de vencimiento de garantía + seguro
Diario 10:00assethub:send-depreciation-end-alertsAlertas cuando los activos llegan al fin de vida útil
Diario 10:30send-inventory-audit-remindersRecordatorios de auditorías de inventario activas
Mensual día 1, 02:00update-asset-valuesRefrescar 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.

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.

v1.x → v2.0 — Full upgrade guide

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