Aller au contenu

Règles métier — Clubs & Terrains

Ce document décrit les règles métier du domaine Clubs. Ces règles définissent le comportement du système de gestion des clubs et de leurs terrains (pistes) de padel.


Inscription et revendication de club

RB-CLUB-001 — Création d'un club

  • Tout utilisateur authentifié peut créer un club en renseignant au minimum : nom, adresse et ville.
  • Le club est créé avec le statut pending (en attente de validation par un administrateur).
  • L'utilisateur devient automatiquement propriétaire (owner_id) du club.
  • Si l'utilisateur avait le rôle player, il est promu au rôle club_manager.

RB-CLUB-002 — Revendication d'un club existant

  • Un utilisateur peut revendiquer un club existant qui n'a pas de propriétaire (owner_id IS NULL).
  • La revendication passe le club en statut pending pour validation.
  • L'utilisateur est promu club_manager (mêmes règles que la création).
  • Un club déjà revendiqué (avec owner_id) ne peut pas être revendiqué par un autre utilisateur (erreur 409).

RB-CLUB-003 — Statuts de club

Statut Description
pending En attente de validation par un administrateur
validated Club validé et visible publiquement
suspended Club suspendu par un administrateur

RB-CLUB-004 — Notifications d'inscription

  • Lorsqu'un club est créé ou revendiqué, tous les administrateurs reçoivent une notification de type club_registration_received.
  • Après validation ou refus par l'administrateur, le gestionnaire reçoit une notification (club_validated ou club_rejected).

Consultation des clubs

RB-CLUB-010 — Liste publique

  • Seuls les clubs avec le statut validated sont affichés dans la liste publique.
  • La recherche filtre sur le nom et la ville du club (recherche insensible à la casse).

RB-CLUB-011 — Fiche club (détail)

  • La page de détail d'un club affiche :
    • Informations générales (nom, adresse, ville, horaires d'ouverture)
    • Coordonnées de contact (téléphone, email, site web)
    • Description
    • Liste des terrains actifs
    • (À venir) Parties à venir dans ce club
  • La fiche est accessible publiquement sans authentification.

RB-CLUB-012 — Clubs favoris

  • Un joueur authentifié peut ajouter/retirer un club de ses favoris depuis la fiche club.
  • Les clubs favoris sont utilisés pour recommander des parties.

Gestion des terrains (pistes)

RB-TERRAIN-001 — Types de terrains

Les terrains de padel sont classés en trois types :

Type Libellé Description
indoor Intérieur Piste couverte (salle fermée)
semi_covered Semi-couvert Piste partiellement couverte (toit, pas de murs)
outdoor Extérieur Piste en plein air

RB-TERRAIN-002 — Création de terrain

  • Seul le propriétaire du club peut ajouter un terrain.
  • Champs obligatoires : nom (1–100 caractères), type (indoor/semi_covered/outdoor).
  • Champs optionnels : description (max 1000 caractères), prix par heure (0–9999.99 €), statut actif/inactif.
  • Un terrain est actif par défaut à la création.

RB-TERRAIN-003 — Modification de terrain

  • Seul le propriétaire du club peut modifier les informations d'un terrain.
  • Un terrain peut être désactivé (masqué de la vue publique) sans être supprimé.

RB-TERRAIN-004 — Suppression de terrain

  • Seul le propriétaire du club peut supprimer un terrain.
  • La suppression est définitive.

RB-TERRAIN-005 — Visibilité

  • Les joueurs voient uniquement les terrains actifs d'un club (vue publique).
  • Le gestionnaire voit tous ses terrains (actifs et inactifs) dans l'interface de gestion.

Mes clubs (espace gestionnaire)

RB-CLUB-020 — Liste des clubs du gestionnaire

  • Un gestionnaire peut consulter la liste de ses propres clubs (owner_id = user.id).
  • Cette liste inclut les clubs de tous statuts (pending, validated, suspended).

RB-CLUB-021 — Logo de club

  • Le propriétaire peut uploader un logo pour son club (formats : JPG, PNG, max 2 Mo).
  • L'ancien logo est supprimé du stockage lors du remplacement.

Gestion des créneaux horaires

RB-CRENEAU-001 — Définition d'un créneau

  • Un créneau représente un plage horaire récurrente associée à un club, optionnellement à un terrain spécifique.
  • Champs obligatoires : day_of_week (0=Lundi … 6=Dimanche), start_time (format HH:MM), end_time (HH:MM), duration_minutes.
  • terrain_id est optionnel (null = valable pour tous les terrains du club).
  • is_available (booléen, défaut : true) indique si le créneau est proposable à la réservation.

RB-CRENEAU-002 — Gestion des créneaux

  • Seul le propriétaire du club peut créer, modifier ou supprimer des créneaux.
  • La consultation des créneaux d'un club est publique (pas d'authentification requise).
  • L'heure de fin doit être postérieure à l'heure de début.

RB-CRENEAU-003 — Marquage disponible/indisponible

  • Le gestionnaire peut basculer is_available sur un créneau sans le supprimer.
  • Un créneau indisponible n'est pas proposé aux joueurs pour la réservation.

Gestion des réservations

RB-RESERVATION-001 — Création d'une réservation

  • Tout utilisateur authentifié peut créer une réservation sur un club validé.
  • Champs obligatoires : terrain_id, reserved_at (datetime ISO 8601), duration_minutes.
  • Le statut initial est toujours pending.
  • Détection de conflit : si une réservation avec statut pending ou accepted existe déjà pour le même terrain et créneau, la création est refusée (erreur 409).

RB-RESERVATION-002 — Statuts de réservation

Statut Description
pending En attente de traitement par le gestionnaire
accepted Réservation acceptée par le gestionnaire
rejected Réservation refusée par le gestionnaire
cancelled Réservation annulée (par le joueur ou le gestionnaire)

RB-RESERVATION-003 — Traitement par le gestionnaire

  • Seul le propriétaire du club peut accepter ou refuser une réservation.
  • L'acceptation passe le statut à accepted, le refus à rejected.
  • Le motif de refus (reason) est obligatoire lors du refus.
  • Le joueur reçoit une notification à chaque changement de statut (reservation_accepted, reservation_rejected).

RB-RESERVATION-004 — Annulation

  • Le joueur ne peut annuler que ses propres réservations avec le statut pending.
  • Le gestionnaire peut annuler n'importe quelle réservation de son club (statut pending ou accepted).
  • Tout autre utilisateur se voit retourner une erreur 403.

RB-RESERVATION-005 — Historique

  • Chaque utilisateur peut consulter la liste de ses propres réservations (GET /api/v1/reservations/my), avec filtrage optionnel par statut.
  • Le gestionnaire peut consulter la liste de toutes les réservations de son club (GET /api/v1/clubs/{club}/reservations), avec filtrage optionnel par statut.