Formules de calcul

Révision de 15 juillet 2016 à 11:23 par Claratte (discuter | contributions) (formatDate('patron', 'date'))

Aller à : navigation, rechercher

Cette page à pour objet de présenter l'ensemble des fonctions et variables utilisables dans des formules de calculs d'OpenFlyers ainsi que les différents types de formules de calculs.

Sommaire

Présentation

Fonctions

abs(X)

Retourne la valeur absolue de X

Exemple :

abs(-200) donne 200
abs(100) donne 100

changeTime('date', 'année', 'mois', 'jour')

Retourne la date en changeant l'année, le mois et/ou le jour

La date doit être au format AAAA-MM-JJ hh:mm:ss ou AAAA-MM-JJ

Les valeurs possibles pour l'année, le mois ou le jour sont :

  • 0 = L'année, le mois ou le jour reste inchangé
  • +X = L'année, le mois ou le jour est augmenté de X
  • -X = L'année, le mois ou le jour est diminué de X
  • X = L'année, le mois ou le jour est placé sur X

Exemple :

changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01

formatDate('patron', 'date')

Formate la date selon le patron. Pour les motifs du patron, voir format de date et d'heure

Exemple :

formatDate('yyyy', '2015-03-01') donne 2015
formatDate('MM', '2015-03-01') donne 03
formatDate('d', '2015-03-01') donne 1
formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours

getSex('person id')

Retourne un nombre correspondant au sexe de la personne :

  • 0 pour un homme
  • 1 pour une femme
  • 2 lorsque ce n'est pas défini

Exemple :

getSex(1)
getSex(%USER_ID)

Exemple pour savoir si un utilisateur est une femme dans une règle de tarification des produits :

(getSex(%USER_ID) == 1) ? $reductionFemme : 0

getValidityExpiredDate('person id', 'validity type id')

  • Retourne la date d'expiration de la validité de la personne si c'est une validité soumise à échéance et que la date d'expiration a été renseigné. La date est au format AAAA-MM-JJ.
  • Retourne "0000-00-00" dans les autres cas

Exemple :

getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31
getValidityExpiredDate(0, 20) donne 0000-00-00

hasValidity('user id', 'validity type id', 'check only holding')

'check only holding' est un paramètre optionnel. On ne prend en compte sa valeur que si elle est à 1. Dans les autres cas, on l'ignore.

  • Si 'check only holding' n'est pas à 1 :
    • Retourne 1 lorsque :
      • Si c'est une validité à formule d'expérience récente :
        • l'utilisateur a l'expérience requise
      • Si ce n'est pas une validité à formule d'expérience récente :
        • Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité
        • Si La validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée
    • Retourne 0 dans les autres cas
  • Si 'check only holding' est à 1 :
    • Retourne 1 lorsque :
      • Si ce n'est pas une validité à formule d'expérience récente :
        • L'utilisateur possède la validité
    • Retourne 0 dans les autres cas (y compris dans le cas d'une validité à formule d'expérience récente et que l'utilisateur possède l'expérience récente)

max(X,Y)

Retourne le maximum entre X et Y

min(X,Y)

Retourne le minimum entre X et Y

roundCeil(X,Y)

Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche

Exemple :

roundCeil(114,100) donne 200
roundCeil(114,10) donne 120

sprintf('pattern', 'string')

Formate la chaîne "string" avec le patron "pattern". Pour les motifs du patron, voir format de sprintf.

Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :

sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple

Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible derrière :

sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple

Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :

sprintf('%6s', %MEMBER_NUM) retourne "    10" si %MEMBER_NUM vaut 10 par exemple

substr(string,a,b)

Retourne l'extrait de chaîne de caractères "string" à partir du caractère "a", 0 étant le 1er caractère et "b" la longueur à extraire. Lorsque b est une valeur négative, alors il détermine le nombre de caractères devant être enlevé depuis la fin de la chaîne.

Exemples :

substr('FIRST_NAME', 0, 5) returns FIRST
substr('FIRST_NAME', 0, -2) returns FIRST_NA

sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')

sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )

Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.

La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.

Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.

Exemple :

sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )

Retourne en Sexacentimal le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.

sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')

sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')

strtolower(string)

Retourne la chaine "string" en minuscule.

Exemple :

strtolower('CamelBack') retourne "camelback"

strtoupper(string)

Retourne la chaine "string" en majuscule.

Exemple :

strtolower('CamelBack') retourne "CAMELBACK"

Variables

%ACCOUNT_TYPE

Type de compte

%AIRFIELD_ARRIVAL

Terrain d'arrivée du vol

%AIRFIELD_DEPARTURE

Terrain de départ du vol

%AUTHENTICATION_LOGIN

Identifiant utilisateur

%AUTO_INCREMENT

Valeur auto-incrémentale

%BOOKING_START_DATE

Date de début d'une réservation.

%COUNTER_ARRIVAL

Compteur arrivé saisi dans le formulaire.

%COUNTER_DEPARTURE

Compteur départ saisi dans le formulaire

%DURATION

Durée du vol

%FIRSTNAME

Prénom de l'utilisateur

%LASTNAME

Nom de l'utilisateur

%MEMBER_NUM

Numéro de membre

%NOW_DATE

Date courante au format AAAA-MM-JJ hh:mm:ss

Par exemple : 2015-03-31 14:20:03

%RESOURCE_NAME

Nom de la ressource

%TIME_ARRIVAL

Heure de fin saisie dans le formulaire

%TIME_DEPARTURE

Heure de début saisie dans le formulaire

%START_DATE

Date de début du vol ou date d'achat de produit au format AAAA-MM-JJ hh:mm:ss

Par exemple : 2015-03-31 14:20:03

%USER_ID

Id de l'utilisateur

Compte d'export

Fonctions autorisées pour le calcul du compte d'export

Variables autorisées pour le calcul du compte d'export

Exemples de formules pour le calcul du compte d'export

Formule de calcul Usage Exemples de génération
411+%ACCOUNT_TYPE Comptes ressources et utilisateurs 4110002, 4110005
411+%AUTHENTICATION_LOGIN Comptes utilisateurs 411pdupont c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs
411+%AUTO_INCREMENT Comptes ressources et utilisateurs 41100001, 41100002, ...., 4110000x
411+%LASTNAME Comptes utilisateurs 411dupont, 411dupond
411+%LASTNAME+substr(%FIRSTNAME,0,1) Comptes utilisateurs 411dupontp, 411dupontf
411+%MEMBER_NUM Comptes utilisateurs 411XXXXX, l'intitulé XXXXXX est le champ Numéro de membre qui est inscrit sur la fiche personnelle de vos adhérents. Exemple : 411001. A vous de vérifier l'unicité de cette valeurs
411+sprintf('%03s', %USER_ID) Comptes utilisateurs 411001, 411002, etc.
411+substr(%AUTHENTICATION_LOGIN,0,3) Comptes utilisateurs 411pdu 411 suivi de l'identifiant limité à 3 caractères. Cela permet d'être compatible avec les logiciels de comptabilités paramétrés pour n'accepter que 6 caractères. Dans ce cas, il est nécessaire de modifier les comptes d'exports en doublon.
7061+sprintf('%02s', %RESOURCE_ID) Comptes ressources 706101, 706102, etc. c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes ressources

Date d'expiration

Fonctions autorisées pour le calcul de la date d'expiration

Variables autorisées pour le calcul de la date d'expiration

Exemples de formules de calcul de la date d'expiration

Date fixe

2012-12-31

Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue

Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.

Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :

formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )

Fin de l'année courante

formatDate( 'yyyy-12-31', %NOW_DATE )

Fin de l'année courante ou la fin de l'année suivante si la date courante est strictement supérieure au 30 septembre

Cette formule permet de vendre une validité (par exemple cotisation) dont la prise est valable jusqu'au 31 décembre de l'année en cours ou de l'année suivante si elle est souscrite à partir du 1er octobre.

formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)<10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )

Expérience récente

Fonctions autorisées pour le calcul de l'expérience récente

Variables autorisées pour le calcul de l'expérience récente

Exemples de formules de calcul de l'expérience récente

Expérience récente en heures ou la détention d'une validité spécifique

L'exemple suivant vérifie qu'un utilisateur a une expérience de 30 heures dans les 12 derniers mois ou qu'il possède une validité X lui permettant de s'affranchir du quota d'heures.

Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :

( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) > 17999) OR hasValidity(%PILOT, XX) )

Type d'activité X dans les 12 derniers mois

L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.

Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :

sumFlightTime(%PILOT, formatDate('yyyy', changeTime( %NOW_DATE, '-1', '0', '0' )), formatDate('M', changeTime( %NOW_DATE, '-1', '0', '0' )), formatDate('d', changeTime( %NOW_DATE, '-1', '0', '0' )), 00, 00, 0, XX ) > 0

Tarification

Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions : A rédiger

Voir Formules en anglais

Fonctions autorisées pour le calcul de la tarification

Variables autorisées pour le calcul de la tarification

Exemples de formules pour le calcul de la tarification

Motoplaneur : tarification à l'heure de vol ET à l'utilisation du moteur

Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :

%DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE

Avion : réduction lorsque le compte pilote a un solde positif

$C2 concerne le tarif horaire de l'avion
$S le solde positif qui doit être atteint pour bénéficier de la réduction
$R le montant horaire de la réduction obtenue dans ce cas

roundCeil((((getBalance(%PILOT)>$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)

Avion : réduction lorsque le vol se fait après une certaine heure

$C2 concerne le tarif horaire de l'avion
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure
659 correspond à 06:59 en temps UTC
Dans ce cas la formule considère que dès 700, la réduction s'applique.

roundCeil(((((formatDate('hmm',%START_DATE)>659)?$C2R:$C2)*%DURATION/600)-0.5),1)

Temps d'activité

Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.

OpenFlyers permet d'attribuer des formules de calcul de temps d'activité par type de ressource. Cf. la gestion des types de ressources.

Définition Unité sexacentimal

En base de données, les temps et les compteurs sont stockés selon le plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format sexacentimal.

Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.

  • 1 heure = 600 sexacentièmes
  • 1 minute = 10 sexacentièmes
  • 5 minutes = 50 sexacentièmes
  • 1 centième de minute = 6 sexacentièmes
  • 10 centième de minute (=1 dixième de minute) = 60 sexacentièmes

Exemples de formules :

  • pour arrondir à 5 minutes : roundCeil(X,50)
  • pour arrondir à 10 centièmes : roundCeil(X,60)

Fonctions autorisées pour le calcul du temps d'activité

Variables autorisées pour le calcul du temps d'activité

Exemples de formules de calcul du temps d'activité

Durée saisie

%DURATION

Différence des compteurs saisis

%COUNTER_ARRIVAL - %COUNTER_DEPARTURE

Durée saisie arrondie à 5 minutes

roundCeil(%DURATION, 50)

Différence des compteurs plus 5 centièmes

%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30

Différence des compteurs plus 5 minutes

%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50

Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ

Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :

%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )

Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes

roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50

Différence des compteurs arrondie à 10 centièmes

roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)

Le plus grand entre la durée du vol et la différence des compteurs

max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)

Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes

max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))

Cette formule calcule :

  • la différence des compteurs et l'arrondi à 5 minutes
  • la valeur de la durée de vol saisie par le pilote

Puis elle prend le plus grand des deux

Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes

max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))

Cette formule calcule :

  • la différence des compteurs et l'arrondi à 5 minutes
  • la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes

Puis elle prend le plus grand des deux