Aller au contenu principal

Feature Support - Contact & Tickets

Vue d'ensemble

Le feature Support permet aux utilisateurs de contacter le support technique directement depuis l'application mobile. Les utilisateurs peuvent signaler des bugs, demander de l'aide, suggérer des fonctionnalités ou poser des questions techniques.

Fonctionnalités

Pour les utilisateurs (Mobile App)

  1. Formulaire de contact structuré

    • Sélection de catégorie (Bug, Feature, Question, Technique, Autre)
    • Champ sujet (obligatoire, min 5 caractères)
    • Message détaillé (obligatoire, min 20 caractères)
    • Capture automatique des informations système
  2. Catégories disponibles

    • 🐛 Bug : Signaler un dysfonctionnement
    • Feature : Suggérer une nouvelle fonctionnalité
    • Question : Poser une question ou demander de l'aide
    • ⚙️ Technique : Problème de configuration
    • 💬 Autre : Autres demandes
  3. Informations système automatiques

    • Version de l'application
    • Numéro de build
    • Plateforme (iOS/Android)
    • Version du système d'exploitation
  4. Confirmation visuelle

    • Dialog de succès après l'envoi
    • Message de confirmation

Pour les administrateurs (Admin Dashboard)

Les tickets sont stockés dans Supabase et peuvent être gérés via votre dashboard admin.

Fonctionnalités recommandées pour l'admin:

  • Liste de tous les tickets avec filtres (statut, catégorie, date)
  • Vue détaillée d'un ticket
  • Réponse aux tickets
  • Changement de statut (Pending → In Progress → Resolved → Closed)
  • Statistiques (temps de réponse moyen, tickets par catégorie, etc.)

Architecture

Structure des dossiers

lib/features/support/
├── domain/
│ ├── entities/
│ │ └── support_ticket.dart # Entité SupportTicket + enums
│ └── repositories/
│ └── support_repository.dart # Interface du repository
├── data/
│ └── repositories/
│ └── support_repository_impl.dart # Implémentation Supabase
├── presentation/
│ └── pages/
│ └── contact_support_page.dart # Page de contact
├── SUPPORT_DATABASE.md # Documentation de la base de données
└── README.md # Ce fichier

Entités principales

SupportTicket

class SupportTicket {
final String id;
final String userId;
final String userEmail;
final SupportTicketCategory category;
final String subject;
final String message;
final SupportTicketStatus status;
final Map<String, dynamic> systemInfo;
final DateTime createdAt;
final DateTime? updatedAt;
final String? adminResponse;
final DateTime? respondedAt;
}

SupportTicketCategory (Enum)

  • bug, feature, question, technical, other

SupportTicketStatus (Enum)

  • pending, in_progress, resolved, closed

Utilisation

La page est accessible depuis Paramètres → Support → Contacter le support.

Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const ContactSupportPage(),
),
);

Créer un ticket programmatiquement

final repository = SupportRepositoryImpl(SupabaseConfig.client);

final ticket = SupportTicket(
id: const Uuid().v4(),
userId: currentUser.id,
userEmail: currentUser.email,
category: SupportTicketCategory.bug,
subject: 'Problème de synchronisation',
message: 'Les données ne se synchronisent pas...',
status: SupportTicketStatus.pending,
systemInfo: {
'app_version': '1.0.0',
'platform': 'android',
},
createdAt: DateTime.now(),
);

await repository.createTicket(ticket);

Récupérer les tickets d'un utilisateur

final tickets = await repository.getUserTickets();

Base de données

Table Supabase: support_tickets

Voir le fichier SUPPORT_DATABASE.md pour la documentation complète de la structure de la table, les requêtes SQL, et la configuration des RLS (Row Level Security).

Commandes rapides:

-- Créer la table
CREATE TABLE support_tickets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
user_email TEXT NOT NULL,
category TEXT NOT NULL,
subject TEXT NOT NULL,
message TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
system_info JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ,
admin_response TEXT,
responded_at TIMESTAMPTZ,
is_read_by_user BOOLEAN NOT NULL DEFAULT false,
is_read_by_admin BOOLEAN NOT NULL DEFAULT false
);

-- Activer RLS
ALTER TABLE support_tickets ENABLE ROW LEVEL SECURITY;

Prochaines améliorations possibles

Phase 1 (Mobile)

  • ✅ Formulaire de contact
  • ✅ Catégorisation des tickets
  • ✅ Capture des infos système
  • ⬜ Historique des tickets dans l'app
  • ⬜ Notifications push quand l'admin répond
  • ⬜ Badge "nouveau" sur l'icône support

Phase 2 (Admin Dashboard)

  • ⬜ Liste des tickets avec filtres
  • ⬜ Vue détaillée d'un ticket
  • ⬜ Réponse aux tickets
  • ⬜ Changement de statut
  • ⬜ Statistiques et métriques

Phase 3 (Avancé)

  • ⬜ Chat en temps réel (Supabase Realtime)
  • ⬜ Pièces jointes (screenshots)
  • ⬜ Templates de réponses pour l'admin
  • ⬜ Satisfaction client (rating après résolution)
  • ⬜ FAQ automatique basée sur les tickets fréquents

Configuration requise

Dépendances

  • supabase_flutter: Client Supabase
  • uuid: Génération d'IDs uniques
  • package_info_plus: Récupération des infos de l'app

Permissions

Aucune permission spéciale n'est requise sur le device.

Variables d'environnement

Aucune variable spécifique. Le client Supabase doit être configuré dans core/config/supabase_config.dart.

Tests

Tests manuels

  1. Ouvrir Paramètres → Support → Contacter le support
  2. Sélectionner une catégorie
  3. Remplir le sujet (min 5 caractères)
  4. Remplir le message (min 20 caractères)
  5. Envoyer
  6. Vérifier le message de confirmation
  7. Vérifier dans Supabase que le ticket a été créé

Tests à implémenter

  • Unit tests pour SupportTicket entity
  • Unit tests pour SupportRepository
  • Widget tests pour ContactSupportPage
  • Integration tests pour le flow complet

Troubleshooting

Le ticket ne s'envoie pas

  1. Vérifier la connexion Supabase
  2. Vérifier que la table support_tickets existe
  3. Vérifier les RLS policies (Row Level Security)
  4. Vérifier que l'utilisateur est bien connecté

Les informations système ne sont pas capturées

  1. Vérifier que package_info_plus est bien installé
  2. Sur iOS, vérifier les permissions dans Info.plist
  3. Vérifier les logs d'erreur dans _getSystemInfo()

L'utilisateur ne reçoit pas d'email de confirmation

Par défaut, aucun email n'est envoyé. Pour implémenter les emails:

  1. Créer une Edge Function Supabase
  2. Ajouter un trigger PostgreSQL
  3. Ou utiliser un service tiers (SendGrid, Mailgun, etc.)

Support et contribution

Pour toute question sur ce feature:

  • Voir la documentation Supabase: https://supabase.com/docs
  • Voir le code source dans lib/features/support/
  • Contacter l'équipe de développement

Licence

Ce feature fait partie de l'application KazaCalendar Mobile.