<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://doc4-fr-mirror.openflyers.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Helyousfi</id>
	<title>Documentation de la solution web de gestion OpenFlyers - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://doc4-fr-mirror.openflyers.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Helyousfi"/>
	<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/Special:Contributions/Helyousfi"/>
	<updated>2026-05-26T17:10:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13627</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13627"/>
		<updated>2025-06-25T08:15:28Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 7 sans catégorie Compte produit ou compte de ressource */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; ou &amp;quot;compte de ressource&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; ou &amp;quot;compte de ressource&amp;quot;  comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13626</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13626"/>
		<updated>2025-06-25T08:02:38Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 7 sans catégorie Compte produit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; ou &amp;quot;compte de ressource&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13625</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13625"/>
		<updated>2025-06-25T08:02:25Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de catégorie Compte produit sans racine 7 ou compte de ressource */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; ou &amp;quot;compte de ressource&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13624</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13624"/>
		<updated>2025-06-25T08:01:24Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de catégorie Compte produit sans racine 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; ou &amp;quot;compte de ressource&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7 ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13623</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13623"/>
		<updated>2025-06-25T08:01:08Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 6 sans catégorie Compte de charge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge ou compte de ressource==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; ou &amp;quot;compte de ressource&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13622</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13622"/>
		<updated>2025-06-24T08:41:45Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de catégorie Compte produit sans racine 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte produit&amp;quot; mais dont le code d'export ne commence pas par 7.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 7.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13621</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13621"/>
		<updated>2025-06-24T08:39:25Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 6 sans catégorie Compte de charge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie.&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13620</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13620"/>
		<updated>2025-06-24T08:39:00Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 7 sans catégorie Compte produit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 7 mais qui ne sont pas catégorisés comme &amp;quot;Compte produit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''.&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Dans la colonne de droite, sélectionner &amp;quot;Compte produit&amp;quot; comme catégorie&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13619</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13619"/>
		<updated>2025-06-24T07:48:47Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de catégorie Compte de charge sans racine 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte.&lt;br /&gt;
*Modifier le code d'export pour qu'il commence par 6.&lt;br /&gt;
&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13618</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13618"/>
		<updated>2025-06-23T15:49:52Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Comptes de racine 6 sans catégorie Compte de charge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13617</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13617"/>
		<updated>2025-06-23T14:25:17Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Alertes liées à la cohérence des comptes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
==Comptes de catégorie Compte de charge sans racine 6==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs catégorisés comme &amp;quot;Compte de charge&amp;quot; mais dont le code d'export ne commence pas par 6.&lt;br /&gt;
==Comptes de racine 7 sans catégorie Compte produit==&lt;br /&gt;
==Comptes de catégorie Compte produit sans racine 7==&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13616</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13616"/>
		<updated>2025-06-23T14:23:07Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Principe de fonctionnement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
*Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
*Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13615</id>
		<title>Alertes de configuration</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Alertes-de-configuration&amp;diff=13615"/>
		<updated>2025-06-23T14:22:00Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Alertes liées à des ruptures d'intégrité de base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Présentation=&lt;br /&gt;
L'objet de cette page est de décrire les actions à entreprendre pour corriger les '''alertes de configuration''' qui peuvent apparaitre sur la [[Accueil|version 4 d'OpenFlyers]].&lt;br /&gt;
&lt;br /&gt;
Attention : dès qu'une nouvelle alerte apparait, il faut la prendre en compte et la traiter sans délai. En effet, bien souvent ces alertes peuvent être corrigées directement par un gestionnaire de la structure sans avoir à remonter le problème à l'équipe OpenFlyers. Cependant, si les écritures comptables ou d'activité liées à cette alerte ont été validées, alors vous êtes obligé de faire intervenir l'équipe OpenFlyers. Dans ce cas, le temps d'intervention pour la dé-validation des écritures concernées est soit facturé soit décompté de votre bonus assistance / développement.&lt;br /&gt;
&lt;br /&gt;
=[[Utilisation de la comptabilité#Mettre_à_jour_les_tarifs|Action annulée car il faut que chaque variable dispose d'une valeur antérieure à la date de début de l'exercice comptable]]=&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des absences de règles de tarification en base de données=&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol==&lt;br /&gt;
Tout vol génère une charge (essence, maintenance, etc.). De ce fait, tout vol doit généré un chiffre d'affaire. Même dans le cas où le coût du vol est supporté par la structure, comptablement ce vol doit générer une charge pour la structure.&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le paramétrage puisse avoir été mis en place en oubliant un cas et ainsi lorsqu'un tel vol est saisi, il n'y a pas de mouvement comptable qui est généré. Afin, de pouvoir identifier ces &amp;quot;trous&amp;quot; comptables, une alerte est générée côté admin pour les vols dont la date est postérieure à la date de début de l'exercice comptable en cours.&lt;br /&gt;
&lt;br /&gt;
Cette alerte peut aussi apparaître à la suite de cette opération :&lt;br /&gt;
* Désactivation de la gestion des comptes&lt;br /&gt;
* Saisie d'un vol. Vu que la gestion des comptes est désactivé, aucune mouvement comptable n'est généré pour le vol.&lt;br /&gt;
* Réactivation de la gestion des comptes&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, 2 cas possibles :&lt;br /&gt;
*Le vol n'a été validé : dans ce cas, il faut mettre en place (en général en demandant à l'équipe OpenFlyers) de vérifier les règles mises en place et de les compléter pour que ce cas soit traité. Une fois que les règles sont complétées, il suffit de re-saisir le vol.&lt;br /&gt;
*Le vol a été validé : dans ce cas, il n'est plus possible d'intervenir sur le vol. Par contre, il est possible de générer manuellement le flux manquant. Ensuite, il suffira d'attendre la clôture de la comptabilité pour que ce message disparaisse.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de mouvement comptable associé au vol créé par le boîtier d'interconnexion GPS/GSM dont le pilote n'est pas renseigné==&lt;br /&gt;
Lorsqu'un vol est récupéré via un boîtier d'interconnexion GPS/GSM ([[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]) et qu'il n'existe pas de correspondance dans notre base de données, le vol est créé sans pilote, ce qui empêche la génération automatique d'un mouvement comptable. Dans ce cas, il est nécessaire de vérifier le vol et de prendre l'une des deux actions suivantes :&lt;br /&gt;
&lt;br /&gt;
*Supprimer le vol s'il est dupliqué.&lt;br /&gt;
*Renseigner manuellement le pilote en modifiant l'activité.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à des ruptures d'intégrité de base de données=&lt;br /&gt;
Une rupture d'intégrité de base de données se produit lorsqu'une entrée dans une table de la base de données fait référence à une autre entrée dans cette même base de données et que cette entrée n'existe pas. Par extension, l'équipe de développement OpenFlyers inclut dans la famille des ruptures d'intégrité de base de données un mauvais enregistrement qui devrait être lié à une autre entrée mais que cette liaison n'existe pas soit du fait que logiciel a été mal programmé ou que la plateforme a été mal configurée. D'un point de vu utilisateur le résultat est le même : la base de données n'est pas &amp;quot;propre&amp;quot; et il faut y remédier.&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable x du ...==&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Comptes &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**la re-saisir en tant que vol&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Il n'y a pas de vol associé au mouvement comptable X (Probablement une duplication)==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable qui est identifiée comme liée à un vol mais qu'il n'y a pas de vol associé et qui pourrait faire doublon avec une autre écriture comptable liées à un vol.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Flux &amp;gt; Mouvements'''&lt;br /&gt;
*Modifier la période visible pour qu'elle corresponde à la date de l'écriture comptable en alerte&lt;br /&gt;
*Identifier l'écriture par son numéro de flux qui correspond au numéro indiqué dans l'alerte&lt;br /&gt;
*Noter tous les éléments concernant cette écriture. Le plus simple est d'[[Trucs-et-astuces#Effectuer-une-copie-d'écran|effectuer une copie d'écran]].&lt;br /&gt;
*Si l'écriture n'a pas été validée :&lt;br /&gt;
**il faut la supprimer&lt;br /&gt;
**vérifier que l'alerte à disparu&lt;br /&gt;
*Si l'écriture a été validée, il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers traite le problème. Si l'écriture est postérieure à la date de début du dernier exercice comptable en cours sur la plateforme OpenFlyers, alors il faudra demander la dé-validation de l'écriture pour pouvoir se retrouver dans le cas précédent. Si l'écriture est antérieure à l'exercice comptable en cours, alors 2 options sont possible :&lt;br /&gt;
**Supprimer l'écriture (en général ce n'est pas souhaitable car la comptabilité ayant été clôturé, cette écriture a été prise en compte)&lt;br /&gt;
**Changer la nature de l'écriture pour qu'elle n'apparaisse plus comme liée à un vol et qu'ainsi elle ne crée plus d'alerte.&lt;br /&gt;
C'est à vous à préciser votre souhait dans votre [[Rapporter un bug|rapport de bug]].&lt;br /&gt;
&lt;br /&gt;
==Le vol X est validé mais les écritures comptables du flux Y associées au vol ne sont pas validées==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparaît lorsqu'un vol est validé sans que ses écritures comptables ne le soient.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers intervienne en validant les écritures comptables associées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des entrées de la table flight_pilot qui pointent sur des vols absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre le détail d'un vol et un vol qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers nettoie la base de données en supprimant les entrées concernées.&lt;br /&gt;
&lt;br /&gt;
==Vous avez des flux qui pointent sur des comptes absents en base de données==&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsqu'une rupture d'intégrité apparait en base de données entre une écriture comptable et un compte qui n'existe plus.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème :&lt;br /&gt;
*Créer un compte de bilan intitulé &amp;quot;En attente d'affectation&amp;quot; et de code d'export &amp;quot;471&amp;quot;&lt;br /&gt;
*[[Rapporter un bug|Rapporter le problème]]&lt;br /&gt;
L'équipe OpenFlyers attribuera le compte &amp;quot;En attente d'affectation&amp;quot; en lieu et place du compte disparu.&lt;br /&gt;
&lt;br /&gt;
=Alertes liées à la cohérence des comptes=&lt;br /&gt;
Cette famille d'alertes permet de détecter des incohérences dans le paramétrage des comptes comptables. Ces alertes vérifient que la catégorie d'un compte correspond bien à la racine de son code d'export.&lt;br /&gt;
==Principe de fonctionnement==&lt;br /&gt;
Dans OpenFlyers, il existe une correspondance entre la racine du code d'export d'un compte et sa catégorie :&lt;br /&gt;
&lt;br /&gt;
Les comptes dont le code d'export commence par 6 doivent être catégorisés comme &amp;quot;Compte de charge&amp;quot;&lt;br /&gt;
Les comptes dont le code d'export commence par 7 doivent être catégorisés comme &amp;quot;Compte produit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La racine d'un compte d'export correspond au premier chiffre du code d'export. Par exemple, pour un compte d'export &amp;quot;6011&amp;quot;, la racine est &amp;quot;6&amp;quot;.&lt;br /&gt;
==Où consulter ces informations==&lt;br /&gt;
*Catégorie des comptes : '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous''', colonne de droite&lt;br /&gt;
*Code d'export : '''Gestion &amp;gt; Comptes &amp;gt; Comptes''' puis n'importe quel choix, 2ème colonne&lt;br /&gt;
==Où apparaissent ces alertes==&lt;br /&gt;
Ces alertes s'affichent dans les emplacements suivants :&lt;br /&gt;
&lt;br /&gt;
*Dans Gestion et dans Admin comme les autres alertes de configuration&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Edition &amp;gt; Compte de résultat'''&lt;br /&gt;
*Dans '''Gestion &amp;gt; Comptes &amp;gt; Gestion &amp;gt; Solder les comptes'''&lt;br /&gt;
==Comptes de racine 6 sans catégorie Compte de charge==&lt;br /&gt;
Cette alerte apparaît lorsqu'il existe des comptes actifs dont le code d'export commence par 6 mais qui ne sont pas catégorisés comme &amp;quot;Compte de charge&amp;quot;.&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Tous'''&lt;br /&gt;
*Identifier les comptes listés dans l'alerte&lt;br /&gt;
*Pour chaque compte concerné :&lt;br /&gt;
**Dans la colonne de droite, sélectionner &amp;quot;Compte de charge&amp;quot; comme catégorie&lt;br /&gt;
**Valider la modification&lt;br /&gt;
*Vérifier que l'alerte a disparu&lt;br /&gt;
&lt;br /&gt;
=Il y a des activités non validées qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des activités, tels que des vols, qui datent de plus de 30 jours et qui ne sont toujours pas validés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des activités, il faut valider ces activités en suivant la procédure [[Gestion-des-activités#Valider-une-activité|Valider une activité]].&lt;br /&gt;
&lt;br /&gt;
=Il y a des encaissements non pointés qui datent de plus de 30 jours=&lt;br /&gt;
Cette alerte s'affiche lorsqu'il existe des encaissements, qui datent de plus de 30 jours et qui ne sont toujours pas pointés.&lt;br /&gt;
&lt;br /&gt;
Afin d'éviter tout problème de modification intempestive des encaissements saisis, il faut les pointer en suivant la procédure [[Utilisation-de-la-comptabilité#Pointer-les-encaissements|Pointer les encaissements]].&lt;br /&gt;
&lt;br /&gt;
=La gestion des comptes est activée mais l'utilisateur X n'a pas de compte Y=&lt;br /&gt;
Cette alerte apparait lorsqu'un utilisateur a été créé et que le compte Y correspondant à l'un de ces profils n'est pas activé.&lt;br /&gt;
&lt;br /&gt;
Il faut [[Rapporter un bug|rapporter le problème]] pour prise en compte et en attendant sa correction, il est possible de contourner les conséquences de ce problème en créant manuellement les comptes concernés :&lt;br /&gt;
*'''Gestion &amp;gt; Comptes &amp;gt; Comptes &amp;gt; Utilisateurs'''&lt;br /&gt;
*Retrouver l'utilisateur concerné&lt;br /&gt;
*Cliquer sur l'icône symbolisant une &amp;quot;check&amp;quot; dans une pastille rouge correspondant à la ligne de l'utilisateur et à la colonne du compte concerné afin de l'activer.&lt;br /&gt;
&lt;br /&gt;
=La gestion des vols est activée mais l'autonomie n'est pas défini pour le type de ressource X=&lt;br /&gt;
Ce message d'erreur apparait lorsque un type de ressource a été créé sans définir d'autonomie.&lt;br /&gt;
&lt;br /&gt;
Cela se corrige en suivant la [[Gestion des ressources#Ajouter_un_type_de_ressource|procédure d'ajout de type de ressource]].&lt;br /&gt;
&lt;br /&gt;
=La plateforme a plus de 3 utilisateurs actifs avec un profil de niveau 6. Les utilisateurs concernés sont : XXX=&lt;br /&gt;
Cette alerte apparaît lorsque la plateforme dispose de plus de 3 utilisateurs actifs avec un profil de niveau 6. L'alerte liste les utilisateurs concernés.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans '''Admin &amp;gt; Utilisateurs › Profils'''&lt;br /&gt;
*Vérifier les profils ayant un [[Gestion-des-profils#Niveau-d'accréditation-des-droits-et-des-profils|niveau d'accréditation]] égal à 6.&lt;br /&gt;
*Le cas échéant retirer des droits à des profils qui n'ont pas vocation à avoir des droits de niveau 6. Cela peut permettre de diminuer le nombre d'utilisateurs ayant un profil de niveau 6.&lt;br /&gt;
*Aller dans '''Gestion &amp;gt; Utilisateurs &amp;gt; Utilisateurs &amp;gt; Actifs'''&lt;br /&gt;
*Retirer aux utilisateurs qui n'en n'ont pas besoin les profils de niveau 6, afin de réduire le nombre total d'utilisateurs ayant ce niveau d'accréditation à 3.&lt;br /&gt;
&lt;br /&gt;
=La plateforme est synchronisée avec un dispositif de géolocalisation, même si l'abonnement pour l'interconnexion avec le boîtier GPS/GSM n'est pas à jour=&lt;br /&gt;
Cette alerte apparaît lorsque l'abonnement d'interconnexion avec le boîtier GPS/GSM n'est pas réglé, alors que la plateforme a déjà au moins un boîtier de géolocalisation synchronisé: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]].&lt;br /&gt;
&lt;br /&gt;
La solution est de payer l'abonnement pour l'interconnexion avec le boîtier GPS/GSM.&lt;br /&gt;
&lt;br /&gt;
=Le formulaire de configuration de l'export aeral n'a pas été rempli ou sauvegardé=&lt;br /&gt;
Cette alerte apparaît lorsque le [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|formulaire du paramétrage d'export aeral]] n'a pas été rempli ou sauvegardé.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce probllème, il faut effectuer les actions correctives suivantes :&lt;br /&gt;
*Aller dans [[AERAL#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|Admin &amp;gt; Structure &amp;gt; Paramétrage &amp;gt; Export Aeral]].&lt;br /&gt;
*Vérifier que les paramètres renseignés sont conformes à la configuration de la plateforme OpenFlyers en s'aidant des consignes et copies d'écrans publiées dans [[#Admin-&amp;gt;-Structure-&amp;gt;-Paramétrage-&amp;gt;-Export-Aeral|ce chapitre]].&lt;br /&gt;
*Cliquer sur le bouton '''Enregistrer'''.&lt;br /&gt;
&lt;br /&gt;
=Le nombre de ressources actives, pour lesquelles l'activité peut être saisie et configurées pour la synchronisation avec un boîtier de géolocalisation a dépassé la limite autorisée par l'abonnement d'interconnexion avec le boîtier GPS/GSM=&lt;br /&gt;
Cette alerte apparaît lorsque :&lt;br /&gt;
&lt;br /&gt;
*L'abonnement d'interconnexion avec le boîtier GPS/GSM est déjà réglé.&lt;br /&gt;
*La synchronisation est effectuée pour au moins un boîtier de géolocalisation: [[Interfaçage-OpenFlyers-et-Charterware|Charterware]], [[Interfaçage-OpenFlyers-et-ClickAndTakeoff|clickAndTakeOff]] ou [[Interfaçage-OpenFlyers-et-Teltonika|Teltonika]]. &lt;br /&gt;
*Le nombre de ressources actives, configurées pour la saisie d'activité et ayant le champ '''Numéro de ressource API géolocalisation''' renseigné, dépasse le nombre de ressources autorisées par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
Pour résoudre ce problème, vider le champ '''Numéro de ressource API géolocalisation''' des ressources souhaitées afin de ne conserver que le nombre autorisé par l'abonnement.&lt;br /&gt;
&lt;br /&gt;
=Le produit XXX est sans type de vente=&lt;br /&gt;
&lt;br /&gt;
Ce message d'erreur apparaître quand un produit n'a pas de type de vente associé. Pour corriger cela, il faut [[Gestion-des-produits-et-des-ventes#Configuration|affecter un type de vente au produit signalé]].&lt;br /&gt;
&lt;br /&gt;
=Le type de paiement X est sans ventilation=&lt;br /&gt;
Cette alerte apparait lorsqu'il existe un type de paiement sans de ventilation associée.&lt;br /&gt;
&lt;br /&gt;
Il faut :&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|supprimer le type de paiement inutile]]&lt;br /&gt;
*soit [[Configuration-de-la-comptabilité#Types-d'encaissements|rajouter la ventilation]]&lt;br /&gt;
&lt;br /&gt;
=L'exercice comptable courant a plus d'un an=&lt;br /&gt;
Cette alerte apparait lorsque l'exercice comptable en cours date de plus de 400 jours, c'est à dire 35/36 jours après la fin d'un exercice comptable qui dure en général 1 an. Il a pour objectif de rappeler aux gestionnaires en charge du suivi de la comptabilité dans OpenFlyers qu'il leur faut [[Utilisation-de-la-comptabilité#Clôturer-l'exercice-comptable|procéder à la clôture de l'exercice comptable]].&lt;br /&gt;
&lt;br /&gt;
=L'identifiant admin n'a pas été supprimé=&lt;br /&gt;
Lors de l'installation d'openflyers, il n'y a dans la base de donnée qu'un seul utilisateur. Cet utilisateur possède tous les droits sur OF. Son nom est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; et son mot de passe est aussi &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;. Cela doit être bien entendu corrigé dès que possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:001_acceuil_postinstallation.jpg|page d'accueil avant modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
Pour corriger cela, connectez-vous avec l'identifiant et le mot de passe &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Actuellement l'interface n'affiche pas grand chose car aucune information n'a encore été renseignée dans le logiciel. Nous détaillerons plus loin cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:002_premiere_connection.jpg|page d'acceuil]]&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur le menu &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt;, ce lien vous permet d'accéder au centre de configuration d'openflyers, sélectionnez ensuite &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt; puis &amp;lt;tt&amp;gt;Utilisateurs&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:003_menu_utilisateur.jpg|page d'admin]]&lt;br /&gt;
&lt;br /&gt;
Actuellement le seul utilisateur c'est &amp;lt;tt&amp;gt;admin&amp;lt;/tt&amp;gt; ; nous allons modifier ce compte en cliquant sur l'icône crayon :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:004_admin_avant_modif.jpg|menu utilisateur]]&lt;br /&gt;
&lt;br /&gt;
Remplacez :&lt;br /&gt;
*l'identifiant&lt;br /&gt;
*le mot de passe utilisateur (les deux zones doivent identiques)&lt;br /&gt;
*le nom de l'utilisateur&lt;br /&gt;
*le prénom de l'utilisateur&lt;br /&gt;
*cochez le type d'utilisateur &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
*cochez le groupe &amp;lt;tt&amp;gt;standard&amp;lt;/tt&amp;gt;&lt;br /&gt;
Au bas du formulaire, utilisez le bouton &amp;lt;tt&amp;gt;validez&amp;lt;/tt&amp;gt; pour accepter ces modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:005_modif_admin.jpg|modification du compte admin]]&lt;br /&gt;
&lt;br /&gt;
=Une armoire à clés est paramétrée cependant la dernière synchronisation remonte à X=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme est paramétrée avec l'utilisation d'une armoire à clés et que cette armoire ne s'est pas connectée à la plateforme OpenFlyers depuis la date X :&lt;br /&gt;
*soit pour une demande de libération de clés dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]]&lt;br /&gt;
*soit pour une synchronisation dans le cas d'une [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]] ou d'une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]].&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte est donc une sécurité qui permet d'être alerté dans le cas où aucune communication ne s'est établie entre l'armoire et la plateforme depuis la date indiquée par le message d'alerte.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut :&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-Deister-commercialisées-par-OpenFlyers|armoire Deister]] faire une demande de libération de clés et vérifier que cette demande aboutie&lt;br /&gt;
*Pour une [[Contrôle-des-accès#Armoires-à-clés-KeyGard-anciennement-commercialisées-par-BKS-électronique|armoire KeyGard]] ou une armoire [[Contrôle-des-accès#Armoires-à-clés-FlogBox-anciennement-commercialisées-par-Francelog|armoire FlogBox]], il faut vérifier les fichiers de mise à jour de la base de données de l'armoire contenue sur le PC pilotant l'armoire et vérifier que la tâche de fond tourne toujours.&lt;br /&gt;
&lt;br /&gt;
=Utiliser correctement la fonctionnalité 'Importer les relevés bancaires par API' en prolongant l'agrégation des banques au-delà de 90 jours après la dernière date d'authentification=&lt;br /&gt;
Cette alerte apparait lorsque la plateforme a un ou plusieurs [[#Agréger-des-comptes-bancaires|comptes bancaires agrégés]] dont leurs dates d'authentification arrive à 30 jours ou moins de l'échéance (la dernière date d'authentification + 90 jours).&lt;br /&gt;
&lt;br /&gt;
Ce message d'alerte permet d'être alerté dans le cas où aucune [[Envoi-des-emails#E-mail-de-rappel-de-renouvellement-d'agrégation-bancaire|communication par email]]  ne s'est établie entre la plateforme et l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Pour faire disparaitre ce message d'alerte, il faut [[Configuration-de-la-comptabilité#Renouveler-l%27agrégation-des-comptes-bancaires|Renouveler l'agrégation des comptes bancaires]]&lt;br /&gt;
&lt;br /&gt;
=Vol X dans le futur au Y=&lt;br /&gt;
Cette alerte apparait lorsqu'il y a des vols dont la date de début est postérieure au lendemain.&lt;br /&gt;
&lt;br /&gt;
=Vous avez un ou plusieurs produits qui ont été validés mais dont les écritures ne le sont pas=&lt;br /&gt;
&lt;br /&gt;
Cette alerte apparait lorsque des produits ont été validés alors que les écritures ne l'ont pas été.&lt;br /&gt;
&lt;br /&gt;
A la suite de l'erreur est affiché le nombre de cas concernés et la date et heure du premier cas concerné.&lt;br /&gt;
&lt;br /&gt;
Il faut alors [[Rapporter un bug|rapporter le problème]] pour que l'équipe OpenFlyers le traite.&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13603</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13603"/>
		<updated>2025-06-16T09:55:47Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Email de rappel de solde pour une structure associative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13602</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13602"/>
		<updated>2025-06-16T09:55:22Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Email de rappel de solde pour une structure associative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&lt;br /&gt;
&lt;br /&gt;
Date d'envoi de l'e-mail : %NOW_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13601</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13601"/>
		<updated>2025-06-16T09:55:11Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Email de rappel de solde pour une structure associative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&lt;br /&gt;
&lt;br /&gt;
Date d’envoi de l'e-mail : %NOW_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13600</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13600"/>
		<updated>2025-06-16T09:55:03Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Email de rappel de solde pour une structure associative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&lt;br /&gt;
Date d’envoi de l'e-mail : %NOW_DATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13599</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13599"/>
		<updated>2025-06-16T09:54:38Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Email de rappel de solde pour une structure associative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date d’envoi de l'e-mail : %NOW_DATE&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
	<entry>
		<id>https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13598</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc4-fr-mirror.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13598"/>
		<updated>2025-06-16T09:53:33Z</updated>

		<summary type="html">&lt;p&gt;Helyousfi: /* Variables autorisées pour l'email de rappel de solde */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Fonctions==&lt;br /&gt;
&lt;br /&gt;
===abs(X)===&lt;br /&gt;
Retourne la valeur absolue de X&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(-200) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;abs(100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===changeTime('date', 'année', 'mois', 'jour', 'minute')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois, le jour et/ou les minutes&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss''' ou '''AAAA-MM-JJ'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois, le jour ou les minutes sont :&lt;br /&gt;
* 0 = L'année, le mois, le jour ou les minutes reste inchangé&lt;br /&gt;
* +X = L'année, le mois, le jour ou les minutes est augmenté de X&lt;br /&gt;
* -X = L'année, le mois, le jour ou les minutes est diminué de X&lt;br /&gt;
* X = L'année, le mois, le jour ou les minutes est placé sur X&lt;br /&gt;
** Les minutes sont placés à 0 si X est négatif&lt;br /&gt;
** Les minutes sont placés à 59 si X est supérieur à 59&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '0', '0' ) donne 2011-05-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&lt;br /&gt;
changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&lt;br /&gt;
changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&lt;br /&gt;
changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&lt;br /&gt;
changeTime( '2011-05-15 01:01:00', '0', '2', '-1', '50' ) donne 2011-02-14 01:50:00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===formatDate('patron', 'date')===&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('yyyy', '2015-03-01') donne 2015&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('MM', '2015-03-01') donne 03&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate('d', '2015-03-01') donne 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-01-01', %NOW_DATE ) donne le 1er janvier dans l'année en cours&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', %NOW_DATE ) donne le jour courant&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSex('person id')===&lt;br /&gt;
&lt;br /&gt;
Retourne un nombre correspondant au sexe de la personne :&lt;br /&gt;
* 0 pour un homme&lt;br /&gt;
* 1 pour une femme&lt;br /&gt;
* 2 lorsque ce n'est pas défini&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSex(1)&lt;br /&gt;
getSex(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour savoir si un utilisateur est une femme dans une règle de facturation des produits :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $reductionFemme : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getSumAccountBusinessField('business field id, 'person id', 'date')===&lt;br /&gt;
Retourne la somme des valeurs d'un [[Champs métiers|champ métier]] de catégorie &amp;quot;Ecriture comptable&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getSumAccountBusinessField(13, %PILOT, formatDate( 'yyyy-01-01', %NOW_DATE ) ) ? 100 : 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(%USER_ID, 1) donne 2014-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20, '2014-01-01') donne 2014-01-01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityExpiredDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityGrantedDate('person id', 'validity type id', 'optional default date')===&lt;br /&gt;
* 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.&lt;br /&gt;
* Dans les autres cas, Retourne &amp;quot;optional default date&amp;quot; ou &amp;quot;0000-00-00&amp;quot; si elle n'est pas renseignée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20, '2014-01-01') donne 2014-01-01 car il n'existe pas d'utilisateur avec un id 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;getValidityGrantedDate(0, 20) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getYearsFromDiffDate('first date', 'second date')===&lt;br /&gt;
&lt;br /&gt;
*Retourne la différence en année entre 2 dates&lt;br /&gt;
*La date est au format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS&lt;br /&gt;
*Quand la 2ème date n'est pas spécifiée, c'est la date du jour qui est utilisée&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;getYearsFromDiffDate( '1975-01-01', '2000-03-03') retourne 25&lt;br /&gt;
getYearsFromDiffDate( '1975-01-01' ) retourne 37&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id', 'check only holding')===&lt;br /&gt;
'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.&lt;br /&gt;
&lt;br /&gt;
*Si 'check only holding' n'est pas à 1 :&lt;br /&gt;
** Retourne '''1''' lorsque :&lt;br /&gt;
*** Si c'est une validité à formule d'expérience récente :&lt;br /&gt;
**** l'utilisateur a l'expérience requise&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** Si la validité n'est pas soumise à échéance alors l'utilisateur possède la validité&lt;br /&gt;
**** Si la validité est soumise à échéance alors l'utilisateur possède la validité et elle n'est pas encore expirée&lt;br /&gt;
** Retourne '''0''' dans les autres cas&lt;br /&gt;
*Si 'check only holding' est à 1 :&lt;br /&gt;
** 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)&lt;br /&gt;
** 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)&lt;br /&gt;
&lt;br /&gt;
===max(X,Y)===&lt;br /&gt;
Retourne le maximum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===min(X,Y)===&lt;br /&gt;
Retourne le minimum entre X et Y&lt;br /&gt;
&lt;br /&gt;
===roundCeil(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre supérieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,100) donne 200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(114,10) donne 120&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(106,5) return 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive à l'entier le plus proche avec 0.5 arrondi à 0 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.5,1) return 107&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour arrondir une valeur positive, avec 2 décimales, à l'entier le plus proche avec 0.5 arrondi à 1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(107.5-0.499,1) return 108&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===roundFloor(X,Y)===&lt;br /&gt;
Arrondi la valeur X au nombre inférieur multiple de l'unité Y le plus proche&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,100) donne 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(114,10) donne 110&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;roundFloor(106,5) donne 105&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec le patron &amp;quot;pattern&amp;quot;. Pour les motifs du patron, voir [[OF-doc-en::CommonFormula#sprintf_format|format de sprintf]].&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 5 caractères en ajoutant autant de zéro que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre pour qu'il ait 6 caractères en ajoutant autant d'espace que possible devant :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater le numéro de membre en format décimal avec 2 chiffres après la virgule :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;sprintf('%0.2f', %MEMBER_NUM) retourne 10.00 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===substr(string,a,b)===&lt;br /&gt;
Retourne l'extrait de chaîne de caractères &amp;quot;string&amp;quot; à partir du caractère &amp;quot;a&amp;quot;, 0 étant le 1er caractère et &amp;quot;b&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
&amp;lt;pre&amp;gt;substr('FIRST_NAME', 0, 5) returns FIRST&lt;br /&gt;
substr('FIRST_NAME', 0, -2) returns FIRST_NA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours sur les types de ressource 1 et 2&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Le total des heures de vol du premier pilote sur les 90 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightHour(%PILOT, 0, 90)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type' )===&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au 1er pilote, la position 1 au 2ème pilote.&lt;br /&gt;
&lt;br /&gt;
Si le type de vol n'est pas spécifié, le total est déterminé pour tous les types de vols.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, 2008, 01, 01, 00, 00, 0, 64 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur le type de vol 4 en tant que pilote en place gauche depuis 12 mois :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites en place gauche depuis le début de l'année :&lt;br /&gt;
&amp;lt;pre&amp;gt;sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*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 :&lt;br /&gt;
&amp;lt;pre&amp;gt;(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))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Retourne le total des heures faites sur l'année précédente :&lt;br /&gt;
&amp;lt;pre&amp;gt;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)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingByType(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'activity type')===&lt;br /&gt;
&lt;br /&gt;
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'.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si le type d'activité n'est pas spécifié, le total est déterminé pour tous les types d'activités.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* 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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, 2008, 01, 01, 00, 00, 0, 64) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages en tant que pilote en place gauche depuis le début de l'année&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingByType(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
* Si le pilote a fait plus de 5 atterrissages sur les 30 derniers jours sur le type de ressource 1&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,0,30,1) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si la personne en seconde place a fait plus de 5 atterrissages sur les 15 derniers jours&lt;br /&gt;
&amp;lt;pre&amp;gt;sumLandingNumber(%PILOT,1,15) &amp;gt; 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sumPreviousFlightTime('pilot id', 'position', 'day', 'endingDate', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
La position 0 correspond au premier pilote, la position 1 à la personne en seconde place.&lt;br /&gt;
&lt;br /&gt;
Si aucun type de ressource n'est spécifié, le total est déterminé pour tous les types de ressource.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;pre&amp;gt;sumPreviousFlightTime(%PILOT, 0, 365, %START_FLIGHT, 1, 2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtolower(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en minuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtolower('CamelBack') retourne &amp;quot;camelback&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===strtotime(string)===&lt;br /&gt;
convertir une chaîne de date/heure en un timestamp Unix.&lt;br /&gt;
&lt;br /&gt;
 strtotime('2023-08-07 15:30:00'); // Output: 1678351800&lt;br /&gt;
&lt;br /&gt;
===strtoupper(string)===&lt;br /&gt;
Retourne la chaine &amp;quot;string&amp;quot; en majuscule.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;strtoupper('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Formatage des dates et des heures==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
The count of pattern letters determine the format.&lt;br /&gt;
&lt;br /&gt;
(Text): 4 or more pattern letters--use full form, &amp;lt; 4--use short or abbreviated form if one exists.&lt;br /&gt;
&lt;br /&gt;
(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.&lt;br /&gt;
&lt;br /&gt;
(Text &amp;amp; Number): 3 or over, use text, otherwise use number.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.&lt;br /&gt;
&lt;br /&gt;
Syntax available:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Symbol!!Meaning!!Presentation!!Example&lt;br /&gt;
|-&lt;br /&gt;
|G||era designator||Text||AD&lt;br /&gt;
|-&lt;br /&gt;
|y||year||Number||1996&lt;br /&gt;
|-&lt;br /&gt;
|M||month in year||&amp;quot;MMM&amp;quot;: Text&amp;lt;br /&amp;gt;&amp;quot;MM&amp;quot; or &amp;quot;M&amp;quot; : Number||July&amp;lt;br /&amp;gt;07 or 7&lt;br /&gt;
|-&lt;br /&gt;
|d||day in month||Number||10&lt;br /&gt;
|-&lt;br /&gt;
|h||hour in am/pm (1~12)||Number||12&lt;br /&gt;
|-&lt;br /&gt;
|H||hour in day (0~23)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|m||minute in hour||Number||30&lt;br /&gt;
|-&lt;br /&gt;
|s||second in minute||Number||55&lt;br /&gt;
|-&lt;br /&gt;
|S||millisecond||Number||978&lt;br /&gt;
|-&lt;br /&gt;
|E||day in week||Text||Tuesday&lt;br /&gt;
|-&lt;br /&gt;
|e||dow (=day of week: 1 = sunday, 2 = monday, )||(Number)||2 (=monday)&lt;br /&gt;
|-&lt;br /&gt;
|D||day in year||Number||189&lt;br /&gt;
|-&lt;br /&gt;
|F||day of week in month||Number||2 (2nd Wed in July)&lt;br /&gt;
|-&lt;br /&gt;
|w||week in year||Number||27&lt;br /&gt;
|-&lt;br /&gt;
|W||week in month||Number||2&lt;br /&gt;
|-&lt;br /&gt;
|a||am/pm marker||Text||PM&lt;br /&gt;
|-&lt;br /&gt;
|k||hour in day (1~24)||Number||24&lt;br /&gt;
|-&lt;br /&gt;
|K||hour in am/pm (0~11)||Number||0&lt;br /&gt;
|-&lt;br /&gt;
|z||time zone||Text||Pacific Standard Time&lt;br /&gt;
|-&lt;br /&gt;
|'||escape for text||Delimiter||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;||single quote||(Literal)||'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples Using the local unit system:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Format Pattern!!Result&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyy.MM.dd G 'at' HH:mm:ss z&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.07.10 AD at 15:08:56 PDT&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;EEE, MMM d, 'yy&amp;quot;&amp;lt;/nowiki&amp;gt;||Wed, July 10, '96&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;KK:mm a, z&amp;quot;&amp;lt;/nowiki&amp;gt;||00:08 AM, PST&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h:mm a&amp;quot;&amp;lt;/nowiki&amp;gt;||12:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;h 'o''clock' a, zzzz&amp;quot;&amp;lt;/nowiki&amp;gt;||12 o'clock PM, Pacific Daylight Time&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;yyyyy.MMMMM.dd GGG h:mm aaa&amp;quot;&amp;lt;/nowiki&amp;gt;||1996.July.10 AD 0:08 PM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;&amp;quot;dd/MMM/yyyyy HH:mm&amp;quot;&amp;lt;/nowiki&amp;gt;||10/07/1996 00:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests conditionnels==&lt;br /&gt;
===Opérateur == ===&lt;br /&gt;
&amp;lt;pre&amp;gt;(getSex(%USER_ID) == 1) ? $womanReduction : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur OR===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 OR test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 || test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Opérateur AND===&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 AND test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur OpenFlyers 4.0 et au-dessus il est aussi possible d'utiliser :&lt;br /&gt;
&amp;lt;pre&amp;gt;( test1 &amp;amp;&amp;amp; test2 ) ? true-case : false-case&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_BALANCE===&lt;br /&gt;
Solde de compte&lt;br /&gt;
&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_ARRIVAL===&lt;br /&gt;
&lt;br /&gt;
Terrain d'arrivée du vol&lt;br /&gt;
&lt;br /&gt;
===%AIRFIELD_DEPARTURE===&lt;br /&gt;
&lt;br /&gt;
Terrain de départ du vol&lt;br /&gt;
&lt;br /&gt;
===%AUTHENTICATION_LOGIN===&lt;br /&gt;
Identifiant utilisateur&lt;br /&gt;
&lt;br /&gt;
===%AUTO_INCREMENT===&lt;br /&gt;
Valeur auto-incrémentale&lt;br /&gt;
&lt;br /&gt;
===%BOOKING_START_DATE===&lt;br /&gt;
Date de début d'une réservation.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_ARRIVAL===&lt;br /&gt;
Compteur arrivé saisi dans le formulaire.&lt;br /&gt;
&lt;br /&gt;
===%COUNTER_DEPARTURE===&lt;br /&gt;
Compteur départ saisi dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%DURATION===&lt;br /&gt;
Durée du vol&lt;br /&gt;
&lt;br /&gt;
===%EXTRAFIELDxx===&lt;br /&gt;
Permet de récupérer le contenu d'un champ métier.&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
*xx = numéro d'identifiant du champ métier. Exemple : %EXTRAFIELD12&lt;br /&gt;
*Pour les formules de facturation, seuls les champs métiers de type de valeur suivants sont acceptés :&lt;br /&gt;
**Nombre entier&lt;br /&gt;
**Nombre entier unique&lt;br /&gt;
**Nombre à virgule&lt;br /&gt;
*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 :&lt;br /&gt;
**Utilisateur (PERSON)&lt;br /&gt;
**Ressource (RESOURCE)&lt;br /&gt;
**Réservation (BOOKING)&lt;br /&gt;
&lt;br /&gt;
===%FIRSTNAME===&lt;br /&gt;
Prénom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%LASTNAME===&lt;br /&gt;
Nom de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
===%PILOT===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
* d'email d'alerte de solde&lt;br /&gt;
* d'expérience récente&lt;br /&gt;
* de facturation des activités et dans ce cas, c'est l'id de l'utilisateur en première place&lt;br /&gt;
&lt;br /&gt;
===%PILOT2===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur en seconde place. Cette variable est utilisable que dans les formules de facturation des activités.&lt;br /&gt;
&lt;br /&gt;
===%MEMBER_NUM===&lt;br /&gt;
Numéro de membre&lt;br /&gt;
&lt;br /&gt;
===%NOW_DATE===&lt;br /&gt;
Date courante au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_ID===&lt;br /&gt;
Id de la ressource.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules de :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
&lt;br /&gt;
===%RESOURCE_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_ARRIVAL&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de fin saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;s&amp;gt;%TIME_DEPARTURE&amp;lt;/s&amp;gt;===&lt;br /&gt;
&amp;lt;s&amp;gt;Heure de début saisie dans le formulaire&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol ou date d'achat de produit au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Par exemple : 2015-03-31 14:20:03&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
Id de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cette variable est utilisable dans les formules :&lt;br /&gt;
*[[#Compte-d'export|Compte d'export]]&lt;br /&gt;
*[[#Date-d'expiration|Date d'expiration]]&lt;br /&gt;
*[[#Expérience-récente|Expérience récente]]&lt;br /&gt;
*[[#Facturation|Facturation des produits]]&lt;br /&gt;
&lt;br /&gt;
==Variables associées aux formules de facturation==&lt;br /&gt;
Les variables associées aux formules de facturation sont utilisables uniquement dans les formules de facturation.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-Charterware#Paramétrage-des-arrondis|Charterware]]=&lt;br /&gt;
&lt;br /&gt;
=[[Interfaçage-OpenFlyers-et-ClickAndTakeoff#Paramétrage-des-arrondis|ClickAndTakeoff]]=&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf('pattern',_'string')|sprintf]]&lt;br /&gt;
*[[#substr(string,a,b)|substr]]&lt;br /&gt;
*[[#strtolower(string)|strtolower]]&lt;br /&gt;
*[[#strtoupper(string)|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.RESOURCE_ID|%RESOURCE_ID]]&lt;br /&gt;
*[[#.RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.USER_ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul du compte d'export==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable centre&amp;quot;&lt;br /&gt;
!Formule de calcul!!Usage!!Exemples de génération&lt;br /&gt;
|-&lt;br /&gt;
|411+%ACCOUNT_TYPE||Comptes ressources et utilisateurs||4110002, 4110005&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTHENTICATION_LOGIN||Comptes utilisateurs||411pdupont '''c'est le modèle recommandé par OpenFlyers et proposé par défaut pour les comptes utilisateurs'''&lt;br /&gt;
|-&lt;br /&gt;
|411+%AUTO_INCREMENT||Comptes ressources et utilisateurs||41100001, 41100002, ...., 4110000x&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME||Comptes utilisateurs||411dupont, 411dupond&lt;br /&gt;
|-&lt;br /&gt;
|411+%LASTNAME+substr(%FIRSTNAME,0,1)||Comptes utilisateurs||411dupontp, 411dupontf&lt;br /&gt;
|-&lt;br /&gt;
|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&lt;br /&gt;
|-&lt;br /&gt;
|411+sprintf('%03s', %USER_ID)||Comptes utilisateurs||411001, 411002, etc.&lt;br /&gt;
|-&lt;br /&gt;
|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.&lt;br /&gt;
|-&lt;br /&gt;
|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'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
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]].&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#formatDate('patron',_'date')|formatDate]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
===Dans 3 mois===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime(%NOW_DATE, '0', '+3', '0' ))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue===&lt;br /&gt;
Cette formule permet de vendre une validité (par exemple une carte de réduction) valable 1 an.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, XX) ? getValidityExpiredDate(%USER_ID, XX) : %NOW_DATE ), '+1', '0', '0' ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante===&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fin de l'année courante pour une première attribution ou fin de l'année suivante pour un renouvellement===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous, il faut remplacer XX par l'id du type de validité dont on vérifie le renouvellement ou non :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-12-31', hasValidity(%USER_ID, XX) ? changeTime(%NOW_DATE, '+1', 0, 0) : %NOW_DATE )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Email de rappel de solde=&lt;br /&gt;
Voir également :&lt;br /&gt;
*Chapitre [[Envoi-des-emails#E-mail-de-rappel-de-solde|Email de rappel de solde]] dans la page [[Envoi des emails]]&lt;br /&gt;
*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é]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour l'email de rappel de solde==&lt;br /&gt;
*[[#.ACCOUNT-BALANCE|%ACCOUNT_BALANCE]]&lt;br /&gt;
*[[#.FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons d'emails de rappel de solde==&lt;br /&gt;
===Email de rappel de solde pour une structure associative===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher adhérent,&lt;br /&gt;
&lt;br /&gt;
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 €.&lt;br /&gt;
&lt;br /&gt;
Pensez à anticiper avant votre prochain vol. &lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
L'équipe de l'Aéroclub.&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Email de rappel de solde pour une structure professionnelle===&lt;br /&gt;
&amp;lt;pre&amp;gt;Cher client,&lt;br /&gt;
&lt;br /&gt;
En date du %NOW_DATE, 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 €.&lt;br /&gt;
&lt;br /&gt;
Nous vous remercions par avance pour la régularisation de votre compte.&lt;br /&gt;
&lt;br /&gt;
Le service comptable&lt;br /&gt;
----------&lt;br /&gt;
Le contrôle de votre compte et l'envoi de ce message sont effectués de façon automatique&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate]]&lt;br /&gt;
*[[#sumFlightHour('pilot_id',_'position',_'day',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime(.25PILOT,_'year',_'month',_'day',_'hour',_'minute',_'position',_'flight_type'_)|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingByType(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'activity-type')|sumLandingByType]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot_id',_'position',_'day',_'endingDate',_'aircraft_type_1'_,_'aircraft_type_2',_'aircraft_type_X')|sumPreviousFlightTime]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.USER-ID|%USER_ID]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
===Calcul d'expérience récente uniquement si l'utilisateur dispose d'une autre validité===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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é.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(hasValidity(%USER_ID, 40) AND ( sumFlightHour(%PILOT, 0, 90, 1) + sumFlightHour(%PILOT, 1, 90, 1) &amp;lt; 1 ))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Expérience récente en heures ou la détention d'une validité spécifique===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité spécifique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Ainsi, 17999 doit être remplacé par le résultat du calcul 600 * X - 1 où X est le nombre d'heures requis.&lt;br /&gt;
&lt;br /&gt;
===Type d'activité X dans les 12 derniers mois===&lt;br /&gt;
L'exemple suivant vérifie si un utilisateur a effectué une activité d'un type X donné dans les 365 derniers jours.&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type d'activité donné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;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 ) &amp;gt; 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Validités à expérience récente pour le LAPL et l'ABL===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour le LAPL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements&lt;br /&gt;
**12 heures de vols&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
Voici la formule à expérience récente '''12 mouvements dans les 24 mois (LAPL)''' qui permet d'afficher une alerte pour les pilotes :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( ( getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=2) AND (( sumLandingNumber(%PILOT, 0, 730) + sumLandingNumber(%PILOT, 1, 730) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont le LAPL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;( (getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE) &amp;gt;= 2) AND (( sumFlightHour(%PILOT, 0, 730) + sumFlightHour(%PILOT, 1, 730) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0) ) ? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;LAPL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Remarque : pour être pertinente, la validité &amp;quot;Expérience récente extérieure&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Pour l'ABL :&lt;br /&gt;
*Pendant les 24 premiers mois suivant son obtention, ce brevet est valide.&lt;br /&gt;
*Au-delà de 24 mois, pour rester valide, un pilote doit justifier avoir effectué, dans les 24 mois précédents de :&lt;br /&gt;
**12 mouvements en tant que commandant de bord&lt;br /&gt;
**12 heures de vols en tant que commandant de bord&lt;br /&gt;
**1 vol d'au moins une heure d'instruction en tant qu'élève&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 mouvements dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 12) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
*Qui ont l'ABL depuis plus de 24 mois&lt;br /&gt;
*ET qui n'ont pas les '''12 heures dans les 730 derniers jours'''&lt;br /&gt;
*ET qui n'ont pas une validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;((getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXXXX, formatDate( 'yyyy-MM-dd', %NOW_DATE )), %NOW_DATE)&amp;gt;=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 ) ) &amp;lt; 7200) AND (hasValidity(%PILOT, YYYYYY) == 0))? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dans cette formule, il faut remplacer :&lt;br /&gt;
*XXXXXX par l'id du type de validité &amp;quot;ABL&amp;quot;&lt;br /&gt;
*YYYYYY par l'id du type de validité &amp;quot;Expérience récente extérieure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Visite médicale depuis moins d'un an===&lt;br /&gt;
Certaines assurances peuvent exiger que le pilote effectuant des activités spécifiques dispose d'une aptitude médicale de moins d'un an.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut mettre en place un type de validité &amp;quot;Visite médicale&amp;quot; avec la saisie de la date d'obtention.&lt;br /&gt;
&lt;br /&gt;
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é &amp;quot;Visite médicale&amp;quot; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;(getYearsFromDiffDate(getValidityGrantedDate(%PILOT, XXXX), %NOW_DATE)&amp;gt;=1)? 0 : 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des activités=&lt;br /&gt;
Outre les définitions toujours valides pour le calcul du temps d'activité, voici d'autres définitions :&lt;br /&gt;
''A rédiger''&lt;br /&gt;
&lt;br /&gt;
Voir [http://doc-en.openflyers.com/index.php?title=AdminDoc2.1 Formules en anglais]&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%PILOT, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%PILOT, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%PILOT, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER-ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER-DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.PILOT|%PILOT]]&lt;br /&gt;
*[[#.PILOT2|%PILOT2]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation==&lt;br /&gt;
===Motoplaneur : facturation à l'heure de vol ET à l'utilisation du moteur===&lt;br /&gt;
Pour cela, on suppose que les compteurs sont utilisés et qu'ils prennent en compte le temps d'utilisation du moteur :&lt;br /&gt;
 %DURATION * $FLIGHT_HOUR_PRICE + (%COUNTER_ARRIVAL - %COUNTER_DEPARTURE) * $ENGINE_HOUR_PRICE&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le compte pilote a un solde positif===&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$S le solde positif qui doit être atteint pour bénéficier de la réduction&amp;lt;br&amp;gt;&lt;br /&gt;
$R le montant horaire de la réduction obtenue dans ce cas&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil((((getBalance(%PILOT)&amp;gt;$S ? ($C2-$R) : $C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le pilote a fait au moins 16 heures depuis le 1er janvier de l'année===&lt;br /&gt;
$montantRemise correspond au montant de la réduction à appliquer&lt;br /&gt;
&amp;lt;pre&amp;gt;(sumFlightTime(%PILOT, formatDate('yyyy', %NOW_DATE), 1, 1, 00, 00, 0) &amp;gt; 15599) ? $montantRemise : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait après une certaine heure===&lt;br /&gt;
&lt;br /&gt;
$C2 concerne le tarif horaire de l'avion&amp;lt;br&amp;gt;&lt;br /&gt;
$C2R concerne le tarif horaire réduit de l'avion après une certaine heure&amp;lt;br&amp;gt;&lt;br /&gt;
659 correspond à 06:59 en temps UTC&amp;lt;br&amp;gt;&lt;br /&gt;
Dans ce cas la formule considère que dès 700, la réduction s'applique.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 roundCeil(((((formatDate('hmm',%START_DATE)&amp;gt;659)?$C2R:$C2)*%DURATION/600)-0.5),1)&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction lorsque le vol se fait un jour de la semaine en dehors des mois de juillet et août===&lt;br /&gt;
$C1R concerne le tarif de la réduction&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (formatDate('e', %START_DATE) &amp;gt; 1) AND (formatDate('e', %START_DATE) &amp;lt; 7) AND ((formatDate('MM', %START_DATE) &amp;lt; 7) OR (formatDate('MM', %START_DATE) &amp;gt; 8)) ) ? $C1R : 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aéronautique : réduction pour un jeune===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Prix unitaire hors-taxe / TVA''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%PILOT), %NOW_DATE ) &amp;gt; 20)? 0 : $remiseSoloJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formule à mettre dans le champ '''Formule :''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;%CURRENT_QUANTITY * %CURRENT_UNIT_PRICE / 600&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Facturation des produits=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
&lt;br /&gt;
*[[#abs(X)|abs(X)]]&lt;br /&gt;
*[[#changeTime('date',-'année',-'mois',-'jour',-'minute')|changeTime]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#convertTimezone.28.25SOME_DATE.2C_.25SOME_TZ1.2C_.25SOME_TZ2.29|convertTimezone]]&lt;br /&gt;
*[[#formatDate('patron',-'date')|formatDate('pattern',%SOME_DATE)]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBalance(U,option-B)|getBalance(U,[option-B])]]&lt;br /&gt;
*[[OF-doc-en:CommonFormula#getBirthdate('person-id')|getBirthdate('person id')]]&lt;br /&gt;
*[[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')]]&lt;br /&gt;
*[[#getSumAccountBusinessField('business-field-id,-'person-id',-'date')|getSumAccountBusinessField]]&lt;br /&gt;
*[[#getValidityExpiredDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityExpiredDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getValidityGrantedDate('person-id',-'validity-type-id',-'optional-default-date')|getValidityGrantedDate('person id', 'valididty type id', 'default optional date')]]&lt;br /&gt;
*[[#getYearsFromDiffDate('first-date',-'second-date')|getYearsFromDiffDate('first date', 'second date')]]&lt;br /&gt;
*[[#hasValidity('user-id',-'validity-type-id',-'check-only-holding')|hasValidity('person id', 'valididty type id')]]&lt;br /&gt;
*[[#max(X,Y)|max(X,Y)]]&lt;br /&gt;
*[[#min(X,Y)|min(X,Y)]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil(X,Y)]]&lt;br /&gt;
*[[#sumFlightTime(.PILOT,-'year',-'month',-'day',-'hour',-'minute',-'position',-'flight-type'-)|sumFlightTime(%USER_ID, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type')]]&lt;br /&gt;
*[[#sumFlightHour('pilot-id',-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumFlightHour(%USER_ID, 'position', 'day','aircraft type')]]&lt;br /&gt;
*[[#sumLandingNumber(.PILOT,-'position',-'day',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumLandingNumber(%USER_ID, 'position', 'day', 'aircraft type')]]&lt;br /&gt;
*[[#sumPreviousFlightTime('pilot-id',-'position',-'day',-'endingDate',-'aircraft-type-1'-,-'aircraft-type-2',-'aircraft-type-X')|sumPreviousFlightTime(%USER_ID, 'position', 'day', '%START_FLIGHT', 'flight type')]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la facturation des produits==&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT1|%ACCOUNT1]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNT2|%ACCOUNT2]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ACCOUNTING_START_DATE|%ACCOUNTING_START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_QUANTITY|%CURRENT_QUANTITY]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.CURRENT_UNIT_PRICE|%CURRENT_UNIT_PRICE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.ENTITY_TZ|%ENTITY_TZ]]&lt;br /&gt;
*[[#.EXTRAFIELDxx|%EXTRAFIELDxx]]&lt;br /&gt;
*[[#.NOW-DATE|%NOW_DATE]]&lt;br /&gt;
*[[#.START-DATE|%START_DATE]]&lt;br /&gt;
*[[OF-doc-en::CommonFormula#.USER_TZ|%USER_TZ]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la facturation des produits==&lt;br /&gt;
===Facturation de la cotisation au prorata de l'année civile===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 - (formatDate('D', %NOW_DATE) / formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) ) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où ''formatDate('D', formatDate( 'yyyy-12-31', %NOW_DATE ) )'' permet de connaitre le nombre de jours dans l'année (365 ou 366).&lt;br /&gt;
&lt;br /&gt;
===Remise sur cotisation jeune en calculant l'âge par rapport à la date du jour ou à dans un an===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? %NOW_DATE : changeTime(%NOW_DATE, '+1', 0, 0) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===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===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Dans la formule ci-dessous :&lt;br /&gt;
*La variable $remiseCotisationJeune doit être définie avec un montant de remise à appliquer&lt;br /&gt;
*25 doit être remplacé par l'âge limite permettant de bénéficier de la remise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;(getYearsFromDiffDate( getBirthdate(%USER_ID), ( (formatDate('MM', %NOW_DATE)&amp;lt;10) ? formatDate( 'yyyy-01-01', %NOW_DATE ) : formatDate( 'yyyy-01-01', changeTime(%NOW_DATE, '+1', 0, 0) ) ) ) &amp;gt; 25)? 0 : $remiseCotisationJeune&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Temps d'activité=&lt;br /&gt;
Pour calculer le temps d'une activité (exemple : vol), les règles diffèrent selon les structures.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
==Définition Unité sexacentimal==&lt;br /&gt;
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 =&amp;gt; 60). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
*1 heure = 600 sexacentièmes&lt;br /&gt;
*1 minute = 10 sexacentièmes&lt;br /&gt;
*5 minutes = 50 sexacentièmes&lt;br /&gt;
*6 minutes = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
*1 centième de minute = 6 sexacentièmes&lt;br /&gt;
*10 centième de minute (=1 dixième de minute) = 60 sexacentièmes&lt;br /&gt;
&lt;br /&gt;
Exemples de formules :&lt;br /&gt;
*pour arrondir à 5 minutes : roundCeil(X,50)&lt;br /&gt;
*pour arrondir à 10 centièmes : roundCeil(X,60)&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#abs(X)|abs]]&lt;br /&gt;
*[[#max(X,Y)|max]]&lt;br /&gt;
*[[#min(X,Y)|min]]&lt;br /&gt;
*[[#roundCeil(X,Y)|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.AIRFIELD-ARRIVAL|%AIRFIELD_ARRIVAL]]&lt;br /&gt;
*[[#.AIRFIELD-DEPARTURE|%AIRFIELD_DEPARTURE]]&lt;br /&gt;
*[[#.COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.DURATION|%DURATION]]&lt;br /&gt;
*[[#.TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.TIME_DEPARTURE|%TIME_DEPARTURE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul du temps d'activité==&lt;br /&gt;
===Durée saisie===&lt;br /&gt;
&amp;lt;pre&amp;gt;%DURATION&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs saisis===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Durée saisie arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%DURATION, 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 centièmes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 minutes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs plus 5 ou 10 minutes selon l'aérodrome de départ===&lt;br /&gt;
Si l'aérodrome de départ est LFBD, on rajoute 10 minutes à la différence des compteurs, sinon on rajoute 5 minutes :&lt;br /&gt;
&amp;lt;pre&amp;gt;%COUNTER_ARRIVAL - %COUNTER_DEPARTURE + ( (%AIRFIELD_DEPARTURE=='LFBD')? 100 : 50 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie au 5 minutes les plus proches plus 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 25, 50) + 50&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Différence des compteurs arrondie à 10 centièmes===&lt;br /&gt;
&amp;lt;pre&amp;gt;roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 60)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION,roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée du vol et la différence des compteurs moins 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(%DURATION, %COUNTER_ARRIVAL - %COUNTER_DEPARTURE - 50)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Le plus grand entre la durée saisie, arrondie à 5 minutes, et la différence des compteurs, arrondie à 5 minutes===&lt;br /&gt;
&amp;lt;pre&amp;gt;max(roundCeil(%DURATION,50),roundCeil(%COUNTER_ARRIVAL - %COUNTER_DEPARTURE, 50))&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cette formule calcule :&lt;br /&gt;
*la différence des compteurs et l'arrondi à 5 minutes&lt;br /&gt;
*la valeur de la durée de vol saisie par le pilote et l'arrondi à 5 minutes&lt;br /&gt;
Puis elle prend le plus grand des deux&lt;/div&gt;</summary>
		<author><name>Helyousfi</name></author>
	</entry>
</feed>