Documentation
Complète & Professionnelle
6 guides complets pour les utilisateurs, développeurs, architectes et administrateurs. Tout ce dont vous avez besoin pour comprendre, développer et utiliser Performa.
| Rôle | Guide principal | Guide secondaire | Référence |
|---|---|---|---|
| Nouveau développeur | 📋 Documentation | 👨💻 Developer Guide | Architecture |
| Architect / Lead | 🏛️ Architecture | Documentation | API Reference |
| Développeur backend | 🔌 API Reference | Documentation | Architecture |
| Administrateur | 👨💼 Admin Guide | User Guide | Documentation |
| Utilisateur final | 📚 User Guide | — | FAQ |
| Package | Version | Rôle |
|---|---|---|
| Vue | 3.5.13 | Framework UI principal |
| TypeScript | 5.8.2 | Type safety |
| Vite | 6.2.3 | Build & Dev server |
| Pinia | 3.0.4 | State management |
| Vuetify | 3.7.18 | Composants Material Design |
| Axios | 1.8.4 | Client HTTP |
| Tailwind CSS | 3.4.17 | Utilitaires CSS |
| ApexCharts | 4.5.0 | Graphiques & statistiques |
Démarrage Rapide
Tout ce dont vous avez besoin pour commencer à utiliser ou développer sur Performa en moins de 5 minutes.
🎯 Choisissez votre parcours
👤 Vous êtes utilisateur
👨💻 Vous êtes développeur
# 1. Cloner le repository
git clone <repo-url>
cd performa
# 2. Installer les dépendances (pnpm requis)
pnpm install
# 3. Configurer l'environnement
cp .env.example .env.local
# Éditer .env.local :
# VITE_API_BASE_URL=https://api.perfomia.digitexia.org/api
# 4. Démarrer le serveur
pnpm dev
# 5. Ouvrir dans le navigateur
open http://localhost:5173
👨💼 Vous êtes administrateur
/admin/users.📦 Scripts disponibles
| Commande | Action |
|---|---|
pnpm dev | Serveur de développement (localhost:5173) |
pnpm build | Build production optimisé |
pnpm preview | Prévisualiser le build |
pnpm typecheck | Vérifier les types TypeScript |
pnpm lint | Linter + formatter le code |
🔐 Se connecter
Utilisez votre email et mot de passe fournis par votre administrateur sur https://perfomia.digitexia.org. Ou via un lien d'invitation reçu par email.
🔑 Système RBAC
✅ Checklist de première utilisation
- Lire ce guide (2 min)
- Choisir votre guide selon votre rôle ci-dessus
- Si développeur :
pnpm installpuispnpm dev - Si utilisateur : explorer la plateforme et consulter le User Guide
- En cas de problème : section Troubleshooting du Developer Guide
Vue d'ensemble du Projet
Architecture générale, stack technologique, structure des dossiers, stores, services, sécurité et routage de Performa.
📌 Présentation
Performa est une plateforme web moderne de gestion d'entreprise construite avec Vue 3, TypeScript, Vite, et Vuetify 3. Elle offre une solution complète pour la gestion de projets, tâches, équipes, courriers et évaluations au sein d'une organisation.
| Propriété | Valeur |
|---|---|
| Nom du projet | modernize-vuejs-free |
| Version | 2.0.0 |
| Type | SPA (Single Page Application) |
| Framework | Vue 3.5.13 |
| Gestionnaire de paquets | pnpm |
| State management | Pinia 3.0.4 |
🗂️ Structure des dossiers
src/
├── pages/ # 30+ pages principales
├── components/ # Composants réutilisables (8 groupes)
├── stores/ # Pinia stores (12 stores)
├── services/ # Logique métier (15 services)
├── types/ # Définitions TypeScript
├── router/ # Configuration des routes
├── api/ # Configuration Axios + interceptors
├── layouts/ # FullLayout, BlankLayout
├── plugins/ # Vuetify, etc.
├── composables/ # Logique réutilisable Vue 3
├── theme/ # Thèmes Light/Dark
├── scss/ # Styles globaux SCSS
└── assets/ # Images et ressources statiques
📄 Pages (30+)
Authentification
LoginPage.vue— Connexion utilisateurRegisterLinkPage.vue— Inscription via lien d'invitationRegisterCompanyPage.vue— Enregistrement d'une nouvelle entreprise
Projets & Tâches
ProjectsPage.vue,ProjectDetailsPage.vueTasksPage.vue,TaskDetailsPage.vue
Équipes & Utilisateurs
TeamPage.vue,MyTeamPage.vue,PeoplePage.vueDepartmentsPage.vue,UsersPage.vue,ServicesPage.vue
Courriers
CourrierListPage.vue,CourrierDetailPage.vueIncomingMailPage.vue,OutgoingMailPage.vue,CourrierTrackingPage.vue
Évaluations (5 pages)
EvaluationsPage.vue+EvaluationStartPage,EvaluationInterviewPage,EvaluationCompletedPage,EvaluationReadOnlyPage,EvaluationReviewPage
Administration
CompaniesPage.vue(super_admin),InvitationsPage.vue,ActivityLogsPage.vue,ActivationCodesPage.vue
🔌 Stores Pinia (12)
| Store | Responsabilités |
|---|---|
| authStore | Authentification, session, login/logout |
| userStore | Données utilisateur, profil, préférences |
| companyStore | Données d'entreprise |
| projectStore | Gestion des projets |
| taskStore | Gestion des tâches |
| courrierStore | Gestion des courriers |
| evaluationStore | Gestion des évaluations |
| notificationStore | Notifications utilisateur |
| roleStore | Rôles et permissions RBAC |
| toastStore | Notifications toast UI |
| userSettingsStore | Paramètres utilisateur |
| companySettingsStore | Paramètres d'entreprise |
🔐 Sécurité & Authentification
Token Bearer
- Token stocké dans
localStorageavec la cléauth_token - Utilisateur stocké dans
localStorageavec la cléauth_user - Automatiquement injecté :
Authorization: Bearer <token>
Intercepteurs Axios
// Request Interceptor → ajoute le Bearer token
// Response Interceptor → gère les erreurs 401
http.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
localStorage.removeItem('auth_token')
router.push('/login')
}
return Promise.reject(error)
}
)
🗺️ Routage
Toutes les routes sont lazy-loaded (code splitting automatique). Les routes protégées utilisent des métadonnées :
{
path: '/companies',
component: () => import('@/pages/CompaniesPage.vue'),
meta: { roles: ['super_admin'] } // Route gardée
}
🎨 Thème & Styles
- Vuetify 3 — Composants Material Design, thèmes Light/Dark
- Tailwind CSS — Utilitaires, couleur "brand" (cyan/bleu)
- SCSS — Variables, overrides, styles globaux
Guide d'Architecture Technique
Architecture en couches, patterns Composition API/Composables/Store/Service/Guard, flux de données, permissions RBAC et optimisations.
🏗️ Architecture en 5 couches
🎯 Patterns Utilisés
1. Composition API Pattern
<script setup lang="ts">
import { ref, computed } from 'vue'
const count = ref(0)
const increment = () => count.value++
const doubled = computed(() => count.value * 2)
</script>
2. Composables Pattern
// src/composables/useRbac.ts
export const useRbac = () => {
const authStore = useAuthStore()
const roles = computed(() => authStore.user?.roles)
return {
roles,
hasRole: (role: string) => roles.value?.includes(role),
isSuperAdmin: computed(() => roles.value?.includes('super_admin'))
}
}
3. Store Pattern (Pinia)
export const useProjectStore = defineStore('projectStore', () => {
// State
const projects = ref<Project[]>([])
const isLoading = ref(false)
const error = ref<string | null>(null)
// Getters
const projectCount = computed(() => projects.value.length)
// Actions
const fetchProjects = async () => {
isLoading.value = true
try {
projects.value = await projectService.getProjects()
} catch (err) {
error.value = getApiErrorMessage(err)
} finally {
isLoading.value = false
}
}
return { projects, isLoading, error, projectCount, fetchProjects }
})
🔐 Système de Permissions RBAC
🚨 Gestion des Erreurs (4 niveaux)
| Niveau | Responsabilité | Exemple |
|---|---|---|
| Service | Validation & transformation | Vérifier payload avant POST |
| Store | Capture & stockage de l'erreur | error.value = msg |
| Component | Affichage à l'utilisateur | v-if="error" |
| HTTP (Axios) | Interceptor global 401/500 | Redirect login si 401 |
⚡ Performance & Optimisations
- Code Splitting — Toutes les routes sont lazy-loaded
- Tree Shaking — Imports nommés, dépendances inutilisées supprimées au build
- Computed Properties — Calculs mémoïsés, jamais de fonctions dans les templates
- Lazy Loading Images — Attribut
loading="lazy" - State Normalization — Données normalisées par ID
- Perfect Scrollbar — Virtualisation pour les longues listes
🔄 Flux d'authentification
USER → LOGIN PAGE
→ authService.login()
→ API POST /auth/login
← { token, user }
→ authStore.setSession(token, user)
→ localStorage update
→ router.push('/dashboard')
→ AUTHENTICATED APP
🔌 Extensibilité — Ajouter une feature
- Créer le type TypeScript dans
src/types/ - Créer le service dans
src/services/ - Créer le store Pinia dans
src/stores/ - Créer les composants dans
src/components/ - Créer la page dans
src/pages/ - Ajouter la route dans
src/router/index.ts
Guide Pratique de Développement
Configuration, conventions de codage, exemples CRUD complets, workflow, debugging et best practices.
🛠️ Configuration de l'environnement
Prérequis
- Node.js 18+ ou Bun
- pnpm 8+
- Git
- VS Code (recommandé)
Extensions VS Code recommandées
Vue.volar— Support Vue 3 (obligatoire)esbenp.prettier-vscode— Formatage Prettierbradlc.vscode-tailwindcss— Support TailwindVue.eslint-extension— Intégration ESLint
Variable d'environnement
# .env.local
VITE_API_BASE_URL=https://api.perfomia.digitexia.org/api
# Pour développement local
VITE_API_BASE_URL=http://localhost:3000/api
📁 Structure pour une nouvelle feature
POUR UNE NOUVELLE FEATURE (ex: "Rapports")
src/
├── pages/ReportsPage.vue # Page principale
├── components/reports/
│ ├── ReportList.vue # Liste
│ ├── ReportForm.vue # Formulaire
│ └── ReportDetail.vue # Détail
├── stores/reportStore.ts # État global
├── services/reportService.ts # API calls
├── types/report.ts # Interfaces TS
└── composables/useReportForm.ts # Logique réutilisable
🎨 Conventions de nommage
| Type | Convention | Exemple |
|---|---|---|
| Composants Vue | PascalCase | UserProfile.vue |
| Services & Stores | camelCase | userService.ts |
| Constants | UPPER_SNAKE_CASE | USER_ROLES.ts |
| Tests | suffixe .test.ts | userService.test.ts |
🎯 Exemple complet — Composant Vue 3
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { useUserStore } from '@/stores/userStore'
import type { User } from '@/types/auth'
// Props
interface Props {
userId: string
readOnly?: boolean
}
const props = withDefaults(defineProps<Props>(), {
readOnly: false
})
// Emits
const emit = defineEmits<{
'user-saved': [user: User]
'user-deleted': [userId: string]
}>()
const userStore = useUserStore()
const user = computed(() => userStore.getUserById(props.userId))
onMounted(async () => {
await userStore.fetchUsers()
})
</script>
💡 Exemple CRUD complet
// FETCH
const fetchProjects = async () => {
isLoading.value = true
try {
projects.value = await projectService.getProjects()
} catch (err) {
error.value = getApiErrorMessage(err)
} finally {
isLoading.value = false
}
}
// CREATE
const createProject = async (payload: CreateProjectPayload) => {
try {
const data = await projectService.createProject(payload)
projects.value.push(data)
toastStore.showSuccess('Projet créé!')
} catch (err) {
throw new Error(getApiErrorMessage(err))
}
}
// UPDATE
const updateProject = async (id: string, data: Partial<Project>) => {
const idx = projects.value.findIndex(p => p.id === id)
if (idx >= 0) projects.value[idx] = { ...projects.value[idx], ...data }
}
// DELETE
const deleteProject = async (id: string) => {
await projectService.deleteProject(id)
projects.value = projects.value.filter(p => p.id !== id)
}
🔄 Workflow de développement
# 1. Créer une branche
git checkout -b feature/users-management
# 2. Développer (types → service → store → composants → page → routes)
# 3. Vérifier les types
pnpm typecheck
# 4. Linter
pnpm lint
# 5. Commit
git commit -m "feat: add users management feature"
# 6. Push & PR
git push origin feature/users-management
🐛 Problèmes courants & Solutions
| Erreur | Cause | Solution |
|---|---|---|
Cannot find module '@/...' | Alias incorrect | Utiliser @/types/auth (avec slash) |
Store not initialized | Appelé hors setup | Appeler dans <script setup> |
Token expired | Token expiré | Vérifier localStorage.auth_token |
Reactive ref undefined | Accès sans null check | if (user.value) { ... } |
✅ Checklist de développement
- Types TypeScript créés et cohérents
- Service API avec gestion d'erreur
- Store Pinia avec actions/getters
- Composants réutilisables
- Routes ajoutées avec permissions (
meta.roles) - Aucune erreur TypeScript :
pnpm typecheck - Code bien formaté :
pnpm lint - Testé manuellement, pas de console errors
API Reference & Modules
70+ endpoints REST documentés, authentification Bearer Token, types de réponse, codes d'erreur, pagination et exemples de requêtes.
📐 Convention
| Propriété | Valeur |
|---|---|
| Base URL | https://api.perfomia.digitexia.org/api |
| Format | JSON |
| Authentification | Bearer Token (header Authorization) |
/auth/login et /auth/register-*) nécessitent un header Authorization: Bearer <token>.👤 Authentification
Exemple Login
curl -X POST https://api.perfomia.digitexia.org/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","password":"password123"}'
# Response
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": "123", "email": "user@example.com",
"firstName": "John", "roles": ["employee"]
}
}
👥 Utilisateurs
📊 Projets
✅ Tâches
👨💼 Équipes
📧 Courriers
📋 Évaluations
🏢 Entreprises super_admin
📌 Paramètres
📊 Types de réponse
Succès
{
"data": { ... },
"message": "Success",
"status": 200
}
Erreur
{
"error": "Unauthorized",
"message": "Token invalide ou expiré",
"statusCode": 401
}
⚠️ Codes HTTP
| Code | Signification |
|---|---|
| 200 | OK — Succès |
| 201 | Created — Ressource créée |
| 400 | Bad Request — Données invalides |
| 401 | Unauthorized — Token manquant/invalide |
| 403 | Forbidden — Permissions insuffisantes |
| 404 | Not Found — Ressource introuvable |
| 422 | Unprocessable Entity — Validation échouée |
| 500 | Internal Server Error |
📄 Pagination
GET /projects?page=1&limit=20
GET /tasks?status=pending&page=2
GET /users?search=john&sort=name&order=asc
Guide Admin — Gestion des Utilisateurs
Hiérarchie administrative, matrice de permissions RBAC, implémentation technique et composants Vue prêts à l'emploi.
🏛️ Hiérarchie Admin
🔑 Matrice de Permissions
| Rôle | Voir | Éditer | Créer | Supprimer |
|---|---|---|---|---|
| super_admin | ✅ Tous | ✅ Tous | ✅ Tous | ✅ Tous |
| admin | ✅ Son entreprise | ✅ Oui | ✅ Oui | ✅ Oui |
| manager | ⚠️ Son équipe | ⚠️ Limité | ❌ Non | ❌ Non |
| service_head | ⚠️ Son service | ⚠️ Limité | ❌ Non | ❌ Non |
| employee | ✅ Lui-même | ✅ Lui-même | ❌ Non | ❌ Non |
🖥️ Accéder à la gestion des utilisateurs
Navigation : Menu Principal → Paramètres → Gestion des Utilisateurs
URL directe : http://localhost:5173/admin/users
💻 Composant 1 — AdminUsersPage.vue
<!-- src/pages/AdminUsersPage.vue -->
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useUserStore } from '@/stores/userStore'
import { useRbac } from '@/composables/useRbac'
import AdminUserList from '@/components/admin/AdminUserList.vue'
import AdminUserForm from '@/components/admin/AdminUserForm.vue'
const userStore = useUserStore()
const { isAdminScope } = useRbac()
const showForm = ref(false)
const selectedUserId = ref<string | null>(null)
onMounted(async () => {
if (isAdminScope.value) await userStore.fetchUsers()
})
const handleCreate = () => {
selectedUserId.value = null
showForm.value = true
}
const handleEdit = (userId: string) => {
selectedUserId.value = userId
showForm.value = true
}
const handleDelete = async (userId: string) => {
if (confirm('Supprimer cet utilisateur?')) {
await userStore.deleteUser(userId)
}
}
</script>
💻 Composant 2 — AdminUserList.vue
<template>
<v-data-table
:headers="headers"
:items="users"
:loading="isLoading"
>
<template #item.actions="{ item }">
<v-btn @click="$emit('edit', item.id)">Éditer</v-btn>
<v-btn @click="$emit('delete', item.id)" color="error">
Supprimer
</v-btn>
</template>
</v-data-table>
</template>
<script setup lang="ts">
import type { User } from '@/types/auth'
defineProps<{ users: User[]; isLoading: boolean }>()
defineEmits<{
edit: [id: string]
delete: [id: string]
}>()
const headers = [
{ title: 'Email', key: 'email' },
{ title: 'Nom', key: 'lastName' },
{ title: 'Rôle', key: 'roles' },
{ title: 'Statut', key: 'isActive' },
{ title: 'Actions', key: 'actions' }
]
</script>
🛣️ Route protégée
{
path: '/admin/users',
name: 'AdminUsers',
component: () => import('@/pages/AdminUsersPage.vue'),
meta: {
requiresAuth: true,
roles: ['admin', 'super_admin']
}
}
🔒 Vérifications backend requises
- Vérifier que l'admin ne peut gérer que les utilisateurs de son entreprise
- Empêcher l'auto-suppression d'un compte
- Valider que les rôles assignés respectent la hiérarchie
- Logger toutes les opérations d'admin dans les activity logs
Guide Utilisateur Complet
Tout ce que vous devez savoir pour utiliser Performa au quotidien : connexion, tableau de bord, projets, tâches, courriers, évaluations et FAQ.
📖 Introduction
Performa est votre plateforme complète de gestion d'entreprise. Elle vous permet de gérer projets, tâches, équipes, courriers et évaluations depuis un seul endroit.
🚀 Premiers Pas
Se connecter via email & mot de passe
- Allez sur https://perfomia.digitexia.org
- Cliquez sur "Se Connecter"
- Entrez votre email et mot de passe
- Cliquez sur "Connexion"
Via lien d'invitation
- Cliquez sur le lien dans votre email d'invitation
- Remplissez votre profil (nom, prénom, mot de passe)
- Cliquez sur "Confirmer"
- Vous êtes connecté!
Changer votre mot de passe
Allez dans Paramètres → Sécurité → Changer le mot de passe.
🎨 Interface Principale
| Élément | Description |
|---|---|
| Menu latéral gauche | Navigation principale entre les sections |
| Barre supérieure | Notifications, profil, recherche rapide |
| Zone centrale | Contenu de la section active |
| Breadcrumb | Votre position dans l'application |
📊 Tableau de Bord
Le tableau de bord affiche une vue personnalisée selon votre rôle :
- Widgets de statistiques — Résumé de vos projets et tâches en cours
- Graphiques — Progression et performances
- Activité récente — Dernières actions de l'équipe
- Tâches prioritaires — Ce qui nécessite votre attention
📊 Gestion de Projets
Créer un projet
- Menu → Projets → Bouton "+ Nouveau Projet"
- Remplir : nom, description, dates, équipe, priorité
- Cliquer sur "Créer"
Statuts de projet
| Statut | Signification |
|---|---|
| En cours | Projet actif en développement |
| Terminé | Projet complété avec succès |
| En pause | Projet temporairement suspendu |
| Archivé | Projet archivé, visible en lecture seule |
✅ Gestion de Tâches
Créer une tâche
- Menu → Tâches → "+ Nouvelle Tâche"
- Remplir : titre, description, assignation, deadline, priorité
- Cliquer sur "Créer"
Vue Kanban
- Glisser-déposer les tâches entre colonnes
- Colonnes :
À Faire→En Cours→Révision→Terminé
👥 Gestion d'Équipes
- Voir les membres de votre équipe et leurs disponibilités
- Rechercher un collègue par nom ou rôle
- Voir l'organigramme des départements
- Contacter directement depuis leur profil
📧 Gestion de Courriers
Courriers Entrants
- Menu → Courriers → Entrants
- Bouton "+ Enregistrer un courrier entrant"
- Remplir l'expéditeur, la date, l'objet et le contenu
- Assigner à un responsable de traitement
Suivi
Chaque courrier a un numéro de référence unique pour le suivi via Courriers → Suivi.
📋 Évaluations
- Démarrer une évaluation : Menu → Évaluations → Nouvelle évaluation
- Entretien : Formulaire structuré, questions par critère
- Révision : Consulter et commenter les résultats
- Approbation : Valider ou demander des corrections
🔔 Notifications
| Type | Déclencheur |
|---|---|
| Tâche assignée | Une tâche vous est assignée |
| Projet mis à jour | Un projet de votre équipe change |
| Courrier reçu | Nouveau courrier assigné à vous |
| Évaluation planifiée | Une évaluation vous concerne |
| Invitation équipe | Ajouté à une nouvelle équipe |
⚙️ Paramètres & Profil
- Profil : Nom, prénom, photo, informations de contact
- Sécurité : Changer le mot de passe, sessions actives
- Préférences : Langue, thème (clair/sombre), notifications
💡 Conseils & Astuces
Ctrl+K pour la recherche rapide, Ctrl+N pour créer un élément dans la section active.❓ FAQ
Je n'arrive pas à me connecter
Vérifiez votre email/mot de passe. Si vous avez oublié votre mot de passe, contactez votre administrateur pour une réinitialisation.
Je ne vois pas certaines fonctionnalités
Votre accès dépend de votre rôle. Certaines pages (administration, paramètres entreprise) sont réservées aux admins et managers.
Comment exporter des données ?
Dans chaque liste (projets, tâches, courriers), un bouton d'export CSV ou PDF est disponible en haut à droite du tableau.
Comment contacter le support ?
- 📧 Utilisateurs :
support@performa.com - 👨💻 Développeurs :
dev@performa.com - 👨💼 Admins :
admin@performa.com