Aller au contenu

Gestion de la disponibilité

La gestion de la disponibilité est décomposé en deux parties:

  • Gestion des réservoirs qui permet de gérer la disponibilités sur le Stade
  • Gestion de la disponibilité des modèles article qui permet de gérer la disponiblités dans la Billetterie.

Structure commune

MCD

classDiagram
    class Club {
        +string nom
    }

    class Saison {
        +string nom
        +datetime date_debut
        +datetime date_fin
    }
    Club "1" <-- "0..n" Saison

    class FiliereVente {
        +integer scope_name
        +bool active
    }
    Saison "1" <-- "0..n" FiliereVente

Fonctionnement

Pour chaque nouvelle saison, on ajoute les filière de ventes, ce sont des canaux de configuration qui regroupe les configurations de la disponibilité des places du Stade et des Articles. Chaque Filière de vente peut-être nommés n'importe comment, le seul champ obligatoire est le champ scope_name.

Il remplace l'ancien fonctionnement de la filière de vente. Avant, lors de la création d'un club, on devait rajouter les même filières de vente avec des noms très précis ("MiniSite", "Dashboard", "Guichet") car il necessite un backend précis pour chaque nom.

Pour éviter tout ça, on a remplacé la filière de vente par un enum scope_name qui permet de s'assurer que le backend fonctionne et on a remplacé le catalogue filiere par la filiere de vente pour simplifier la lecture du code.

Détail du model FiliereVente

  • scope_name : Enum qui permet de définir le type de filière de vente. Remplace la relation FiliereVente <-> CatalogueFiliere car le nom dans FiliereVente était sensible à la casse car on devait saisir un nom bien précis.
  • everyone
  • dashboard
  • guichet (Pas prévu tout de suite mais sera possible)
  • active : Permet de choisir si la FiliereVente est accessible pour tout le monde ou uniquement aux gestionnaires disposant des permissions nécessaires.

Changement à effectuer après le déploiement

  • Retirer la relation Reservoir <-> ConfigurationLogique (configuration_logique_id)
  • Retirer la relation Reservoir <-> CategoriePublic (categorie_public_id)
  • Retirer la relation FiliereVente <-> CategoriePublic (categorie_public_id)
  • Retirer la relation ModeleArticle <-> CatalogueFiliere (catalogue_filiere_id)
  • Retirer la table catalogue_filieres et retirer définitivement les filiere_ventes discarded et associé à un club
  • Retirer la relation FiliereVente <-> Club (club_id)
  • Retirer la colonne statut_billetterie dans Club | Remplacé par FiliereVente#statut_billetterie
  • Retirer la relation PlaceVente <-> ConfigurationVente (configuration_vente_id)

Permissions

Avec le système de permission, on pourrait filtrer les filières de vente disponibles cotés dashboard par rapport aux permissions d'un gestionnaire. On pourrait réserver le premier octet et utiliser un bit par scope_name.

  • bit 1 -> everyone
  • bit 2 -> dashboard
  • bit 3 -> guichet
  • bit 4 -> ?? (Réservé pour le future)
  • bit 5 -> ?? (Réservé pour le future)
  • bit 6 -> ?? (Réservé pour le future)
  • bit 7 -> ?? (Réservé pour le future)
  • bit 8 -> ?? (Réservé pour le future)

Voir Gestion des permissions d'un gestionnaire

Gestion de la disponibilité du Stade

MCD

classDiagram
    class FiliereVente {
        +integer scope_name
        +bool active
    }

    class Reservoir {
        +string nom
    }
    FiliereVente "0..n" <--> "0..n" Reservoir

    class CategoriePublic {
        +string nom
    }
    Reservoir "0..n" <--> "0..n" CategoriePublic

    class ModeleArticle {
        +string nom
    }
    Reservoir "0..n" <--> "0..n" ModeleArticle

Fonctionnement

Pour chaque filière de vente créées pour la saison, il faut créer les réservoirs associés. Les réservoirs permet de rendre disponibles des places pour 1 ou plusieurs filières de vente. Chaque réservoir est associés à un ensemble de catégorie de public, ça permet de filtrer les tarifs associés à un produit au moment de la commande. Les modèles articles sont associés aussi aux réservoirs pour les reliées aux places ventes.

Exemple

Dans cet exemple, les choix des noms sont choisi exprès pour que ça ne correspondent pas du tout à nos habitudes. Le but, voir si notre structure peux permettre à un Club de choisir complétement son vocabulaire.

On a les catégories de publique pour le club courant ci-dessous:

  • nom: "Personne lambda"
  • nom: "VIP"
  • nom: "Famille" (Famille du club)

On a les contacts ci-dessous:

  • nom: "Jean", catégories: "Personne lambda"
  • nom: "Bob", catégories: "Personne lambda", "VIP"
  • nom: "Alice", catégories: "Personne lambda", "Famille"

On a les filières de ventes ci-dessous:

  • nom: "Publique", scope: everyone
  • nom: "Collaborateurs", scope: dashboard

On a les réservoirs ci-dessous:

  • nom: "Commande Publique", filiere_ventes: "Publique", categorie_publics: "Personne lambda"
  • nom: "Commande VIP Collaborateurs", filiere_ventes: "Collaborateurs", categorie_publics: "VIP"
  • nom: "Commande Famille Collaborateurs", filiere_ventes: "Collaborateurs", categorie_publics: "Famille"

On a les produits ci-dessous:

  • nom: "Abonnement Saison", reservoirs: ["Commande Publique", "Commande VIP Collaborateurs", "Commande Famille Collaborateurs"] | On veut que le produit puisse être commandé par tout le monde
  • nom: "Abonnement VIP", reservoirs: "Commande VIP Collaborateurs"
  • nom: "Abonnement Famille", reservoirs: "Commande Famille Collaborateurs"
  • nom: "Abonnement publique uniquement", reservoirs: "Commande Publique"

Pour récuperer l'ensemble des produits disponible sur la billetterie (Publique).

On commence par récupérer l'ensemble des filières de vente disponible filiere_ventes = Current.saison.filiere_ventes.everyone.active. Donc dans notre cas, on aura que ["Publique"].

A voir si on stocke pas le résultat dans un cache. Car ça bougera uniquement si l'Administrateur change les réservoirs pour cette filiere de vente. Exemples:

  • everyone_#{saison.id}_reservoir_ids => Reservoir.where(filiere_ventes: FiliereVente.everyone.active.where(saison: saison.id)).ids
  • dashboard_#{saison.id}_reservoir_ids => Reservoir.where(filiere_ventes: FiliereVente.dashboard.active.where(saison: saison.id)).ids

Et dès que l'on modifie un réservoir d'un scope_name, on recalcule le cache.

Ensuite on récupère les réservoirs avec Réservoir.where(filiere_ventes:). Dans notre cas, on aura ["Commande Publique"].

Dans le cas ou "Jean" est connectée, on a la liste des catégories de publique ["Personne lambda"].

On filtre les réservoirs avec la liste des catégories de public Reservoir.where(categorie_publics:) donc on obtient ["Commande Publique"].

Ensuite on filtre ensuite les produits par réservoirs ModeleArticle.where(reservoirs:), on doit obtenir ["Abonnement Saison", "Abonnement publique uniquement"].

Gestion de la disponibilité sur la Billetterie

MCD

classDiagram
    class FiliereVente {
        +integer scope_name
        +bool active
    }

    class ModeleArticle {
        +string nom
    }

    class ArticleDisponibilite {
        +integer statut_billetterie
    }


    ArticleDisponibilite "0..n" --> "1" FiliereVente
    ArticleDisponibilite "0..n" --> "1" ModeleArticle

Fonctionnement

Si on a une relation entre la filière de vente et le modèle article. On part du principe que l'on doit l'afficher sur la Billetterie sinon on ne l'affiche pas quelque soit sa catégorie. Le champ statut_billetterie permet d'autoriser où non l'achat des billets pour ce modèle article.

Exemple

Dans cet exemple, les choix des noms sont choisi exprès pour que ça ne correspondent pas du tout à nos habitudes. Le but, voir si notre structure peux permettre à un Club de choisir complétement son vocabulaire.

On a les filières de ventes ci-dessous:

  • nom: "Publique", scope: everyone
  • nom: "Collaborateurs", scope: dashboard

On a les produits ci-dessous:

  • nom: Pack 4 matchs, type: :abonnement
  • nom: Limoges VS Paris, type: :match

Cas pour un abonnement

On souhaite rendre disponible le modèle article "Pack 4 matchs" pour la filière de vente "Collaborateurs" dans un premier temps. Il faut qu'il puisse acheter les billets égalements.

On rajoute un ArticleDisponibilite avec les valeurs suivantes:

  • statut_billetterie: ouverte (Dans le cas d'un abonnement, il est tout simplement ignoré)
  • filiere_vente: "Collaborateurs"
  • modele_article: "Pack 4 matchs"

Une fois l'ensemble des commandes faites par les collaborateurs, on peut rendre disponible le modèle article pour tout le monde.

On rajoute un ArticleDisponibilite avec les valeurs suivantes:

  • statut_billetterie: ouverte (Dans le cas d'un abonnement, il est tout simplement ignoré)
  • filiere_vente: "Publique"
  • modele_article: "Pack 4 matchs"

Cas pour un match_simple

On souhaite rendre disponible le modèle article "Limoges VS Paris" pour la filière de vente "Collaborateurs" dans un premier temps. Il faut qu'il puisse acheter les billets égalements.

On rajoute un ArticleDisponibilite avec les valeurs suivantes:

  • statut_billetterie: ouverte (Pour permettre au personne d'acheter le billet)
  • filiere_vente: "Collaborateurs"
  • modele_article: "Limoges VS Paris"

Une fois l'ensemble des commandes faites par les collaborateurs, on peut rendre disponible le modèle article pour tout le monde.

On rajoute un ArticleDisponibilite avec les valeurs suivantes:

  • statut_billetterie: ouverte (Pour permettre au personne d'acheter le billet)
  • filiere_vente: "Publique"
  • modele_article: "Limoges VS Paris"