Plateforme d'Administration Backend (admin-alta.alta-voce.tech)
Documentation auto-générée
Documentation API REST (Scribe) : Voir la documentation API - Documentation OpenAPI/Postman générée automatiquement.
1. Rôle d'Architecture & Spécifications
Le backend admin-alta sert de tour de contrôle centrale pour tout l'écosystème Alta Voce. Conçu en Laravel 10 / PHP 8.1, il remplit trois rôles critiques :
- Ingestion et Nettoyage de la Télémétrie : Point d'entrée à haute fréquence (REST API) collectant les paquets envoyés par les agents, exécutant les filtres de sécurité et de nettoyage (réduction de 96 % par whitelist).
- Portail d'Administration Filament v3 : Dashboard d'administration complet basé sur Livewire, Alpine.js et Tailwind pour piloter l'ensemble du parc client.
- Moteur d'Orchestration Temporel (CRON / CLI) : Système automatisé d'analyse nocturne, d'agrégation décisionnelle (BI), de facturation et de maintenance préventive.
2. Authentification de l'API REST
L'API REST utilise des tokens opaques Laravel Sanctum (pas JWT). Les tokens sont créés à la connexion et transmis en tant que header Bearer sur toutes les requêtes protégées.
Cycle de vie des tokens
- Expiration : 2 heures après la création (configurable via
sanctum.expiration). - Rafraîchissement proactif : Le client frontend appelle automatiquement
POST /api/refresh-tokenquand il reste moins de 30 minutes sur le token courant. - Rafraîchissement réactif : Sur une réponse
401, le client tente un rafraîchissement si l'utilisateur a été actif dans les 5 dernières minutes ; sinon il force la déconnexion.
Endpoints d'authentification
| Méthode | Chemin | Auth | Description |
|---|---|---|---|
| POST | /api/login | — | S'authentifier et recevoir un bearer token |
| POST | /api/logout | ✅ | Révoquer le token courant |
| POST | /api/register | — | Créer un nouveau compte |
| POST | /api/forgot-password | — | Demander un email de réinitialisation (token valide 1h) |
| POST | /api/reset-password | — | Appliquer la réinitialisation du mot de passe |
| POST | /api/invite | ✅ | Inviter un nouveau compte par email (admin/client-admin seulement) |
| GET | /account-setup/{token} | — | Formulaire web de configuration de compte (lien d'invitation) |
| POST | /api/account/setup | — | Finaliser la configuration d'un compte invité (nom, mot de passe) |
| POST | /api/refresh-token | ✅ | Rafraîchir le token Sanctum (seulement dans les 30 min d'expiration) |
| PUT | /api/complete_onboarding | ✅ | Marquer l'onboarding comme terminé |
| GET | /api/user / /api/me | ✅ | Obtenir le profil du compte authentifié courant |
Politique de mot de passe (configuration de compte)
Les nouveaux comptes configurés via le flux d'invitation doivent choisir un mot de passe contenant au moins une majuscule, une minuscule, un chiffre et un caractère spécial (minimum 8 caractères). Le lien de configuration est valide 3 jours.
Système de rôles
Trois rôles existent dans la table roles :
| Rôle | Permissions |
|---|---|
admin | Accès complet : gérer tous les clients, toutes les ressources, impersonnification |
client-admin | Gérer les comptes et groupes de sa propre organisation |
member | Accès lecture/écriture aux ressources de son groupe |
Impersonification
Les administrateurs peuvent impersonifier n'importe quel autre compte :
POST /api/impersonate— Démarre l'impersonification. Retourne un nouveau token limité au compte cible. L'événement est enregistré dans la tableimpersonations.POST /api/impersonate/stop— Restaure la session et le token admin d'origine.- Le frontend (
ImpersonateWidget.vue) affiche une bannière persistante pendant l'impersonification et permet de l'arrêter à tout moment.
3. API Plugin Desktop (/api/altacall/*)
Routes utilisées exclusivement par le client Windows AltaCall. L'authentification est gérée par un AltaAuthMiddleware personnalisé qui supporte simultanément trois schémas : PHP Basic Auth (PHP_AUTH_USER/PHP_AUTH_PW), HTTP Basic Auth (Authorization: Basic ...), et un schéma Digest propriétaire (Authorization: Digest clientId:userId:sha256checksum).
Toutes les routes plugin passent également par AltacallMonitoringMiddleware, qui enregistre les métriques de requêtes (durée, mémoire, taille de réponse, IP, infos licence).
| Méthode | Chemin | Description |
|---|---|---|
| GET / POST | /api/altacall/license | Valider une clé de licence. Retourne license_status: valid|invalid + user. Résultats mis en cache 30 min (valide) / 5 min (invalide). |
| POST | /api/altacall/config | Obtenir la configuration dynamique et fusionnée du plugin. Couches : général → app → version → config client licence → config utilisateur/machine. Injecte les messages d'incidents actifs. |
| POST | /api/altacall/telemetry | Soumettre un payload de télémétrie diagnostique périodique. |
| POST | /api/altacall/event | Notifier d'un événement plugin (device.capture.added, device.capture.removed, device.capture.none, audio.state.changed, noop). |
| POST | /api/altacall/process | Déclarer une nouvelle instance de processus en cours d'exécution. |
| GET / POST | /api/altacall/consent | Lire ou mettre à jour le consentement de collecte de données de l'agent. |
| POST | /api/altacall/logs | Uploader un bundle de logs de diagnostic. |
| POST | /api/it/recordings | Uploader un enregistrement audio depuis le plugin. |
Gestion des événements
L'endpoint POST /api/altacall/event distribue chaque événement à un handler typé :
| Type d'événement | Handler | Effet |
|---|---|---|
device.capture.added | DeviceCaptureAddedHandler | Si la politique est auto, met à jour device_capture dans la config utilisateur avec le nouveau périphérique. |
device.capture.removed | DeviceCaptureRemovedHandler | Sélectionne un périphérique de remplacement par correspondance regex avec les listes de bons/mauvais périphériques connus. |
device.capture.none | DeviceCaptureNoneHandler | Gère l'état sans périphérique. |
audio.state.changed | NoopHandler | No-op, enregistré uniquement. |
noop | NoopHandler | No-op. |
Retourne {"actions": ["config.update"]} quand le client doit rafraîchir sa config, {"actions": []} sinon.
4. Architecture du Portail Admin (Filament v3)
Le portail s'appuie sur Filament Admin v3, structuré autour de Resources gérant les modèles Eloquent. Chaque ressource définit ses formulaires de saisie, ses grilles avec filtres et ses actions métier personnalisées :
4.1. ABTestsResource (Gestion des Campagnes A/B Testing)
- Description : Créer, configurer et monitorer les tests comparatifs d'algorithmes acoustiques (SMA, VMO, Smile).
- Colonnes :
id,name,status(badges :active/pending/completed),start_date,end_date,goal_progress(barre de progression dynamique). - Formulaire : Configuration générale, sélection des presets de transformation, ciblage par labels d'agents.
- Actions :
- Télécharger le CSV : Export brut de toutes les télémétries et KPIs liés au test.
- Forcer la Rotation : Déclenche immédiatement la rotation des algorithmes.
4.2. ClientResource (Administration des Comptes Clients)
- Description : Gestion des entreprises et centres d'appels clients.
- Colonnes :
name,email,email_billing,vat_number,groups_count. - Formulaire : Informations fiscales, contact, Éditeur JSON
config(restrictions réseau, règles d'alertes).
4.3. UserResource (Agents Alta Call)
- Description : Profils des agents enregistrés via télémétrie (différents des comptes portail).
- Colonnes :
name(username Windows),vmo_user_id,last_update,status. - Actions : Export Usage Trace (CSV/JSON) — historique quotidien des durées et médianes F0/Pitch.
4.4. AccountsResource (Comptes du Portail)
- Description : Comptes des utilisateurs admin et client-admin qui se connectent au dashboard web. Distinct de
users(les agents Alta Call sur les postes). Les comptes portail utilisent email/mot de passe via Sanctum.
4.5. MachinesResource (Inventaire & Diagnostic du Parc)
- Description : Administration de tous les postes physiques exécutant Alta Call.
- Colonnes :
computer(hostname),vmo_machine_id,version,local_ip_address,status(vert/rouge selon les incidents ouverts). - Actions : Onglet de diagnostic listant les anomalies ouvertes (depuis
machines_issues).
4.6. InvoicesResource (Module de Facturation Automatisée)
- Description : Création et suivi financier des abonnements mensuels.
- Colonnes :
invoice_number,client.name,period_start,period_end,amount_excl_tax,amount_incl_tax,status(paid/unpaid/frozen). - Actions :
- Télécharger le PDF : Facture légale générée depuis un template Blade.
- Notifier par Email : Envoi automatique au contact de facturation.
4.7. LicenseResource (Clés d'Accès)
- Description : Génération et activation des clés de licences logicielles.
- Formulaire : Génération automatique, champ
fancynamepour le support, togglevalidpour révocation immédiate.
4.8. TransformationsResource (Presets de Transformation Vocale)
- Description : Gestion des algorithmes de transformation vocale (
transfos). Chaque preset définit letransfo_mode(SMA,VMO,MANUAL) et son payload de paramètres JSON injecté dans les configs plugin.
4.9. GroupsResource & MonitoringResource
- GroupsResource : Gestion des départements/équipes clients. Les groupes relient clients, utilisateurs, machines et licences.
- MonitoringResource : Inspection des métriques de requêtes enregistrées par
AltacallMonitoringMiddleware(latences, taux d'erreur, requêtes lentes).
4.10. AltacallLogResource & PluginLogResource
- Description : Consulter et télécharger les bundles de logs système et les logs d'intégration softphone envoyés par les postes.
4.11. SoftwareVersionResource (Versioning et Déploiement)
- Description : Gérer les packages logiciels (MSI/EXE) et définir les versions minimales requises pour forcer les mises à jour de sécurité.
4.12. RecordingsResource, SuggestionResource & ExternalUtilityResource
- RecordingsResource : Règles et fichiers d'enregistrement audio à distance, utilisés pour le contrôle qualité des A/B tests.
- SuggestionResource : Tickets de feedback utilisateurs envoyés depuis le client de bureau.
- ExternalUtilityResource : Téléchargements d'outils complémentaires distribués via le portail.
5. Moteur d'Orchestration Temporel (CRON / CLI)
[!IMPORTANT] Architecture de contournement HTTP (FastCGI) Le backend étant hébergé sur Gandi Simple Hosting avec un timeout HTTP de 30 secondes, les tâches planifiées utilisent une méthode asynchrone :
- Un planificateur externe (cron-job.org) appelle les routes sous
/cron/*via HTTP GET.- La route appelle
fastcgi_finish_request(), retournant HTTP 200 immédiatement pour couper la connexion réseau.- PHP continue l'exécution en arrière-plan (
set_time_limit(170)) pour terminer les longs calculs.
Référence complète des endpoints cron
| Route HTTP Cron | Commande / service | Fréquence | Description |
|---|---|---|---|
/cron/summaries-build | summaries:build | Quotidien 02:00 | Génère les users_summaries depuis les télémétries brutes (F0, dB, durées). |
/cron/billing-save-daily-usage | InvoiceService::saveDailyUsage | Quotidien 00:05 | Calcule et stocke les secondes de voix transformée par agent dans daily_usages. |
/cron/billing-save-monthly-usage | billing:save-monthly-usage | 1er du mois 00:10 | Agrège daily_usages vers monthly_usages. |
/cron/billing-generate-auto-invoices | billing:generate-auto-invoices | 1er du mois 01:00 | Génère les factures brouillons depuis monthly_usages × grille tarifaire. |
/cron/billing-freeze-auto-invoices | billing:freeze-auto-invoices | 5 du mois 08:00 | Verrouille les factures en statut frozen. |
/cron/billing-notify-ready-invoices | billing:notify-ready-invoices | 5 du mois 09:00 | Envoie les liens PDF de facture aux contacts de facturation. |
/cron/billing-notify-usage-data | billing:notify-usage-data | Mensuel | Envoie les statistiques d'usage aux clients. |
/cron/abtest-prune-telemetry | abtest:prune-telemetry | Quotidien 03:00 | Supprime les télémétries brutes de plus de 7 jours. |
/cron/abtest-prune-user-summaries | abtest:prune-user-summaries | Périodique | Purge les anciennes entrées users_summaries. |
/cron/incidents-archive-and-prune | incidents:archive-and-prune | Quotidien 00:00 | Archive et purge les incidents résolus de plus de 30 jours. |
/cron/job/abtests-compute-progress | AbtestProgressService::computeAllProgress | Horaire | Met à jour goal_progress pour les A/B tests actifs. |
/cron/abtest-notify-tests-progress | AbtestProgressService::notifyTestsProgress | Lundis 08:00 | Email de synthèse hebdomadaire des KPIs des A/B tests en cours. |
/cron/job/rotate-transformations | AbtestRotationService::rotateTransformations | Toutes les 4h | Fait tourner l'attribution des presets vocaux entre les groupes de test. |
/cron/abtest-autotune-smile-scaling | abtest:autotune-smile-scaling | Quotidien 04:00 | Ajuste le scaling des presets Smile depuis les données F0/dB de la veille. |
/cron/abtest-send-reports | abtest:send-reports | Configurable | Envoie les rapports A/B test aux parties prenantes. |
/cron/abtest-delete-expired-recordings | abtest:delete-expired-recordings | Quotidien 03:30 | Supprime les fichiers audio expirés et leurs références en base. |
/cron/abtest-delete-expired-data | abtest:delete-expired-data | Quotidien | Nettoyage général des données A/B test expirées. |
/cron/abtest-delete-expired-outdated-machines | abtest:delete-expired-outdated-machines | Quotidien | Supprime les entrées périmées de outdated_machines. |
/cron/abtest-disable-expired-tests | abtest:disable-expired-tests | Quotidien | Désactive automatiquement les A/B tests passés leur date de fin. |
/cron/abtest-prune-obsolete-issues | abtest:prune-obsolete-issues | Quotidien | Supprime les incidents machines auto-résolus. |
/cron/abtest-prune-event | abtest:prune-event | Quotidien | Purge les vieilles entrées de la table events. |
/cron/abtest-trigger-recordings | abtest:trigger-recordings | Périodique | Active les règles d'enregistrement audio pour le contrôle qualité. |
/cron/abtest-trigger-recording-pool-progress | abtest:trigger-recording-pool-progress | Périodique | Avance la machine d'état du pool d'enregistrements. |
/cron/abtest-trigger-quality-control | abtest:trigger-quality-control | Périodique | Déclenche l'analyse QC sur les enregistrements collectés. |
/cron/abtest-trigger-needs-tuning | abtest:trigger-needs-tuning | Périodique | Signale les groupes A/B test nécessitant un ajustement de paramètres. |
/cron/abtest-notify-tuning-progress | abtest:notify-tuning-progress | Périodique | Notifie les ingénieurs de l'avancement du tuning. |
/cron/notify-upcoming-abtests | notify:upcoming-abtests | Quotidien 09:00 | Prévient les superviseurs des A/B tests qui démarrent le lendemain. |
/cron/telescope-prune | telescope:custom-prune --hours=1 | Horaire | Purge les entrées de debug Telescope (conserve 1h de données). |
/cron/app-clear-cache | app:clear-cache | À la demande | Vide tous les caches applicatifs. |
/cron/monitoring-sync | monitoring:sync | Périodique | Synchronise les données de monitoring. |
6. Gestion de la Télémétrie (Pipeline d'Ingestion)
Toute télémétrie soumise par un client de bureau traverse un pipeline rigoureux géré par TelemController@postTelemetry :
graph TD
A[Paquet de Télémétrie Entrant] --> B[AltaAuthMiddleware — Auth Licence/Digest]
B --> C{Auth valide ?}
C -- Non --> X1[401 Non autorisé]
C -- Oui --> D[Vérification de la version vs version minimale requise]
D --> E[Résolution des entités : Utilisateur / Machine / Processus]
E --> F{Payload de rattrapage ?}
F -- Oui --> G[Stocker la télémétrie brute & retour anticipé]
F -- Non --> H["TelemetryCleaningService — réduction 96% du payload"]
H --> I[Traitement des périphériques audio & Audiostream]
I --> J[Calcul des statistiques de processus actifs]
J --> K["Transaction atomique DB : Update Processus, Machine, Utilisateur"]
K --> L["IssueDetectionService — scan des anomalies"]
L --> M[Écriture dans machines_issues & telemetry_incidents si anomalie détectée]
M --> N[Broadcast IncidentCreated via Laravel Reverb si nouvel incident]
N --> O[Retour 200 OK]
- Auth :
AltaAuthMiddlewarevalide PHP Basic Auth, HTTP Basic Auth, ou le schéma Digest propriétaire. - Nettoyage :
TelemetryCleaningServiceapplique une whitelist de clés approuvées, réduisant chaque entrée JSON de 96 % (de ~14 Ko à ~535 octets en moyenne). - Détection d'incidents :
IssueDetectionServicescanne le payload pour les anomalies (HIGH_LATENCY,EXCESSIVE_XRUNS,AUDIO_CRASHED, etc.) et ouvre ou résout des enregistrements dansmachines_issues. - Broadcast temps réel : Quand un nouvel
TelemetryIncidentest créé, l'événementIncidentCreatedest diffusé sur le canalincidentsvia Laravel Reverb (WebSockets), permettant des alertes en direct dans le tableau de bord admin.