AssetHub Guide

Questions fréquentes

Puis-je exécuter AssetHub sur l'offre Hostinger Single la moins chère ?

Oui — AssetHub est entièrement compatible avec Hostinger Single (~$2.99/mois). Single inclut PHP 8.3, MySQL, Cron Jobs natifs et SSL gratuit — tout ce dont AssetHub a besoin. Pas de SSH, pas de Composer, pas de ligne de commande. Voir la section Configuration Hostinger pour le guide pas à pas.

Ai-je besoin de compétences techniques pour l'installer ?

Non. L'installeur web gère tout : vérification des prérequis, configuration de la base de données, migrations et création du compte admin. Téléversez simplement les fichiers, visitez /install dans votre navigateur et suivez l'assistant.

Comment fonctionnent les e-mails programmés (alertes de garantie/maintenance) ?

AssetHub utilise le planificateur de Laravel. Vous ne configurez qu'un seul cron job qui s'exécute chaque minute, et Laravel distribue en interne chaque tâche au bon moment (quotidien 08:00, mensuel, etc.). Pour cPanel, configurez-le dans Advanced → Cron Jobs. Pour Hostinger, utilisez hPanel → Advanced → Cron Jobs. Voir Configuration cPanel → Étape 7 ou Configuration Hostinger → Étape 5. Si votre hébergeur n'a pas de cron, utilisez l'URL Cron intégrée avec le service gratuit cron-job.org.

Quelles méthodes d'amortissement sont supportées ?

Trois méthodes : Linéaire (amortissement annuel constant), Dégressif (accéléré, courant pour les impôts), et Unités de production (basé sur l'usage, pour équipement industriel). Les valeurs des actifs sont rafraîchies automatiquement le 1er de chaque mois.

Le scanner QR fonctionne-t-il sur mobile ?

Oui — il utilise la caméra du navigateur via html5-qrcode et fonctionne sur tous les navigateurs modernes (téléphone/tablette/bureau). Le seul prérequis est HTTPS. AutoSSL cPanel et Let's Encrypt SSL Hostinger fonctionnent d'emblée.

Puis-je ajouter mes propres champs sans coder ?

Oui. Admin → Champs personnalisés vous permet d'ajouter des attributs illimités (texte, nombre, date, sélection, zone de texte, fichier, case à cocher), de les limiter à des catégories spécifiques, de les rendre obligatoires et de les réordonner par glisser-déposer — tout depuis l'interface.

Combien de langues AssetHub prend-il en charge ?

11 locales prêtes à l'emploi : anglais, vietnamien, espagnol, français, allemand, chinois, japonais, portugais (BR), russe, arabe (avec prise en charge RTL complète) et hindi (हिन्दी). Les admins gèrent les traductions depuis Administration → Translations (nécessite la permission manage translations).

Puis-je installer AssetHub sur un hébergement mutualisé cPanel ?

Oui — AssetHub fonctionne sur tout plan d'hébergement mutualisé cPanel standard avec PHP 8.2+, MySQL et Cron Jobs. Aucun Composer ni Node.js sur le serveur requis — le package est livré pré-compilé. De nombreux hébergeurs cPanel n'incluent pas de Terminal web ; ce n'est pas un problème. Voir la section Configuration cPanel pour le guide complet pas à pas (y compris comment générer APP_KEY sans Terminal).

Comment rebrand AssetHub (page de connexion, titre d'onglet et couleurs) ?

AssetHub peut être entièrement rebrandé depuis le panneau admin — sans modification de code ni npm run build. Depuis v3.1.0, le logo, le footer et le badge de la page de connexion suivent Settings → Branding → App Name. v4.0 ajoute le titre d'onglet du navigateur en temps réel et l'onglet Appearance pour les couleurs globales en mode clair et sombre.

Checklist rebrand complète : mettez à jour App Name (logo, login, titre d'onglet) → modifiez auth.login_subtitle par langue → personnalisez les couleurs dans Settings → Appearance.

Référence rapide:

ÉlémentExempleComment modifier
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.

Aperçu

AssetHub est un système complet de gestion des actifs construit avec Laravel 11, Vue 3 et Tailwind CSS. La version 3.0 ajoute un Translation Editor complet, des locales personnalisées, l'import/export CSV et une localisation effective du fuseau horaire/de la devise — en plus du suivi batch/lot v2, des allocations, des disposals et des pages publiques de remise QR.

Suivi par QR

Génération automatique de codes QR pour chaque actif. Scannez avec n'importe quelle caméra de navigateur.

Amortissement

3 méthodes : linéaire, dégressif, unités de production.

Champs personnalisés

Ajoutez des attributs illimités — texte, date, sélection, fichier, case à cocher.

Hooks HTTP

15 types d'événements avec signature HMAC et retry automatique.

Journal d'audit

Chaque modification enregistrée avec un visualiseur de diff complet.

Rapports

12 rapports avec graphiques, export Excel et PDF.

Prérequis serveur

  • PHP 8.2 ou supérieur
  • MySQL 5.7+ ou MariaDB 10.3+
  • Composer 2.x
  • Node.js 18+ et npm 9+
  • Serveur web : Apache ou Nginx

Extensions PHP requises

  • OpenSSL, PDO, PDO_MySQL, Mbstring, Tokenizer, XML, Ctype, JSON, GD, Fileinfo

Espace disque

~ 200 Mo minimum. Prévoyez de l'espace supplémentaire pour les photos d'actifs et pièces jointes.

Mise en place

Option A — Installeur web (Recommandé)

  1. Téléversez les fichiers du projet sur votre serveur web.
  2. Pointez le document root du domaine vers public/.
  3. Définissez les permissions : storage/ et bootstrap/cache/ doivent être inscriptibles (chmod 775).
  4. Copiez .env.example vers .env et définissez APP_KEY (exécutez php artisan key:generate si vous avez SSH/Terminal, ou voir Configuration cPanel → Étape 5 pour les alternatives du Gestionnaire de fichiers).
  5. Visitez https://yourdomain.com/install dans votre navigateur.
  6. Suivez l'assistant — Requirements → Database → Migrate → Admin Account → Done.

Option B — Installation CLI

# 1. Installer les dépendances
composer install --no-dev --optimize-autoloader
npm install
npm run build

# 2. Configurer l'environnement
cp .env.example .env
php artisan key:generate

# 3. Éditer .env pour les identifiants BD
# DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD

# 4. Créer les tables et données initiales
php artisan migrate --seed

# 5. Créer le lien symbolique storage pour les uploads
php artisan storage:link

# 6. Mettre la config en cache pour la production
php artisan config:cache
php artisan route:cache
php artisan view:cache

# 7. Marquer comme installé
echo "Installed" > storage/installed.lock
Configuration du serveur web : Le document root doit pointer vers le répertoire public/. Pour Apache, le .htaccess inclus gère la réécriture d'URL. Pour Nginx, voir le guide de déploiement Laravel.

Assistant Étape 2 — Configuration de la base de données

Lorsque l'assistant atteint l'étape 2, vous devez saisir les informations de connexion MySQL de la base de données créée dans votre panneau d'hébergement. La base doit déjà exister (elle peut être vide — l'étape suivante de l'assistant créera les tables).

ChampPar défaut / ExempleRemarques
Host127.0.0.1Fonctionne sur 99 % des hébergeurs mutualisés (Hostinger, cPanel, Plesk). Conservez cette valeur par défaut sauf si votre hébergeur fournit un nom d'hôte MySQL personnalisé (services de base gérée comme AWS RDS, DigitalOcean Managed Database).
Port3306Port MySQL standard. Ne modifiez que si votre fournisseur utilise un port non standard (rare).
Nom de la base de donnéesuXXXXXX_assethubLe nom complet affiché dans votre panneau d'hébergement. La plupart des hébergeurs mutualisés le préfixent avec votre ID utilisateur (ex. Hostinger : u287094729_assethub).
Nom d'utilisateuruXXXXXX_assethubUtilisateur MySQL avec des droits sur la base de données ci-dessus. N'utilisez pas root — les hébergeurs mutualisés ne l'autorisent pas.
Mot de passe(votre mot de passe DB)Le mot de passe que vous avez défini ou copié lors de la création de l'utilisateur MySQL. La plupart des hébergeurs l'affichent une seule fois à la création — utilisez "View / Reset" si vous ne l'avez pas enregistré.

Où trouver ces identifiants selon le panneau d'hébergement

  • Hostinger: hPanel → Databases → Management → cliquez sur votre base de données. La page affiche le nom, l'utilisateur et un bouton "Show password".
  • cPanel: cPanel → MySQL Databases. La liste des bases affiche les noms ; les utilisateurs sont listés en dessous. Utilisez "Change Password" si nécessaire.
  • Plesk: Plesk → Databases → cliquez sur le nom de la base de données. La page de détail affiche les identifiants et propose une réinitialisation du mot de passe.
  • DirectAdmin: DirectAdmin → MySQL Management → cliquez sur la base de données. Les identifiants et la réinitialisation du mot de passe se trouvent sur la page de détail.
  • Base externe / gérée: AWS RDS, DigitalOcean Managed Database, etc. Utilisez le nom d'hôte personnalisé, le port (souvent 3306 mais vérifiez), le nom de la base, l'utilisateur et le mot de passe depuis votre console cloud. Assurez-vous que l'IP du serveur est autorisée dans le pare-feu de la base.

Erreurs courantes et comment les corriger

Message d'erreurCause et correction
SQLSTATE[HY000] [1045] Access deniedNom d'utilisateur ou mot de passe incorrect, ou l'utilisateur n'a pas accès à cette base de données. Vérifiez l'orthographe (y compris le préfixe utilisateur sur l'hébergement mutualisé). Réinitialisez le mot de passe dans le panneau d'hébergement en cas de doute.
SQLSTATE[HY000] [1049] Unknown databaseLe nom de la base de données est incorrect, ou vous ne l'avez pas encore créée dans votre panneau d'hébergement. Créez-la d'abord, puis saisissez à nouveau le nom exact (y compris tout préfixe).
SQLSTATE[HY000] [2002] Connection refusedLe serveur MySQL est inaccessible. Vérifiez Hôte et Port. Sur l'hébergement mutualisé, essayez localhost au lieu de 127.0.0.1 ou inversement. Pour les bases gérées, assurez-vous que l'IP du serveur est autorisée.
SQLSTATE[42S02] Base table not found: sessionsSe produit lorsque SESSION_DRIVER=database ou CACHE_STORE=database est défini dans .env avant que les tables existent. Modifiez .env et changez les deux en file, enregistrez, puis rechargez l'assistant. Vous pourrez repasser à database après l'installation si vous le souhaitez.
could not find driverL'extension PHP pdo_mysql est manquante ou désactivée. Activez-la dans votre panneau d'hébergement (Configuration PHP → Extensions). Sur cPanel : MultiPHP INI Editor → Extensions ou Select PHP Version → Extensions. Sur Hostinger : hPanel → Advanced → PHP Configuration → onglet PHP Extensions.
Conseil : Les champs Hôte et Port sont préremplis avec les valeurs les plus courantes (127.0.0.1 et 3306) — laissez-les tels quels sur l'hébergement mutualisé. Vous n'avez qu'à saisir le nom de la base de données, l'utilisateur et le mot de passe. Cliquez sur Test & Save → pour vérifier la connexion et passer à l'étape 3.

Localhost (Développement local)

Guide rapide pour faire tourner AssetHub sur votre machine pour des tests ou du développement avant le déploiement en production. Choisissez l'environnement adapté à votre système d'exploitation.

Recommandé : Laravel Herd est la voie la plus rapide sur macOS et Windows — pas de Docker, pas de configuration manuelle Apache/MySQL. XAMPP et Laragon sont de bonnes alternatives gratuites si vous préférez un stack traditionnel.

Option 1 — Laravel Herd (Recommandé, macOS & Windows)

Laravel Herd est l'environnement local officiel de l'équipe Laravel — gratuit, natif, sans Docker. Il intègre PHP 8.2/8.3/8.4, Nginx et (dans Herd Pro) MySQL/Redis.

  1. Téléchargez et installez Laravel Herd depuis herd.laravel.com.
  2. Placez le dossier du projet AssetHub dans ~/Herd/ (macOS) ou %USERPROFILE%\Herd\ (Windows). Herd crée automatiquement un domaine .test — p. ex. http://assethub.test.
  3. Ouvrez Herd → Sites et confirmez que la version PHP est 8.2 ou 8.3. Clic droit sur le site → Secure pour activer HTTPS (nécessaire pour le scanner QR).
  4. Créez une base de données MySQL. Avec Herd Pro, utilisez Services → MySQL → Open in TablePlus. Sinon, installez MySQL Community ou utilisez SQLite (DB_CONNECTION=sqlite, touch database/database.sqlite).
  5. Copiez .env.example vers .env, remplissez les identifiants BD, puis exécutez php artisan key:generate à la racine du projet.
  6. Ouvrez http://assethub.test/install dans votre navigateur et suivez l'assistant d'installation.

Choix 2 — XAMPP (Windows, macOS, Linux)

XAMPP regroupe Apache, MySQL/MariaDB et PHP. Gratuit et multiplateforme. Veillez à choisir une version avec PHP 8.2 ou plus récent.

  1. Téléchargez XAMPP 8.2+ depuis apachefriends.org et installez-le.
  2. Copiez le projet AssetHub dans C:\xampp\htdocs\AssetHub\ (Windows) ou /Applications/XAMPP/htdocs/AssetHub/ (macOS).
  3. Ouvrez le XAMPP Control Panel et démarrez Apache et MySQL. Si les ports sont occupés, utilisez Config → service.conf pour basculer Apache sur 8080.
  4. Allez sur http://localhost/phpmyadminNouvelle → créez une base nommée assethub avec interclassement utf8mb4.
  5. Dans le dossier du projet : copiez .env.example vers .env, mettez DB_DATABASE=assethub, DB_USERNAME=root, laissez DB_PASSWORD vide (défaut XAMPP). Exécutez php artisan key:generate.
  6. Visitez http://localhost/AssetHub/public/install pour lancer l'assistant d'installation.
URLs propres sans /public/ : créez un hôte virtuel dans C:\xampp\apache\conf\extra\httpd-vhosts.conf pointant DocumentRoot vers le dossier public/ du projet, puis ajoutez 127.0.0.1 assethub.local à votre fichier hosts.

Choix 3 — Laragon (Windows)

Laragon est un stack Windows portable conçu pour Laravel — vhosts automatiques, URLs propres, MySQL/MariaDB et HeidiSQL inclus.

  1. Téléchargez Laragon Full depuis laragon.org et installez-le.
  2. Dans Laragon : Menu → PHP → Version — basculez sur PHP 8.2 ou 8.3.
  3. Copiez le projet AssetHub dans C:\laragon\www\AssetHub\.
  4. Cliquez sur Start All. Laragon crée automatiquement le vhost : http://assethub.test (pointant vers le dossier public/).
  5. Ouvrez HeidiSQL (inclus) → créez la base assethub. Identifiants par défaut : utilisateur root, mot de passe vide.
  6. Éditez .env avec les identifiants BD, exécutez php artisan key:generate, puis visitez http://assethub.test/install.

Option 4 — Serveur PHP intégré (sans serveur web)

L'option la plus simple : Laravel embarque artisan serve, qui démarre un serveur PHP de développement. Pas besoin d'Apache ou Nginx. Idéal pour des tests rapides.

# Installer les dépendances et configurer
cd /path/to/AssetHub
composer install
cp .env.example .env
php artisan key:generate

# Lancer les migrations et le seed des données initiales
php artisan migrate --seed

# Démarrer le serveur de développement
php artisan serve
# Puis visitez: http://127.0.0.1:8000/install

Pièges courants en localhost

Le scanner QR n'ouvre pas la caméra sur http://

Les APIs caméra du navigateur exigent HTTPS, avec une exception : http://localhost et http://127.0.0.1 sont traités comme des contextes sécurisés. Si vous accédez à AssetHub via votre IP LAN (p. ex. http://192.168.1.10), la caméra refusera. Utilisez localhost pour le dev, ou activez HTTPS via Herd / mkcert.

Permission denied sur storage (macOS / Linux)

Si vous voyez des erreurs d'écriture quand l'app essaie de logger ou de cacher, corrigez les permissions : chmod -R 775 storage bootstrap/cache. Sur Windows ce n'est généralement pas nécessaire.

Port déjà utilisé

Si le port 8000 est pris par une autre app, utilisez un port différent :

php artisan serve --port=8001

Tester les emails localement

Le vrai SMTP n'est pas disponible sur la plupart des configurations localhost. Deux options sûres : (1) mettez MAIL_MAILER=log dans .env — les emails sont écrits dans storage/logs/laravel.log au lieu d'être envoyés ; ou (2) utilisez Mailtrap / MailHog pour capturer le courrier sortant dans une fausse boîte de réception.

MAIL_MAILER=log
# Tous les emails sont écrits dans storage/logs/laravel.log

Assets frontend (Vite / Tailwind)

Le frontend Vue/Tailwind d'AssetHub est pré-compilé dans le paquet. Si vous éditez des composants Vue ou la config Tailwind, vous aurez besoin de Node.js 18+ :

npm install
npm run dev    # Hot-reload pendant le développement
npm run build  # Build de production (à exécuter avant le déploiement)

Déployer sur Hostinger Single (Hébergement mutualisé)

C'est la voie recommandée pour les utilisateurs sans VPS ni expérience technique. AssetHub est entièrement compatible avec l'offre Hostinger Single Web Hosting la moins chère (~$2.99/mois). Pas de SSH, pas de Composer, pas de ligne de commande — Single inclut des cron jobs natifs, PHP 8.3 et SSL gratuit.

Testé sur : offres Hostinger Single, Premium, Business (PHP 8.2+, MySQL 5.7+, Cron Jobs natifs inclus sur toutes).

Étape 1 — Préparer votre hébergement

  1. Connectez-vous à Hostinger hPanel.
  2. Allez dans Hébergement → Gérer pour votre domaine.
  3. Définissez la version PHP à 8.2 ou 8.3 via Avancé → Configuration PHP.
  4. Assurez-vous que ces extensions PHP sont activées (généralement par défaut) :
    • OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo

Étape 2 — Créer la base de données MySQL

  1. Dans hPanel, allez dans Bases de données → MySQL Databases.
  2. Cliquez sur Créer une nouvelle base de données.
  3. Notez ces 3 valeurs :
    • Nom de la base de données — p. ex. u123_AssetHub
    • Utilisateur — p. ex. u123_admin
    • Mot de passe — auto-généré, gardez-le précieusement

Étape 3 — Téléverser les fichiers

  1. Allez dans Fichiers → File Manager dans hPanel.
  2. Naviguez vers public_html/ (c'est la racine de votre domaine).
  3. Supprimez tout index.html ou default.php par défaut dans ce dossier.
  4. Cliquez sur Téléverser des fichiers et téléversez tout source.zip du paquet.
    Ou téléversez directement le contenu du dossier /source/ via FTP si vous préférez.
  5. Si vous avez téléversé un ZIP, clic droit → Extraire. Après extraction, tous les fichiers doivent être à la racine de public_html/.
  6. Vérifiez que public_html/ contient : app/, public/, vendor/, .htaccess, index.php (dans public/), .env, etc.
Important : Assurez-vous que le fichier .htaccess existe à la racine de public_html/. Il contient les règles de réécriture d'URL. Si File Manager cache les fichiers cachés, cliquez sur Paramètres → Afficher les fichiers cachés.

Étape 4 — Lancer l'installeur

  1. Ouvrez votre navigateur et allez à https://yourdomain.com/install.
  2. Vous verrez AssetHub Installer.
  3. Étape 1 : Requirements — Toutes les vérifications doivent passer (vert). Si une échoue, contactez le support Hostinger pour activer l'extension PHP manquante.
  4. Étape 2 : Database — Entrez les identifiants de l'Étape 2 ci-dessus :
    • Hôte: localhost
    • Port: 3306
    • Base de données: u123_AssetHub
    • Utilisateur: u123_admin
    • Mot de passe : (celui généré par Hostinger)
  5. Étape 3 : Migrate — Cliquez sur "Run Migrations & Seed". Prend ~10 secondes. Ne pas rafraîchir.
  6. Étape 4 : Admin — Créez votre compte administrateur. Utilisez un mot de passe fort.
  7. Terminé ! — Vous verrez l'URL Cron (sauvegardez-la !) et un bouton de connexion.

Étape 5 — Configurer les alertes e-mail automatiques via Hostinger Cron

AssetHub utilise le planificateur Laravel pour les tâches en arrière-plan : alertes de garantie, rappels de maintenance, expiration de documents, rafraîchissement de l'amortissement et checkouts en retard. Configurez un seul cron job dans hPanel et Laravel décide quelle tâche exécuter et quand.

  1. Dans hPanel, allez dans Avancé → Cron Jobs.
  2. Cliquez sur Créer un Cron job.
  3. Sélectionnez le type : Custom (pas "PHP" — nous devons passer un argument).
  4. Pour la commande, entrez (remplacez uXXXXXX par votre nom d'utilisateur Hostinger) :
    /usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run
    Astuce : ouvrez File Manager, repérez le fichier artisan (racine du projet), clic droit → Propriétés pour copier le chemin complet.
  5. Définissez le planning à Chaque minute — les cinq champs (Minute, Heure, Jour, Mois, Jour de la semaine) à *.
  6. Cliquez sur Enregistrer.

C'est tout — AssetHub envoie maintenant automatiquement les rappels de checkout en retard, alertes de maintenance, expiration de documents, garanties, et rafraîchit les valeurs d'amortissement. Laravel planifie en interne chaque job à sa bonne fréquence (quotidien 08:00, mensuel, etc.).

Document root configuré sur public_html/public/ ? Aucun problème — votre code Laravel reste à la racine de public_html/, le chemin du cron reste donc /home/uXXXX/public_html/artisan (n'ajoutez pas /public/).
Solution de secours pour hébergeurs sans cron : Si vous n'êtes pas sur Hostinger ou que votre hébergeur n'a pas de cron jobs, AssetHub expose aussi une URL de déclenchement webhook.
  1. Connectez-vous comme admin → Paramètres → onglet Système → copiez votre URL Cron.
  2. Inscrivez-vous gratuitement sur cron-job.org.
  3. Créez un cronjob, collez l'URL, réglez sur Toutes les 15 minutes, enregistrez.

Étape 6 — Configurer l'e-mail (SMTP)

Hostinger fournit des comptes e-mail avec chaque offre. Pour les utiliser pour les notifications AssetHub :

  1. Dans hPanel, allez dans E-mails → Comptes e-mail et créez-en un (p. ex. noreply@yourdomain.com).
  2. Éditez le fichier .env dans public_html/ via 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. Enregistrez le fichier.
  4. Connectez-vous à AssetHub → Paramètres → onglet Email → Envoyer un e-mail test. Si vous le recevez, c'est bon.
Limites SMTP sur Single : Hostinger Single autorise ~100 e-mails sortants par heure. Pour les déploiements plus grands, utilisez un fournisseur dédié comme SendGrid, Mailgun ou Postmark (offres gratuites disponibles).

Problèmes courants sur Hostinger Single

"500 Internal Server Error" après téléversement

  • Vérifiez que .htaccess existe à la racine de public_html/ et contient les règles de réécriture.
  • Vérifiez que la version PHP est sur 8.2 ou 8.3 dans hPanel.
  • Consultez storage/logs/laravel.log via File Manager pour l'erreur réelle.

"Permission denied" sur les uploads

Hostinger définit généralement les bonnes permissions, mais sinon :

  • Clic droit sur storage/ dans File Manager → Permissions → réglez à 755 récursivement.
  • Idem pour bootstrap/cache/.

Le scanner QR n'ouvre pas la caméra

Les APIs caméra du navigateur exigent HTTPS. Hostinger fournit du SSL gratuit via Let's Encrypt — activez-le dans hPanel sous SSL → Gérer.

Les e-mails planifiés ne partent pas

  • Dans hPanel → Cron Jobs → vérifiez la colonne Last run de votre cron. Si elle est vide, le cron ne se déclenche pas — vérifiez le chemin artisan.
  • Testez la commande manuellement : ouvrez Terminal dans hPanel (s'il est disponible) et exécutez la commande cron. En cas d'erreur, le message pointera le problème (mauvaise version PHP, mauvais chemin, etc.).
  • Vérifiez que SMTP est correctement configuré (Paramètres → Email → Envoyer test).
  • Consultez storage/logs/laravel.log pour les erreurs du planificateur.

Performance lente

Hostinger Single a un CPU/RAM partagés. Si votre équipe dépasse 20 utilisateurs, envisagez :

  • De passer à Premium (~$3.99/mois) — serveurs plus rapides, plus de ressources, plusieurs bases de données.
  • Ou Business (~$5.99/mois) — ressources dédiées, sauvegardes quotidiennes, environnement staging.

Déploiement sur cPanel (Hébergement mutualisé)

Ce guide couvre l'hébergement mutualisé cPanel standard (Namecheap, Bluehost, GoDaddy et la plupart des hébergeurs bon marché). AssetHub est livré avec vendor/ et les ressources frontend pré-compilées — aucun Composer, npm ni Terminal web requis. Si votre cPanel manque de Terminal, utilisez SSH Access ou les alternatives du Gestionnaire de fichiers ci-dessous.

Testé sur : cPanel 110+ avec PHP 8.2/8.3, MySQL 5.7+/MariaDB 10.3+, Apache et Cron Jobs natifs. Le répertoire racine est généralement /home/CPANELUSER/ — vérifiez la barre latérale dans cPanel sous Informations générales.

Étape 1 — Définir la version PHP et les extensions

  1. Connectez-vous à cPanel.
  2. Ouvrez MultiPHP Manager (ou Select PHP Version) et définissez votre domaine sur PHP 8.2 ou 8.3.
  3. Ouvrez MultiPHP INI Editor ou PHP Extensions et confirmez que ces extensions sont activées :
    • OpenSSL, PDO, PDO_MySQL, Mbstring, GD, Tokenizer, XML, Ctype, JSON, Fileinfo
  4. Si une extension est manquante, activez-la dans la liste des extensions ou contactez le support de votre hébergeur.

Étape 2 — Activer SSL (HTTPS)

  1. Accédez à SSL/TLS Status (ou Let's Encrypt SSL / AutoSSL).
  2. Exécutez AutoSSL ou installez un certificat gratuit pour votre domaine.
  3. HTTPS est obligatoire pour que le scanner QR du navigateur accède à la caméra.
Conseil : Attendez quelques minutes après l'activation du SSL, puis visitez https://votredomaine.com pour confirmer l'apparition de l'icône de cadenas.

Étape 3 — Créer une base de données MySQL et un utilisateur

  1. Ouvrez Manage My Databases (sous Bases de données).
  2. Dans Créer une nouvelle base de données, saisissez un nom (ex. assethub) et cliquez sur Créer. cPanel ajoute automatiquement le préfixe de votre compte — le nom complet ressemblera à cpaneluser_assethub.
  3. Dans Utilisateurs MySQL, créez un utilisateur avec un mot de passe fort. Copiez le nom d'utilisateur complet avec son préfixe.
  4. Dans Ajouter un utilisateur à la base de données, sélectionnez l'utilisateur et la base de données, cliquez sur Ajouter, puis accordez TOUS LES PRIVILÈGES. Cette étape est facile à oublier — sans elle, vous obtiendrez des erreurs Access denied (1045).
  5. Notez ces trois valeurs exactement telles qu'elles apparaissent dans cPanel :
    • Nom de la base de données — p. ex. u123_AssetHub
    • Utilisateur — p. ex. u123_admin
    • Mot de passe — auto-généré, gardez-le précieusement

Étape 4 — Téléverser les fichiers

  1. Ouvrez le Gestionnaire de fichiers et accédez à public_html/ (racine du document de votre domaine).
  2. Activez Paramètres → Afficher les fichiers cachés pour voir .htaccess et .env.
  3. Supprimez tout fichier index.html par défaut dans public_html/ s'il est présent.
  4. Téléversez l'archive source.zip et extrayez-la, ou téléversez le contenu du dossier /source/ via FTP.
  5. Après l'extraction, public_html/ doit contenir app/, public/, vendor/, le .htaccess racine et artisan au même niveau.
Important : Le .htaccess racine redirige toutes les requêtes vers le dossier public/ — vous n'avez pas besoin de modifier la racine du document manuellement sur la plupart des hébergeurs.

Étape 5 — Préparer .env avant d'exécuter l'installeur

Complétez cette étape avant de visiter /install. Laravel nécessite une APP_KEY valide et des paramètres de base de données corrects dans .env.

  1. Dans le Gestionnaire de fichiers, copiez .env.example vers .env (même dossier que artisan).
  2. Éditez .env et configurez au minimum :
    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. Définissez DB_CONNECTION=mysql — le fichier .env.example par défaut utilise SQLite ; l'hébergement mutualisé nécessite MySQL.
  4. Définissez SESSION_DRIVER=file et CACHE_STORE=file avant la première migration (évite les erreurs "table sessions introuvable").
  5. Entourez DB_PASSWORD de guillemets doubles s'il contient des caractères spéciaux (#, $, !, etc.).

Générer APP_KEY (sans Terminal)

De nombreux plans cPanel n'incluent pas de Terminal web. Utilisez l'une de ces méthodes :

  • SSH Access (cPanel → Sécurité → SSH Access) : connectez-vous avec PuTTY ou PowerShell, puis exécutez cd ~/public_html && php artisan key:generate.
  • Assistant Gestionnaire de fichiers — créez temporairement public/genkey.php, visitez-le dans votre navigateur, copiez le résultat dans APP_KEY=, puis supprimez le fichier immédiatement.
    <?php
    echo 'base64:' . base64_encode(random_bytes(32));
  • Sur votre PC — si PHP est installé localement, exécutez php -r "echo 'base64:'.base64_encode(random_bytes(32));" et collez le résultat dans .env.
Sécurité : Supprimez genkey.php dès que vous avez copié la clé. Ne laissez jamais des scripts auxiliaires sur un serveur de production.
  • Définissez les permissions de storage/ et bootstrap/cache/ sur 755 (récursif) si l'installeur signale des erreurs d'écriture.

Étape 6 — Exécuter l'installeur web

  1. Ouvrez https://votredomaine.com/install dans votre navigateur.
  2. Étape 1 : Prérequis — toutes les vérifications doivent réussir (vert). Corrigez toute extension PHP manquante à l'Étape 1 ci-dessus.
  3. Étape 2 : Base de données — saisissez les noms exacts avec préfixe de l'Étape 3 :
    • Hôte: 127.0.0.1 or localhost
    • Port: 3306
    • Base de données: cpaneluser_assethub
    • Utilisateur: cpaneluser_admin
    • Mot de passe: (your MySQL password)
  4. Étape 3 : Migration — cliquez sur "Run Migrations & Seed". Prend environ 10 secondes. Ne rechargez pas la page.
  5. Décochez Include demo data pour une installation de production propre.
  6. Étape 4 : Admin — créez votre compte administrateur.
  7. Terminé ! — sauvegardez l'URL Cron affichée sur l'écran final.

Étape 7 — Configurer les Cron Jobs pour les alertes e-mail

AssetHub a besoin d'un cron job s'exécutant chaque minute pour que Laravel puisse envoyer des alertes de garantie, des rappels de maintenance et d'autres e-mails planifiés.

  1. Dans cPanel, accédez à Advanced → Cron Jobs.
  2. Dans Ajouter un nouveau cron job, définissez la fréquence sur Chaque minute (* * * * *).
  3. Saisissez la commande (remplacez CPANELUSER par votre nom d'utilisateur cPanel des Informations générales) :
    /usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run
    Conseil : le chemin PHP peut être /usr/local/bin/php ou /usr/bin/php — renseignez-vous auprès de votre hébergeur en cas de doute. Le chemin artisan est l'endroit où vous avez téléversé le projet (généralement /home/CPANELUSER/public_html/artisan).
  4. Cliquez sur Ajouter un nouveau cron job pour sauvegarder.
Racine du document définie sur public_html/public/ ? Le cron pointe toujours vers /home/CPANELUSER/public_html/artisan — n'ajoutez pas /public/.
Pas de cron disponible ? Utilisez l'URL Cron intégrée à la place :
  1. Connectez-vous en tant qu'admin → Paramètres → Système → copiez l'URL Cron.
  2. Inscrivez-vous sur cron-job.org (gratuit).
  3. Créez une tâche qui visite cette URL toutes les 15 minutes.

Étape 8 — Configurer le courrier (SMTP)

Créez un compte e-mail cPanel pour les notifications sortantes :

  1. Accédez à Comptes e-mail → créez par ex. noreply@votredomaine.com.
  2. Modifiez .env dans le Gestionnaire de fichiers :
    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. Sauvegardez, puis dans AssetHub : Paramètres → E-mail → Envoyer un e-mail de test.
Limites SMTP de l'hébergement mutualisé : De nombreux hébergeurs cPanel limitent le courrier sortant (~100–500/heure). Pour les équipes plus grandes, utilisez SendGrid, Mailgun ou Postmark.

Problèmes fréquents sur cPanel

"Access denied for user" (SQLSTATE 1045)

  • Copiez le nom de la base de données et l'utilisateur exactement depuis cPanel — en incluant le préfixe du compte.
  • Confirmez que vous avez complété Ajouter un utilisateur à la base de données avec TOUS LES PRIVILÈGES.
  • Réinitialisez le mot de passe MySQL dans cPanel et mettez à jour .env — utilisez des guillemets autour de DB_PASSWORD s'il contient des caractères spéciaux.

La migration échoue après que l'étape Base de données a réussi

  • L'installeur teste les identifiants du formulaire, mais Migrate lit depuis .env. Assurez-vous que les deux correspondent.
  • Supprimez bootstrap/cache/config.php s'il existe, puis réessayez.
  • Assurez-vous que DB_CONNECTION=mysql est défini dans .env (pas sqlite).

"Invalid default value" lors de la migration (1067)

Corrigé dans AssetHub v2.1.0+ (la table checkouts utilise des colonnes dateTime). Si vous avez une version plus ancienne, mettez à jour le fichier de migration ou téléchargez le dernier package depuis CodeCanyon.

"500 Internal Server Error" après le téléversement

  • Vérifiez que le fichier .htaccess racine existe et que PHP est en 8.2+.
  • Consultez storage/logs/laravel.log pour voir l'erreur réelle.
  • Confirmez que APP_KEY est défini dans .env — une clé vide provoque des erreurs 500.

Pas de Terminal dans cPanel

C'est normal sur de nombreux plans mutualisés. Utilisez SSH Access (si activé), la méthode temporaire genkey.php à l'Étape 5, ou générez la clé sur votre PC local.

La caméra du scanner QR ne s'ouvre pas

Activez SSL via SSL/TLS Status → AutoSSL et accédez au site via https://.

Paramètres

Fichier .env

CléLibelléExemple
APP_NAMENom de l'application affiché dans la barre de titreAssetHub
APP_URLURL publique de votre installationhttps://assets.example.com
APP_DEBUGDéfinir à false en productionfalse
DB_*Détails de connexion à la base de donnéesmysql, 127.0.0.1, 3306, ...
MAIL_MAILERPilote mailsmtp, log, mailgun
MAIL_HOSTNom d'hôte du serveur SMTPsmtp.gmail.com
MAIL_PORTPort SMTP587
MAIL_USERNAMEIdentifiant SMTPyour@email.com
MAIL_PASSWORDMot de passe SMTP ou app token**********
MAIL_FROM_ADDRESSAdresse From par défautnoreply@example.com

Paramètres in-app

La plupart des options non sensibles sont configurables depuis Admin → Paramètres :

  • Général : nom/e-mail/téléphone de l'entreprise, préfixe asset tag
  • Email : envoyer un e-mail test pour vérifier SMTP
  • Notifications : seuils d'alerte garantie, fenêtre de rappel maintenance
  • Localisation : fuseau horaire (liste recherchable incl. Europe/Skopje), format de date, code devise (incl. MKD — Denar macédonien), symbole et position du symbole — appliqués à l'ensemble de l'application après enregistrement
  • Général → Page publique des actifs : visibilité QR (public / connexion / désactivé) et régénération de tous les codes QR après modification de l'URL
  • L'onglet Localisation renvoie vers Administration → Translations pour le Translation Editor complet (admin uniquement)
  • Branding : nom et logo — met à jour le logo login, le footer, le badge et le titre d'onglet du navigateur (v4.0+). Sous-titre login : modifiez auth.login_subtitle dans Administration → Translations
  • Appearance (v4.0+) : personnalisez les couleurs de marque, statut et texte pour les modes clair et sombre — voir le guide de rebrand dans la FAQ

Support multilingue

AssetHub est livré avec 11 langues prêtes à l'emploi, dont l'arabe RTL et le hindi. Les utilisateurs changent de langue via le menu déroulant du drapeau en haut à droite.

Langues incluses

IdentifiantLangueSens
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

Comment changer de langue

  1. Cliquez sur l'icône drapeau (en haut à droite) pour ouvrir le menu.
  2. Choisissez votre langue dans la liste.
  3. La page se recharge ; toutes les étiquettes, dates et formats de devise changent.
  4. Votre choix est enregistré dans votre compte utilisateur et dans un cookie (1 an).
N'ouvrez pas les fichiers .html de l'app directement. AssetHub est une application Laravel + Vue côté serveur — le changement de langue envoie un POST à /locale/{code}, ce qui ne fonctionne que lorsqu'un serveur PHP est en cours d'exécution. Accédez toujours par votre vrai domaine (production) ou http://localhost:8000 (dev avec php artisan serve). Les fichiers de documentation comme celui-ci, en revanche, sont entièrement autonomes et peuvent être ouverts directement.

Ajouter une langue personnalisée (admin)

Accédez à Administration → Translations (utilisateurs admin avec la permission manage translations) :

  • Cliquez sur "Add Locale" — indiquez un code (ex. mk pour le macédonien), nom d'affichage, nom natif, nom de fichier SVG du drapeau, direction (LTR/RTL) et une locale de base pour copier les traductions.
  • La nouvelle locale apparaît dans le sélecteur de langue et dans la liste des langues par défaut de Paramètres → Localisation.
  • Les traductions stockées en base remplacent automatiquement les traductions des fichiers dans lang/{code}/.

Translation Editor

L'éditeur liste chaque clé de traduction regroupée par fichier (ex. assets, nav, settings). Les clés affichent la référence du fichier et toute surcharge en base.

  • Filtrez par locale, groupe de traduction ou texte de recherche.
  • Cliquez sur une valeur pour l'éditer inline ; les modifications sont enregistrées immédiatement en base.
  • Réinitialisez une clé pour revenir à la référence du fichier.
  • Les locales intégrées (en, vi, es, …) peuvent être modifiées ; les locales personnalisées sont entièrement pilotées par la base.
  • Seuls les utilisateurs disposant de la permission manage translations peuvent accéder à cette page.

CSV import / export

  • Export — téléchargez toutes les clés d'une locale au format CSV (group,key,value).
  • Import — téléversez un CSV avec les mêmes colonnes ; les surcharges DB existantes sont mises à jour, les nouvelles clés sont insérées.

Locale par défaut par utilisateur

Chaque utilisateur a une colonne locale. Les notifications par email sont automatiquement envoyées dans la langue préférée du destinataire grâce au contrat HasLocalePreference de Laravel.

La langue par défaut du site se configure sous Paramètres → Localisation → Langue par défaut. Chaque utilisateur peut la remplacer via le sélecteur de langue de l'en-tête.

Liste des fonctionnalités

Gestion des actifs

  • Asset tags auto-générés
  • Plusieurs images par actif
  • Génération de codes QR
  • Suivi du statut et de l'état
  • Import/export en masse
  • Cloner un actif
  • Suivi des quantités batch / lot (v2)

Flux de travail

  • Affecter / Retourner / Transférer
  • Demandes avec approbation
  • Réservation Check-in / Check-out
  • Détection de conflits

Entretien

  • Planifier préventif/correctif
  • Vue calendrier
  • Auto-planifier le suivant
  • Suivi des coûts
  • Rappels par e-mail

Pièces jointes

  • Joindre factures, manuels
  • Aperçu inline
  • Alertes d'expiration
  • Plusieurs types de documents

Amortissement

  • 3 méthodes de calcul
  • Mise à jour automatique de la valeur
  • Graphique d'échéancier
  • Résumé annuel

Rapports

  • 12 types de rapports
  • Export Excel + PDF
  • Graphiques et tableaux de bord
  • Filtres de date

Opérationnel (v2)

  • Actifs batch / lot avec réconciliation en direct
  • Allocations aux employés, départements, entrepôt
  • Disposals avec approbation à séparation des fonctions
  • Page publique de remise QR à /a/{tag}

Localisation et traductions (v3)

  • 11 langues UI intégrées + locales personnalisées
  • Translation Editor avec recherche, filtre par groupe, édition inline
  • Import/export CSV pour les mises à jour de traduction en masse
  • Paramètres fuseau horaire et devise appliqués à l'ensemble de l'application

Image de marque & Apparence (v4)

  • Le titre de l'onglet du navigateur se met à jour depuis Paramètres → Image de marque → Nom de l'application
  • Personnalisez les couleurs dans Paramètres → Apparence (modes clair et sombre)

Utilisateurs et Rôles

AssetHub est livré avec 5 rôles préconfigurés :

RôleCapacités
AdminAccès complet — utilisateurs, départements, paramètres, audit, webhooks, traductions
IT ManagerGérer les actifs (unitaires + batch/lot), catégories, maintenance, demandes ; approuver les transferts ; consulter les rapports et l'amortissement
ComptableGérer les actifs et l'amortissement, exécuter les audits d'inventaire, approuver les transferts et disposals, accès complet aux rapports (orientation financière)
SuperviseurApprouver les demandes du département, gérer les checkouts, participer aux inventaires, voir les rapports
EmployéVoir les actifs affectés, créer des demandes, gérer ses propres checkouts

Les permissions sont stockées comme rôles Spatie — les administrateurs peuvent affiner par permission via la base de données.

Gestion des actifs

Créer des actifs

  1. Naviguez vers Actifs → Nouvel actif.
  2. Renseignez nom, catégorie, marque, modèle, numéro de série.
  3. Ajoutez date d'achat et prix (requis pour l'amortissement).
  4. Téléversez les images (plusieurs fichiers supportés, max 5 Mo chacun).
  5. Enregistrez — asset tag et code QR sont auto-générés.

Format de l'Asset Tag

Par défaut : {PREFIX}-{YEAR}-{NNNN}, p. ex. AS-2026-0001. Configurable via Paramètres → Général → Préfixe Asset Tag.

Import en masse

  1. Cliquez sur Importer sur la page Actifs.
  2. Téléchargez le modèle Excel.
  3. Remplissez vos données — colonnes requises : name, category_name.
  4. Téléversez le fichier.

Actifs batch / lot (v2)

Pour des articles identiques en quantité (chaises, claviers, uniformes), choisissez Type de suivi → Batch / Lot sur le formulaire Nouvel actif au lieu de créer des enregistrements en double.

  1. Saisissez la quantité et l'unité (pièce, lot, boîte). À l'enregistrement, le stock est placé dans le pool entrepôt.
  2. Ouvrez l'actif → onglet AllocationsAllouer des unités à un employé ou un département.
  3. Utilisez Retour, Ajustement (endommagé/perdu/réparation) ou les actions de disposition — le résumé en direct doit concorder avec la quantité totale.
  4. Les actifs batch supportent uniquement le prix unitaire ; l'amortissement est optionnel et désactivé par défaut pour une configuration plus rapide.
Note de mise à niveau : Les actifs v1 existants (articles uniques) restent inchangés. Exécutez php artisan migrate après la mise à jour vers v2 — aucune perte de données.

Codes QR

Chaque actif reçoit automatiquement un code QR à la création. Le scan ouvre la page publique ou authentifiée de l'actif (voir ci-dessous). Le scan dans l'application ouvre directement l'écran de détail de l'actif.

Imprimer les étiquettes

  • Étiquette unique : cliquez sur l'icône imprimante sur n'importe quelle ligne d'actif.
  • Format PDF : A4, 2 étiquettes par ligne, comprend asset tag, nom, marque, série.

Scan

Cliquez sur Scanner QR sur la page Actifs. Autorisez l'accès à la caméra. Le scanner utilise html5-qrcode et fonctionne sur tout navigateur moderne. Note : l'accès caméra nécessite HTTPS ou localhost.

Page publique de remise QR (v2)

Chaque actif dispose aussi d'une URL publique imprimable à /a/{asset_tag} — utile pour une remise physique sans connexion.

  • Configurez dans Paramètres → Général → Page publique des actifs : Public, Connexion requise ou Désactivé.
  • La page affiche la photo, les champs clés et (pour les batch) la répartition des quantités. Les utilisateurs peuvent l'imprimer comme fiche de remise.
  • Après modification de APP_URL, cliquez sur Régénérer tous les codes QR dans le même panneau de paramètres.

Flux de travail

Affectation d'actif

  1. Ouvrez une page de détail d'actif.
  2. Cliquez sur Affecter (visible si l'actif est disponible).
  3. Choisissez un utilisateur, date de retour optionnelle, notes.
  4. Soumettez — la transaction est créée et la notification e-mail envoyée.

Demandes d'actifs

Les employés peuvent soumettre des demandes d'actifs. Les demandes ont 4 statuts : pending → approved → fulfilled, ou rejected. Les e-mails d'approbation sont envoyés automatiquement.

Check-in / Check-out

Pour les actifs partagés (caméras, projecteurs, véhicules). Les réservations ont des plages de dates ; le système empêche les checkouts qui se chevauchent. La vue calendrier montre toutes les réservations d'un coup d'œil.

Disposals — Mise au rebut formelle (v2)

Les articles usés ou endommagés sont mis au rebut par lots documentés avec séparation des fonctions (proposant ≠ approbateur). Nécessite les permissions manage disposals et approve disposals.

  1. Barre latérale → DisposalsNew Disposal. Définissez le titre et la période (T1–T4, annuelle ou ad hoc).
  2. Ouvrez le brouillon → Add items — unités batch endommagées éligibles ou actifs unitaires en état Poor.
  3. Cliquez sur Submit for approval — le lot est verrouillé.
  4. Un autre approbateur clique sur Approve & execute — les actifs/unités sont marqués comme disposed.
  5. Imprimez le procès-verbal de mise au rebut (PDF) pour les dossiers de conformité.
Irréversible : Les disposals approuvés ne peuvent pas être annulés. Conservez le PDF signé avec votre piste d'audit.

Amortissement

AssetHub calcule l'amortissement des actifs avec l'une des trois méthodes :

MéthodeFormuleCas d'usage
Linéaire(Cost - Salvage) / Useful LifePlus courant ; amortissement annuel constant
Dégressif2 / Useful Life × Book ValueAccéléré ; pour fiscalité
Unités de productionBasé sur l'usageÉquipement industriel

Les valeurs par défaut sont héritées de la catégorie de l'actif. Les entrées d'échéancier sont générées mensuellement. La current_value de l'actif est mise à jour automatiquement le 1er de chaque mois.

Champs personnalisés

Admin → Champs personnalisés vous permet d'ajouter des attributs personnalisés illimités aux actifs :

  • Types : texte, nombre, date, sélection (dropdown), zone de texte, fichier, case à cocher
  • Portée : appliquer à toutes les catégories ou à une catégorie spécifique
  • Réordonner : glisser-déposer la poignée
  • Les champs obligatoires sont validés à l'enregistrement de l'actif

Rapports

Douze rapports intégrés, accessibles depuis le menu Rapports :

  1. Résumé des actifs — totaux par statut, état, catégorie, département
  2. Amortissement — perte de valeur par catégorie, actifs les plus amortis
  3. Transactions — activité d'affectation, retour, transfert dans le temps
  4. Coût de maintenance — dépenses par mois, catégorie, type
  5. Expiration de garantie — actifs nécessitant attention dans 30/60/180 jours
  6. Actifs par département — distribution et utilisation du budget par département
  7. Actifs par source — distribution entre achats, projet, don, transfert
  8. Résumé d'audit d'inventaire — écarts entre cycles d'audit périodiques
  9. Affectations employés (v2) — qui détient quoi, y compris les allocations batch
  10. Département / Emplacement (v2) — actifs et quantités par département ou emplacement
  11. Réconciliation d'inventaire (v2) — stock vs alloué vs endommagé/perdu/mis au rebut
  12. Actifs endommagés (v2) — articles signalés pour réparation ou mise au rebut

Tous les rapports prennent en charge l'export Excel et PDF via les boutons en en-tête de page. Les rapports v2 tiennent compte des quantités (nombre d'actifs + total des unités).

Hooks HTTP

AssetHub peut notifier des services externes lors d'événements clés.

Événements 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

Format du 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
  }
}

Vérification de signature

Si un secret est configuré, les requêtes incluent l'en-tête X-AssetHub-Signature contenant HMAC-SHA256 du corps. Vérifiez de votre côté :

$expected = hash_hmac('sha256', $rawBody, $secret);
if (hash_equals($expected, $request->header('X-AssetHub-Signature'))) {
  // valide
}

Politique de retry

Les livraisons échouées sont retentées 3 fois avec un délai de 200 ms. Après 10 échecs consécutifs, le webhook est auto-désactivé.

Tâches planifiées

AssetHub utilise le planificateur Laravel pour les jobs en arrière-plan. Vous n'avez besoin que d'une seule entrée cron — Laravel dispatche en interne chaque job au bon moment.

Hébergement mutualisé (Interface Cron Jobs cPanel / Hostinger)

Voir la section Configuration cPanel → Étape 7 ou Configuration Hostinger → Étape 5 pour les instructions avec captures d'écran. En résumé : Advanced → Cron Jobs, commande :

/usr/bin/php /home/uXXXXXX/public_html/artisan schedule:run

Planning : chaque minute (* dans les cinq champs).

Commande cron cPanel

Remplacez CPANELUSER par votre nom d'utilisateur cPanel :

/usr/local/bin/php /home/CPANELUSER/public_html/artisan schedule:run

VPS / serveur dédié (crontab)

Exécutez crontab -e en tant qu'utilisateur web (souvent www-data) et ajoutez :

* * * * * cd /path/to/AssetHub && php artisan schedule:run >> /dev/null 2>&1

Solution de secours : pinger d'URL externe

Si votre hébergeur n'a pas de cron du tout, utilisez l'URL Cron in-app (Paramètres → onglet Système) avec cron-job.org (gratuit, toutes les 15 min).

Jobs qui s'exécutent automatiquement

HeureCommandeObjectif
Quotidien 08:00send-overdue-checkout-alertsRappels e-mail des checkouts en retard
Quotidien 08:30send-maintenance-remindersRappels de maintenance à venir
Quotidien 09:00send-document-expiry-alertsDocuments expirant dans 30/14/7/1 jours
Quotidien 09:30send-warranty-alertsAlertes d'expiration garantie + assurance
Quotidien 10:00assethub:send-depreciation-end-alertsAlertes quand les actifs atteignent la fin de leur durée de vie
Quotidien 10:30send-inventory-audit-remindersRappels pour audits d'inventaire actifs
Mensuel le 1er, 02:00update-asset-valuesRafraîchir current_value des actifs depuis l'amortissement

Upgrade Guides

Step-by-step guides for updating an existing installation. Open the guide that matches your current version.

Dépannage

"Permission denied" sur storage

chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache

Le scanner QR n'ouvre pas la caméra

Les APIs caméra du navigateur exigent HTTPS. Installez un certificat SSL ou utilisez localhost pour tester.

Les e-mails n'arrivent pas

Consultez storage/logs/laravel.log pour les erreurs. Utilisez Paramètres → Email → Envoyer un e-mail test pour vérifier les identifiants SMTP. Assurez-vous que votre serveur SMTP autorise l'IP émettrice.

Base de données "Access denied" (1045) sur cPanel

Nom d'utilisateur/mot de passe incorrect, affectation manquante de l'utilisateur à la base de données, ou caractères spéciaux dans le mot de passe qui cassent l'analyse de .env. Voir Configuration cPanel → Problèmes fréquents.

Erreur de migration 1067 (Invalid default value)

Le mode strict MySQL sur l'hébergement mutualisé rejette plusieurs colonnes timestamp NOT NULL. Corrigé dans la v2.1.0+. Mettez à jour votre package ou changez checkout_date / expected_return_date en dateTime dans la migration checkouts.

APP_KEY manquant / Erreur 500 avant l'installation

Laravel nécessite APP_KEY dans .env avant le chargement de l'application. Si cPanel n'a pas de Terminal, voir Configuration cPanel → Étape 5 pour les méthodes SSH, genkey.php ou génération locale.

Réinitialiser l'installation

Supprimez storage/installed.lock et revisitez /install. Les données existantes seront effacées si vous relancez les migrations.

Performance — liste d'actifs lente

Exécutez php artisan optimize pour cacher config, routes, vues. Assurez-vous que MySQL a des index sur assets.asset_tag, assets.serial_number, assets.status (créés automatiquement par les migrations).

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

Mise à niveau de v2.x vers v3.0

Téléchargez le ZIP v3 depuis CodeCanyon, remplacez les fichiers de l'application (conservez votre .env et les uploads dans storage/), puis exécutez php artisan migrate. De nouvelles tables pour les locales personnalisées et les surcharges de traduction sont ajoutées automatiquement. Les paramètres et actifs existants sont conservés.

v2.x → v3.0 — Full upgrade guide

Mise à niveau de v1.x vers v2.0

Téléchargez le ZIP v2 depuis CodeCanyon, remplacez les fichiers de l'application (conservez votre .env et les uploads dans storage/), puis exécutez php artisan migrate. La mise à niveau est non destructive — les actifs uniques existants continuent de fonctionner ; les nouvelles tables batch/disposal sont ajoutées automatiquement.

v1.x → v2.0 — Full upgrade guide

Journal des modifications

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 login : footer et badge suivent Settings → Branding → App Name (sans modification de code)

v3.0.0 — Localisation et Translation Editor (2026-06)

  • Interface Translation Editor à Administration → Translations (Ajouter une locale, édition inline, recherche/filtre par groupe)
  • Locales personnalisées stockées en base — code, nom d'affichage, nom natif, drapeau SVG, direction, locale de base
  • Import/export CSV pour les mises à jour de traduction en masse
  • Paramètres de fuseau horaire et de devise appliqués à l'ensemble de l'application (config/localization.php incl. Europe/Skopje, MKD)
  • Paramètres → Localisation : listes déroulantes fuseau horaire/devise recherchables avec support de valeurs personnalisées
  • Hindi (hi) ajouté comme 11e locale intégrée ; date_format respecté sur les pages Vue
  • Gestion des traductions contrôlée par permission ; les surcharges en base fusionnent avec la référence des fichiers lang/

v2.0.0 — Version opérationnelle (2026-06)

  • Actifs batch / lot — suivi des quantités, allocations, retours, réconciliation en direct
  • 4 rapports opérationnels : Affectations employés, Département/Emplacement, Réconciliation d'inventaire, Actifs endommagés
  • Module Disposals — lots de mise au rebut, approbation avec séparation des fonctions, procès-verbal PDF imprimable
  • Page publique QR des actifs à /a/{tag} avec visibilité configurable
  • Rapports existants mis à jour pour afficher le nombre d'actifs + total des unités
  • Les codes QR pointent vers la page publique de remise ; le journal des transactions enregistre la quantité lors des mouvements batch
  • Données de démonstration, guide utilisateur (livré séparément dans documentation/) et chaînes i18n mises à jour

v1.0.0 — Version initiale (2026-05)

  • CRUD d'actifs avec génération automatique de QR
  • 5 rôles utilisateur (Admin, IT Manager, Comptable, Superviseur, Employé) avec permissions granulaires
  • Suivi de Source d'actif (achat centralisé, achat décentralisé, projet d'investissement, don, transfert interne)
  • Flux d'affectation, retour avec notifications e-mail
  • Flux d'approbation de transfert (pending → approved/rejected) avec contrôle de permissions
  • Flux d'approbation des demandes d'actifs
  • Check-in/check-out avec vue calendrier
  • Planification de maintenance avec auto-renouvellement
  • Pièces jointes de documents avec alertes d'expiration
  • Amortissement avec 3 méthodes + alertes de fin de vie
  • Module d'audit d'inventaire — inventaire périodique avec suivi des écarts
  • Champs personnalisés avec 7 types d'entrée et tri drag-drop
  • 8 rapports avec graphiques, export Excel et PDF (incl. Actifs par source, Résumé d'audit)
  • Journal d'audit via Spatie Activitylog avec visualiseur de diff
  • Webhooks avec signature HMAC et auto-retry
  • Interface multi-langue : 10 langues (en, vi, es, fr, de, zh, ja, pt-BR, ru, ar avec RTL)
  • UI de Paramètres pour entreprise, e-mail, notifications, localisation, traductions
  • Assistant d'installation web
  • Mode sombre avec palette emerald-teal

Crédits

Bibliothèques open-source utilisées