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 relationFiliereVente <-> CatalogueFilierecar le nom dansFiliereVenteé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_filiereset retirer définitivement lesfiliere_ventesdiscarded et associé à un club - Retirer la relation
FiliereVente<->Club(club_id) - Retirer la colonne
statut_billetteriedansClub| Remplacé parFiliereVente#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)).idsdashboard_#{saison.id}_reservoir_ids=> Reservoir.where(filiere_ventes: FiliereVente.dashboard.active.where(saison: saison.id)).idsEt 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"