Skip to content

Tableau de bord revendeur

Vue rendue sous /dashboard (views/ResellerDashboard.vue, via Dashboard.vue quand la casquette active est une organisation de type reseller), portée pour le design depuis .lovable-ref/.../dashboards/ResellerDashboard.tsx (le portail « revendeur » de la référence ; voir le skill inspiration-to-vue). C'est l'accueil des revendeurs (voir Routage & gardes) : Dashboard.vue route une casquette d'organisation selon son typereseller → ce portail, region → le portail région. Si l'organisation n'est pas approved (suspendue), le portail est remplacé par l'écran pleine page « Compte suspendu » (views/OrganizationSuspended.vue — voir Routage & gardes).

Composition

  • views/ResellerDashboard.vue — coquille identique à celles des portails voyageur, super-admin et région : SidebarProvider + barre latérale + barre supérieure (fil d'Ariane, déconnexion) + section active. La section courante est un état d'UI local (ref<ResellerSectionId>). Calcule le nom de l'utilisateur et celui de l'organisation active (casquette) et les passe à la vue d'ensemble. La déconnexion passe par le store de session puis redirige vers /login.
  • components/reseller/ResellerSidebar.vue — barre latérale repliable (primitive shadcn-vue sidebar), navigation plate (les huit sections de la référence, comme les barres voyageur et région ; pas de groupes contrairement au super-admin). Prop active, émet select. Son en-tête rend le RoleSwitcher, qui affiche pour une organisation reseller son nom et l'icône Store.
  • components/reseller/ResellerOverview.vue — vue « Vue d'ensemble » : en-tête de bienvenue, indicateurs clés réels (cartes vendues = total − inStock, en stock, cartes utilisées, cartes émises) issus de fetchActivationCodeStats() (GET /stats/activation-codes), scopés sur le revendeur via la casquette active (X-Viewing-As = UUID de l'org). Chargement et erreur retombent sur « — » (+ toast d'erreur). Suivent une carte d'avancement de l'activation (barre de progression + lien « Continuer » qui émet select('activation'), encore en démo : onboarding sans endpoint) et une carte de bienvenue nominative (nom + organisation, reçus en props).
  • components/reseller/PromoCodesView.vue — section « Codes promo » : liste des codes du revendeur (scopés sur la casquette via X-Viewing-As), KPI, export CSV et actions groupées (annuler / rembourser / renouveler), le tout mutualisé avec l'écran super-admin. À côté du badge de statut, le sablier ambre partagé (components/CodePendingExtensionIcon.vue, tooltip « Extension en attente ») signale un code dont la demande de prolongation attend une décision admin (has_open_extension_request). Un sélecteur Codes / Lots en tête ouvre une vue Lots en lecture seule : elle réutilise BatchesDirectory (mode readonly, sans filtre organisation ni bouton d'édition — l'édition d'un lot reste super-admin) et charge les lots du revendeur via fetchActivationCodeBatches() au premier passage (chargement paresseux, recherche par numéro de lot, pagination). Voir la vue Lots super-admin.
  • components/ComingSoon.vue — espace réservé partagé pour les sections pas encore construites (Activation, Commandes cartes, Kit marketing, Stocks, Canaux de vente, Ventes en direct).
  • components/reseller/sections.ts — modèle de navigation (sections plates + icônes).

État d'avancement

Les sections « Vue d'ensemble » et « Codes promo » (codes + vue Lots en lecture seule) sont construites ; les six autres affichent ComingSoon. Les indicateurs clés sont désormais réels (comptes de codes d'activation du revendeur). En revanche l'avancement de l'activation et la carte de bienvenue restent des valeurs de démonstration (reseller.overview.demoNote reformulé en ce sens) : pas d'endpoint d'onboarding. Le revenu, la commission en CHF et les canaux de vente ne sont pas affichés (ils demanderaient un prix/carte et un modèle de canaux absents du backend). Les vues riches de la référence (timeline d'onboarding, codes promo, commandes, kit marketing, tableau des stocks, canaux, ventes en direct) restent à porter.

i18n

Toutes les chaînes passent par t() sous les clés reseller.* et roles.* (libellés des casquettes et des types d'organisation utilisés par le RoleSwitcher), présentes dans les trois catalogues (fr / de / en). Le nom de l'utilisateur et celui de l'organisation sont interpolés (carte de bienvenue) ; les libellés interpolés ({pct}, {step}, {completed}, {total}, {name}) proviennent des données de session ou de démonstration.

Contributors

No contributors

Changelog

No recent changes