Formules de calcul and Validités: Difference between pages

From Documentation de la solution web de gestion OpenFlyers
(Difference between pages)
Jump to navigation Jump to search
 
 
Line 1: Line 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=
=Présentation=
L'objet de cette page est de présenter l'utilisation des validités dans la [[Accueil|version 4 d'OpenFlyers]].


==Fonctions==
Il existe également une page qui traite du [[paramétrage des validités]].
 
===abs(X)===
Retourne la valeur absolue de X
 
Exemple :
<pre>abs(-200) donne 200</pre>
<pre>abs(100) donne 100</pre>
 
===changeTime('date', 'année', 'mois', 'jour', 'minute')===
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes


La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''
==Définitions==
Le terme '''validité''' est utilisé par OpenFlyers pour désigner tout ce qui peut constituer une attestation, autorisation, brevet, certificat, diplôme, échelon, expérience acquise, grade, licence, permis, qualification, etc.


Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :
Les '''types de validités''' permettent de [[#Paramètres-de-configuration|définir des validités]] qui seront attribuées aux utilisateurs.
* 0 = L'année, le mois, le jour ou les minutes reste inchangé
* +X = L'année, le mois, le jour ou les minutes est augmenté de X
* -X = L'année, le mois, le jour ou les minutes est diminué de X
* X = L'année, le mois, le jour ou les minutes est placé sur X
** Les minutes sont placés à 0 si X est négatif
** Les minutes sont placés à 59 si X est supérieur à 59


Exemple :
La détention par un utilisateur de validités requises peut être vérifié :
<pre>changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15
*A la connexion de l'utilisateur
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide
*Lors d'une réservation faite pour un utilisateur par lui-même ou un autre utilisateur. OpenFlyers vérifie les validités de l'utilisateur concerné par la réservation.
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15
*Lors d'une saisie d'activité (par exemple lors de la saisie d'un vol pour l'aéronautique).
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
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00</pre>


===formatDate('patron', 'date')===
===Documents-validités===
Document associé à la validité d'un utilisateur et qui permet de démontrer la réelle détention de la validité par un utilisateur. Pour qu'un document soit associable à une validité, le type de validité doit avoir le paramètre [[Paramétrage-des-validités#Associer-un-document|Associer un document]].


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]].
Pour un tel type de validité, la [[Paramétrage-des-validités#Certification|certification]] est en général activée pour permettre la validation du document par un gestionnaire.


Exemple :
===Validité à échéance===
<pre>formatDate('yyyy', '2015-03-01') donne 2015</pre>
Un type de validité est une validité à échéancelorsque le champ de paramétrage du type de validité [[Paramétrage-des-validités#Soumise-à-échéance|Soumise à échéance]] est coché .
<pre>formatDate('MM', '2015-03-01') donne 03</pre>
Dans ce cas, la date d'échéance doit obligatoirement être renseignée lors de la création de la validité. Une fois cette date dépassée, l'utilisateur ne détient plus cette validité.
<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>
<pre>formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant</pre>


===getSex('person id')===
===Validité à expérience===
Un type de validité est une validité à expérience lorsque le champ de paramétrage du type de validité [[Paramétrage-des-validités#Formule-d'expérience|formule d'expérience]] contient une formule. Dans ce cas, la validité n'est pas attribuable à un utilisateur. C'est l'expérience de l'utilisateur, c'est à dire son activité passée vérifiée par la formule d'expérience, qui définit si l'utilisateur détient cette validité.


Retourne un nombre correspondant au sexe de la personne :
===Validité à vendre===
* 0 pour un homme
Une validité à vendre est une validité qui est couplée à un [[Gestion-des-produits-et-des-ventes#Configuration-d'un-produit-Validité|produit en vente]].
* 1 pour une femme
* 2 lorsque ce n'est pas défini


Exemple :
===Validité complète===
<pre>getSex(1)
getSex(%USER_ID)</pre>


Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :
Une validité est complète lorsque tous les points suivants sont réunis :
<pre>(getSex(%USER_ID) == 1) ? $reductionFemme : 0</pre>


===getSumAccountBusinessField('business field id, 'person id', 'date')===
* Si la date d'expiration est requise, elle doit être renseignée.
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] 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.
* Si le code identifiant est requis, il doit être renseigné.
* Si la date d'obtention est requise, elle doit être renseignée.
* Si un document peut être associé, les pages obligatoires (s'il y en a) doivent être téléversées.


Exemple :
===Validité contrat===
<pre>getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200</pre>
Une validité contrat est un validité qui a été déclarée comme contrat. Un contrat est une validité avec un document défini, le but est de permettre de mettre en ligne un document que les utilisateurs doivent signer.


===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===
Un utilisateur qui n'a pas signé ses contrats ne peux pas se connecter. Il a la possibilité de signer ses contrats lors de ses tentatives de connexion.


* 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ée. La date est au format AAAA-MM-JJ.
Un contrat signé est stocké en base de données avec le nom  et l'adresse IP du signataire ainsi que la date et l'heure de signature.
* Dans les autres cas, Retourne "optional default date" ou "0000-00-00" si elle n'est pas renseignée


Exemple :
Suivre [[Paramétrage-des-validités#Paramétrer-une-validité-comme-contrat|cette procédure]] pour mettre en place des contrats.
<pre>getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31</pre>
<pre>getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01</pre>
<pre>getValidityExpiredDate(0, 20) donne 0000-00-00</pre>


===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===
Voir également la procédure de [[Connexion#Signer-des-validités-contrats|signature des validités-contrats]].
* Retourne la date d'obtention de la validité de la personne si c'est une validité avec gestion de la date d'obtention et que la date d'obtention a été renseignée. La date est au format AAAA-MM-JJ.
* Dans les autres cas, Retourne "optional default date" ou "0000-00-00" si elle n'est pas renseignée


Exemple :
=Alertes sur les validités=
<pre>getValidityGrantedDate(%USER_ID, 1) donne 2014-12-31 si l'utilisateur possède la validité,qu'elle est avec une date d'obtention et que la date d'obtention est renseignée</pre>
==Alerte à la connexion==
<pre>getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0</pre>
Les validités contrôlées à la connexion sont uniquement :
<pre>getValidityGrantedDate(0, 20) donne 0000-00-00</pre>
*celles possédées par l'utilisateur qui se connecte et qui sont [[Validités#Validité-à-échéance|soumises à échéance]]
*[[Validités#Validité-à-expérience|les validités à expérience]] récente.


===getYearsFromDiffDate('first date', 'second date')===
Ainsi, les validités sans échéance ne sont pas contrôlées.


*Retourne la différence en année entre 2 dates
OpenFlyers affiche un message d'alerte pour les validités dont la date d'échéance est expirée ou va expirer dans un délai inférieur à la période d'alerte définie dans la fiche utilisateur. L'utilisateur a la possibilité de cliquer sur la case à cocher "Ne plus le rappeler" afin de ne plus avoir de message de rappel. Dans ce cas, lors des connexions ultérieures, il n'aura plus de message de rappel. Il peut cependant réactiver cette alerte en la réactivant dans la colonne "Alertes" de la ligne correspondante dans '''Planning > Données > Personnelles > Validités'''. Cette réactivation est automatique lors d'une modification de la validité.
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée


Exemple :
==Alertes lors d'une réservation ou une saisie d'activité==
<pre>getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25
Les [[Gestion-des-activités#Alertes|alertes suivantes sont générées lors de la saisie d'une activité]] ou d'une réservation.
getYearsFromDiffDate( '1975-01-01' ) retourne 37</pre>


===hasValidity('user id', 'validity type id', 'check only holding')===
Les validités périmées apparaissent systématiquement lors de la saisie d'une réservation ou d'une activité comme à la connexion. Leur affichage ne dépend pas du type de ressource. C'est juste un rappel.
'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 :
Ce rappel est notamment utile lorsqu'une personne effectue une réservation ou une saisie de vol pour le compte d'un tiers. Cela lui permet d'être informé et d'informer ce tiers de sa situation.
** 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''' si ce n'est pas une validité à formule d'expérience récente  et que l'utilisateur possède la validité (périmée ou non)
** 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)===
==Alertes sur la page listant les validités d'un utilisateur==
Retourne le maximum entre X et Y
*Alerte de cellule vide alors qu'elle devrait être remplie : la cellule affiche une bordure et un panneau rouges.
*[[#Alertes-d'expiration|Alertes d'expiration]]


===min(X,Y)===
==[[Envoi-des-emails#s#E-mail-de-rappel-d'échéance-de-validité|Email de rappel d'échéance de validité]]==
Retourne le minimum entre X et Y


===roundCeil(X,Y)===
=Certifier des validités=
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche
La certification permet à une structure d'attester qu'une validité saisie dans OpenFlyers a été vérifiée.


Exemples :
Lorsqu'un document est associé à une validité, cela permet d'indiquer que le document a été vérifié et que les données saisies correspondantes à la validité sont conformes au document téléversé. Cela permet également d'indiquer que le document est valide.
<pre>roundCeil(114,100) donne 200</pre>


<pre>roundCeil(114,10) donne 120</pre>
Un document-validité peut être certifié de 2 façons :
*Soit manuellement par un gestionnaire disposant des droits de certification du document
*Soit par un robot dans le cas où le robot dispose d'un modèle du type de document à certifier.


<pre>roundCeil(106,5) return 110</pre>
Voir le [[Paramétrage-des-validités#Certification|paramétrage de la certification d'un type de validité]] pour définir les validités qui peuvent être certifiées et la colonne [[Gestion-des-profils#Types-de-validités-que-l'utilisateur-peut-gérer-et-certifier|Types de validités que l'utilisateur peut gérer et certifier]] dans la gestion des profils pour définir ceux qui peuvent certifier.


Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :
==Certification manuelle==
<pre>roundCeil(107.5-0.5,1) return 107</pre>
;Pré-requis
Pour pouvoir certifier une validité, un utilisateur doit disposer du [[Gestion-des-profils#Types-de-validités-que-l'utilisateur-peut-gérer-et-certifier|droit de certifier la validité concernée]]


Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :
;Procédure
<pre>roundCeil(107.5-0.499,1) return 108</pre>
Pour certifier manuellement une validité, il faut soit :
*Passer par l'interface de gestion des [[#Validités-en-attente-de-certification|validités en attente de certification]] :
**Vérifier les informations des validités en attente, corriger si besoin
**Quand une validités est conforme, cliquer sur certifier
*Passer par le menu de gestion individuelle des validités des utilisateurs :
**Aller sur la page de gestion des validités des utilisateurs dans '''Gestion > Utilisateurs > Actifs'''
**Chercher l'utilisateur dont la validité est à certifier puis dans la colonne action cliquer sur l'icône "Editer les validités de l'utilisateur"
**Sur la page qui s'ouvre, contrôler les informations de la validité puis cliquer sur le bouton dans la colonne "Certifier"


===roundFloor(X,Y)===
==Certification automatique==
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche
===Certification automatique à partir du numéro de licence délivré par la [https://www.ffa-aero.fr Fédération Française Aéronautique]===
Cette certification est active lorsque le type de validité est paramétré avec le [[Paramétrage-des-validités#Certification|type de certification '''Par API FFA''']].


Exemples :
;Certification automatique
<pre>roundFloor(114,100) donne 100</pre>
Lorsque la validité est nécessaire, à la connexion, lors de la réservation en solo ou lors d'une saisie d'activité en solo, si la validité n'est pas déjà certifiée ou si elle est périmée, le robot OpenFlyers interroge l'API SMILE FFA pour vérifier la validité de la licence.


<pre>roundFloor(114,10) donne 110</pre>
;Réactualisation manuelle
Il est possible de forcer la réactualisation de la certification en appuyant sur l'icône de mise à jour qui apparaît dans la colonne '''Actions''' de la liste des validités, cela permet d'appeler le robot OpenFlyers qui interroge l'API SMILE FFA pour vérifier la validité de la licence.


<pre>roundFloor(106,5) donne 105</pre>
Le bouton n'est actif que si l'une des conditions suivantes est rencontrée :
*La date d'échéance de la validité est dépassée
*La date courante est supérieure ou égale au 1er octobre et l'année de la date d'échéance est l'année en cours


===sprintf('pattern', 'string')===
; Interrogation de l'API SMILE FFA par le robot OpenFlyers
* Après interrogation de l'API FFA, nous avons les cas suivants :
** Si la licence est valide, le robot certifie automatiquement la validité en mettant à jour la date d'échéance au 31/12 de l'année renvoyée par l'API FFA.
** Si la licence n'est pas valide :
*** Si une date d'échéance est fournie par API FFA, le robot certifie automatiquement la validité en mettant à jour la date d'échéance avec la date de fin indiquée dans la réponse.
*** Si non, le robot certifie automatiquement la validité en mettant à jour la date d'échéance au 31/12 de l'année la précédente.


Formate la chaîne "string" avec le patron "pattern". Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].
Un document peut-être associé à la validité. Il n'est pas pris en compte pour la certification.


Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :
===Certification automatique de l'attestation délivrée par la [https://www.ffa-aero.fr Fédération Française Aéronautique]===
<syntaxhighlight lang="php">sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple</syntaxhighlight>
Cette certification est active lorsque le type de validité est paramétré avec le [[Paramétrage-des-validités#Certification|type de certification '''Possible par robot (FFA)''']].


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 :
Le robot d'OpenFlyers est capable d'analyser les fichiers PDF correspondant aux attestations de licence délivrées par la [https://www.ffa-aero.fr Fédération Française Aéronautique (FFA)]. Chaque pilote licencié à la FFA peut récupérer ce document sur le site web [http://projet.ff-aero.fr/SMILE_II/ SMILE]. Le robot extrait du document :
<syntaxhighlight lang="php">sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple</syntaxhighlight>
*Le numéro de licence de l'utilisateur
*Les noms et prénom de l'utilisateur
*La date de naissance de l'utilisateur
*La date de début de validité la licence FFA
*La date de fin de validité de la licence FFA
*La présence de l'assurance "Individuelle Accident de base" avec l'attribut "Oui"


Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :
Ces informations lui permettent de valider que le document est conforme et correspond à l'utilisateur pour qui le document a été téléversé. Il se base sur le nom et la date de naissance.
<syntaxhighlight lang="php">sprintf('%6s', %MEMBER_NUM) retourne "    10" si %MEMBER_NUM vaut 10 par exemple</syntaxhighlight>


Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :
Lorsque la correspondance est établie, il met à jour la validité avec les données suivantes :
<syntaxhighlight lang="php">sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple</syntaxhighlight>
*Le numéro de licence
*La date de début de validité
*La date de fin de validité


===substr(string,a,b)===
Quand un document est sélectionné les champs mis à jour disparaissent dans le formulaire de saisie, car les données seront extraite du document.
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 :
===Licence de pilote privé (PPL)===
<pre>substr('FIRST_NAME', 0, 5) returns FIRST
''(en développement)''
substr('FIRST_NAME', 0, -2) returns FIRST_NA</pre>
La certification de ce type de validité n'est en fonction que lorsque la [[Paramétrage-des-validités#Certification|certification]] de ce type de validité est activé avec le choix '''Possible par OCR'''.


===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===
Un deuxième robot d'OpenFlyers permet d'analyser les fichiers PDF ou JPEG qui correspondent aux Licences de Pilote Privé (PPL).


Retourne le total des heures de vol en [[#Définition-Unité-sexacentimal|Sexacentimal]] faite par un pilote %PILOT entre la date du jour moins 'day' sur les types de ressource indiqués.
Les champs détéctés par le robot sont :
*Les noms et prénoms
*Le numéro de la licence
*L'intitulé de la licence
*La date de validité de la licence


La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.
Déroulement de la procédure :
*Quand un document est téléversé, la détéction commence automatiquement.
*A l'issue du traitment, quatre champs remplis des données résultantes du traitement par le robot apparaîssent. Des boutons de confirmations apparaîssent aussi en dessous de chaque champ :
*A ce stade, l'utilisateur est amené à '''effectuer certaines actions''' avant de pouvoir valider le formulaire de saisie. '''Il doit vérifier si les résultats sont correctes puis les confirmer ou les corriger''' sinon :
**Si l'utilisateur corrige le champ, le bouton de confirmation est remplacé par le message "Vous avez corrigé ce champ".
**Si l'utilisateur remet le résultat initial dans le champ, le bouton de confirmation réapparaît sous le champ à la place du message.
**Si l'utilisateur est en train de modifier un champ, des points de suspension sont affichés en dessou du champ réspectif.
Les champs sont toujours modifiables. C'est-à-dire, l'utilisateur peut corriger un champ même après l'appui sur le bouton de confirmation.


Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.
Dans tous les cas, la validation du formulaire n'est possible que si l'utilisateur a '''corrigé''' ou '''validé''' tous les champs.


Exemples:
=Consulter et gérer ses validités ou celles d'un tiers=
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2
<pre>sumFlightHour(%PILOT, 0, 90, 1, 2)</pre>
* Le total des heures de vol du premier pilote sur les 90 derniers jours
<pre>sumFlightHour(%PILOT, 0, 90)</pre>


===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===
L'interface de gestion des validités est accessible :
Retourne en [[#Définition_Unité_sexacentimal|Sexacentimal]] le total des heures de vol postérieures à la date définie par 'year' 'month' 'day' 'hour' 'minute' faite par un pilote '%PILOT' pour le type de vol 'activity type'.
*côté planning : '''Planning > Données > Personnelles > Validités'''
*côté Gestion :
*'''Gestion > Utilisateurs > Validités'''
*'''Gestion > Utilisateurs > Actifs''' et cliquer sur l’icône représentant une check-list dans la colonne '''Actions'''.


La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.
Conditions pour consulter et gérer ses validités :
*Pour consulter ses validités un utilisateur doit posséder le droit [[Gestion-des-profils#Voir-ses-validités|Voir ses validités]].
*Un utilisateur peut gérer pour lui-même les validités qui sont définies dans le droit [[Gestion des profils#Type-de-validité-que-l'utilisateur-peut-gérer-pour-lui-même|Type de validité que l'utilisateur peut gérer pour lui-même]].
*Pour qu'un utilisateur soit autorisé à ajouter une nouvelle validité, il doit détenir le droit [[Gestion-des-profils#Ajout-et-gestion-de-ses-validités|Ajout et gestion de ses validités]].
*Pour qu'un utilisateur soit autorisé à renouveler une validité détenue ou à mettre à jour le '''Code identifiant''', la '''Date d'obtention''', la '''Limite de validité''' (d'une validité non achetable) ou à supprimer une validité, il doit détenir le droit [[Gestion-des-profils#Ajout-et-gestion-de-ses-validités|Ajout et gestion de ses validités]] ou le droit [[Gestion-des-profils#Gestion-de-ses-validités-détenues|Gestion de ses validités détenues]].
*Pour qu'un utilisateur soit autorisé à acheter ou renouveler une validité-produit, il doit détenir le droit [[Gestion des profils#Achat-ventes-libres|Achat ventes libres]] et le produit associé à la validité doit être en vente libre.


Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.
Conditions pour consulter et gérer les validités d'un tiers :
*Un utilisateur peut consulter et gérer les validités qui sont définies dans le droit [[Gestion des profils#Type-de-validité-que-l'utilisateur-peut-gérer-pour-lui-même|Types de validités que l'utilisateur peut gérer et certifier]].
*Pour qu'un utilisateur soit autorisé à ajouter une validité à vendre à un autre utilisateur, il doit détenir le droit [[Gestion-des-profils#Acheter-pour-les-tiers|Acheter pour les tiers]]


Exemples :
Il est possible d'afficher uniquement les validités nécessaires en sélectionnant un filtre :
*Retourne le total des heures faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00 :
<pre>sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )</pre>


*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :
[[File:selecteur-validités.png]]
<pre>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, 4)</pre>


*Retourne le total des heures faites en place gauche depuis le début de l'année :
Il est donc possible d'afficher uniquement :
<pre>sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)</pre>
*les validités qui peuvent être certifiées
*les validités effectives ([[#Prise-en-compte-d'une-validité|prises en compte]])


*Retourne le total des heures faites en place gauche entre le début de l'année et la date de début du vol courant :
Si les validités de tous les utilisateurs sont affichées, il est possible d'afficher uniquement les validités d'un certain type grâce au sélecteur présent en haut à droite de la page. Si tous les types de validités sont affichés, alors il est uniquement possible d'afficher les validités qui peuvent être certifiées.
<pre>sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) - sumFlightTime(%PILOT, formatDate('yyyy', %START_DATE), formatDate('M', %START_DATE), formatDate('d', %START_DATE), formatDate('H', %START_DATE), formatDate('m', %START_DATE), 0)</pre>


*Retourne le total des heures faites en place gauche entre le début de l'année et la date de début du vol courant en ignorant les vols qui sont sur le type de vol 8 :
Pour renouveler une validité détenue, il faut éditer la validité en appuyant sur l'icône crayon qui apparaît dans la colonne '''Actions'''. Une fois sur le formulaire d'édition de la validité concernée un bouton '''Renouveler la validité''' est affiché. Cliquer dessus puis valider.
<pre>(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) - sumFlightTime(%PILOT, formatDate('yyyy', %START_DATE), formatDate('M', %START_DATE), formatDate('d', %START_DATE), formatDate('H', %START_DATE), formatDate('m', %START_DATE), 0)) - (sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0, 8) - sumFlightTime(%PILOT, formatDate('yyyy', %START_DATE), formatDate('M', %START_DATE), formatDate('d', %START_DATE), formatDate('H', %START_DATE), formatDate('m', %START_DATE), 0, 8))</pre>


*Retourne le total des heures faites sur l'année précédente :
Lorsqu'un type de validité est configuré pour y [[Paramétrage-des-validités#Associer-un-document|associer un document]], l'utilisateur peut [[#Téléverser-un-fichier|téléverser un fichier]]. Une fois le fichier téléversé, il est téléchargeable.
<pre>sumFlightTime(%PILOT, formatDate('yyyy', changeTime( %NOW_DATE, '-1', '0', '0' )), 1, 1, 00, 00, 0) + sumFlightTime(%PILOT, formatDate('yyyy', changeTime( %NOW_DATE, '-1', '0', '0' )), 1, 1, 00, 00, 1) - sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) - sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 1)</pre>


===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===
Dans le tableau de la liste des validités, l'utilisateur concerné, peut voir qui et quand ont été certifiées ses validités. Il retrouve aussi les [[#Validité-contrat|validités-contrats]] qu'il a [[Connexion#Signer-des-validités-contrats|signé à la connexion]].


Retourne le total d'atterrissage fait par un pilote %PILOT sur les activités postérieures à la date définie par 'year' 'month' 'day' 'hour' 'minute' et qui ont comme type d'activité 'activity type'.
Si l'utilisateur peut gérer les validités de tiers, une liste déroulante '''Utilisateur''' apparaît au-dessus du tableau. Si la valeur '''Tous''' est sélectionné seules les validités à certifier sont affichées. De plus, une colonne ''Nom du titulaire'' est ajoutée et la colonne ''Alerte ?'' ainsi que le champ ''délai de prévenance'' sont cachés. Si on sélectionne un utilisateur autre que soi-même la colonne ''Alerte ?'' et le champ ''délai de prévenance'' sont cachés.


La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.
Remarques :
*Les validités arrivées à échéance apparaissent sur fond orange.
*Lorsqu'une validité n'est pas certifiée la cellule '''Etat de certification''' apparaît sur fond rouge.
*La mise à jour de la date d'échéance d'une validité réactive automatiquement la cellule de la colonne [[#Alertes-d'expiration|Alertes ?]] si celle-ci n'est pas modifié lors de la saisie dans le formulaire.
*Une validité-produit déjà détenue ne peut pas être supprimée.


Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.
==Alertes d'expiration==
Il existe deux types d'alertes liées à l'expiration d'une validité :
*Lorsque la date limite d'une validité est bientôt atteinte, une '''alerte avant échéance''' apparaît. Celle-ci s'affiche sous la forme d'une cellule à bordure orange et contenant un panneau orange.
*Lorsque la date limite d'une validité est dépassée, une '''alerte de validité expirée''' apparaît. Celle-ci s'affiche sous la forme d'une cellule à bordure et contenant un panneau rouges.


Exemples:
La case '''Alerte ?''' dans le formulaire de gestion d'une validité permet à un utilisateur d'activer ou désactiver les '''rappels à la connexion''' des validités arrivant à expiration ou ayant expiré.
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le 2008-01-01 00:00:00 sur le type d'activité 64
<pre>sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) > 5</pre>
Exemples:
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année
<pre>sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) > 5</pre>


===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===
Le délai de rappel des validités arrivant à expiration est visible dans le champ '''Délai de prévenance en semaines avant chaque échéance''' sous le tableau listant les validités d'un utilisateur. L'utilisateur connecté peut modifier son propre délai. Dans ce cas, ce champ affiche un menu déroulant dans lequel l'utilisateur connecté peut changer le délai. Par ailleurs, pour chaque activité, la case '''Alerte''' doit être cochée.


Retourne le total d'atterrissage faite par un pilote %PILOT sur les X derniers jours ('day') en prenant la date du jour comme référence sur les types de ressource indiqués.
==Ajouter une validité à un utilisateur==
*[[#Consulter-et-gérer-ses-validités-ou-celles-d'un-tiers|Accéder à l'interface de gestion des validités]]
*Sélectionner la validité à ajouter et valider.
*Saisir les données dans le formulaire et valider


La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.
Si la validité est une [[#Validité-à-vendre|validité à vendre]], l'utilisateur sera automatiquement débité du montant correspondant. Les écritures comptables générées correspondantes sont validées. L'objectif est d'empêcher la réversibilité de cette opération par un utilisateur qui aurait souscrit à une validité. Cela permet de garantir la traçabilité des engagements.


Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.
Il est néanmoins possible de [[#Supprimer_la_validité_d'un_utilisateur|supprimer une validité]] à vendre indument attribuée.


Exemples:
Il est également possible de débrayer la vente an cliquant sur le toggle-switch '''Débrayer la vente''' afin que le compte ne soit pas débité. Cela nécessite d'avoir le [[Gestion-des-profils#Débrayage-des-ventes-de-validités|droit de débrayage]].
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1
<pre>sumLandingNumber(%PILOT,0,30,1) > 5</pre>
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours
<pre>sumLandingNumber(%PILOT,1,15) > 5</pre>


===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===
===Téléverser un fichier===
Lorsqu'un type de validité est configuré pour y [[Paramétrage-des-validités#Associer-un-document|associer un document]], le téléversement des fichiers se fait comme suit :
*L'utilisateur téléverse le fichier
Ensuite :
*S'il s'agit d'un fichier image, il est stocké en base de données.
*S'il s'agit d'un PDF contenant du texte, le PDF est stocké en base de données.
*S'il s'agit d'un PDF qui contient une seule image, celle-ci est extraite du PDF et est stockée en base de données.
*S'il s'agit d'un PDF qui contient plusieurs images, seule la première image est extraite du PDF et stockée en base de données.
*Si le fichier est vide (ne contient ni texte ni image), une alerte utilisateur [[Alertes-utilisateur#Le-contenu-du-fichier-est-vide.-Le-fichier-n'as-pas-pu-être-téléchargé|indiquant que le contenu du fichier est vide]] est affichée à l'écran. Le fichier ne peut pas être téléversé.
Dans un cas particulier où l'image encapsulée dans le PDF se compose de plusieurs masques transparents, OpenFlyers convertit l'ensemble de la page du PDF en une image jpeg. Dans le cas où plusieurs images sont encapsulées dans le fichier sur plusieurs pages, seule la première page est extraite.


Retourne le total des heures de vol en [[#Définition-Unité-sexacentimal|Sexacentimal]] faite par un pilote %PILOT sur les X derniers jours ('day') précédant 'endingDate' sur les types de ressource indiqués.  
Les fichiers téléversés sont stockés directement en base de données sous réserve d'être conforme aux règles de téléversement ci-dessous :
*Formats des fichiers autorisés : GIF, JPEG, PNG et PDF. Si le fichier téléversé n'est pas dans l'un de ces formats, [[Alertes-utilisateur#Ce-n'est-pas-un-fichier-de-type-:-gif,-jpeg,-png,-pdf|un message d'alerte correspondant]] s'affiche à l'écran.
*Poids maximal autorisé au moment du téléversement : 10 Mo.
*Poids maximal autorisé pour le stockage : 500 ko. Si le fichier téléversé dépasse les 500 Ko, il est redimensionné dans le cas où c'est une image. Si le fichier est toujours trop gros, alors il est refusé et le [[Alertes-utilisateur#La-taille-maximale-d'un-fichier-est-500ko|message d'alerte correspondant]] s'affiche.


La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.
Récapitulatif :


Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.
[[File:traitement-apres-televersement.png|800px]]


Exemple : Le total des heures de vol pour le premier pilote sur les 365 derniers jours précédant la date du vol sur les types de ressource 1 et 2
==États de la validité==
<pre>sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)</pre>
{| class="wikitable"
 
!État de validité!!description!!
===strtolower(string)===
Retourne la chaine "string" en minuscule.
 
Exemple :
<pre>strtolower('CamelBack') retourne "camelback"</pre>
 
===strtotime(string)===
convertir une chaîne de date/heure en un timestamp Unix.
 
strtotime('2023-08-07 15:30:00'); // Output: 1678351800
 
===strtoupper(string)===
Retourne la chaine "string" en majuscule.
 
Exemple :
<pre>strtoupper('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
|À échéance||La validité est sur le point d'expirer et nécessite une mise à jour||[[File:pendingExpirationValidity.png|1000px]]
|-
|-
|S||millisecond||Number||978
|Expirée||La validité est périmée, elle n'est plus conforme et ne peut plus être utilisée||[[File:expiredValidity.png|1000px]]
|-
|-
|E||day in week||Text||Tuesday
|[[#Validités-en-attente-de-certification|Non certifiée]]||La validité n'a pas encore été validée officiellement et ne peut pas être utilisée||[[File:notCertifiedValidity.png|1000px]]
|-
|-
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)
|[[#Prise-en-compte-d'une-validité|Prise en compte]]||La validité est active et conforme, elle peut être utilisée sans restrictions||[[File:effectiveValidity.png|1000px]]
|-
|-
|D||day in year||Number||189
|Provisoire||un état temporaire où une [[#Historique-des-validités|ancienne version]] reste [[#Prise-en-compte-d'une-validité|prise en compte]] en [[#Certifier-des-validités|attendant la certification]] d'une nouvelle||[[File:provisionalValidity.png|1000px]]
|-
|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:
==Modifier la validité d'un utilisateur==
{| {{prettytable}}
*[[#Consulter-et-gérer-ses-validités-ou-celles-d'un-tiers|Accéder à l'interface de gestion des validités]]
!Format Pattern!!Result
*Les modifications s'effectuent via le formulaire d'édition d'une validité accessible depuis l'icône crayon dans la colonne '''Actions''' du tableau.
|-
|<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
|}
 
==Tests conditionnels==
===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_BALANCE===
Solde de compte
 
===%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 métier.
 
Description :
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :
**Nombre entier
**Nombre entier unique
**Nombre à virgule
*Pour le modèle de l'e-mail d'annulation de réservation extérieure, seuls les champs métiers des catégories suivantes sont acceptés :
**Utilisateur (PERSON)
**Ressource (RESOURCE)
**Réservation (BOOKING)
 
===%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 facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place
 
===%PILOT2===
 
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.
 
===%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_ID===
Id de la ressource.
 
Cette variable est utilisable dans les formules de :
*[[#Compte-d'export|Compte d'export]]
 
===%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 :
*[[#Compte-d'export|Compte d'export]]
*[[#Date-d'expiration|Date d'expiration]]
*[[#Expérience-récente|Expérience récente]]
*[[#Facturation|Facturation des produits]]
 
==Variables associées aux formules de facturation==
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.
 
Voir le chapitre [[Facturation-des-clients#Fonctionnement-et-nommage-des-variables-associées-aux-formules-de-facturation|Fonctionnement et nommage des variables associées aux formules de facturation]].
 
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=
 
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=
 
=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_ID|%RESOURCE_ID]]
*[[#.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=
Les formules de date d'expiration sont présentes dans l'[[Gestion-des-produits-et-des-ventes#Configuration-d'un-produit-Validité|interface des validités à vendre]].
==Fonctions autorisées pour le calcul de la date d'expiration==
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]
*[[#formatDate('patron',_'date')|formatDate]]
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]
 
==Variables autorisées pour le calcul de la date d'expiration==
 
* [[#.NOW-DATE|%NOW_DATE]]
* [[#.USER-ID|%USER_ID]]
 
==Exemples de formules de calcul de la date d'expiration==
 
===Dans 3 mois===
<pre>formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))</pre>
 
===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>
 
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===
Cette formule permet de vendre une validité (par exemple cotisation) avec une échéance au 31 décembre de l'année en cours dans le cas d'une première attribution ou de renouveler l'échéance au 31 décembre de l'année suivante si l'utilisateur possède déjà cette validité et qu'elle n'est pas périmée.
 
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :
<pre>formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )</pre>
 
=Email de rappel de solde=
Voir également :
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]
*Chapitre [[Configuration-de-la-comptabilité#Paramétrage-général-des-comptabilités|Paramétrage général des comptabilités]] dans la page [[Configuration de la comptabilité]]
 
==Variables autorisées pour l'email de rappel de solde==
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]
*[[#.FIRSTNAME|%FIRSTNAME]]
*[[#.LASTNAME|%LASTNAME]]
 
==Exemples de patrons d'emails de rappel de solde==
===Email de rappel de solde pour une structure associative===
<pre>Cher adhérent,
 
En date du %NOW_DATE, votre compte au sein de l'aéro-club Jean Mermoz présente un solde de %ACCOUNT_BALANCE € en dessous du seuil minimum de 0 €.
 
Pensez à anticiper avant votre prochain vol.
 
Nous vous remercions par avance pour la régularisation de votre compte.
 
L'équipe de l'Aéroclub.
----------
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique</pre>
 
===Email de rappel de solde pour une structure professionnelle===
<pre>Cher client,
 
Votre compte au sein de la société Latécoère présente un solde de %ACCOUNT_BALANCE € en dessous du seuil minimum de 50 €.
 
Nous vous remercions par avance pour la régularisation de votre compte.
 
Le service comptable
----------
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique</pre>
 
=Expérience récente=
==Fonctions autorisées pour le calcul de l'expérience récente==
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]
*[[#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]]
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]
*[[#sumLandingNumber(.PILOT,-'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==
 
*[[#.PILOT|%PILOT]]
*[[#.NOW-DATE|%NOW_DATE]]
*[[#.USER-ID|%USER_ID]]
 
==Exemples de formules de calcul de l'expérience récente==
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===
L'exemple suivant vérifie qu'un utilisateur dispose d'une validité #40 et si c'est le cas alors il renvoie 0 si l'expérience récente sur le type de ressource #90 est insuffisante.
 
Dit autrement : si l'expérience récente est suffisante sur le type de ressource #1 ou si l'utilisateur ne dispose pas de la validité #40, il renvoie 1.
 
Ce calcul est utile, par exemple, pour n'afficher une alerte de manque d'expérience récente que pour les utilisateurs disposant de l'autorisation d'utiliser le type de ressource considéré.
 
<syntaxhighlight lang="php">(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) < 1 ))? 0 : 1</syntaxhighlight>
 
===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 :
 
<syntaxhighlight lang="php">( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) > 17999) OR hasValidity(%PILOT, XX) )</syntaxhighlight>
 
17999 est déterminé par la formule 600 * 30 - 1 où 600 est la base du [[#Définition-Unité-sexacentimal|système sexacentimal]] utilisé par OpenFlyers.
 
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.
 
===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é :
 
<syntaxhighlight lang="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</syntaxhighlight>
 
===Validités à expérience récente pour le LAPL et l'ABL===
Le LAPL ([[Wikipedia-en:Light_aircraft_pilot_licence|Light Aircraft Pilot Licence]]) est un brevet de pilote dont la validité dépend de l'expérience récente. L'ABL est l'Autorisation de base du LAPL. Il a vocation à remplacer le Brevet de base. Les deux mettent en œuvre une succession de règles.
 
Pour le LAPL :
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :
**12 mouvements
**12 heures de vols
**1 vol d'au moins une heure d'instruction en tant qu'élève
 
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :
*Qui ont le LAPL depuis plus de 24 mois
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''
*ET qui n'ont pas une validité "Expérience récente extérieure"
<syntaxhighlight lang="php">( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)>=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) < 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1</syntaxhighlight>
Dans cette formule, il faut remplacer :
*XXXXXX par l'id du type de validité "LAPL"
*YYYYYY par l'id du type de validité "Expérience récente extérieure"
 
Voici la formule à expérience récente '''12 heures de vols dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :
*Qui ont le LAPL depuis plus de 24 mois
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''
*ET qui n'ont pas une validité "Expérience récente extérieure"
<syntaxhighlight lang="php">( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) >= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) < 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1</syntaxhighlight>
Dans cette formule, il faut remplacer :
*XXXXXX par l'id du type de validité "LAPL"
*YYYYYY par l'id du type de validité "Expérience récente extérieure"
 
Remarque : pour être pertinente, la validité "Expérience récente extérieure" devrait être une validité à échéance qui permette ainsi d'indiquer la date jusqu'à laquelle l'utilisateur concerné peut être considéré comme remplissant les critères.
 
Pour l'ABL :
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :
**12 mouvements en tant que commandant de bord
**12 heures de vols en tant que commandant de bord
**1 vol d'au moins une heure d'instruction en tant qu'élève
 
Voici la formule à expérience récente '''12 mouvements en tant que commandant de bord dans les 24 mois (ABL)''' qui permet d'afficher une alerte pour les pilotes :
*Qui ont l'ABL depuis plus de 24 mois
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''
*ET qui n'ont pas une validité "Expérience récente extérieure"
<syntaxhighlight lang="php">((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)>=2) AND (( sumLandingNumber(%PILOT, 0, 730)+sumLandingNumber(%PILOT, 1, 730) - sumLandingByType(%PILOT, formatDate('yyyy', changeTime( %NOW_DATE, '-2', '0', '0' )), formatDate('M', changeTime( %NOW_DATE, '-2', '0', '0' )), formatDate('d', changeTime( %NOW_DATE, '-2', '0', '0' )), 00, 00, 0, 4 ) ) < 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1</syntaxhighlight>
Dans cette formule, il faut remplacer :
*XXXXXX par l'id du type de validité "ABL"
*YYYYYY par l'id du type de validité "Expérience récente extérieure"
 
 
Voici la formule à expérience récente '''12 heures de vols en tant que commandant de bord dans les 24 mois (ABL)''' qui permet d'afficher une alerte pour les pilotes :
*Qui ont l'ABL depuis plus de 24 mois
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''
*ET qui n'ont pas une validité "Expérience récente extérieure"
<syntaxhighlight lang="php">((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)>=2) AND (( sumFlightHour(%PILOT, 0, 730)+sumFlightHour(%PILOT, 1, 730) - sumFlightTime(%PILOT, formatDate('yyyy', changeTime( %NOW_DATE, '-2', '0', '0' )), formatDate('M', changeTime( %NOW_DATE, '-2', '0', '0' )), formatDate('d', changeTime( %NOW_DATE, '-2', '0', '0' )), 00, 00, 0, 4 ) ) < 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1</syntaxhighlight>
Dans cette formule, il faut remplacer :
*XXXXXX par l'id du type de validité "ABL"
*YYYYYY par l'id du type de validité "Expérience récente extérieure"
 
===Visite médicale depuis moins d'un an===
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.
 
Pour cela, il faut mettre en place un type de validité "Visite médicale" avec la saisie de la date d'obtention.
 
Ensuite, il faut créer une validité à expérience contenant la formule suivante où il faut remplacer XXXX par l'id du type de validité "Visite médicale" :
<syntaxhighlight lang="php">(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)>=1)? 0 : 1</syntaxhighlight>
 
=Facturation des activités=
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 facturation==
 
*[[#abs(X)|abs(X)]]
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]
*[[OF-doc-en:CommonFormula#getFlowSumBetweenAccount.28.27accound_id_1.27.2C_.27account_id_2.27.2C_.27start_date.27.2C_.27end_date.27.29|getFlowSumBetweenAccount('accound id 1', 'account id 2', 'start date', 'end date')]]
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]
*[[#max(X,Y)|max(X,Y)]]
*[[#min(X,Y)|min(X,Y)]]
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]
 
==Variables autorisées pour le calcul de la facturation==
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]
*[[#.DURATION|%DURATION]]
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]
*[[#.PILOT|%PILOT]]
*[[#.PILOT2|%PILOT2]]
*[[#.NOW-DATE|%NOW_DATE]]
*[[#.START-DATE|%START_DATE]]
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]
 
==Exemples de formules pour le calcul de la facturation==
===Motoplaneur : facturation à 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
 
===Aéronautique : 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)
 
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===
$montantRemise correspond au montant de la réduction à appliquer
<pre>(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) > 15599) ? $montantRemise : 0</pre>
 
===Aéronautique : 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)
 
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===
$C1R concerne le tarif de la réduction
 
<pre>( (formatDate('e', %START_DATE) > 1) AND (formatDate('e', %START_DATE) < 7) AND ((formatDate('MM', %START_DATE) < 7) OR (formatDate('MM', %START_DATE) > 8)) ) ? $C1R : 0</pre>
 
===Aéronautique : réduction pour un jeune===
Exemple de formule de calcul permettant à un jeune de moins de 21 ans de bénéficier d'une réduction de $remiseSoloJeune par heure.
 
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :
<pre>(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) > 20)? 0 : $remiseSoloJeune</pre>


Formule à mettre dans le champ '''Formule :''' :
''Note :''
<pre>%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600</pre>
*Avant de faire un enregistrement en base de données, OpenFlyers vérifie s'il y a des modifications par rapport au dernier enregistrement actif de la même validité pour le même utilisateur.
*Les cellules non renseignées sont en rouges. Lors de l'édition via le formulaire, les champs associés sont également en surbrillance rouge.


=Facturation des produits=
Dans le cas d'une [[#Validité-à-vendre|validité à vendre]], la limite de validité n'est pas modifiable. Afin de l'augmenter, il faut passer par un renouvellement. Il est également possible de la modifier manuellement (à condition de disposer du [[Gestion-des-profils#Débrayage-des-ventes-de-validités|droit de débrayage]]) en cliquant sur l'interrupteur '''Débrayer la vente'''.


==Fonctions autorisées pour le calcul de la facturation des produits==
==Supprimer la validité d'un utilisateur==
*[[#Consulter-et-gérer-ses-validités-ou-celles-d'un-tiers|Accéder à l'interface de gestion des validités]]
*Les suppressions s'effectuent directement sur la ligne de la validité concernée en cliquant sur l'icône poubelle de la validité associée.


*[[#abs(X)|abs(X)]]
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]
*[[OF-doc-en:CommonFormula#getFlowSumBetweenAccount.28.27accound_id_1.27.2C_.27account_id_2.27.2C_.27start_date.27.2C_.27end_date.27.29|getFlowSumBetweenAccount('accound id 1', 'account id 2', 'start date', 'end date')]]
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]
*[[#max(X,Y)|max(X,Y)]]
*[[#min(X,Y)|min(X,Y)]]
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]


==Variables autorisées pour le calcul de la facturation des produits==
;Dans le cas où la ligne de la validité concernée ne dispose pas de l'icône poubelle
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]
Cela veut dire que [[Gestion des produits et des ventes#Configuration_du_produit_Validité_"Cotisation"|la validité est à vendre]]. Il faut effectuer la procédure suivante :
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]
*Si l'utilisateur a été indument débité, il faut [[Utilisation de la comptabilité#Annuler_l'effet_d'une_écriture_comptable|annuler l'effet d'une écriture comptable]] correspond au montant facturé qui n'aurait pas du l'être
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]
Supprimer la vente de validité de façon temporaire :
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]
*'''Admin > Ventes > Produits > Validités à vendre'''
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]
*Repérer la ligne qui lie le type de validité concerné avec un produit
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]
*Copier la '''Formule de calcul de la date d'expiration''' de la ligne concernée et la coller dans un fichier texte temporaire pour la récupérer ultérieurement
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]
*Noter le nom du produit associé
*[[#.NOW-DATE|%NOW_DATE]]
*Supprimer la ligne
*[[#.START-DATE|%START_DATE]]
*Supprimer la validité de l'utilisateur concerné (cf. début de la présente procédure)
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]
Remettre en place la vente du type de validité :
*'''Admin > Ventes > Produits > Validités à vendre'''
Sur la dernière ligne :
*Champ '''Validité''' : sélectionner le nom du type de validité concerné
*Champ '''Produit''' : sélectionner le nom du produit associé
*Champ '''Formule de calcul de la date d'expiration''' : recoller la formule de calcul
*Cliquer le bouton '''Ajouter'''.


==Exemples de formules pour le calcul de la facturation des produits==
=Contrôle des validités=
===Facturation de la cotisation au prorata de l'année civile===
==Contrôle des validités à la connexion==
<pre>1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )</pre>
Dès que l'utilisateur est identifié, un contrôle de ses validités est effectué. Les validités contrôlées sont uniquement celles que possède l'utilisateur et qui sont soumises à échéance ([[#Validité-complète|complète]]) ou les validités à expérience récente.


''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).
Le paramétrage du contrôle des validités s'effectue au travers de 2 champs :
*le champ '''[[Paramétrage-des-validités#Alerte-à-la-connexion|Alerte à la connexion]]''' qui définit le comportement que l'application OpenFlyers doit adopter à la connexion
*le champ '''[[Paramétrage-des-validités#Soumise-à-échéance|Soumise à échéance]]''' qui doit être attribué. S'il n'y a pas d'échéance, alors il n'y a pas de contrôle de validité de l'échéance à la connexion


===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===
==Contrôle des validités lors de la saisie d'une réservation==
La formule suivante applique une remise du montant $remiseCotisationJeune lorsque l'age de la personne concernée est inférieure ou égale à 25 par rapport à la date du jour ou par rapport à dans 1 an si la cotisation est souscrite à partir du mois d'octobre.
Lors d'une réservation, OpenFlyers contrôle les validités détenues par la personne occupant la 1ère place dans la ressource '''et seulement s'il n'y a qu'une seule personne pour cette réservation'''. OpenFlyers vérifie également pour cette personne si des validités ne vont pas expirés avant la date de fin de la réservation. Les validités détenues doivent correspondre aux validités demandées pour le type de ressource correspondant à la ressource réservée et aux validités demandées pour les types d'activités sélectionnés.


Dans la formule ci-dessous :
Il y a 3 comportement possibles :
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer
*Pas de contrôle des validités.
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise
*Une [[Présentation-générale-des-alertes#Alerte-orange|alerte non bloquante]] dans le cas où il manque une ou plusieurs validités.
*Une [[Présentation-générale-des-alertes#Alerte-rouge|alerte bloquante]] dans le cas où il manque une ou plusieurs validités.


<pre>(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)<10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) > 25)? 0 : $remiseCotisationJeune</pre>
Il y a un [[Configuration-des-réservations-internes#Paramétrage-général-du-contrôle-des-validités-pour-les-réservations|paramétrage général]] qui définit si toute validité manquante doit entrainer un blocage. Si ce n'est pas le cas, alors cela dépend du paramétrage associé à chaque type de validité grâce à la case à cocher [[Paramétrage-des-validités#Validité-bloquante-pour-la-saisie-(si-requise)|Validité bloquante pour la saisie des activités (si requise)]].


===Remise sur cotisation jeune en calculant l'âge par rapport au 1er janvier de l'année ou au 1er janvier de l'année suivante===
Le comportement est le même pour toutes les validités.
La formule suivante applique une remise du montant $remiseCotisationJeune lorsque l'age de la personne concernée est inférieure ou égale à 25 par rapport au 1er janvier de l'année en cours ou par rapport au 1er janvier de l'année suivante si la cotisation est souscrite à partir du mois d'octobre.


Dans la formule ci-dessous :
==Contrôle des validités lors de la saisie d'une activité==
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer
Lors de la saisie d'une activité, OpenFlyers effectue 2 contrôles :
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise
#'''S'il n'y a qu'une seule personne pour cette activité''', le logiciel vérifie la présence des validités requises pour la ressource utilisée et les types d'activités sélectionnés. Il y a 2 comportements possibles pour chaque validité manquante :
#*Une [[Présentation-générale-des-alertes#Alerte-orange|alerte non bloquante]].
#*Une [[Présentation-générale-des-alertes#Alerte-rouge|alerte bloquante]].
#:Il y a un [[Paramétrage-des-activités#Paramétrage-général-du-contrôle-des-validités-pour-la-saisie-des-vols|paramétrage général]] qui définit si toute validité manquante doit entrainer un blocage. Si ce n'est pas le cas, alors cela dépend du paramétrage associé à chaque type de validité grâce à la case à cocher [[Paramétrage-des-validités#Validité-bloquante-pour-la-saisie-(si-requise)|Validité bloquante pour la saisie des activités (si requise)]].
#OpenFlyers affiche une alerte pour les validités périmées [[#Contrôle_des_validités_à_la_connexion|comme à la connexion]].


<pre>(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)<10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) > 25)? 0 : $remiseCotisationJeune</pre>
=Débrayer la vente d'une validité=
Débrayer la vente d'une validité consiste à modifier la date limite d'une validité sans déclencher de vente afin que l'utilisateur concerné ne soit pas débité.


=Temps d'activité=
;Prérequis :
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.
Pour pouvoir débrayer la vente d'une validité, le gestionnaire doit disposer du droit [[Gestion-des-profils#Débrayage-des-ventes-de-validités|débrayage des ventes de validités]].


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]].
;Procédure pour attribuer une nouvelle validité sans la vendre :
*'''Gestion > Utilisateurs > Utilisateurs > Validités'''
*Sélectionner en haut à gauche, dans la liste des utilisateurs, l'utilisateur concerné
*Sélectionner en haut à droite, dans la liste des validités, la validité à attribuer
Si la validité est une validité à vendre, alors apparait à côté de la liste, un interrupteur
*Cliquer sur cet interrupteur '''Débrayer la vente'''
Le bouton '''Acheter''' se transforme en '''Ajouter'''
*Cliquer sur le bouton '''Ajouter'''
*Compléter le formulaire, notamment la '''Limite de validité'''
*Cliquer sur le bouton '''Enregistrer'''


==Définition Unité sexacentimal==
;Procédure pour modifier la limite validité d'une validité déjà attribuée sans la vendre :
En base de données, les temps et les compteurs sont stockés selon le multiple au centième (100) et au système sexagésimale (heures minutes => 60). Nous avons appelé cela le format ''sexacentimal''.
*'''Gestion > Utilisateurs > Utilisateurs > Validités'''
*Sélectionner en haut à gauche, dans la liste des utilisateurs, l'utilisateur concerné
Les validités attribuées à l'utilisateur apparaissent
*A droite de la ligne de la validité à modifier, cliquer sur le pictogramme avec le symbole de l'euro barré et un crayon
Le formulaire d'édition de la validité apparait
*Modifier le champ '''Limite de validité'''
*Cliquer sur le bouton '''Enregistrer'''


Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime tout problème d'arrondi qui pourrait être problématique pour les additions selon le format d'entrée (heures minutes ou heures centièmes).
=Historique des validités=
Une validité possède un historique contenant tous les états par lesquels elle est passée.
Chaque changement effectué sur une validité entraîne automatiquement une entrée dans l'historique.


Ainsi :
L'historique d'une validité est conservé même si la validité est supprimée, il sera consultable si une nouvelle validité du même type est créée pour le même utilisateur.
*1 heure = 600 sexacentièmes
*1 minute = 10 sexacentièmes
*5 minutes = 50 sexacentièmes
*6 minutes = 60 sexacentièmes


*1 centième de minute = 6 sexacentièmes
Il est possible de consulter les anciens fichiers contenus par la validité mêmes s'ils ont été remplacés.
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes


Exemples de formules :
Les fichiers validités téléversés sont comparés. S'ils sont identiques, alors seul l'ancien fichier est conservé. Cela permet de limiter l'augmentation de la taille de la base de données.
*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é==
==Afficher l'historique des validités==
*[[#abs(X)|abs]]
Pour afficher l'historique des validité :
*[[#max(X,Y)|max]]
*Aller sur l'[[#Consulter-et-gérer-ses-validités-ou-celles-d'un-tiers|interface de gestion des validités d'un utilisateur]].
*[[#min(X,Y)|min]]
*Cliquer sur le nom de la validité dans la colonne de gauche du tableau pour ouvrir la page d'historique.
*[[#roundCeil(X,Y)|roundCeil]]
L'historique s'affiche chronologiquement, du changement le plus récent au plus ancien.


==Variables autorisées pour le calcul du temps d'activité==
=Lister les détenteurs d'un type de validité=
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]
*Aller sur '''Admin > Utilisateurs > Types de validités'''
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]
*Cliquer sur l'icône symbolisant une liste dans la colonne '''Liste''' de la ligne correspondante à la validité concernée.
*[[#.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é==
Le tableau liste les personnes ayant la validité correspondante.
===Durée saisie===
<pre>%DURATION</pre>


===Différence des compteurs saisis===
Lorsque la validité est soumise à échéance, la liste fait ressortir en rouge sur fond gris les dates d'échéances périmées.
<pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE</pre>


===Durée saisie arrondie à 5 minutes===
Lorsque la validité est une validité à expérience, la liste contient uniquement les utilisateurs remplissant les critères de la formule d'expérience.
<pre>roundCeil(%DURATION, 50)</pre>


===Différence des compteurs plus 5 centièmes ===
=Prise en compte d'une validité=
<pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30</pre>


===Différence des compteurs plus 5 minutes ===
Une validité prend effet lorsque tous les points suivants sont réunis :
<pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50</pre>


===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===
* La validité doit être [[#Validité-complète|complète]].
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :
* Si une date d'expiration est présente, elle ne doit pas être dépassée.
<pre>%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )</pre>
* Si la [[#Certifier-des-validités|certification]] est possible, la validité doit être certifiée.


===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===
NB : Si la dernière validité enregistrée n'est pas prise en compte pour un utilisateur X et un type de validité Y, on vérifie dans [[#Historique-des-validités|l'historique]] s'il existe une validité qui est encore considérée comme valide pour la prendre en compte, on parle de [[#États-de-la-validité|validité provisoire]].
<pre>roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50</pre>


===Différence des compteurs arrondie à 10 centièmes===
=Validités en attente de certification=
<pre>roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)</pre>


===Le plus grand entre la durée du vol et la différence des compteurs===
*[[#Consulter-et-gérer-ses-validités-ou-celles-d'un-tiers|Accéder à l'interface de gestion des validités]]
<pre>max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)</pre>
*Par défaut le filtre ''Utilisateur'' est sélectionné sur ''Tous'' ce qui permet de visualiser toutes les validités que l'utilisateur peut certifier.


===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===
Il est possible de consulter et modifier les renseignements rentrés par les utilisateurs, dans le cas où les informations sont valides, l'utilisateur peut certifier la validité.
<pre>max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))</pre>
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===
Une fois certifiée, la validité reste encore visible 24h, ainsi il est encore possible de corriger la validité si une erreur apparaît.
<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===
Cette page est accessible en suivant le lien contenu dans [[Envoi-des-emails#E-mail-de-demande-de-certification-de-validité|l'e-mail de notification]] envoyé automatiquement aux utilisateurs disposant du [[Gestion-des-profils#Types-de-validités-que-l'utilisateur-peut-gérer-et-certifier|droit de certifier la validité concernée]].
<pre>max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))</pre>
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

Revision as of 15:05, 17 June 2025

Présentation

L'objet de cette page est de présenter l'utilisation des validités dans la version 4 d'OpenFlyers.

Il existe également une page qui traite du paramétrage des validités.

Définitions

Le terme validité est utilisé par OpenFlyers pour désigner tout ce qui peut constituer une attestation, autorisation, brevet, certificat, diplôme, échelon, expérience acquise, grade, licence, permis, qualification, etc.

Les types de validités permettent de définir des validités qui seront attribuées aux utilisateurs.

La détention par un utilisateur de validités requises peut être vérifié :

  • A la connexion de l'utilisateur
  • Lors d'une réservation faite pour un utilisateur par lui-même ou un autre utilisateur. OpenFlyers vérifie les validités de l'utilisateur concerné par la réservation.
  • Lors d'une saisie d'activité (par exemple lors de la saisie d'un vol pour l'aéronautique).

Documents-validités

Document associé à la validité d'un utilisateur et qui permet de démontrer la réelle détention de la validité par un utilisateur. Pour qu'un document soit associable à une validité, le type de validité doit avoir le paramètre Associer un document.

Pour un tel type de validité, la certification est en général activée pour permettre la validation du document par un gestionnaire.

Validité à échéance

Un type de validité est une validité à échéancelorsque le champ de paramétrage du type de validité Soumise à échéance est coché . Dans ce cas, la date d'échéance doit obligatoirement être renseignée lors de la création de la validité. Une fois cette date dépassée, l'utilisateur ne détient plus cette validité.

Validité à expérience

Un type de validité est une validité à expérience lorsque le champ de paramétrage du type de validité formule d'expérience contient une formule. Dans ce cas, la validité n'est pas attribuable à un utilisateur. C'est l'expérience de l'utilisateur, c'est à dire son activité passée vérifiée par la formule d'expérience, qui définit si l'utilisateur détient cette validité.

Validité à vendre

Une validité à vendre est une validité qui est couplée à un produit en vente.

Validité complète

Une validité est complète lorsque tous les points suivants sont réunis :

  • Si la date d'expiration est requise, elle doit être renseignée.
  • Si le code identifiant est requis, il doit être renseigné.
  • Si la date d'obtention est requise, elle doit être renseignée.
  • Si un document peut être associé, les pages obligatoires (s'il y en a) doivent être téléversées.

Validité contrat

Une validité contrat est un validité qui a été déclarée comme contrat. Un contrat est une validité avec un document défini, le but est de permettre de mettre en ligne un document que les utilisateurs doivent signer.

Un utilisateur qui n'a pas signé ses contrats ne peux pas se connecter. Il a la possibilité de signer ses contrats lors de ses tentatives de connexion.

Un contrat signé est stocké en base de données avec le nom et l'adresse IP du signataire ainsi que la date et l'heure de signature.

Suivre cette procédure pour mettre en place des contrats.

Voir également la procédure de signature des validités-contrats.

Alertes sur les validités

Alerte à la connexion

Les validités contrôlées à la connexion sont uniquement :

Ainsi, les validités sans échéance ne sont pas contrôlées.

OpenFlyers affiche un message d'alerte pour les validités dont la date d'échéance est expirée ou va expirer dans un délai inférieur à la période d'alerte définie dans la fiche utilisateur. L'utilisateur a la possibilité de cliquer sur la case à cocher "Ne plus le rappeler" afin de ne plus avoir de message de rappel. Dans ce cas, lors des connexions ultérieures, il n'aura plus de message de rappel. Il peut cependant réactiver cette alerte en la réactivant dans la colonne "Alertes" de la ligne correspondante dans Planning > Données > Personnelles > Validités. Cette réactivation est automatique lors d'une modification de la validité.

Alertes lors d'une réservation ou une saisie d'activité

Les alertes suivantes sont générées lors de la saisie d'une activité ou d'une réservation.

Les validités périmées apparaissent systématiquement lors de la saisie d'une réservation ou d'une activité comme à la connexion. Leur affichage ne dépend pas du type de ressource. C'est juste un rappel.

Ce rappel est notamment utile lorsqu'une personne effectue une réservation ou une saisie de vol pour le compte d'un tiers. Cela lui permet d'être informé et d'informer ce tiers de sa situation.

Alertes sur la page listant les validités d'un utilisateur

  • Alerte de cellule vide alors qu'elle devrait être remplie : la cellule affiche une bordure et un panneau rouges.
  • Alertes d'expiration

Email de rappel d'échéance de validité

Certifier des validités

La certification permet à une structure d'attester qu'une validité saisie dans OpenFlyers a été vérifiée.

Lorsqu'un document est associé à une validité, cela permet d'indiquer que le document a été vérifié et que les données saisies correspondantes à la validité sont conformes au document téléversé. Cela permet également d'indiquer que le document est valide.

Un document-validité peut être certifié de 2 façons :

  • Soit manuellement par un gestionnaire disposant des droits de certification du document
  • Soit par un robot dans le cas où le robot dispose d'un modèle du type de document à certifier.

Voir le paramétrage de la certification d'un type de validité pour définir les validités qui peuvent être certifiées et la colonne Types de validités que l'utilisateur peut gérer et certifier dans la gestion des profils pour définir ceux qui peuvent certifier.

Certification manuelle

Pré-requis

Pour pouvoir certifier une validité, un utilisateur doit disposer du droit de certifier la validité concernée

Procédure

Pour certifier manuellement une validité, il faut soit :

  • Passer par l'interface de gestion des validités en attente de certification :
    • Vérifier les informations des validités en attente, corriger si besoin
    • Quand une validités est conforme, cliquer sur certifier
  • Passer par le menu de gestion individuelle des validités des utilisateurs :
    • Aller sur la page de gestion des validités des utilisateurs dans Gestion > Utilisateurs > Actifs
    • Chercher l'utilisateur dont la validité est à certifier puis dans la colonne action cliquer sur l'icône "Editer les validités de l'utilisateur"
    • Sur la page qui s'ouvre, contrôler les informations de la validité puis cliquer sur le bouton dans la colonne "Certifier"

Certification automatique

Certification automatique à partir du numéro de licence délivré par la Fédération Française Aéronautique

Cette certification est active lorsque le type de validité est paramétré avec le type de certification Par API FFA.

Certification automatique

Lorsque la validité est nécessaire, à la connexion, lors de la réservation en solo ou lors d'une saisie d'activité en solo, si la validité n'est pas déjà certifiée ou si elle est périmée, le robot OpenFlyers interroge l'API SMILE FFA pour vérifier la validité de la licence.

Réactualisation manuelle

Il est possible de forcer la réactualisation de la certification en appuyant sur l'icône de mise à jour qui apparaît dans la colonne Actions de la liste des validités, cela permet d'appeler le robot OpenFlyers qui interroge l'API SMILE FFA pour vérifier la validité de la licence.

Le bouton n'est actif que si l'une des conditions suivantes est rencontrée :

  • La date d'échéance de la validité est dépassée
  • La date courante est supérieure ou égale au 1er octobre et l'année de la date d'échéance est l'année en cours
Interrogation de l'API SMILE FFA par le robot OpenFlyers
  • Après interrogation de l'API FFA, nous avons les cas suivants :
    • Si la licence est valide, le robot certifie automatiquement la validité en mettant à jour la date d'échéance au 31/12 de l'année renvoyée par l'API FFA.
    • Si la licence n'est pas valide :
      • Si une date d'échéance est fournie par API FFA, le robot certifie automatiquement la validité en mettant à jour la date d'échéance avec la date de fin indiquée dans la réponse.
      • Si non, le robot certifie automatiquement la validité en mettant à jour la date d'échéance au 31/12 de l'année la précédente.

Un document peut-être associé à la validité. Il n'est pas pris en compte pour la certification.

Certification automatique de l'attestation délivrée par la Fédération Française Aéronautique

Cette certification est active lorsque le type de validité est paramétré avec le type de certification Possible par robot (FFA).

Le robot d'OpenFlyers est capable d'analyser les fichiers PDF correspondant aux attestations de licence délivrées par la Fédération Française Aéronautique (FFA). Chaque pilote licencié à la FFA peut récupérer ce document sur le site web SMILE. Le robot extrait du document :

  • Le numéro de licence de l'utilisateur
  • Les noms et prénom de l'utilisateur
  • La date de naissance de l'utilisateur
  • La date de début de validité la licence FFA
  • La date de fin de validité de la licence FFA
  • La présence de l'assurance "Individuelle Accident de base" avec l'attribut "Oui"

Ces informations lui permettent de valider que le document est conforme et correspond à l'utilisateur pour qui le document a été téléversé. Il se base sur le nom et la date de naissance.

Lorsque la correspondance est établie, il met à jour la validité avec les données suivantes :

  • Le numéro de licence
  • La date de début de validité
  • La date de fin de validité

Quand un document est sélectionné les champs mis à jour disparaissent dans le formulaire de saisie, car les données seront extraite du document.

Licence de pilote privé (PPL)

(en développement)

La certification de ce type de validité n'est en fonction que lorsque la certification de ce type de validité est activé avec le choix Possible par OCR.

Un deuxième robot d'OpenFlyers permet d'analyser les fichiers PDF ou JPEG qui correspondent aux Licences de Pilote Privé (PPL).

Les champs détéctés par le robot sont :

  • Les noms et prénoms
  • Le numéro de la licence
  • L'intitulé de la licence
  • La date de validité de la licence

Déroulement de la procédure :

  • Quand un document est téléversé, la détéction commence automatiquement.
  • A l'issue du traitment, quatre champs remplis des données résultantes du traitement par le robot apparaîssent. Des boutons de confirmations apparaîssent aussi en dessous de chaque champ :
  • A ce stade, l'utilisateur est amené à effectuer certaines actions avant de pouvoir valider le formulaire de saisie. Il doit vérifier si les résultats sont correctes puis les confirmer ou les corriger sinon :
    • Si l'utilisateur corrige le champ, le bouton de confirmation est remplacé par le message "Vous avez corrigé ce champ".
    • Si l'utilisateur remet le résultat initial dans le champ, le bouton de confirmation réapparaît sous le champ à la place du message.
    • Si l'utilisateur est en train de modifier un champ, des points de suspension sont affichés en dessou du champ réspectif.

Les champs sont toujours modifiables. C'est-à-dire, l'utilisateur peut corriger un champ même après l'appui sur le bouton de confirmation.

Dans tous les cas, la validation du formulaire n'est possible que si l'utilisateur a corrigé ou validé tous les champs.

Consulter et gérer ses validités ou celles d'un tiers

L'interface de gestion des validités est accessible :

  • côté planning : Planning > Données > Personnelles > Validités
  • côté Gestion :
  • Gestion > Utilisateurs > Validités
  • Gestion > Utilisateurs > Actifs et cliquer sur l’icône représentant une check-list dans la colonne Actions.

Conditions pour consulter et gérer ses validités :

Conditions pour consulter et gérer les validités d'un tiers :

Il est possible d'afficher uniquement les validités nécessaires en sélectionnant un filtre :

Selecteur validités.png

Il est donc possible d'afficher uniquement :

  • les validités qui peuvent être certifiées
  • les validités effectives (prises en compte)

Si les validités de tous les utilisateurs sont affichées, il est possible d'afficher uniquement les validités d'un certain type grâce au sélecteur présent en haut à droite de la page. Si tous les types de validités sont affichés, alors il est uniquement possible d'afficher les validités qui peuvent être certifiées.

Pour renouveler une validité détenue, il faut éditer la validité en appuyant sur l'icône crayon qui apparaît dans la colonne Actions. Une fois sur le formulaire d'édition de la validité concernée un bouton Renouveler la validité est affiché. Cliquer dessus puis valider.

Lorsqu'un type de validité est configuré pour y associer un document, l'utilisateur peut téléverser un fichier. Une fois le fichier téléversé, il est téléchargeable.

Dans le tableau de la liste des validités, l'utilisateur concerné, peut voir qui et quand ont été certifiées ses validités. Il retrouve aussi les validités-contrats qu'il a signé à la connexion.

Si l'utilisateur peut gérer les validités de tiers, une liste déroulante Utilisateur apparaît au-dessus du tableau. Si la valeur Tous est sélectionné seules les validités à certifier sont affichées. De plus, une colonne Nom du titulaire est ajoutée et la colonne Alerte ? ainsi que le champ délai de prévenance sont cachés. Si on sélectionne un utilisateur autre que soi-même la colonne Alerte ? et le champ délai de prévenance sont cachés.

Remarques :

  • Les validités arrivées à échéance apparaissent sur fond orange.
  • Lorsqu'une validité n'est pas certifiée la cellule Etat de certification apparaît sur fond rouge.
  • La mise à jour de la date d'échéance d'une validité réactive automatiquement la cellule de la colonne Alertes ? si celle-ci n'est pas modifié lors de la saisie dans le formulaire.
  • Une validité-produit déjà détenue ne peut pas être supprimée.

Alertes d'expiration

Il existe deux types d'alertes liées à l'expiration d'une validité :

  • Lorsque la date limite d'une validité est bientôt atteinte, une alerte avant échéance apparaît. Celle-ci s'affiche sous la forme d'une cellule à bordure orange et contenant un panneau orange.
  • Lorsque la date limite d'une validité est dépassée, une alerte de validité expirée apparaît. Celle-ci s'affiche sous la forme d'une cellule à bordure et contenant un panneau rouges.

La case Alerte ? dans le formulaire de gestion d'une validité permet à un utilisateur d'activer ou désactiver les rappels à la connexion des validités arrivant à expiration ou ayant expiré.

Le délai de rappel des validités arrivant à expiration est visible dans le champ Délai de prévenance en semaines avant chaque échéance sous le tableau listant les validités d'un utilisateur. L'utilisateur connecté peut modifier son propre délai. Dans ce cas, ce champ affiche un menu déroulant dans lequel l'utilisateur connecté peut changer le délai. Par ailleurs, pour chaque activité, la case Alerte doit être cochée.

Ajouter une validité à un utilisateur

Si la validité est une validité à vendre, l'utilisateur sera automatiquement débité du montant correspondant. Les écritures comptables générées correspondantes sont validées. L'objectif est d'empêcher la réversibilité de cette opération par un utilisateur qui aurait souscrit à une validité. Cela permet de garantir la traçabilité des engagements.

Il est néanmoins possible de supprimer une validité à vendre indument attribuée.

Il est également possible de débrayer la vente an cliquant sur le toggle-switch Débrayer la vente afin que le compte ne soit pas débité. Cela nécessite d'avoir le droit de débrayage.

Téléverser un fichier

Lorsqu'un type de validité est configuré pour y associer un document, le téléversement des fichiers se fait comme suit :

  • L'utilisateur téléverse le fichier

Ensuite :

  • S'il s'agit d'un fichier image, il est stocké en base de données.
  • S'il s'agit d'un PDF contenant du texte, le PDF est stocké en base de données.
  • S'il s'agit d'un PDF qui contient une seule image, celle-ci est extraite du PDF et est stockée en base de données.
  • S'il s'agit d'un PDF qui contient plusieurs images, seule la première image est extraite du PDF et stockée en base de données.
  • Si le fichier est vide (ne contient ni texte ni image), une alerte utilisateur indiquant que le contenu du fichier est vide est affichée à l'écran. Le fichier ne peut pas être téléversé.

Dans un cas particulier où l'image encapsulée dans le PDF se compose de plusieurs masques transparents, OpenFlyers convertit l'ensemble de la page du PDF en une image jpeg. Dans le cas où plusieurs images sont encapsulées dans le fichier sur plusieurs pages, seule la première page est extraite.

Les fichiers téléversés sont stockés directement en base de données sous réserve d'être conforme aux règles de téléversement ci-dessous :

  • Formats des fichiers autorisés : GIF, JPEG, PNG et PDF. Si le fichier téléversé n'est pas dans l'un de ces formats, un message d'alerte correspondant s'affiche à l'écran.
  • Poids maximal autorisé au moment du téléversement : 10 Mo.
  • Poids maximal autorisé pour le stockage : 500 ko. Si le fichier téléversé dépasse les 500 Ko, il est redimensionné dans le cas où c'est une image. Si le fichier est toujours trop gros, alors il est refusé et le message d'alerte correspondant s'affiche.

Récapitulatif :

Traitement apres televersement.png

États de la validité

État de validité description
À échéance La validité est sur le point d'expirer et nécessite une mise à jour PendingExpirationValidity.png
Expirée La validité est périmée, elle n'est plus conforme et ne peut plus être utilisée ExpiredValidity.png
Non certifiée La validité n'a pas encore été validée officiellement et ne peut pas être utilisée NotCertifiedValidity.png
Prise en compte La validité est active et conforme, elle peut être utilisée sans restrictions EffectiveValidity.png
Provisoire un état temporaire où une ancienne version reste prise en compte en attendant la certification d'une nouvelle ProvisionalValidity.png

Modifier la validité d'un utilisateur

Note :

  • Avant de faire un enregistrement en base de données, OpenFlyers vérifie s'il y a des modifications par rapport au dernier enregistrement actif de la même validité pour le même utilisateur.
  • Les cellules non renseignées sont en rouges. Lors de l'édition via le formulaire, les champs associés sont également en surbrillance rouge.

Dans le cas d'une validité à vendre, la limite de validité n'est pas modifiable. Afin de l'augmenter, il faut passer par un renouvellement. Il est également possible de la modifier manuellement (à condition de disposer du droit de débrayage) en cliquant sur l'interrupteur Débrayer la vente.

Supprimer la validité d'un utilisateur


Dans le cas où la ligne de la validité concernée ne dispose pas de l'icône poubelle

Cela veut dire que la validité est à vendre. Il faut effectuer la procédure suivante :

Supprimer la vente de validité de façon temporaire :

  • Admin > Ventes > Produits > Validités à vendre
  • Repérer la ligne qui lie le type de validité concerné avec un produit
  • Copier la Formule de calcul de la date d'expiration de la ligne concernée et la coller dans un fichier texte temporaire pour la récupérer ultérieurement
  • Noter le nom du produit associé
  • Supprimer la ligne
  • Supprimer la validité de l'utilisateur concerné (cf. début de la présente procédure)

Remettre en place la vente du type de validité :

  • Admin > Ventes > Produits > Validités à vendre

Sur la dernière ligne :

  • Champ Validité : sélectionner le nom du type de validité concerné
  • Champ Produit : sélectionner le nom du produit associé
  • Champ Formule de calcul de la date d'expiration : recoller la formule de calcul
  • Cliquer le bouton Ajouter.

Contrôle des validités

Contrôle des validités à la connexion

Dès que l'utilisateur est identifié, un contrôle de ses validités est effectué. Les validités contrôlées sont uniquement celles que possède l'utilisateur et qui sont soumises à échéance (complète) ou les validités à expérience récente.

Le paramétrage du contrôle des validités s'effectue au travers de 2 champs :

  • le champ Alerte à la connexion qui définit le comportement que l'application OpenFlyers doit adopter à la connexion
  • le champ Soumise à échéance qui doit être attribué. S'il n'y a pas d'échéance, alors il n'y a pas de contrôle de validité de l'échéance à la connexion

Contrôle des validités lors de la saisie d'une réservation

Lors d'une réservation, OpenFlyers contrôle les validités détenues par la personne occupant la 1ère place dans la ressource et seulement s'il n'y a qu'une seule personne pour cette réservation. OpenFlyers vérifie également pour cette personne si des validités ne vont pas expirés avant la date de fin de la réservation. Les validités détenues doivent correspondre aux validités demandées pour le type de ressource correspondant à la ressource réservée et aux validités demandées pour les types d'activités sélectionnés.

Il y a 3 comportement possibles :

  • Pas de contrôle des validités.
  • Une alerte non bloquante dans le cas où il manque une ou plusieurs validités.
  • Une alerte bloquante dans le cas où il manque une ou plusieurs validités.

Il y a un paramétrage général qui définit si toute validité manquante doit entrainer un blocage. Si ce n'est pas le cas, alors cela dépend du paramétrage associé à chaque type de validité grâce à la case à cocher Validité bloquante pour la saisie des activités (si requise).

Le comportement est le même pour toutes les validités.

Contrôle des validités lors de la saisie d'une activité

Lors de la saisie d'une activité, OpenFlyers effectue 2 contrôles :

  1. S'il n'y a qu'une seule personne pour cette activité, le logiciel vérifie la présence des validités requises pour la ressource utilisée et les types d'activités sélectionnés. Il y a 2 comportements possibles pour chaque validité manquante :
    Il y a un paramétrage général qui définit si toute validité manquante doit entrainer un blocage. Si ce n'est pas le cas, alors cela dépend du paramétrage associé à chaque type de validité grâce à la case à cocher Validité bloquante pour la saisie des activités (si requise).
  2. OpenFlyers affiche une alerte pour les validités périmées comme à la connexion.

Débrayer la vente d'une validité

Débrayer la vente d'une validité consiste à modifier la date limite d'une validité sans déclencher de vente afin que l'utilisateur concerné ne soit pas débité.

Prérequis

Pour pouvoir débrayer la vente d'une validité, le gestionnaire doit disposer du droit débrayage des ventes de validités.

Procédure pour attribuer une nouvelle validité sans la vendre
  • Gestion > Utilisateurs > Utilisateurs > Validités
  • Sélectionner en haut à gauche, dans la liste des utilisateurs, l'utilisateur concerné
  • Sélectionner en haut à droite, dans la liste des validités, la validité à attribuer

Si la validité est une validité à vendre, alors apparait à côté de la liste, un interrupteur

  • Cliquer sur cet interrupteur Débrayer la vente

Le bouton Acheter se transforme en Ajouter

  • Cliquer sur le bouton Ajouter
  • Compléter le formulaire, notamment la Limite de validité
  • Cliquer sur le bouton Enregistrer
Procédure pour modifier la limite validité d'une validité déjà attribuée sans la vendre
  • Gestion > Utilisateurs > Utilisateurs > Validités
  • Sélectionner en haut à gauche, dans la liste des utilisateurs, l'utilisateur concerné

Les validités attribuées à l'utilisateur apparaissent

  • A droite de la ligne de la validité à modifier, cliquer sur le pictogramme avec le symbole de l'euro barré et un crayon

Le formulaire d'édition de la validité apparait

  • Modifier le champ Limite de validité
  • Cliquer sur le bouton Enregistrer

Historique des validités

Une validité possède un historique contenant tous les états par lesquels elle est passée. Chaque changement effectué sur une validité entraîne automatiquement une entrée dans l'historique.

L'historique d'une validité est conservé même si la validité est supprimée, il sera consultable si une nouvelle validité du même type est créée pour le même utilisateur.

Il est possible de consulter les anciens fichiers contenus par la validité mêmes s'ils ont été remplacés.

Les fichiers validités téléversés sont comparés. S'ils sont identiques, alors seul l'ancien fichier est conservé. Cela permet de limiter l'augmentation de la taille de la base de données.

Afficher l'historique des validités

Pour afficher l'historique des validité :

L'historique s'affiche chronologiquement, du changement le plus récent au plus ancien.

Lister les détenteurs d'un type de validité

  • Aller sur Admin > Utilisateurs > Types de validités
  • Cliquer sur l'icône symbolisant une liste dans la colonne Liste de la ligne correspondante à la validité concernée.

Le tableau liste les personnes ayant la validité correspondante.

Lorsque la validité est soumise à échéance, la liste fait ressortir en rouge sur fond gris les dates d'échéances périmées.

Lorsque la validité est une validité à expérience, la liste contient uniquement les utilisateurs remplissant les critères de la formule d'expérience.

Prise en compte d'une validité

Une validité prend effet lorsque tous les points suivants sont réunis :

  • La validité doit être complète.
  • Si une date d'expiration est présente, elle ne doit pas être dépassée.
  • Si la certification est possible, la validité doit être certifiée.

NB : Si la dernière validité enregistrée n'est pas prise en compte pour un utilisateur X et un type de validité Y, on vérifie dans l'historique s'il existe une validité qui est encore considérée comme valide pour la prendre en compte, on parle de validité provisoire.

Validités en attente de certification

Il est possible de consulter et modifier les renseignements rentrés par les utilisateurs, dans le cas où les informations sont valides, l'utilisateur peut certifier la validité.

Une fois certifiée, la validité reste encore visible 24h, ainsi il est encore possible de corriger la validité si une erreur apparaît.

Cette page est accessible en suivant le lien contenu dans l'e-mail de notification envoyé automatiquement aux utilisateurs disposant du droit de certifier la validité concernée.