Formules de calcul : Différence entre versions
(→Le plus grand entre la différence des heures et la différence des compteurs) |
(→roundCeil(X,Y)) |
||
(201 révisions intermédiaires par 5 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | + | 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. | |
− | + | __TOC__ | |
− | + | =Présentation= | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Fonctions== | ==Fonctions== | ||
− | === | + | |
− | + | ===abs(X)=== | |
− | + | Retourne la valeur absolue de X | |
+ | |||
Exemple : | Exemple : | ||
− | + | <pre>abs(-200) donne 200</pre> | |
+ | <pre>abs(100) donne 100</pre> | ||
− | + | ===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 : | ||
+ | <pre>changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15</pre> | ||
+ | <pre>changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide</pre> | ||
+ | <pre>changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15</pre> | ||
+ | <pre>changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15</pre> | ||
+ | <pre>changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15</pre> | ||
+ | <pre>changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14</pre> | ||
+ | <pre>changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01</pre> | ||
+ | |||
+ | ===formatDate('patron', 'date')=== | ||
+ | |||
+ | Formate la date selon le patron. Pour les motifs du patron, voir le [[#Formatage-des-dates-et-des-heures|formatage des dates et des heures]]. | ||
+ | |||
+ | Exemple : | ||
+ | <pre>formatDate('yyyy', '2015-03-01') donne 2015</pre> | ||
+ | <pre>formatDate('MM', '2015-03-01') donne 03</pre> | ||
+ | <pre>formatDate('d', '2015-03-01') donne 1</pre> | ||
+ | <pre>formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours</pre> | ||
+ | |||
+ | ===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 : | ||
+ | <pre>getSex(1) | ||
+ | getSex(%USER_ID)</pre> | ||
+ | |||
+ | Exemple pour savoir si un utilisateur est une femme dans une règle de tarification des produits : | ||
+ | <pre>(getSex(%USER_ID) == 1) ? $reductionFemme : 0</pre> | ||
+ | |||
+ | ===getSumAccountBusinessField('business field id, 'person id', 'date')=== | ||
+ | Retourne la somme des valeurs d'un [[Champs additionnels|champ additionnel]] de catégorie "Ecriture comptable". Seules les valeurs du champ métier associées à des écritures comptable correspondantes à la personne et dont la date est postérieure ou égale à la date indiquée en paramètre sont prises en compte dans le calcul. La date est au format AAAA-MM-JJ. | ||
+ | |||
+ | Exemple : | ||
+ | <pre>getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200</pre> | ||
+ | |||
+ | ===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 : | ||
+ | <pre>getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31</pre> | ||
+ | <pre>getValidityExpiredDate(0, 20) donne 0000-00-00</pre> | ||
+ | |||
+ | ===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 | ||
Exemples : | Exemples : | ||
− | + | <pre>roundCeil(114,100) donne 200</pre> | |
− | + | <pre>roundCeil(114,10) donne 120</pre> | |
− | + | <pre>roundCeil(106,5) return 110</pre> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 : | |
− | + | <pre>roundCeil(107.5-0.5,1) return 107</pre> | |
− | + | ||
− | + | ||
− | + | Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 : | |
− | + | <pre>roundCeil(107.5-0.499,1) return 108</pre> | |
− | ==Le plus grand entre la différence des | + | ===sprintf('pattern', 'string')=== |
− | + | ||
+ | Formate la chaîne "string" avec le patron "pattern". Pour les motifs du patron, voir [[OF_doc-en::CommonFormula#sprintf_format|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 : | ||
+ | <php>sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple</php> | ||
+ | |||
+ | 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 : | ||
+ | <php>sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple</php> | ||
+ | |||
+ | Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant : | ||
+ | <php>sprintf('%6s', %MEMBER_NUM) retourne " 10" si %MEMBER_NUM vaut 10 par exemple</php> | ||
+ | |||
+ | ===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 : | ||
+ | <pre>substr('FIRST_NAME', 0, 5) returns FIRST | ||
+ | substr('FIRST_NAME', 0, -2) returns FIRST_NA</pre> | ||
+ | |||
+ | ===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 : | ||
+ | <pre>sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )</pre> | ||
+ | Retourne en [[#Définition_Unité_sexacentimal|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 : | ||
+ | <pre>strtolower('CamelBack') retourne "camelback"</pre> | ||
+ | |||
+ | ===strtoupper(string)=== | ||
+ | Retourne la chaine "string" en majuscule. | ||
+ | |||
+ | Exemple : | ||
+ | <pre>strtolower('CamelBack') retourne "CAMELBACK"</pre> | ||
+ | |||
+ | ==Formatage des dates et des heures== | ||
+ | To specify the format use a pattern string. In this pattern, all ASCII letters are reserved as pattern letters, which are defined as the following: | ||
+ | |||
+ | The count of pattern letters determine the format. | ||
+ | |||
+ | (Text): 4 or more pattern letters--use full form, < 4--use short or abbreviated form if one exists. | ||
+ | |||
+ | (Number): the minimum number of digits. Shorter numbers are zero-padded to this amount. Year is handled specially; that is, if the count of 'y' is 2, the Year will be truncated to 2 digits. | ||
+ | |||
+ | (Text & Number): 3 or over, use text, otherwise use number. | ||
+ | |||
+ | Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not embraced within single quotes. | ||
+ | |||
+ | A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing. | ||
+ | |||
+ | Syntax available: | ||
+ | {| {{prettytable}} | ||
+ | !Symbol!!Meaning!!Presentation!!Example | ||
+ | |- | ||
+ | |G||era designator||Text||AD | ||
+ | |- | ||
+ | |y||year||Number||1996 | ||
+ | |- | ||
+ | |M||month in year||"MMM": Text<br />"MM" or "M" : Number||July<br />07 or 7 | ||
+ | |- | ||
+ | |d||day in month||Number||10 | ||
+ | |- | ||
+ | |h||hour in am/pm (1~12)||Number||12 | ||
+ | |- | ||
+ | |H||hour in day (0~23)||Number||0 | ||
+ | |- | ||
+ | |m||minute in hour||Number||30 | ||
+ | |- | ||
+ | |s||second in minute||Number||55 | ||
+ | |- | ||
+ | |S||millisecond||Number||978 | ||
+ | |- | ||
+ | |E||day in week||Text||Tuesday | ||
+ | |- | ||
+ | |e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday) | ||
+ | |- | ||
+ | |D||day in year||Number||189 | ||
+ | |- | ||
+ | |F||day of week in month||Number||2 (2nd Wed in July) | ||
+ | |- | ||
+ | |w||week in year||Number||27 | ||
+ | |- | ||
+ | |W||week in month||Number||2 | ||
+ | |- | ||
+ | |a||am/pm marker||Text||PM | ||
+ | |- | ||
+ | |k||hour in day (1~24)||Number||24 | ||
+ | |- | ||
+ | |K||hour in am/pm (0~11)||Number||0 | ||
+ | |- | ||
+ | |z||time zone||Text||Pacific Standard Time | ||
+ | |- | ||
+ | |'||escape for text||Delimiter|| | ||
+ | |- | ||
+ | |<nowiki>''</nowiki>||single quote||(Literal)||' | ||
+ | |} | ||
+ | |||
+ | Examples Using the local unit system: | ||
+ | {| {{prettytable}} | ||
+ | !Format Pattern!!Result | ||
+ | |- | ||
+ | |<nowiki>"yyyy.MM.dd G 'at' HH:mm:ss z"</nowiki>||1996.07.10 AD at 15:08:56 PDT | ||
+ | |- | ||
+ | |<nowiki>"EEE, MMM d, 'yy"</nowiki>||Wed, July 10, '96 | ||
+ | |- | ||
+ | |<nowiki>"KK:mm a, z"</nowiki>||00:08 AM, PST | ||
+ | |- | ||
+ | |<nowiki>"h:mm a"</nowiki>||12:08 PM | ||
+ | |- | ||
+ | |<nowiki>"h 'o''clock' a, zzzz"</nowiki>||12 o'clock PM, Pacific Daylight Time | ||
+ | |- | ||
+ | |<nowiki>"yyyyy.MMMMM.dd GGG h:mm aaa"</nowiki>||1996.July.10 AD 0:08 PM | ||
+ | |- | ||
+ | |<nowiki>"dd/MMM/yyyyy HH:mm"</nowiki>||10/07/1996 00:08 | ||
+ | |} | ||
+ | |||
+ | |||
+ | ==Opérateurs== | ||
+ | ===Opérateur == === | ||
+ | <pre>(getSex(%USER_ID) == 1) ? $womanReduction : 0</pre> | ||
+ | |||
+ | ===Opérateur OR=== | ||
+ | <pre>( test1 OR test2 ) ? true-case : false-case</pre> | ||
+ | |||
+ | Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser : | ||
+ | <pre>( test1 || test2 ) ? true-case : false-case</pre> | ||
+ | |||
+ | ===Opérateur AND=== | ||
+ | <pre>( test1 AND test2 ) ? true-case : false-case</pre> | ||
+ | |||
+ | Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser : | ||
+ | <pre>( test1 && test2 ) ? true-case : false-case</pre> | ||
+ | |||
+ | ==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 | ||
+ | |||
+ | ===%EXTRAFIELDxx=== | ||
+ | Permet de récupérer le contenu d'un champ additionnel | ||
+ | |||
+ | Description : | ||
+ | *xx = numéro d'identifiant du champ additionnel. Exemple : %EXTRAFIELD12 | ||
+ | *Pour les formules de tarification, seuls les champs additionnels de type de valeur suivants sont acceptés : | ||
+ | **Nombre entier | ||
+ | **Nombre entier unique | ||
+ | **Nombre à virgule | ||
+ | |||
+ | ===%FIRSTNAME=== | ||
+ | Prénom de l'utilisateur | ||
+ | |||
+ | ===%LASTNAME=== | ||
+ | Nom de l'utilisateur | ||
+ | |||
+ | ===%PILOT=== | ||
+ | Id de l'utilisateur. | ||
+ | |||
+ | Cette variable est utilisable dans les formules : | ||
+ | * d'email d'alerte de solde | ||
+ | * d'expérience récente | ||
+ | * de tarification des heures | ||
+ | |||
+ | ===%PILOT2=== | ||
+ | |||
+ | Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de tarification des heures. | ||
+ | |||
+ | ===%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 | ||
+ | |||
+ | ===<s>%TIME_ARRIVAL</s>=== | ||
+ | <s>Heure de fin saisie dans le formulaire</s> | ||
+ | |||
+ | ===<s>%TIME_DEPARTURE</s>=== | ||
+ | <s>Heure de début saisie dans le formulaire</s> | ||
+ | |||
+ | ===%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. | ||
+ | |||
+ | Cette variable est utilisable dans les formules de : | ||
+ | * compte d'export | ||
+ | * tarification des produits | ||
+ | * renouvellement de validité | ||
+ | |||
+ | =Compte d'export= | ||
+ | |||
+ | ==Fonctions autorisées pour le calcul du compte d'export== | ||
+ | |||
+ | *[[#sprintf('pattern',_'string')|sprintf]] | ||
+ | *[[#substr(string,a,b)|substr]] | ||
+ | *[[#strtolower(string)|strtolower]] | ||
+ | *[[#strtoupper(string)|strtoupper]] | ||
+ | |||
+ | ==Variables autorisées pour le calcul du compte d'export== | ||
+ | *[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]] | ||
+ | *[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]] | ||
+ | *[[#.AUTO_INCREMENT|%AUTO_INCREMENT]] | ||
+ | *[[#.FIRSTNAME|%FIRSTNAME]] | ||
+ | *[[#.LASTNAME|%LASTNAME]] | ||
+ | *[[#.MEMBER_NUM|%MEMBER_NUM]] | ||
+ | *[[#.RESOURCE_NAME|%RESOURCE_NAME]] | ||
+ | *[[#.USER_ID|%USER_ID]] | ||
+ | |||
+ | ==Exemples de formules pour le calcul du compte d'export== | ||
+ | {| class="wikitable sortable centre" | ||
+ | !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== | ||
+ | |||
+ | * [[#changeTime('date',_'année',_'mois',_'jour')|changeTime]] | ||
+ | * [[#formatDate('patron',_'date')|formatDate]] | ||
+ | * [[#getValidityExpiredDate('person_id',_'validity_type_id')|getValidityExpiredDate]] | ||
+ | * [[#hasValidity('user_id',_'validity_type_id')|hasValidity]] | ||
+ | |||
+ | ==Variables autorisées pour le calcul de la date d'expiration== | ||
+ | |||
+ | * [[#.25NOW_DATE|%NOW_DATE]] | ||
+ | * [[#.25USER_ID|%USER_ID]] | ||
+ | |||
+ | ==Exemples de formules de calcul de la date d'expiration== | ||
+ | |||
+ | ===Date fixe=== | ||
+ | <pre>2012-12-31</pre> | ||
+ | |||
+ | ===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é : | ||
+ | <pre>formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )</pre> | ||
+ | |||
+ | ===Fin de l'année courante=== | ||
+ | <pre>formatDate( 'yyyy-12-31', %NOW_DATE )</pre> | ||
+ | |||
+ | ===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. | ||
+ | |||
+ | <pre>formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)<10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )</pre> | ||
+ | |||
+ | =Expérience récente= | ||
+ | ==Fonctions autorisées pour le calcul de l'expérience récente== | ||
+ | *[[#hasValidity('user_id',_'validity_type_id')|hasValidity]] | ||
+ | *[[#changeTime('date',_'année',_'mois',_'jour')|changeTime]] | ||
+ | *[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]] | ||
+ | *[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]] | ||
+ | *[[#sumLandingNumber('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumLandingNumber]] | ||
+ | *[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]] | ||
+ | |||
+ | ==Variables autorisées pour le calcul de l'expérience récente== | ||
+ | |||
+ | * [[#.25NOW_DATE|%NOW_DATE]] | ||
+ | |||
+ | ==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 : | ||
+ | |||
+ | <php>( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) > 17999) OR hasValidity(%PILOT, XX) )</php> | ||
+ | |||
+ | ===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é : | ||
+ | |||
+ | <php>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</php> | ||
+ | |||
+ | =Tarification= | ||
+ | Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions : | ||
+ | ''A rédiger'' | ||
+ | |||
+ | Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais] | ||
+ | |||
+ | ==Fonctions autorisées pour le calcul de la tarification== | ||
+ | |||
+ | * [[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]] | ||
+ | |||
+ | ==Variables autorisées pour le calcul de la tarification== | ||
+ | *[[#.EXTRAFIELDxx|%EXTRAFIELDxx]] | ||
+ | *[[#.START-DATE|%START_DATE]] | ||
+ | |||
+ | ==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<br> | ||
+ | $S le solde positif qui doit être atteint pour bénéficier de la réduction<br> | ||
+ | $R le montant horaire de la réduction obtenue dans ce cas<br> | ||
+ | |||
+ | 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<br> | ||
+ | $C2R concerne le tarif horaire réduit de l'avion après une certaine heure<br> | ||
+ | 659 correspond à 06:59 en temps UTC<br> | ||
+ | Dans ce cas la formule considère que dès 700, la réduction s'applique.<br> | ||
+ | |||
+ | 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 ressources#Ajouter_un_type_de_ressource|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é== | ||
+ | *[[#abs(X)|abs]] | ||
+ | *[[#max(X,Y)|max]] | ||
+ | *[[#min(X,Y)|min]] | ||
+ | *[[#roundCeil(X,Y)|roundCeil]] | ||
+ | |||
+ | ==Variables autorisées pour le calcul du temps d'activité== | ||
+ | *[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]] | ||
+ | *[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]] | ||
+ | *[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]] | ||
+ | *[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]] | ||
+ | *[[#.DURATION|%DURATION]] | ||
+ | *[[#.TIME_ARRIVAL|%TIME_ARRIVAL]] | ||
+ | *[[#.TIME_DEPARTURE|%TIME_DEPARTURE]] | ||
+ | |||
+ | ==Exemples de formules de calcul du temps d'activité== | ||
+ | ===Durée saisie=== | ||
+ | <pre>%DURATION</pre> | ||
+ | |||
+ | ===Différence des compteurs saisis=== | ||
+ | <pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE</pre> | ||
+ | |||
+ | ===Durée saisie arrondie à 5 minutes=== | ||
+ | <pre>roundCeil(%DURATION, 50)</pre> | ||
+ | |||
+ | ===Différence des compteurs plus 5 centièmes === | ||
+ | <pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30</pre> | ||
+ | |||
+ | ===Différence des compteurs plus 5 minutes === | ||
+ | <pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50</pre> | ||
+ | |||
+ | ===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 : | ||
+ | <pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )</pre> | ||
+ | |||
+ | ===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes=== | ||
+ | <pre>roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50</pre> | ||
+ | |||
+ | ===Différence des compteurs arrondie à 10 centièmes=== | ||
+ | <pre>roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)</pre> | ||
+ | |||
+ | ===Le plus grand entre la durée du vol et la différence des compteurs=== | ||
+ | <pre>max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)</pre> | ||
+ | |||
+ | ===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes=== | ||
+ | <pre>max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))</pre> | ||
Cette formule calcule : | Cette formule calcule : | ||
*la différence des compteurs et l'arrondi à 5 minutes | *la différence des compteurs et l'arrondi à 5 minutes | ||
Ligne 64 : | Ligne 558 : | ||
Puis elle prend le plus grand des deux | Puis elle prend le plus grand des deux | ||
− | ==Le plus grand entre la durée du vol, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes | + | ===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes=== |
− | + | <pre>max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)</pre> | |
+ | |||
+ | ===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes=== | ||
+ | <pre>max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))</pre> | ||
Cette formule calcule : | Cette formule calcule : | ||
*la différence des compteurs et l'arrondi à 5 minutes | *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 | *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 | Puis elle prend le plus grand des deux |
Version actuelle en date du 16 janvier 2017 à 13:13
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
- 1 Présentation
- 1.1 Fonctions
- 1.1.1 abs(X)
- 1.1.2 changeTime('date', 'année', 'mois', 'jour')
- 1.1.3 formatDate('patron', 'date')
- 1.1.4 getSex('person id')
- 1.1.5 getSumAccountBusinessField('business field id, 'person id', 'date')
- 1.1.6 getValidityExpiredDate('person id', 'validity type id')
- 1.1.7 hasValidity('user id', 'validity type id', 'check only holding')
- 1.1.8 max(X,Y)
- 1.1.9 min(X,Y)
- 1.1.10 roundCeil(X,Y)
- 1.1.11 sprintf('pattern', 'string')
- 1.1.12 substr(string,a,b)
- 1.1.13 sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')
- 1.1.14 sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )
- 1.1.15 sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')
- 1.1.16 sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')
- 1.1.17 strtolower(string)
- 1.1.18 strtoupper(string)
- 1.2 Formatage des dates et des heures
- 1.3 Opérateurs
- 1.4 Variables
- 1.4.1 %ACCOUNT_TYPE
- 1.4.2 %AIRFIELD_ARRIVAL
- 1.4.3 %AIRFIELD_DEPARTURE
- 1.4.4 %AUTHENTICATION_LOGIN
- 1.4.5 %AUTO_INCREMENT
- 1.4.6 %BOOKING_START_DATE
- 1.4.7 %COUNTER_ARRIVAL
- 1.4.8 %COUNTER_DEPARTURE
- 1.4.9 %DURATION
- 1.4.10 %EXTRAFIELDxx
- 1.4.11 %FIRSTNAME
- 1.4.12 %LASTNAME
- 1.4.13 %PILOT
- 1.4.14 %PILOT2
- 1.4.15 %MEMBER_NUM
- 1.4.16 %NOW_DATE
- 1.4.17 %RESOURCE_NAME
- 1.4.18 %TIME_ARRIVAL
- 1.4.19 %TIME_DEPARTURE
- 1.4.20 %START_DATE
- 1.4.21 %USER_ID
- 1.1 Fonctions
- 2 Compte d'export
- 3 Date d'expiration
- 4 Expérience récente
- 5 Tarification
- 6 Temps d'activité
- 6.1 Définition Unité sexacentimal
- 6.2 Fonctions autorisées pour le calcul du temps d'activité
- 6.3 Variables autorisées pour le calcul du temps d'activité
- 6.4 Exemples de formules de calcul du temps d'activité
- 6.4.1 Durée saisie
- 6.4.2 Différence des compteurs saisis
- 6.4.3 Durée saisie arrondie à 5 minutes
- 6.4.4 Différence des compteurs plus 5 centièmes
- 6.4.5 Différence des compteurs plus 5 minutes
- 6.4.6 Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ
- 6.4.7 Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes
- 6.4.8 Différence des compteurs arrondie à 10 centièmes
- 6.4.9 Le plus grand entre la durée du vol et la différence des compteurs
- 6.4.10 Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes
- 6.4.11 Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes
- 6.4.12 Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes
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 le formatage des dates et des heures.
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
getSumAccountBusinessField('business field id, 'person id', 'date')
Retourne la somme des valeurs d'un champ additionnel de catégorie "Ecriture comptable". Seules les valeurs du champ métier associées à des écritures comptable correspondantes à la personne et dont la date est postérieure ou égale à la date indiquée en paramètre sont prises en compte dans le calcul. La date est au format AAAA-MM-JJ.
Exemple :
getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200
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
- Si c'est une validité à formule d'expérience récente :
- Retourne 0 dans les autres cas
- Retourne 1 lorsque :
- 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é
- Si ce n'est pas une validité à formule d'expérience récente :
- 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)
- Retourne 1 lorsque :
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
Exemples :
roundCeil(114,100) donne 200
roundCeil(114,10) donne 120
roundCeil(106,5) return 110
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :
roundCeil(107.5-0.5,1) return 107
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :
roundCeil(107.5-0.499,1) return 108
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"
Formatage des dates et des heures
To specify the format use a pattern string. In this pattern, all ASCII letters are reserved as pattern letters, which are defined as the following:
The count of pattern letters determine the format.
(Text): 4 or more pattern letters--use full form, < 4--use short or abbreviated form if one exists.
(Number): the minimum number of digits. Shorter numbers are zero-padded to this amount. Year is handled specially; that is, if the count of 'y' is 2, the Year will be truncated to 2 digits.
(Text & Number): 3 or over, use text, otherwise use number.
Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not embraced within single quotes.
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.
Syntax available:
Symbol | Meaning | Presentation | Example |
---|---|---|---|
G | era designator | Text | AD |
y | year | Number | 1996 |
M | month in year | "MMM": Text "MM" or "M" : Number |
July 07 or 7 |
d | day in month | Number | 10 |
h | hour in am/pm (1~12) | Number | 12 |
H | hour in day (0~23) | Number | 0 |
m | minute in hour | Number | 30 |
s | second in minute | Number | 55 |
S | millisecond | Number | 978 |
E | day in week | Text | Tuesday |
e | dow (=day of week: 1 = sunday, 2 = monday, ) | (Number) | 2 (=monday) |
D | day in year | Number | 189 |
F | day of week in month | Number | 2 (2nd Wed in July) |
w | week in year | Number | 27 |
W | week in month | Number | 2 |
a | am/pm marker | Text | PM |
k | hour in day (1~24) | Number | 24 |
K | hour in am/pm (0~11) | Number | 0 |
z | time zone | Text | Pacific Standard Time |
' | escape for text | Delimiter | |
'' | single quote | (Literal) | ' |
Examples Using the local unit system:
Format Pattern | Result |
---|---|
"yyyy.MM.dd G 'at' HH:mm:ss z" | 1996.07.10 AD at 15:08:56 PDT |
"EEE, MMM d, 'yy" | Wed, July 10, '96 |
"KK:mm a, z" | 00:08 AM, PST |
"h:mm a" | 12:08 PM |
"h 'o''clock' a, zzzz" | 12 o'clock PM, Pacific Daylight Time |
"yyyyy.MMMMM.dd GGG h:mm aaa" | 1996.July.10 AD 0:08 PM |
"dd/MMM/yyyyy HH:mm" | 10/07/1996 00:08 |
Opérateurs
Opérateur ==
(getSex(%USER_ID) == 1) ? $womanReduction : 0
Opérateur OR
( test1 OR test2 ) ? true-case : false-case
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :
( test1 || test2 ) ? true-case : false-case
Opérateur AND
( test1 AND test2 ) ? true-case : false-case
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :
( test1 && test2 ) ? true-case : false-case
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
%EXTRAFIELDxx
Permet de récupérer le contenu d'un champ additionnel
Description :
- xx = numéro d'identifiant du champ additionnel. Exemple : %EXTRAFIELD12
- Pour les formules de tarification, seuls les champs additionnels de type de valeur suivants sont acceptés :
- Nombre entier
- Nombre entier unique
- Nombre à virgule
%FIRSTNAME
Prénom de l'utilisateur
%LASTNAME
Nom de l'utilisateur
%PILOT
Id de l'utilisateur.
Cette variable est utilisable dans les formules :
- d'email d'alerte de solde
- d'expérience récente
- de tarification des heures
%PILOT2
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de tarification des heures.
%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.
Cette variable est utilisable dans les formules de :
- compte d'export
- tarification des produits
- renouvellement de validité
Compte d'export
Fonctions autorisées pour le calcul du compte d'export
Variables autorisées pour le calcul du compte d'export
- %ACCOUNT_TYPE
- %AUTHENTICATION_LOGIN
- %AUTO_INCREMENT
- %FIRSTNAME
- %LASTNAME
- %MEMBER_NUM
- %RESOURCE_NAME
- %USER_ID
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, XX) : %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é
- %AIRFIELD_ARRIVAL
- %AIRFIELD_DEPARTURE
- %COUNTER_ARRIVAL
- %COUNTER_DEPARTURE
- %DURATION
- %TIME_ARRIVAL
- %TIME_DEPARTURE
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 du vol et la différence des compteurs moins 5 minutes
max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)
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