Pricing management

Jump to: navigation, search

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