Pricing management
From Openflyers
Contents |
Introduction
Le but de la gestion de la tarification est de permettre une tarification la plus souple possible en fonction de tous les critères utilisables en aéro-club.
Classiquement, voici la configuration que l'on peut rencontrer dans un club :
- il existe plusieurs catégories de membres en fonction de leur CE de rattachement (ou du fait qu'ils n'appartiennent à aucun CE)
- les tarifs peuvent varier en fonction de la catégorie d'appartenance du membre (on peut même imaginer une appartenance à plusieurs catégories pour un même membre)
- les tarifs peuvent varier en fonction du type de vol (solo, double, nav, ifr, etc.)
- les tarifs peuvent varier en fonction du type d'avion
- les tarifs peuvent varier en fonction du nombre d'heures de vol effectuées dans l'année sur le même type d'avion ou tous les avions.
- la ventilation comptable peut varier en fonction des mêmes paramètres (catégorie du membre, type de vol et type d'avion) et pour un seul vol faire intervenir plusieurs comptes au débit et/ou au crédit
Pour solutionner cela et permettre cette flexibilité, il suffit d'utiliser un système matriciel qui prenne en entrée le vecteur (catégorie du membre, type de vol, type d'avion) et qui en sortie donne d'autres vecteurs (compte à créditer, compte à débiter, formule à appliquer sur le temps de vol). Il peut y avoir plusieurs vecteurs en sortie (tableau de vecteurs).
Ce qui est simple à élaborer : la table qui fait la matrice.
Ce qui est plus compliqué : créer la catégorie de membre et gérer un lien "appartenance à une catégorie" et "existance d'un compte lié (si nécessaire).
Implémentation
situation actuelle
A l'heure actuelle il existe une table et une seule qui gère simplement la tarification. C'est la table aircrafttype_price
Cette table est vouée à disparaitre et à être remplacée par ce qui suit.
Tables
flight_hours_pricing
| nom du champ | type | description |
|---|---|---|
| id | INTEGER | clé primaire définissant une "ligne tarifaire" |
| price_formula | TEXT | formule à appliquer sur le temps de vol |
| account_member_type_id | INTEGER | clé externe vers la table account_member_type, type de compte à débiter |
| account_id | INTEGER | clé externe vers la table account, numéro de compte à créditer |
| member_debited | BOOLEAN | set if member is debited or not (=credited), an thus, if account_id is credited or credited |
| order_num | INTEGER | as usual |
La composition de la formule doit respecter les mêmes règles de formatage que celle concernant le calcul du temps de vol. Cependant, elle doit pouvoir accepter d'autres fonctions compliquées comme par exemple une fonction TOTAL_HOURS(aircraft_type_list,flight_type_list,date_start) qui permettrait de connaitre le nombre d'heures de vols effectuées sur une liste de types d'avion pour une liste de type de vols depuis date_start. Si l'une des listes est vide alors tout le monde est concerné.
fhp_member_pool
| nom du champ | type | description |
|---|---|---|
| fhp_id | INTEGER | clé externe vers l'id de flight_hours_pricing |
| member_pool_id | INTEGER | clé externe pointant sur la table member_pool |
Cette table permet d'associer la liste des catégories de membres avec une ligne tarifaire. On peut envisager un "member_pool_id magique" de valeur 0 qui permet de considérer que cela concerne toutes les catégories de membre.
fhp_aircrafttype
| nom du champ | type | description |
|---|---|---|
| fhp_id | INTEGER | clé externe vers l'id de flight_hours_pricing |
| aircrafttype_id | INTEGER | clé externe pointant sur la table aircraft_type |
Cette table permet d'associer la liste des types d'avions avec une ligne tarifaire. On peut envisager un "aircrafttype_id magique" de valeur 0 qui permet de considérer que cela concerne tous les types d'avions. Utile pour la tarification de l'instruction en double commande par exemple.
fhp_flight_type
| nom du champ | type | description |
|---|---|---|
| fhp_id | INTEGER | clé externe vers l'id de flight_hours_pricing |
| flight_type_id | INTEGER | clé externe pointant sur la table flight_type |
Cette table permet d'associer la liste des types de vols avec une ligne tarifaire. On peut envisager un "flighttype_id magique" de valeur 0 qui permet de considérer que cela concerne tous les types de vols. Utile pour éviter de devoir créer une nouvelle tarification pour chaque type de vol.
account_member_type
| nom du champ | type | description |
|---|---|---|
| id | INTEGER | clé primaire |
| name | TEXT | description du type de compte |
Cette table permet de lister les types de comptes qui peuvent être associés à un membre.
Ainsi le champ ACCOUNT_TYPE de la table account_member pointe vers cette table. C'est ainsi qu'on récupère l'intitulé du compte du membre.
Rmq : du coup, on peut se poser la question de l'utilité du champ MAIN dans la table account_member. Moi, je ne lui en vois plus...
member_pool
| nom du champ | type | description |
|---|---|---|
| id | INTEGER | clé primaire |
| name | TEXT | description de la catégorie |
| order_num | INTEGER | group number, unique |
| required_account_type | INTEGER | clé externe vers la table account_member_type, indique le type de compte à créer (peut être 0) |
Cette table permet de lister les différentes catégories de membres
member_pool_join
| nom du champ | type | description |
|---|---|---|
| member_pool_id | INTEGER | clé externe vers la table member_pool |
| member_id | INTEGER | clé externe vers la table member (ou authentication ;-) |
Cette table permet de lister les catégories auxquelles chaque membre appartient
Fonctions
getPricingFormula
En entrée :
- type d'avion
- catégorie de membre
- type de vol
En sortie, une liste comprenant à chaque fois :
- formule de calcul tarifaire à appliquer
- type de compte à débit
- compte à créditer
Exemple
Tarifs d'un club
- le DR400 est à 100 €/h pour tout le monde en solo
- la double commande est à 20 €/h pour tout le monde
- le TB10 est à 140 €/h pour les membres du CE Airbus mais débité sur un compte spécial et à 150 €/h pour les autres
Traduction en base
flight_type
| id | name |
|---|---|
| 1 | vol local |
| 2 | navigation |
| 4 | voltige |
| 8 | instruction |
| 16 | VSV |
| 32 | Vol de nuit |
aircraft_type
| id | name |
|---|---|
| 1 | DR400 |
| 2 | TB10 |
account
| id | name | export_account |
|---|---|---|
| 1 | Recettes DR400 | 706001 |
| 2 | Recettes TB10 | 706002 |
| 3 | Recettes instruction | 710000 |
flight_hours_pricing
| id | price_formula | debit_account_member_type_id | credit_account_id |
|---|---|---|---|
| 1 | 100*%FLIGHT_HOURS | 1 | 1 |
| 2 | 140*%FLIGHT_HOURS | 2 | 2 |
| 3 | 150*%FLIGHT_HOURS | 1 | 2 |
| 4 | 20*%FLIGHT_HOURS | 1 | 3 |
fhp_member_pool
| fhp_id | member_pool_id |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 0 |
fhp_aircrafttype
| fhp_id | aircraft_type_id |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 0 |
fhp_flight_type
| fhp_id | flight_type_id |
|---|---|
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 4 | 8 |
account_member_type
| id | name |
|---|---|
| 1 | compte membre standard |
| 2 | compte membre CE Airbus |
member_pool
| id | name | required_account_type |
|---|---|---|
| 1 | membre standard | 1 |
| 2 | membre CE Airbus | 2 |
member_pool_join
contient les comptes associés à chaque membre
Exemples de formules possible pour flight_hour_pricing
Aide du CE
Le CE verse 50% du prix de l'heure de vol pour les 10 premières heures effectuées sur tous types d'avions TOTAL_HOURS(aircraft_type_list,flight_type_list,date_start)
Dans ce cas, nous sommes obligé de créer une formule par avion. Pour l'un d'entre-eux si le prix de l'heure de vol est de 100 €, la formule est :
= (TOTAL_HOURS(0,0,2006-01-01)<10) ? 50 * %FLIGHT_HOURS : 0
La formule retourne :
- soit la moitie du prix de l'heure de vol (qui sera créditée sur le compte pilote et débitée sur le compte du CE)
- soit 0 (si le membre a déjà fait plus de 10 heures de vol).
On peut affiner la formule, pour le cas où le membre atteint la dixième heure au cours de ce vol là :
= min( (10 - TOTAL_HOURS(0,0,2006-01-01)) > 0 ? (10 - TOTAL_HOURS(0,0,2006-01-01)) : 0, %FLIGHT_HOURS) * 50
Vol de nuit avec taxe de balisage
Si le vol est de nuit, le club peut faire supporter un forfait éclairage de nuit de 50 € par exemple en plus du prix de l'heure de vol. La formule est :
= 100 * %FLIGHT_HOURS + 50
Une autre solution consiste à séparer en deux formules :
- la ou les formules qui calculent le prix de l'heure de vol
- la formule specifique au balisage
Dans ce cas, la formule du balisage est tout simplement :
= 50

