<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://doc2-fr.openflyers.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcheng</id>
		<title>Documentation de la solution web de gestion OpenFlyers version 2 - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://doc2-fr.openflyers.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcheng"/>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/Sp%C3%A9cial:Contributions/Jcheng"/>
		<updated>2026-04-30T20:21:15Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Structure-de-la-base-de-donn%C3%A9es&amp;diff=14198</id>
		<title>Structure de la base de données</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Structure-de-la-base-de-donn%C3%A9es&amp;diff=14198"/>
				<updated>2017-06-08T11:22:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : Page créée avec « =Structure=  &amp;lt;sql&amp;gt;CREATE TABLE IF NOT EXISTS `account` (   `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,   `creation_date` date DEFAULT NULL,   `name` text CHARACTER SET... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Structure=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sql&amp;gt;CREATE TABLE IF NOT EXISTS `account` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `creation_date` date DEFAULT NULL,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `export_account` text CHARACTER SET latin1,&lt;br /&gt;
  `activated` int(1) DEFAULT '1',&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of account';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_aircraft` (&lt;br /&gt;
  `account_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `aircraft_id` int(11) DEFAULT NULL,&lt;br /&gt;
  `account_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`account_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of aircraft accounts';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_aircraft_type` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `activated` tinyint(1) NOT NULL DEFAULT '1',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='account aircraft type description';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_club` (&lt;br /&gt;
  `account_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `payment_allowed` tinyint(1) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`account_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of club accounts';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_entry` (&lt;br /&gt;
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `double_entry_id` int(11) DEFAULT NULL,&lt;br /&gt;
  `account_date` datetime DEFAULT NULL,&lt;br /&gt;
  `account_id` int(11) DEFAULT NULL,&lt;br /&gt;
  `credit` decimal(15,2) DEFAULT '0.00',&lt;br /&gt;
  `debit` decimal(15,2) DEFAULT '0.00',&lt;br /&gt;
  `payment_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `payment_description` text CHARACTER SET latin1,&lt;br /&gt;
  `person_delivery_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `comments` text CHARACTER SET latin1,&lt;br /&gt;
  `validated` int(1) DEFAULT '0',&lt;br /&gt;
  `exported` int(1) DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY (`id`),&lt;br /&gt;
  KEY `idx_account_date` (`account_date`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of account entries';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_member` (&lt;br /&gt;
  `account_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `member_id` int(11) DEFAULT NULL,&lt;br /&gt;
  `account_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`account_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of member accounts';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `account_member_type` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `activated` tinyint(1) NOT NULL DEFAULT '1',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of account member types';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `callsign` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `comments` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `non_bookable` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `ref_date` datetime DEFAULT NULL,&lt;br /&gt;
  `ref_hours` int(11) DEFAULT NULL,&lt;br /&gt;
  `inspection_date` datetime DEFAULT NULL,&lt;br /&gt;
  `inspection_time` int(11) DEFAULT NULL,&lt;br /&gt;
  `interval_visit` int(11) UNSIGNED DEFAULT '30000',&lt;br /&gt;
  `tolerance_time` int(11) UNSIGNED DEFAULT '6000',&lt;br /&gt;
  `last_counter` int(11) DEFAULT NULL,&lt;br /&gt;
  `activated` tinyint(1) UNSIGNED DEFAULT '1',&lt;br /&gt;
  `time_alert1` int(11) DEFAULT '6000',&lt;br /&gt;
  `time_alert2` int(11) DEFAULT '0',&lt;br /&gt;
  `time_alert3` int(11) DEFAULT '0',&lt;br /&gt;
  `day_alert1` smallint(3) DEFAULT '15',&lt;br /&gt;
  `day_alert2` smallint(3) DEFAULT '0',&lt;br /&gt;
  `day_alert3` smallint(3) DEFAULT '8',&lt;br /&gt;
  `non_flightable` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`),&lt;br /&gt;
  UNIQUE KEY `CALLSIGN` (`callsign`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='ALL AIRCRAFTS OF ALL AIRCLUBS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft_type` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `admin_desc` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `seats_available` tinyint(3) UNSIGNED DEFAULT '1',&lt;br /&gt;
  `comments` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `flight_time_formula` varchar(255) CHARACTER SET latin1 DEFAULT '%DURATION',&lt;br /&gt;
  `counter_state` tinyint(2) NOT NULL DEFAULT '-1',&lt;br /&gt;
  `tolerance` int(11) DEFAULT '0',&lt;br /&gt;
  `autonomy` int(11) DEFAULT '5990',&lt;br /&gt;
  `activated` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',&lt;br /&gt;
  `digit_counter_number` tinyint(1) UNSIGNED NOT NULL DEFAULT '4',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Types of aircraft';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft_type_allowed_function` (&lt;br /&gt;
  `aircraft_type_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `place_num` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `function_id` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of allowed functions for each aircraft type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft_type_mandatory_flight_type` (&lt;br /&gt;
  `aircraft_type_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `flight_type_id` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of compulsory flight type for each aircraft type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft_type_qualif` (&lt;br /&gt;
  `aircraft_type_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `check_num` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `qualification_id` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Types of qualif required for each aircraft type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `aircraft_type_uncomp_flight_type` (&lt;br /&gt;
  `aircraft_type_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `flight_type_id` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of uncompatible flight type for each aircraft type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `authentication` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` varchar(255) NOT NULL,&lt;br /&gt;
  `password` varchar(255) NOT NULL,&lt;br /&gt;
  `first_name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `last_name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `profile` mediumint(8) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `view_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `view_width` tinyint(3) UNSIGNED NOT NULL DEFAULT '12',&lt;br /&gt;
  `view_height` tinyint(4) UNSIGNED NOT NULL DEFAULT '30',&lt;br /&gt;
  `aircrafts_viewed` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `inst_viewed` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `email` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `timezone` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `address` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `zipcode` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `city` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `state` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `country` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `home_phone` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `work_phone` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `cell_phone` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `lang` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `notification` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `activated` tinyint(1) UNSIGNED DEFAULT '1',&lt;br /&gt;
  `birthdate` datetime DEFAULT '0000-00-00 00:00:00',&lt;br /&gt;
  `sex` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `nationality` char(2) DEFAULT NULL,&lt;br /&gt;
  `total_flight_time` int(10) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `date_total_flight_time` datetime DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`),&lt;br /&gt;
  UNIQUE KEY `idx_name` (`name`)&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='used for authentication';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `balance` (&lt;br /&gt;
  `account_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `balance_date_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `debit` decimal(15,2) DEFAULT '0.00',&lt;br /&gt;
  `credit` decimal(15,2) DEFAULT '0.00',&lt;br /&gt;
  PRIMARY KEY (`account_id`,`balance_date_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `balance_date` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `balance_date` datetime DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `booking` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `start_date` datetime DEFAULT NULL,&lt;br /&gt;
  `end_date` datetime DEFAULT NULL,&lt;br /&gt;
  `aircraft_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `member_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `slot_type` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `instructor_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `free_seats` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `comments` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `airfield` varchar(6) DEFAULT NULL,&lt;br /&gt;
  `estimated_duration` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='RECORDS ALL THE SLOTS OF ALL AIRCRAFTS OF ALL AIRCLUBS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `club` (&lt;br /&gt;
  `id` int(10) NOT NULL DEFAULT '0',&lt;br /&gt;
  `name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `info_cell` text,&lt;br /&gt;
  `logo` longblob,&lt;br /&gt;
  `logo_name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `logo_ext` varchar(25) DEFAULT NULL,&lt;br /&gt;
  `logo_size` int(11) DEFAULT NULL,&lt;br /&gt;
  `first_hour_displayed` time DEFAULT NULL,&lt;br /&gt;
  `last_hour_displayed` time DEFAULT NULL,&lt;br /&gt;
  `usual_profiles` mediumint(8) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `icao` varchar(6) DEFAULT NULL,&lt;br /&gt;
  `default_slot_range` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `min_slot_range` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `twilight_range` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `mailing_list_name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `mailing_list_type` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `club_site_url` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `default_timezone` varchar(255) NOT NULL,&lt;br /&gt;
  `lang` varchar(255) NOT NULL,&lt;br /&gt;
  `admin_num` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mail_from_address` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `default_view_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `address` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `zipcode` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `city` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `state` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `country` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `phone` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `fax` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `email` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `default_notification` int(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `welcome_cell` text,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='DESCRIPTION OF ALL AIRCLUBS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `criteria` (&lt;br /&gt;
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `label` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `predicate` text CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `default_display` (&lt;br /&gt;
  `authentication_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `display_key` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',&lt;br /&gt;
  `display_value` text CHARACTER SET latin1,&lt;br /&gt;
  PRIMARY KEY (`authentication_id`,`display_key`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `exceptionnal_inst_date` (&lt;br /&gt;
  `instructor_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `start_date` datetime DEFAULT NULL,&lt;br /&gt;
  `end_date` datetime DEFAULT NULL,&lt;br /&gt;
  `presence` tinyint(1) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `favorite_icao` (&lt;br /&gt;
  `icao` varchar(6) NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`icao`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='favorite airfield list';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `fhp_aircraft_type` (&lt;br /&gt;
  `fhp_id` int(10) DEFAULT NULL,&lt;br /&gt;
  `aircraft_type_id` int(10) DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='flight hour pricing aircraft type list';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `fhp_flight_type` (&lt;br /&gt;
  `fhp_id` int(10) DEFAULT NULL,&lt;br /&gt;
  `flight_type_id` int(10) DEFAULT NULL,&lt;br /&gt;
  `excluded` tinyint(1) UNSIGNED DEFAULT '0'&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='flight hour pricing flight type list';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `fhp_member_pool` (&lt;br /&gt;
  `fhp_id` int(10) DEFAULT NULL,&lt;br /&gt;
  `member_pool_id` int(10) DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='flight hour pricing flight type list';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `aircraft_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `start_date` datetime DEFAULT NULL,&lt;br /&gt;
  `duration` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `flight_type_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `people_onboard` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `airfield_departure` varchar(6) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `airfield_arrival` varchar(6) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `counter_departure` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `counter_arrival` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `landing_number` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `comments` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `airborne` tinyint(1) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `validated` tinyint(3) UNSIGNED DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of flight';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_account_entry` (&lt;br /&gt;
  `flight_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `account_entry_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY (`flight_id`,`account_entry_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='flight account entry join';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_hours_pricing` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `price_formula` text CHARACTER SET latin1,&lt;br /&gt;
  `price_sentence` text CHARACTER SET latin1,&lt;br /&gt;
  `left_account_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `right_account_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `left_account_type` tinyint(1) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `right_account_type` tinyint(1) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `member_debited` tinyint(1) UNSIGNED DEFAULT '1',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of flight hours pricing formula';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_pilot` (&lt;br /&gt;
  `flight_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `pilot_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `function_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `num` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`flight_id`,`pilot_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of crew for each flight';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_tank_qty` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `flight_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `tank_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `quantity` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '0.00',&lt;br /&gt;
  `after_flight` tinyint(1) NOT NULL DEFAULT '0',&lt;br /&gt;
  `account_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `pay_type` tinyint(1) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_type` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of flight type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `flight_type_mandatory_qualification` (&lt;br /&gt;
  `flight_type_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `qualification_id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY (`flight_type_id`,`qualification_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of mandatory qualification for each flight type';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `icao` (&lt;br /&gt;
  `name` varchar(64) DEFAULT NULL,&lt;br /&gt;
  `icao` varchar(6) NOT NULL,&lt;br /&gt;
  `lat` float DEFAULT NULL,&lt;br /&gt;
  `lon` float DEFAULT NULL,&lt;br /&gt;
  `alt` smallint(6) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`icao`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='airfields coord';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `instructor` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `sign` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='LIST INSTRUCTORS AND THEIR AUTORIZATIONS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `ip_stopped` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `ip` varchar(255) NOT NULL,&lt;br /&gt;
  `counter` tinyint(1) UNSIGNED NOT NULL,&lt;br /&gt;
  `expire_date` datetime NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='BLACKLISTED IP';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `journal` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `login` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `date_log` datetime DEFAULT NULL,&lt;br /&gt;
  `rights` text CHARACTER SET latin1,&lt;br /&gt;
  `rights2` text CHARACTER SET latin1,&lt;br /&gt;
  `is_member` tinyint(1) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `is_instructor` tinyint(1) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `action` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`),&lt;br /&gt;
  KEY `idx_date_log` (`date_log`),&lt;br /&gt;
  KEY `idx_action` (`action`(8))&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='list of logs';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `key_assignment` (&lt;br /&gt;
  `key_id` tinyint(2) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `key_name` tinytext CHARACTER SET latin1,&lt;br /&gt;
  `aircraft_id` int(10) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `key_state` tinyint(1) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `key_word` bigint(20) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`key_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='key assignment description';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `key_host` (&lt;br /&gt;
  `id` tinyint(2) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `timeout` tinyint(2) UNSIGNED NOT NULL DEFAULT '10',&lt;br /&gt;
  `num_key` tinyint(2) UNSIGNED NOT NULL DEFAULT '10',&lt;br /&gt;
  `ipkey` varchar(50) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `httpport` varchar(4) CHARACTER SET latin1 NOT NULL DEFAULT '4080',&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='key host configuration';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `log` (&lt;br /&gt;
  `journal_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `action` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `table_name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `field_name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `field_value` text CHARACTER SET latin1,&lt;br /&gt;
  KEY `journal_id` (`journal_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='part of logs';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `login_stopped` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `login` varchar(255) NOT NULL,&lt;br /&gt;
  `counter` tinyint(3) UNSIGNED NOT NULL,&lt;br /&gt;
  `expire_date` datetime NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='BLACKLISTED LOGIN';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `member` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `member_num` int(11) DEFAULT NULL,&lt;br /&gt;
  `subscription` date NOT NULL DEFAULT '2003-12-31',&lt;br /&gt;
  `qualif_alert_delay` tinyint(3) UNSIGNED NOT NULL DEFAULT '8',&lt;br /&gt;
  `inscription_date` date DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='ALL MEMBERS OF ALL AIRCLUBS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `member_awaiting_activation` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `login` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `ip` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `code` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `category` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `member_pool` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `required_account_type` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='List of member pool';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `member_pool_join` (&lt;br /&gt;
  `member_pool_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `member_id` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Correspondance between pools and members';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `member_qualif` (&lt;br /&gt;
  `member_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `qualif_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `expire_date` date DEFAULT NULL,&lt;br /&gt;
  `no_alert` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `ident_value` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `grant_date` date DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`member_id`,`qualif_id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='QUALIFICATIONS OF EACH MEMBER';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `nationality` (&lt;br /&gt;
  `code` char(2) NOT NULL DEFAULT '',&lt;br /&gt;
  `label` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`code`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `parameter` (&lt;br /&gt;
  `code` varchar(255) NOT NULL,&lt;br /&gt;
  `enabled` tinyint(1) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `int_value` int(10) UNSIGNED DEFAULT '0',&lt;br /&gt;
  `char_value` varchar(255) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`code`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='APPLICATION PARAMETERS';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `payment_distribution` (&lt;br /&gt;
  `payment_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `account_club_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `person_delivery` tinyint(1) UNSIGNED DEFAULT '0'&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='payment distribution description';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `payment_type` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` text CHARACTER SET latin1,&lt;br /&gt;
  `text_field_label` text CHARACTER SET latin1,&lt;br /&gt;
  `supplier` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `only_admin` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='type of payment description';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `pilot_function` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `abbrev` varchar(10) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `name` varchar(100) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of functions for pilot';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `pricing_value` (&lt;br /&gt;
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `variable_id` int(11) NOT NULL,&lt;br /&gt;
  `assign_value` decimal(10,2) NOT NULL,&lt;br /&gt;
  `start_date` datetime NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `pricing_variable` (&lt;br /&gt;
  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `variable` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `label` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `profile` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `name` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `permits` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `permits2` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `psp_transaction` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `credit_account_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `debit_account_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `transaction_date` datetime NOT NULL,&lt;br /&gt;
  `amount` float NOT NULL,&lt;br /&gt;
  `description` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `payment_type_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `state` int(10) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `bank_answer` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  `bank_misc` varchar(255) CHARACTER SET latin1 DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `qualification` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `name` varchar(255) NOT NULL,&lt;br /&gt;
  `time_limitation` tinyint(1) NOT NULL DEFAULT '0',&lt;br /&gt;
  `ident_value_enable` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `grant_date_enable` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `is_for_instructor` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `mandatory` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',&lt;br /&gt;
  `experience_formula` varchar(255) DEFAULT NULL,&lt;br /&gt;
  `order_num` int(11) DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='QUALIFICATIONS LIST';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `regular_presence_inst_date` (&lt;br /&gt;
  `instructor_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `start_day` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `end_day` tinyint(3) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `start_hour` time DEFAULT NULL,&lt;br /&gt;
  `end_hour` time DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `sale` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `entry_id` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `unit_price` float DEFAULT NULL,&lt;br /&gt;
  `quantity` float DEFAULT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of sales';&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `tank` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
  `aircraft_type_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `tank_type_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `unit_id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `label` varchar(255) CHARACTER SET latin1 NOT NULL,&lt;br /&gt;
  PRIMARY KEY (`id`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;&lt;br /&gt;
 &lt;br /&gt;
CREATE TABLE IF NOT EXISTS `uncomp_flight_type` (&lt;br /&gt;
  `id1` int(10) UNSIGNED DEFAULT NULL,&lt;br /&gt;
  `id2` int(10) UNSIGNED DEFAULT NULL&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='List of sales';&amp;lt;/sql&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Accueil&amp;diff=14197</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Accueil&amp;diff=14197"/>
				<updated>2017-06-08T11:21:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Documentation Webmasters et Développeurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:2013-OF4-launch.gif|right|link=OF_doc4-fr:Montée-de-version]]&lt;br /&gt;
&lt;br /&gt;
Bienvenue sur la documentation de la '''version 1''' d'OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Cette version est obsolète. Les versions en vigueurs sont les versions 3 et 4.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez retrouver leur documentation sur les pages suivantes :&lt;br /&gt;
*[[OF_doc3-fr:Accueil|Documentation OpenFlyers version 3]]&lt;br /&gt;
*[[OF_doc4-fr:Accueil|Documentation OpenFlyers version 4]]&lt;br /&gt;
&lt;br /&gt;
You can also access to our [[OF_doc-en:Main-Page2|english documentation]].&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*[[FAQ client|FAQ clients]]&lt;br /&gt;
*[[FAQ utilisateur|FAQ utilisateur]]&lt;br /&gt;
*[[FAQ administrateur 2.0|FAQ administrateur version 2.0]]&lt;br /&gt;
*[[FAQ administrateur|FAQ administrateur]]&lt;br /&gt;
*[[FAQ comptabilité|FAQ comptabilité]]&lt;br /&gt;
*[[FAQ export]]&lt;br /&gt;
*[[FAQ AeroBox]]&lt;br /&gt;
&lt;br /&gt;
=Documentation Administrateurs=&lt;br /&gt;
*[[Documentation administrateur|Documentation administrateur]]&lt;br /&gt;
*[[Liste de diffusion|Gérer une liste de diffusion sur OpenFlyers]]&lt;br /&gt;
*[[Formules de calcul|Formules de calcul]]&lt;br /&gt;
&lt;br /&gt;
==Comptabilité==&lt;br /&gt;
*[[Use-Accounting2.1|Utilisation de la comptabilité sur version 2.1]]&lt;br /&gt;
&lt;br /&gt;
===Facturation client===&lt;br /&gt;
*[[Gestion des ventes|Gestion des ventes version]]&lt;br /&gt;
&lt;br /&gt;
===FAQ comptabilité===&lt;br /&gt;
*[[FAQ comptabilité|FAQ comptabilité version]]&lt;br /&gt;
&lt;br /&gt;
==Maintenance==&lt;br /&gt;
*[[Maintenance aéronautique|Maintenance aéronautique]]&lt;br /&gt;
*[[Suivi de navigabilité|Suivi de la navigabilité]]&lt;br /&gt;
&lt;br /&gt;
===Requêtes permettant de générer des rapports===&lt;br /&gt;
*[[OF_doc-en::Export generator 2.0|Génération d'export version 2.0]]&lt;br /&gt;
*[[OF_doc-en::Export generator 2.1|Génération d'export version]]&lt;br /&gt;
&lt;br /&gt;
=Documentation Utilisateurs=&lt;br /&gt;
*[[Documentation utilisateur 2.0|Documentation utilisateur version 2.0]]&lt;br /&gt;
*[[Documentation utilisateur|Documentation utilisateur]]&lt;br /&gt;
&lt;br /&gt;
=[[OF_wiki:|Documentation Webmasters et Développeurs]]=&lt;br /&gt;
*[[Contrôle d'identification par OpenFlyers pour un logiciel tiers]]&lt;br /&gt;
*[[Structure de la base de données]]&lt;br /&gt;
&lt;br /&gt;
=[[BTS|Rapporter des bugs]]=&lt;br /&gt;
&lt;br /&gt;
=[[Trucs et astuces|Trucs et astuces]]=&lt;br /&gt;
==[[Kiosque PC|Mettre en place un PC kiosque]]==&lt;br /&gt;
==[[Réseau Internet hybride|Mettre en place un réseau internet hybride]]==&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Fichier:Joomla_authentication_plugin.zip&amp;diff=14186</id>
		<title>Fichier:Joomla_authentication_plugin.zip</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Fichier:Joomla_authentication_plugin.zip&amp;diff=14186"/>
				<updated>2016-06-16T07:31:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=14088</id>
		<title>WIKI</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=14088"/>
				<updated>2016-03-07T12:03:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Inter-lien!!URL Wiki!!Exemple&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-de||https://doc-de.openflyers.com||[[OF_doc-de:Hauptseite]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-en||https://doc-en.openflyers.com||[[OF_doc-en:Main-Page]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-es||https://doc-es.openflyers.com||[[OF_doc-es:Página-principal]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc1-fr||https://doc1-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc2-fr||https://doc2-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc3-fr||https://doc3-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc4-fr||https://doc4-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_wiki||https://wiki.openflyers.org||[[OF_wiki:Main-Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-en||http://en.wikipedia.org||[[Wikipedia-en:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-es||http://es.wikipedia.org||[[Wikipedia-es:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-fr||http://fr.wikipedia.org||[[Wikipedia-fr:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=14080</id>
		<title>WIKI</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=14080"/>
				<updated>2016-03-02T14:17:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Inter-lien!!URL Wiki!!Exemple&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-de||http://doc-de.openflyers.com||[[OF_doc-de:Hauptseite]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-en||http://doc-en.openflyers.com||[[OF_doc-en:Main-Page]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-es||http://doc-es.openflyers.com||[[OF_doc-es:Página-principal]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-fr||http://doc-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc1-fr||http://doc1-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc2-fr||http://doc2-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc3-fr||http://doc3-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc4-fr||http://doc4-fr.openflyers.com||[[OF_doc-fr:Accueil]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_wiki||http://wiki.openflyers.org||[[OF_wiki:Main-Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-en||http://en.wikipedia.org||[[Wikipedia-en:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-es||http://es.wikipedia.org||[[Wikipedia-es:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-fr||http://fr.wikipedia.org||[[Wikipedia-fr:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Utilisateur:Jcheng&amp;diff=14070</id>
		<title>Utilisateur:Jcheng</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Utilisateur:Jcheng&amp;diff=14070"/>
				<updated>2016-03-02T10:27:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : Page créée avec « 2 »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=13853</id>
		<title>WIKI</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=WIKI&amp;diff=13853"/>
				<updated>2016-02-15T14:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Inter-lien!!URL Wiki!!Exemple&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-de||http://doc-de.openflyers.com||[[OF_doc-de:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-en||http://doc-en.openflyers.com||[[OF_doc-en:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-es||http://doc-es.openflyers.com||[[OF_doc-es:P%C3%A1gina_principal]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_doc-fr||http://doc-fr.openflyers.com||[[OF_doc-fr:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|OF_wiki||http://wiki.openflyers.org||[[OF_wiki:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-en||http://en.wikipedia.org||[[Wikipedia-en:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-es||http://es.wikipedia.org||[[Wikipedia-es:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Wikipedia-fr||http://fr.wikipedia.org||[[Wikipedia-fr:Main_Page]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13794</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13794"/>
				<updated>2016-01-11T08:41:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* getSex('person id') */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&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;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&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''' lorsque :&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** L'utilisateur possède la validité&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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.25USER_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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#min.28X.2CY.29|min]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13793</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13793"/>
				<updated>2016-01-11T08:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* getValidityExpiredDate('person id', 'validity type id') */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&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(%USER_ID)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&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''' lorsque :&lt;br /&gt;
*** Si ce n'est pas une validité à formule d'expérience récente :&lt;br /&gt;
**** L'utilisateur possède la validité&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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du compte d'export==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
*[[#.25USER_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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#min.28X.2CY.29|min]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Accueil&amp;diff=13706</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Accueil&amp;diff=13706"/>
				<updated>2015-10-20T07:50:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Découvrir le logiciel OpenFlyers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:2013-OF4-launch.gif|right|link=Upgrade4]]&lt;br /&gt;
&amp;lt;p style=&amp;quot;float: right&amp;quot; &amp;gt;[[Upgrade4|Découvrir OpenFlyers 4]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bienvenue sur la [[Accueil|documentation]] d''''OpenFlyers version 2'''.&lt;br /&gt;
&lt;br /&gt;
You can also access to our [[OF_doc-en:Main_Page2|english documentation]].&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
==[[Introduction|La suite logicielle OpenFlyers]]==&lt;br /&gt;
===[[Discover OpenFlyers software3|Découvrir le logiciel OpenFlyers]]===&lt;br /&gt;
&lt;br /&gt;
==[[Geolocation technologies for aerospace|Les technologies de géolocalisation pour l'aéronautique]]==&lt;br /&gt;
&lt;br /&gt;
=[[Getting started with OpenFlyers|Bien débuter avec OpenFlyers]]=&lt;br /&gt;
&lt;br /&gt;
=[[Créer une plateforme OpenFlyers pour sa structure|Créer une plateforme OpenFlyers pour sa structure]]=&lt;br /&gt;
&lt;br /&gt;
=[[OpenFlyers Trainings|Formations OpenFlyers]]=&lt;br /&gt;
&lt;br /&gt;
=[[How to communicate with OpenFlyers|Bien communiquer avec OpenFlyers]]=&lt;br /&gt;
&lt;br /&gt;
=[[OpenFlyers release history|Historique des versions]]=&lt;br /&gt;
&lt;br /&gt;
=[[Browsers_compatibility|Compatibilité des navigateurs]]=&lt;br /&gt;
&lt;br /&gt;
=[[Modèle commercial et compte client OpenFlyers]]=&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
*[[FAQ client|FAQ clients]]&lt;br /&gt;
*[[FAQ user2.1|FAQ utilisateur version 2.1]]&lt;br /&gt;
*[[FAQ admin2.0|FAQ administrateur version 2.0]]&lt;br /&gt;
*[[FAQ admin2.1|FAQ administrateur version 2.1]]&lt;br /&gt;
*[[FAQ accounting2.1|FAQ comptabilité version 2.1]]&lt;br /&gt;
*[[FAQ export]]&lt;br /&gt;
*[[FAQ AeroBox]]&lt;br /&gt;
&lt;br /&gt;
=Documentation Administrateurs=&lt;br /&gt;
*[[adminDoc2.1|Documentation administrateur version 2.1]]&lt;br /&gt;
*[[mailingList|Gérer une liste de diffusion sur OpenFlyers]]&lt;br /&gt;
*[[Formula_pool|Formules de calcul]]&lt;br /&gt;
&lt;br /&gt;
==Comptabilité==&lt;br /&gt;
*[[account|Généralités sur la comptabilité]]&lt;br /&gt;
*[[Accounting_Specic_Advise|Conseils spécifiques]]&lt;br /&gt;
*[[accounting entries|Les écritures comptables]]&lt;br /&gt;
*[[Compte de résultats]]&lt;br /&gt;
*[[Use_Accounting2.1|Utilisation de la comptabilité sur version 2.1]]&lt;br /&gt;
*[[OF_doc-en::Accounting_export_template_list|Template de format d'export comptable]]&lt;br /&gt;
*[[ODT_bill_template|Template ODT pour les factures]]&lt;br /&gt;
&lt;br /&gt;
===Facturation client===&lt;br /&gt;
*[[admin_sale_manager2.1|Gestionnaire des ventes version 2.1]]&lt;br /&gt;
&lt;br /&gt;
===FAQ comptabilité===&lt;br /&gt;
*[[FAQ accounting2.1|FAQ comptabilité version 2.1]]&lt;br /&gt;
&lt;br /&gt;
==Maintenance==&lt;br /&gt;
*[[MRO|Généralités sur la maintenance]]&lt;br /&gt;
*[[MRO2.1|Suivi de la navigabilité version 2.1]]&lt;br /&gt;
&lt;br /&gt;
===Requêtes permettant de générer des rapports===&lt;br /&gt;
*[[OF_doc-en::Export generator 2.0|Génération d'export version 2.0]]&lt;br /&gt;
*[[OF_doc-en::Export generator 2.1|Génération d'export version 2.1]]&lt;br /&gt;
&lt;br /&gt;
=Documentation Utilisateurs=&lt;br /&gt;
*[[userDoc2.0|Documentation utilisateur version 2.0]]&lt;br /&gt;
*[[userDoc2.1|Documentation utilisateur version 2.1]]&lt;br /&gt;
*[[user_sale_manager3|Gestionnaire des ventes]]&lt;br /&gt;
&lt;br /&gt;
=[[OF_wiki:|Documentation Webmasters et Développeurs]]=&lt;br /&gt;
&lt;br /&gt;
=[[BTS|Rapporter des bugs]]=&lt;br /&gt;
&lt;br /&gt;
=[[Tips-and-tricks|Trucs et astuces]]=&lt;br /&gt;
==[[Kiosk|Mettre en place un PC kiosque]]==&lt;br /&gt;
==[[Hybrid internet network|Mettre en place un réseau internet hybride]]==&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13657</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13657"/>
				<updated>2015-08-26T12:01:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Fonctions autorisées pour le calcul du temps d'activité */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#min.28X.2CY.29|min]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13656</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13656"/>
				<updated>2015-08-26T11:59:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* max(X,Y) */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13652</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13652"/>
				<updated>2015-08-04T08:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* %TIME_DEPARTURE */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13651</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13651"/>
				<updated>2015-08-04T08:10:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* %TIME_ARRIVAL */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_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;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13650</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13650"/>
				<updated>2015-08-04T08:09:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Variables autorisées pour le calcul de la tarification */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
* [[#.25START_DATE|%START_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13649</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13649"/>
				<updated>2015-08-04T08:08:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* %START_DATE */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13648</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13648"/>
				<updated>2015-08-04T08:04:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* %USER_ID */&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%START_DATE===&lt;br /&gt;
&lt;br /&gt;
Date de début du vol 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;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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+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;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===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, 3XX3) : %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;
=Expérience récente=&lt;br /&gt;
==Fonctions autorisées pour le calcul de l'expérience récente==&lt;br /&gt;
*[[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&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;php&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/php&amp;gt;&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;php&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;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13576</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13576"/>
				<updated>2015-06-10T12:04:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13575</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13575"/>
				<updated>2015-06-10T12:04:08Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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_pattern|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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13574</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13574"/>
				<updated>2015-06-10T12:00:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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 ...&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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13573</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13573"/>
				<updated>2015-06-10T11:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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 ...&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;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%-05d', %MEMBER_NUM) retourne 10000 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;php&amp;gt;sprintf('%6s', %MEMBER_NUM) retourne &amp;quot;    10&amp;quot; si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13572</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13572"/>
				<updated>2015-06-10T11:43:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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 ...&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre décimaux sur deux chiffres après la virgule&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%0.2f', 0.5) retourne 0.50&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%05d', 9) retourne 00009&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible derrière&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%-05d', 9) retourne 90000&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater une chaîne afin qu'elle ait 6 caractères en ajoutant autant d'espace que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%6s', 'test') retourne &amp;quot;  test&amp;quot;&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13571</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13571"/>
				<updated>2015-06-10T11:40:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre décimaux sur deux chiffres après la virgule&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%0.2f', 0.5) retourne 0.50&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%05d', 9) retourne 00009&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible derrière&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%-05d', 9) retourne 90000&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater une chaîne afin qu'elle ait 6 caractères en ajoutant autant d'espace que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%6s', 'test') retourne &amp;quot;  test&amp;quot;&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13570</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13570"/>
				<updated>2015-06-10T11:39:15Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===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;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;sprintf('%05s', %MEMBER_NUM) retourne 00010 si %MEMBER_NUM vaut 10 par exemple&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre décimaux sur deux chiffres après la virgule&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%0.2f', 0.5) retourne 0.50&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%05d', 9) retourne 00009&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater un nombre pour qu'il ait 5 chiffres en ajoutant autant de zéro que possible derrière&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%-05d', 9) retourne 90000&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple pour formater une chaîne afin qu'elle ait 6 caractères en ajoutant autant d'espace que possible devant&lt;br /&gt;
&amp;lt;php&amp;gt;sprintf('%6s', 'test') retourne &amp;quot;  test&amp;quot;&amp;lt;/php&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13566</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13566"/>
				<updated>2015-06-09T14:40:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec un patron.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;sprintf('%05s', %MEMBER_NUM') returns 00100&amp;lt;/pre&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13565</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13565"/>
				<updated>2015-06-09T14:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Fonctions autorisées pour le calcul du compte d'export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec un patron.&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#sprintf.28.27pattern.27.2C_.27string.27.29|sprintf]]&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13564</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13564"/>
				<updated>2015-06-09T14:18:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* sprintf('pattern', 'string') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate la chaîne &amp;quot;string&amp;quot; avec un patron.&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13563</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13563"/>
				<updated>2015-06-09T14:17:45Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* substr(string,a,b) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sprintf('pattern', 'string')===&lt;br /&gt;
&lt;br /&gt;
Formate une chaîne avec un patron.&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;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
Retourne le total des heures de vol faite par un pilote %PILOT pour le type de vol 'flight type' Depuis la date indiquée.&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;
Exemple :&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;
Retourne en [[#D.C3.A9finition_Unit.C3.A9_sexacentimal|Sexacentimal]] le total des heures de vol faites sur le type de vol 64 en tant que pilote en place gauche depuis le 2008-01-01 00:00:00.&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
===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;
===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;strtolower('CamelBack') retourne &amp;quot;CAMELBACK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
===%ACCOUNT_TYPE===&lt;br /&gt;
Type de compte&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;
===%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;
===%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;
===%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_NAME===&lt;br /&gt;
Nom de la ressource&lt;br /&gt;
&lt;br /&gt;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Compte d'export=&lt;br /&gt;
&lt;br /&gt;
==Fonctions autorisées pour le calcul du compte d'export==&lt;br /&gt;
&lt;br /&gt;
*[[#substr.28string.2Ca.2Cb.29|substr]]&lt;br /&gt;
*[[#strtolower.28string.29|strtolower]]&lt;br /&gt;
*[[#strtoupper.28string.29|strtoupper]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
*[[#.25ACCOUNT_TYPE|%ACCOUNT_TYPE]]&lt;br /&gt;
*[[#.25AUTHENTICATION_LOGIN|%AUTHENTICATION_LOGIN]]&lt;br /&gt;
*[[#.25AUTO_INCREMENT|%AUTO_INCREMENT]]&lt;br /&gt;
*[[#.25FIRSTNAME|%FIRSTNAME]]&lt;br /&gt;
*[[#.25LASTNAME|%LASTNAME]]&lt;br /&gt;
*[[#.25MEMBER_NUM|%MEMBER_NUM]]&lt;br /&gt;
*[[#.25RESOURCE_NAME|%RESOURCE_NAME]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de patrons de comptes 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'''&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+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;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant l'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;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13524</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13524"/>
				<updated>2015-06-09T09:09:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise===&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13523</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13523"/>
				<updated>2015-06-09T09:08:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule calculant la date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise===&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13522</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13522"/>
				<updated>2015-06-09T09:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise===&lt;br /&gt;
&lt;br /&gt;
Remplacer dans l'exemple suivant XX par l'identifiant du type de validité concerné :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, XX)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13521</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13521"/>
				<updated>2015-06-09T09:07:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule calculant la date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le 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, 3XX3) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, 16) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13520</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13520"/>
				<updated>2015-06-09T09:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule calculant si le pilote a effectué le nombre de vol requis ou s'il a la validité requise */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule vérifiant que le pilote a effectué le nombre d'heures de vol requis ou qu'il possède la validité requise===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, 16) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13519</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13519"/>
				<updated>2015-06-09T09:01:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Exemples de formules de calcul de l'expérience récente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
===Formule calculant si le pilote a effectué le nombre de vol requis ou s'il a la validité requise===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, 16) )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13518</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13518"/>
				<updated>2015-06-09T09:00:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Variables autorisées pour le calcul de l'expérience récente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, 16) )&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13517</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13517"/>
				<updated>2015-06-09T08:59:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Exemples de formules de calcul de l'expérience récente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
( (sumFlightHour(%PILOT, 0, 365)+sumFlightHour(%PILOT, 1, 365) &amp;gt; 17999) OR hasValidity(%PILOT, 16) )&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13516</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=13516"/>
				<updated>2015-06-09T08:55:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Fonctions autorisées pour le calcul de l'expérience récente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13244</id>
		<title>FAQ utilisateur</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13244"/>
				<updated>2015-04-16T13:12:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Navigation dans OpenFlyers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Connexion=&lt;br /&gt;
==Impossible de me connecter à la plateforme OpenFlyers de ma structure aéronautique==&lt;br /&gt;
Si vous n'arrivez pas à accéder une plateforme OpenFlyers il faut en rechercher la raison. Voici un certain nombre de questions qui peuvent vous permettre de solutionner votre problème :&lt;br /&gt;
*Accédez-vous à la page d'identification de la plateforme OpenFlyers ?&lt;br /&gt;
**Si non, alors il faut regarder la FAQ [[#Page_indisponible|Page indisponible]]&lt;br /&gt;
*Lorsque vous vous identifiez, avez-vous un message de rejet indiquant que votre identifiant et/ou votre mot de passe ne sont pas corrects ?&lt;br /&gt;
**Si oui, alors le problème peut venir du mot de passe qui a changé. Dans ce cas là, vous pouvez ré-initialiser votre mot de passe en suivant la procédure [[#J.27ai_oubli.C3.A9_mon_mot_de_passe.2C_comment_le_r.C3.A9cup.C3.A9rer_.3F|de réinitialisation de mot de passe]]. Cela peut également venir de votre identifiant qui n'est pas bon. Dans ce cas, il faut demander à la personne en charge de la gestion d'OpenFlyers au sein de votre structure aéronautique&lt;br /&gt;
*Une fois connecté, revenez-vous sur la page d'identification lorsque vous changez de page ?&lt;br /&gt;
**Si oui, alors il faut regarder la [[#A_chaque_fois_que_je_change_de_page.2C_je_reviens_sur_la_page_d.27identification_.3F|procédure de gestion des cookies du navigateur]].&lt;br /&gt;
Si vous n'êtes dans aucun des cas répertoriés ci-dessus, alors vous pouvez rapporter votre problème en nous envoyant un e-mail et en décrivant le plus précisément possible le problème que vous rencontrez :&lt;br /&gt;
*Navigateur utilisé&lt;br /&gt;
*Système d'exploitation&lt;br /&gt;
*type de PC, smartphone ou tablette&lt;br /&gt;
*Nom du fournisseur d'accès internet&lt;br /&gt;
*Actions effectuées&lt;br /&gt;
*Message d'erreur s'affichant&lt;br /&gt;
&lt;br /&gt;
==Page indisponible==&lt;br /&gt;
Si vous n'arrivez pas à accéder à la plateforme OpenFlyers de votre structure aéronautique. Voici une liste d'actions à effectuer :&lt;br /&gt;
*Redémarrer votre ordinateur&lt;br /&gt;
*Redémarrer la &amp;quot;box&amp;quot; ADSL&lt;br /&gt;
*Si cela ne fonctionne toujours pas, il faut [[#Tester_les_r.C3.A9solutions_DNS|tester les résolutions DNS]].&lt;br /&gt;
===Tester les résolutions DNS===&lt;br /&gt;
Pour effectuer les tests suivants, il faut ouvrir une fenêtre &amp;quot;[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|en ligne de commandes]]&amp;quot;. En cas de problème, il faut nous rapporter les résultats en ouvrant un rapport de bug sur le [http://bts.openflyers.ogr BTS]. Pour cela, il est pratique de procéder par [[#Copier.2FColler_dans_une_fen.C3.AAtre_en_ligne_de_commande|copier/coller]].&lt;br /&gt;
*Dans la fenêtre en ligne de commande taper ce qui suit (en remplaçant '''structure_aéro''' par le sous-domaine correspondant à votre structure aéronautique) :&lt;br /&gt;
&amp;lt;bash&amp;gt;ping structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
La réponse normale est pour OpenFlyers 3.0 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of3.openflyers.net [87.98.143.237] avec 32 octets de données :&lt;br /&gt;
 Réponse de 87.98.143.237 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of3.openflyers.net&amp;quot; ou &amp;quot;Réponse de 87.98.143.237&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 2.1 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of21.openflyers.net [91.121.47.179] avec 32 octets de données :&lt;br /&gt;
 Réponse de 91.121.47.179 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur5-of21.openflyers.net&amp;quot; ou &amp;quot;Réponse de 91.121.47.179&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 1.3 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of1.openflyers.net [178.33.105.217] avec 32 octets de données :&lt;br /&gt;
 Réponse de 178.33.105.217 : octets=32 temps=41 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of1.openflyers.net&amp;quot; ou &amp;quot;Réponse de 178.33.105.217&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
====Tests plus poussés====&lt;br /&gt;
*Faire un :&lt;br /&gt;
&amp;lt;bash&amp;gt;nslookup structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Et un :&lt;br /&gt;
&amp;lt;bash&amp;gt;tracert structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Faire le test avec '''dig +trace''' :&lt;br /&gt;
&amp;lt;bash&amp;gt;dig +trace structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
Sous Windows, il faudra au préalable récupérer l'utilitaire (par exemple dans un package [http://www.isc.org./downloads bind]). Une fois téléchargé le package, il faut copier/coller le programme dig ainsi que les fichiers .dll dans un répertoire commun et se positionner dans ce répertoire depuis la fenêtre en ligne de commandes avec la commande dir '''&amp;quot;nom du chemin du répertoire&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
====Tester les résolutions DNS sous Mac====&lt;br /&gt;
De plus, nous disposons de commandes plus puissantes qui permettent d'avoir d'avantage d'informations :&lt;br /&gt;
*cat /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
===Vérifier la configuration de résolution des DNS===&lt;br /&gt;
====Vérifier la configuration de résolution des DNS sous Windows====&lt;br /&gt;
Si vous avez un problème de résolution DNS sous windows, il peut être utile de vérifier que la résolution DNS est dynamique :&lt;br /&gt;
#Double-cliquer sur la connexion réseau concernée (par exemple le symbole &amp;quot;WIFI&amp;quot;)&lt;br /&gt;
#Cliquer sur '''Propriétés''' dans l'onglet '''Général''' de l''''Etat de Connexion réseau sans fil''' (si WIFI))&lt;br /&gt;
#Sélectionner '''Protocole internet TCP/IP'''&lt;br /&gt;
#Cliquer sur '''Propriétés'''&lt;br /&gt;
#Vérifier qu'est sélectionné '''Obtenir les adresses des serveurs DNS automatiquement'''. (si ce n'est pas le cas, modifier).&lt;br /&gt;
#En dernier ressort, [[#Changer de serveur DNS|Changer de serveur DNS]] ou [[#Forcer_les_DNS|Forcer les DNS]].&lt;br /&gt;
&lt;br /&gt;
===Nous communiquez les adresses IP des serveurs DNS===&lt;br /&gt;
====Nous communiquez les adresses IP des serveurs DNS sous Windows====&lt;br /&gt;
#[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|Ouvrir une fenêtre en ligne de commande]]&lt;br /&gt;
#Taper : '''ipconfig /all'''&lt;br /&gt;
Les adresses IP des serveurs DNS se trouvent au droit de '''Serveurs DNS'''&lt;br /&gt;
&lt;br /&gt;
===Changer de serveur DNS===&lt;br /&gt;
Si vous rencontrez un problème de résolution de DNS avec votre fournisseur d'accès, vous pouvez changer les serveurs qui effectue la résolution des DNS pour votre accès.&lt;br /&gt;
====Changer de serveur DNS sous Mac====&lt;br /&gt;
*Dans '''Préférences Systèmes''', choisir '''Réseau''', puis une fois la bonne carte réseau sélectionnée, appuyer sur Avancé.&lt;br /&gt;
*Dans la fenêtre qui apparaît, aller sur l'onglet '''DNS''' et dans '''Serveurs DNS''' appuyer sur le + pour ajouter '''8.8.8.8''' et une autre fois pour ajouter '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Il ne reste plus qu'à '''Appliquer''' et à tester.&lt;br /&gt;
&lt;br /&gt;
====Changer de serveur DNS sous Windows XP====&lt;br /&gt;
*'''Démarrer &amp;gt; Connexions''' puis cliquer sur la connexion réseau active (par exemple la connexion WIFI)&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*Sélectionner '''Protocole Internet (TCP/IP)'''&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*En général, en bas de la fenêtre '''Propriétés de Protocole Internet (TCP/IP)''' la configuration active est : '''Obtenir les adresses des serveurs DNS automatiquement'''&lt;br /&gt;
*Cocher '''Utiliser l'adresse de serveur DNS suivante :'''&lt;br /&gt;
*Pour '''Serveur DNS préféré''', saisir '''8.8.8.8'''&lt;br /&gt;
*Pour '''Serveur DNS auxiliaire''', saisir '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''Fermer'''&lt;br /&gt;
&lt;br /&gt;
===Forcer les DNS===&lt;br /&gt;
====Forcer les DNS sous Windows====&lt;br /&gt;
Attention, avec Vista, il faut appliquer une [[#Particularit.C3.A9_avec_Windows_Vista|procédure préalable]].&lt;br /&gt;
*Il est possible de résoudre ce problème de DNS en éditant le fichier C:\WINDOWS\system32\drivers\etc\hosts (avec le bloc-notes) en rajoutant la ligne (il faut remplacer structure_aéro par le sous-domaine de l'espace OpenFlyers de votre structure aéronautique) :&lt;br /&gt;
**Pour OF 1.3 :&lt;br /&gt;
&amp;lt;pre&amp;gt;178.33.105.217 structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 2.1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;91.121.47.179  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 3.0alpha :&lt;br /&gt;
&amp;lt;pre&amp;gt;87.98.143.237  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Ensuite, il faut relancer votre PC&lt;br /&gt;
*Une fois la connexion correctement effectuée, il est parfois possible de supprimer cette entrée dans le fichier hosts tout en gardant la connexion.&lt;br /&gt;
&lt;br /&gt;
====Particularité avec Windows Vista====&lt;br /&gt;
*Il faut être administrateur pour pouvoir modifier le fichier hosts.&lt;br /&gt;
*Il faut également copier le fichier hosts sur le bureau pour le modifier puis ensuite le recopier dans le bon répertoire (si on édite directement le fichier hosts depuis (system32\drivers\etc\) on ne peut pas le ré-enregistrer).&lt;br /&gt;
&lt;br /&gt;
====Forcer les DNS sous Mac====&lt;br /&gt;
*lancer Terminal (dans Applications/Utilitaires)&lt;br /&gt;
*taper &amp;quot;sudo nano /etc/hosts&amp;quot; (il demande le mot de passe de l'utilisateur qui a les droits admin sur la machine)&lt;br /&gt;
*Ajouter les entrées sur le modèle de la [[#Forcer_les_DNS_sous_Windows|procédure sous Windows]]&lt;br /&gt;
*Faire controle-o pour enregistrer puis controle-x pour quitter&lt;br /&gt;
*Eventuellement, faire &amp;quot;dscacheutil -flushcache&amp;quot; si le changement n'est pas encore pris en compte.&lt;br /&gt;
&lt;br /&gt;
==A chaque fois que je change de page, je reviens sur la page d'identification ?==&lt;br /&gt;
Si le retour à la page d'identification est systématique, alors il doit s'agir d'un problème de '''cookies'''. Il faut modifier la configuration du navigateur de manière à [[#Autoriser_les_cookies|autoriser les cookies]].&lt;br /&gt;
&lt;br /&gt;
===Variante du problème : la déconnexion n'est pas systématique mais aléatoire===&lt;br /&gt;
Dans ce cas, il peut s'agir aussi d'un problème de proxy (si vous êtes sur un réseau d'entreprise par exemple) ou de fournisseurs d'accès (accès depuis un mobile, depuis un hôtel, bref, tout type d'accès qui change régulièrement l'adresse IP et ainsi ne permet de maintenir un accès authentifié dans la durée. La solution est présentée dans la procédure [[#Utiliser_OpenFlyers_sur_un_smartphone|Utiliser OpenFlyers sur un smartPhone]].&lt;br /&gt;
&lt;br /&gt;
==Plusieurs membres peuvent-ils ouvrir des sessions en même temps (sans le savoir) ?==&lt;br /&gt;
Oui, c'est même le but premier : permettre à plusieurs personnes de consulter en même temps le cahier de réservation.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez même avoir une personne qui ouvre plusieurs sessions avec son identifiant. Mais pour cela, elle doit utiliser des ordinateurs ou des navigateurs différents.&lt;br /&gt;
==Suite à une migration, impossible de naviguer dans la nouvelle version d'OpenFlyers==&lt;br /&gt;
Lorsque nous migrons d'une version vers une autre, bien souvent nous le faisons en changeant les &amp;quot;DNS&amp;quot;. Cela peut occasionner des problèmes d'accès. Il peut également apparaitre des problèmes de &amp;quot;cache&amp;quot; qui se résolvent d'eux sous 24 à 48 heures. Ces problèmes peuvent survenir lorsque l'ordinateur concerné a été connecté à l'ancienne plateforme OpenFlyers juste avant la migration.&lt;br /&gt;
&lt;br /&gt;
Voici différentes techniques qui permettent d'imposer à votre navigateur d'utiliser des DNS actualisées et d'utiliser un cache à jour :&lt;br /&gt;
#Penser à éteindre et rallumer complètement l'ordinateur&lt;br /&gt;
#Faites un CTRL+R (ou icône de &amp;quot;rafraichissement&amp;quot;). Bien souvent cela suffit au navigateur pour qu'il vide son cache et le ré-actualise&lt;br /&gt;
#Vider le cache dans le navigateur&lt;br /&gt;
#Supprimer les cookies dans le navigateur&lt;br /&gt;
Plus technique :&lt;br /&gt;
#Faites un ipconfig /flushdns en ligne de commande (menu démarrer, puis &amp;quot;Exécutez&amp;quot;, taper &amp;quot;cmd&amp;quot;)&lt;br /&gt;
#Forcer les nouvelles DNS dans le fichier C:\WINDOWS\system32\drivers\etc\hosts en ajoutant une ligne du genre : xxx.xxx.xxx.xxx xxx.openflyers.zz (nous demandez pour connaitre les valeurs à utiliser)&lt;br /&gt;
&lt;br /&gt;
De plus, afin de permettre quand même d'accéder à la nouvelle plateforme, nous mettons en place une deuxième URL temporaire pendant 1 semaine. Ainsi pour l'URL plateforme.openflyers.fr nous mettrons en place une URL temporaire plateforme2.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
=Navigation dans OpenFlyers=&lt;br /&gt;
OpenFlyers est un logiciel qui s'utilise grâce à votre navigateur internet. Les plus connus sont Chrome, Firefox, Internet Explorer ou Safari.&lt;br /&gt;
Une certaine configuration est nécessaire afin de faire fonctionner OpenFlyers : la configuration des cookies.&lt;br /&gt;
Si vous rencontrez des problèmes d'utilisations tels que :&lt;br /&gt;
&lt;br /&gt;
*Impossibilité de se connecter alors que votre identifiant et mot de passe est correct&lt;br /&gt;
*Impossibilité d'aller d'un page à l'autre une fois connecté (et retour sur la page de connexion)&lt;br /&gt;
&lt;br /&gt;
Voila comment régler votre navigateur.&lt;br /&gt;
&lt;br /&gt;
==[https://support.google.com/chrome/answer/95647?hl=fr Comment autoriser les cookies sous Chrome]==&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous Internet Explorer==&lt;br /&gt;
*'''Outils &amp;gt; Options internet'''&lt;br /&gt;
*Onglet '''Confidentialité'''&lt;br /&gt;
*Positionner le niveau de sécurité au maximum à '''Moyenne'''&lt;br /&gt;
*Bouton '''OK'''&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous iPhone / Safari==&lt;br /&gt;
*'''Réglages &amp;gt; Safari'''&lt;br /&gt;
*Régler '''Accepter les cookies'''&lt;br /&gt;
[[Fichier:Accepter-cookies-iPhone-Safari.png]]&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous Firefox==&lt;br /&gt;
*'''Outils &amp;gt; Options'''&lt;br /&gt;
*Onglet '''vie privée'''&lt;br /&gt;
*Cocher '''Accepter les cookies'''&lt;br /&gt;
*Bouton '''OK'''&lt;br /&gt;
&lt;br /&gt;
==Problème de navigation sur un réseau GSM==&lt;br /&gt;
OpenFlyers est accessible sur les smartphones par le biais du navigateur embarqué. Cependant, des problèmes de session peuvent survenir du fait du changement dynamique de l'adresse IP du smartphone du fait du réseau GSM. Pour palier à ce problème et éviter des déconnexions intempestives, il faut se connecter en HTTPS.&lt;br /&gt;
&lt;br /&gt;
De plus, et toujours en HTTPS, il est possible de [[#Transmettre_l.27identifiant_et_le_mot_de_passe_dans_l.27URL|rajouter le couple identifiant/mot de passe à la suite de l'URL sécurisée]] et d'enregistrer cette URL en favori. Ainsi, il n'est plus nécessaire de saisir systématiquement son identifiant et son mot de passe.&lt;br /&gt;
&lt;br /&gt;
==Problèmes de navigation sous iPhone==&lt;br /&gt;
*Penser à mettre à jour le logiciel de l'iPhone. OpenFlyers fonctionne correctement pour une version au moins 4.02.&lt;br /&gt;
*Activer l'[[#Autoriser_les_cookies_sous_iPhone_.2F_Safari|acceptation des cookies]]&lt;br /&gt;
*Si la navigation était possible sur une version précédente d'OpenFlyers et qu'elle n'est plus possible sur une nouvelle version d'OpenFlyers, alors il peut être nécessaire de vider le cache du navigateur Safari de l'iPhone :&lt;br /&gt;
**'''Réglages &amp;gt; Safari'''&lt;br /&gt;
**'''Effacer cookies et données'''&lt;br /&gt;
&lt;br /&gt;
=Transmettre l'identifiant et le mot de passe dans l'URL=&lt;br /&gt;
Si vous souhaitez transmettre le couple identifiant/mot de passe dans l'URL dans le but de pouvoir les sauver facilement, vous avez besoin d'un [http://www.openflyers.com/doc/catalogue-tarifaire.pdf abonnement HTTPS] et alors l'URL doit avoir la forme :&lt;br /&gt;
 https://mySpaceName.openflyers.tld?login=myLogin&amp;amp;password=myPassword&lt;br /&gt;
où :&lt;br /&gt;
*mySpaceName doit être remplacé par le nom du compte openflyers&lt;br /&gt;
*tld doit être remplacé par l'extension (comme de, fr, us, etc.)&lt;br /&gt;
*myLogin doit être remplacé par votre identifiant&lt;br /&gt;
*myPassword doit être remplacé par votre mot de passe&lt;br /&gt;
&lt;br /&gt;
=Cahier de réservation=&lt;br /&gt;
==Que se passe t-il en cas de conflit de réservation ?==&lt;br /&gt;
Il ne peut y avoir de conflit de réservation. C'est l'un des principes durs d'OpenFlyers : à chaque instant donné, il ne peut y avoir plus d'une réservation pour chaque pilote, chaque avion ou chaque instructeur.&lt;br /&gt;
&lt;br /&gt;
Si vous arrivez à faire des réservations qui se chevauchent (pour un avion, un instructeur ou un pilote), alors vous avez mis en évidence un bug, et il faut nous le signaler pour que nous y remédions.&lt;br /&gt;
&lt;br /&gt;
==Si je suis en train de consulter une page, et que quelqu'un fait une modif sur cette page, vais-je voir la modif sans lancer un rafraichissement ?==&lt;br /&gt;
Non vous ne verrez pas la modification. Cependant, ce n'est pas grave car au moment où vous essayerez de faire votre réservation, OpenFlyers vérifiera à ce moment-là que le créneau que vous souhaitez est toujours disponible (pour empêcher les conflits justement).&lt;br /&gt;
&lt;br /&gt;
==Comment saisir une date rapidement dans la gestion des qualifications ?==&lt;br /&gt;
En cliquant sur l'icône &amp;quot;calendrier&amp;quot; placé par défaut au mois courant, vous pourrez vous déplacer mois par mois ou année par année en cliquant sur les flèches respectives. Pour des dates plus anciennes, passez le curseur de votre souris sur l'endroit où se trouve le texte correspondant à &amp;quot;Mois Année&amp;quot;. Ce texte s'encadre alors d'une bordure. Faites un clic dessus et une nouvelle petite fenêtre va s'ouvrir. Là vous pourrez saisir l'année en tapant les chiffres avec votre clavier.&lt;br /&gt;
&lt;br /&gt;
==A propos des horaires de la nuit aéronautique==&lt;br /&gt;
&lt;br /&gt;
Nous calculons les éphémérides d'après les définitions officielles.&lt;br /&gt;
&lt;br /&gt;
Ainsi, les heures de lever et de coucher du soleil correspondent au passage du centre du soleil sous l'horizon (donc 3 degrés sous l'horizon puisqu'il est considéré, en première approximation que le soleil a un diamètre apparent de 6 degrés).&lt;br /&gt;
&lt;br /&gt;
Les heures du jour et de la nuit aéronautique correspondent au passage du soleil 6 degrés sous l'horizon. Il s'agit de la définition officielle, aussi bien française, qu'internationale (OACI). Le calcul est validé pour les latitudes inférieures à 65 degrés. Sa précision est de l'ordre de la minute sous des latitudes inférieures à 50 degrés. La précision diminue au fur et à mesure que la latitude augmente (c'est à dire que l'on se rapproche des pôles).&lt;br /&gt;
&lt;br /&gt;
Conséquence du calcul : les résultats trouvés ne correspondent pas (forcément) à la simple addition de + ou - 30 minutes. Mais il n'a jamais été écrit dans un texte officiel que la journée aéronautique correspondait au lever du soleil moins trente minutes, et que la nuit aéronautique correspondait au coucher du soleil plus trente minutes. La seule chose que vous trouverez, si vous vous penchez sur les textes, c'est qu'il est admis d'utiliser + ou - 30 minutes pour faire les calculs sous des latitudes comprises entre 30 et 60 degrés et 15 minutes sous les latitudes inférieures à 30 degrés). Voir [http://www.anpi.asso.fr/Reglesair.pdf Règles de l'air - Chapitre 1er - Définitions]&lt;br /&gt;
Attention: certains pays n'utilisent pas la nuit aéronautique et ne permettent pas le vol en dehors du lever et du coucher du soleil&lt;br /&gt;
&lt;br /&gt;
Le résultat proposé est donc le bon résultat. Si vous ne souhaitez pas utiliser ce résultat, il vous suffit de retrancher ou d'ajouter 30 minutes au calcul du lever et du coucher du soleil.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous attirons votre attention sur l'intérêt d'utiliser le bon calcul : il vous met du bon côté du point de vue de la sécurité. En effet, si en été vous y gagnez, c'est parce que le soleil met plus de temps à se coucher. Par contre en hiver, notre calcul fait &amp;quot;perdre&amp;quot; une dizaine de minutes : c'est parce que le soleil met moins de temps à se coucher. Calculer l'écart entre la nuit aéronautique et le coucher du soleil (et comparer avec les 30 minutes) vous permettra d'avoir une idée de la &amp;quot;vitesse&amp;quot; avec laquelle se couche le soleil, donc de vous méfier encore plus de l'arrivée de la nuit et de ne pas vous faire surprendre par le crépuscule.&lt;br /&gt;
&lt;br /&gt;
Qui ne s'est jamais retrouvé au sol en ayant voulu &amp;quot;tangenter&amp;quot; avec la nuit et s'est surpris à constater qu'il faisait bien sombre, tout d'un coup ?&lt;br /&gt;
&lt;br /&gt;
Le programme calcule les heures de coucher/lever du soleil à partir des coordonnées géographique du terrain de base. Si vous constatez que vos heures sont erronées, demander à votre administrateur qu'il vérifie le code OACI dans les paramètres de la structure aéronautique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Saisie des vols=&lt;br /&gt;
==Nos avions ont des compteurs en heures, centièmes, peut-on avoir un affichage en heures, minutes ?==&lt;br /&gt;
Chaque utilisateur paramètre son affichage comme il le souhaite dans Données/Affichage et fiche personnelle&lt;br /&gt;
[[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format Patron de date et heure]]&lt;br /&gt;
&lt;br /&gt;
== Comment saisir plusieurs pilotes pour un vol ?==&lt;br /&gt;
Saisir les vols dans OF comme dans le carnet de route de l'avion&lt;br /&gt;
== Comment partager les coûts d'un vol ?==&lt;br /&gt;
Si un pilote veux partager les frais du vol (sans être pilote) il doit faire un transfert de son compte vers le compte du pilote&lt;br /&gt;
Menu Comtes/Transférer&lt;br /&gt;
&lt;br /&gt;
=Divers=&lt;br /&gt;
==Peut-il y avoir des accès à plusieurs sur la base ?==&lt;br /&gt;
Oui, sinon deux membres ne pourraient pas consulter le cahier en même temps.&lt;br /&gt;
&lt;br /&gt;
Par contre, lorsqu'un membre réserve un avion, au moment où OpenFlyers teste la disponibilité du créneau, il empêche toute autre écriture sur la base concernant les réservations. Le but est d'empécher justement les conflits de réservation.&lt;br /&gt;
&lt;br /&gt;
=Actions dynamiques non prises en compte par OpenFlyers=&lt;br /&gt;
OpenFlyers met en oeuvre des actions dites &amp;quot;dynamiques&amp;quot; c'est à dire qui ne nécessite pas un rafraîchissement complet de la page pour être prises en comptes. Ces actions sont basées sur le principe &amp;quot;[http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML AJAX]&amp;quot;. Elles nécessitent l'activation du moteur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] du navigateur pour être opérationnelles.&lt;br /&gt;
&lt;br /&gt;
De plus, certaines commandes [http://fr.wikipedia.org/wiki/JavaScript JavaScript] ne sont pas reconnues par tous les navigateurs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, lorsque vous lancez une action dynamique dans OpenFlyers qui reste sans résultat, avant de rapporter l'anomalie sur le [http://bts.openflyers.org BTS] il faut vérifier :&lt;br /&gt;
#L'activation de [http://fr.wikipedia.org/wiki/JavaScript JavaScript] dans le navigateur utilisé.&lt;br /&gt;
#Tester avec un autre navigateur&lt;br /&gt;
#Dans le cas où JavaScript est activé, il faut rapporter l'anomalie sur le [http://bts.openflyers.org BTS] en précisant le navigateur sur lequel l'action est inefficace et le navigateur sur lequel l'action est efficace.&lt;br /&gt;
Vous pouvez également nous facilitez la correction de l'anomalie en nous rapportant le message d'erreur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] s'il y a lieu.&lt;br /&gt;
&lt;br /&gt;
=Comment exporter les données ?=&lt;br /&gt;
OF affiche une page XHTML ce qui signifie un texte correctement formaté qui peut être récupéré par un simple copier coller. Le tableur Calc de Open Office ou Libre Office interprète correctement ce HTML et le formate en colonne conformément à la présentation de votre page.&lt;br /&gt;
 &lt;br /&gt;
Il a cependant un paramétrage à faire pour que les textes soit correctement encodé (affichage des caractères accentués) et que les cellules numériques affichent le format correct&lt;br /&gt;
&lt;br /&gt;
*Allez dans l'onglet Outils/Options/Chargement&amp;amp;Enegistrement/Compatibilité HTML (Tools/Options/Load&amp;amp;Save/HTML Compatibility)&lt;br /&gt;
*Cocher &amp;quot;Utiliser l'environnement linguistique Anglais (USA) pour les nombres&amp;quot;, (&amp;quot;Use English (USA) locale numbers&amp;quot;)&lt;br /&gt;
*Par la même occasion vous pouvez aussi changer le Jeu d'encodage (Character set) par Unicode (UTF-8) &lt;br /&gt;
&lt;br /&gt;
Le programme interprète alors le point comme le séparateur décimal et vous avez directement le bon copier/coller Si vous avec choisi l'encodage UTF-8 les caractères accentués seront aussi correctement traduits (A rechanger si vous avez à faire des copier coller depuis des programmes à l'encodage CP1252 &amp;quot;Windows Microsoft&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Pour les exports au format csv voir [[FAQ csv reading with Oo]]&lt;br /&gt;
&lt;br /&gt;
=Paramétrage et données personnelles=&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti automatiquement des réservations annulées ?==&lt;br /&gt;
Dans la version 3 d'OpenFlyers, il est possible pour chaque utilisateur de paramétrer OpenFlyers de sort à être averti par e-mail lorsqu'un créneau se libère. Voici comment configurer cela :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''', sélectionner '''Notification des réservations annulées'''&lt;br /&gt;
*Cliquer sur le bouton '''Sauver'''&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti des réservations sur plusieurs adresses e-mail ?==&lt;br /&gt;
&lt;br /&gt;
Il est possible d'utiliser plusieurs adresses e-mails afin d'être averti des réservations.&lt;br /&gt;
&lt;br /&gt;
Voici comment procéder :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''' puis au niveau du champ '''E-mail'''&lt;br /&gt;
*Rentrer chacune des adresses e-mails en les séparant d'une virgule&lt;br /&gt;
'''Attention : il ne faut jamais mettre d'espace : ni dans l'adresse e-mail elle même, ni avant ou après les virgules de séparation des adresses e-mails'''&lt;br /&gt;
&lt;br /&gt;
Exemple valide :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr,jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemples non valides :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr, jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Accéder à l'application et aller dans le menu Données &amp;gt; Affichage et fiche personnelle&lt;br /&gt;
&lt;br /&gt;
==Comment changer mes options d'affichage ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Option d'affichage'''&lt;br /&gt;
&lt;br /&gt;
Dans les champs choisissez les paramètres selon vos souhaits: langue, heure local ou UTC, format monétaire,...&lt;br /&gt;
&lt;br /&gt;
Sélectionner les avions et instructeurs que sous voulez afficher&lt;br /&gt;
&lt;br /&gt;
==Affichage des dates et des heures==&lt;br /&gt;
Chaque utilisateur paramètre son affichage des dates et des heures comme il le souhaite dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Ressources sur les [[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format patrons de date et heure]]&lt;br /&gt;
&lt;br /&gt;
==Comment modifier mes paramétrages ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Charger une photo pour le trombinoscope&lt;br /&gt;
&lt;br /&gt;
La date de naissance, le sexe et la nationalité sont obligatoire pour que les statistiques DGAC puisse être calculés &lt;br /&gt;
&lt;br /&gt;
Mettez votre email et vos numéros de téléphone pour qu'on puisse vous contacter. Vous pouvez choisir ceux qui sont public ou non. &lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas seul les personnes avec des droits administrateur pourrons voir ces infos.&lt;br /&gt;
&lt;br /&gt;
==J'ai oublié mon mot de passe, comment le récupérer ?==&lt;br /&gt;
Il n'est pas possible de &amp;quot;retrouver&amp;quot; son mot de passe perdu dans OpenFlyers. En effet, ces derniers sont cryptés dans la base de données pour des raisons de confidentialités.&lt;br /&gt;
&lt;br /&gt;
Si vous avez oublié votre mot de passe, vous n'avez pas besoin de demander à votre administrateur une ré-initialisation, OpenFlyers dispose d'une procédure de ré-initialisation automatique :&lt;br /&gt;
&lt;br /&gt;
*Sur la page de connexion d'une plateforme OpenFlyers, cliquer sur le lien &amp;quot;Mot de passe oublié&amp;quot;&lt;br /&gt;
*:[[Fichier:FAQ_user_forgottenPassword.png]]&lt;br /&gt;
*Sur la page qui s'affiche il y a deux zones de saisie. Saisissez l'email que vous avez indiqué dans votre page personnelle. Il vous sera envoyé un email vous donnant votre identifiant et un code d'activation&lt;br /&gt;
*Revenez sur la page de ré-initialisation et mettez ces informations. Un nouvel email vous sera envoyé avec votre mot de passe&lt;br /&gt;
&lt;br /&gt;
Vous pouvez maintenant accéder à l'application. Pour mettre un mot de passe personnalisé voir [[#Comment_changer_de_mot_de_passe|Comment changer son mot de passe]]&lt;br /&gt;
&lt;br /&gt;
==Comment changer de mot de passe==&lt;br /&gt;
*Dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Aller en bas de la page, dans le formulaire '''Changer de mot de passe''' et saisissez votre nouveau mot de passe&lt;br /&gt;
&lt;br /&gt;
Un indicateur vous indique le niveau de fiabilité. Mélanger les minuscules/majuscules/chiffres et sigles pour augmenter la difficulté pour des robots de trouver votre mot de passe. La sécurité de l'application de votre club sera ainsi accrue.&lt;br /&gt;
&lt;br /&gt;
=Trucs et astuces=&lt;br /&gt;
==Fenêtre en ligne de commande==&lt;br /&gt;
===Ouvrir une fenêtre en ligne de commande===&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
*Aller dans le menu &amp;quot;Démarrer&amp;quot;&lt;br /&gt;
*Puis Tous les programmes/Accessoires&lt;br /&gt;
*Lancer l'&amp;quot;invite de commandes&amp;quot;&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Sous OSX (mac) il faut lancer un Terminal. Pour cela 2 solutions :&lt;br /&gt;
*Taper &amp;quot;terminal&amp;quot; dans spotlight&lt;br /&gt;
ou&lt;br /&gt;
*lancer l'application qui est dans Applications &amp;gt; Utilitaires.&lt;br /&gt;
&lt;br /&gt;
===Copier/Coller dans une fenêtre en ligne de commande===&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
Vous pouvez faire un copier/coller en utilisant le bouton droit de la souris dans la fenêtre de l'invite de commandes puis en choisissant '''sélectionner''' et ensuite en appuyant sur le bouton gauche et en le laissant appuyer tout en sélectionnant la zone souhaitée)&lt;br /&gt;
&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Pour faire un copier/coller de ces informations et nous les communiquer, il suffit d'utiliser commande-C dans le terminal.&lt;br /&gt;
&lt;br /&gt;
=Comment imprimer la doc ?=&lt;br /&gt;
Si vous souhaitez imprimer la doc, il vous suffit de :&lt;br /&gt;
*cliquer sur le lien &amp;quot;version imprimable&amp;quot; de la &amp;quot;boîte à outils&amp;quot; présente sur le côté gauche des pages du wiki. Vous obtiendrez ainsi une version des pages destinée à être imprimer.&lt;br /&gt;
*ou bien, utiliser la fonction imprimer de votre navigateur. Une mise en page spécifique est générée pour obtenir un format papier&lt;br /&gt;
&lt;br /&gt;
Si vous imprimer avec une Imprimante pdf ([http://www.pdfforge.org/pdfcreator pdfCreator] par exemple) vous générerez alors un format pdf pour archivage&lt;br /&gt;
&lt;br /&gt;
=Problèmes=&lt;br /&gt;
==Signaler un problème==&lt;br /&gt;
Si vous rencontrer une anomalie ou un bug dans l'application OpenFlyers, il faut le rapporter sur le [http://bts.openflyers.org BTS] pour une prise en compte la plus rapide possible et pour permettre un meilleur traitement et suivi.&lt;br /&gt;
&lt;br /&gt;
Pour rapporter une anomalie il faut :&lt;br /&gt;
*Aller sur la page http://bts.openflyers.org&lt;br /&gt;
*S'inscrire sur le BTS en cliquant sur '''Signup for a new account''' : il faut choisir un identifiant, une adresse e-mail puis cliquer sur '''Signup'''.&lt;br /&gt;
Un e-mail est envoyé par le BTS permettant de valider votre adresse e-mail. Cliquer sur le lien présent sur cet e-mail.&lt;br /&gt;
*Sur le formulaire qui apparait, Choisir :&lt;br /&gt;
**Un mot de passe dans les champs '''Password''' et '''Confirm Password'''&lt;br /&gt;
**Compléter éventuellement le champ '''Real Name'''&lt;br /&gt;
*Cliquer sur le bouton '''Update account'''&lt;br /&gt;
Votre compte pour rapporter un problème sur le BTS est ainsi créé. Un nouveau formulaire d'identification s'affiche automatiquement :&lt;br /&gt;
*Renseigner les champs '''Username''' et '''Password'''&lt;br /&gt;
*Sélectionner éventuellement sur '''Remember my login in this browser''' afin de ne plus avoir à s'identifier lors d'une nouvelle connexion depuis le même navigateur internet.&lt;br /&gt;
*Dé-sélectionner éventuellement le champ '''Only allow your session to be used from this IP address.''' qui limite les possibilités de connexion&lt;br /&gt;
*Cliquer sur '''Login'''&lt;br /&gt;
*Aller dans l'onglet '''Preferences'''&lt;br /&gt;
*En bas du formulaire, modifier le champ '''Language''' pour choisir '''french'''.&lt;br /&gt;
*Cliquer sur '''Update Prefs'''&lt;br /&gt;
Vous pouvez alors tranquillement rapporter un bug depuis le formulaire '''Rapporter un bogue'''&lt;br /&gt;
&lt;br /&gt;
==Problème d'auto-complétion des terrains==&lt;br /&gt;
*Si les terrains d'arrivée et de départ ne s'affichent pas, vérifier la [[Browsers_compatibility#Versions_support.C3.A9es|compatibilité de votre navigateur]].&lt;br /&gt;
*La version 2.1 d'OpenFlyers n'est pas supportée par Internet Explorer 10.&lt;br /&gt;
*En revanche, la version 3.0.3 d'OpenFlyers est supportée par les versions d'Internet Explorer supérieures à 8.&lt;br /&gt;
Si vous êtes sous la version 2.1 d'OpenFlyers avec comme navigateur Internet Explorer alors vous avez 2 solutions :&lt;br /&gt;
*Changer de navigateur&lt;br /&gt;
*[[FAQ_client#Comment_se_fait_la_migration_vers_une_version_sup.C3.A9rieure_.3F|Demander à migrer]] sous la version 3.0.3 d'OpenFlyers.&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13237</id>
		<title>FAQ utilisateur</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13237"/>
				<updated>2015-04-16T12:48:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Navigation dans OpenFlyers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Connexion=&lt;br /&gt;
==Impossible de me connecter à la plateforme OpenFlyers de ma structure aéronautique==&lt;br /&gt;
Si vous n'arrivez pas à accéder une plateforme OpenFlyers il faut en rechercher la raison. Voici un certain nombre de questions qui peuvent vous permettre de solutionner votre problème :&lt;br /&gt;
*Accédez-vous à la page d'identification de la plateforme OpenFlyers ?&lt;br /&gt;
**Si non, alors il faut regarder la FAQ [[#Page_indisponible|Page indisponible]]&lt;br /&gt;
*Lorsque vous vous identifiez, avez-vous un message de rejet indiquant que votre identifiant et/ou votre mot de passe ne sont pas corrects ?&lt;br /&gt;
**Si oui, alors le problème peut venir du mot de passe qui a changé. Dans ce cas là, vous pouvez ré-initialiser votre mot de passe en suivant la procédure [[#J.27ai_oubli.C3.A9_mon_mot_de_passe.2C_comment_le_r.C3.A9cup.C3.A9rer_.3F|de réinitialisation de mot de passe]]. Cela peut également venir de votre identifiant qui n'est pas bon. Dans ce cas, il faut demander à la personne en charge de la gestion d'OpenFlyers au sein de votre structure aéronautique&lt;br /&gt;
*Une fois connecté, revenez-vous sur la page d'identification lorsque vous changez de page ?&lt;br /&gt;
**Si oui, alors il faut regarder la [[#A_chaque_fois_que_je_change_de_page.2C_je_reviens_sur_la_page_d.27identification_.3F|procédure de gestion des cookies du navigateur]].&lt;br /&gt;
Si vous n'êtes dans aucun des cas répertoriés ci-dessus, alors vous pouvez rapporter votre problème en nous envoyant un e-mail et en décrivant le plus précisément possible le problème que vous rencontrez :&lt;br /&gt;
*Navigateur utilisé&lt;br /&gt;
*Système d'exploitation&lt;br /&gt;
*type de PC, smartphone ou tablette&lt;br /&gt;
*Nom du fournisseur d'accès internet&lt;br /&gt;
*Actions effectuées&lt;br /&gt;
*Message d'erreur s'affichant&lt;br /&gt;
&lt;br /&gt;
==Page indisponible==&lt;br /&gt;
Si vous n'arrivez pas à accéder à la plateforme OpenFlyers de votre structure aéronautique. Voici une liste d'actions à effectuer :&lt;br /&gt;
*Redémarrer votre ordinateur&lt;br /&gt;
*Redémarrer la &amp;quot;box&amp;quot; ADSL&lt;br /&gt;
*Si cela ne fonctionne toujours pas, il faut [[#Tester_les_r.C3.A9solutions_DNS|tester les résolutions DNS]].&lt;br /&gt;
===Tester les résolutions DNS===&lt;br /&gt;
Pour effectuer les tests suivants, il faut ouvrir une fenêtre &amp;quot;[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|en ligne de commandes]]&amp;quot;. En cas de problème, il faut nous rapporter les résultats en ouvrant un rapport de bug sur le [http://bts.openflyers.ogr BTS]. Pour cela, il est pratique de procéder par [[#Copier.2FColler_dans_une_fen.C3.AAtre_en_ligne_de_commande|copier/coller]].&lt;br /&gt;
*Dans la fenêtre en ligne de commande taper ce qui suit (en remplaçant '''structure_aéro''' par le sous-domaine correspondant à votre structure aéronautique) :&lt;br /&gt;
&amp;lt;bash&amp;gt;ping structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
La réponse normale est pour OpenFlyers 3.0 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of3.openflyers.net [87.98.143.237] avec 32 octets de données :&lt;br /&gt;
 Réponse de 87.98.143.237 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of3.openflyers.net&amp;quot; ou &amp;quot;Réponse de 87.98.143.237&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 2.1 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of21.openflyers.net [91.121.47.179] avec 32 octets de données :&lt;br /&gt;
 Réponse de 91.121.47.179 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur5-of21.openflyers.net&amp;quot; ou &amp;quot;Réponse de 91.121.47.179&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 1.3 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of1.openflyers.net [178.33.105.217] avec 32 octets de données :&lt;br /&gt;
 Réponse de 178.33.105.217 : octets=32 temps=41 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of1.openflyers.net&amp;quot; ou &amp;quot;Réponse de 178.33.105.217&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
====Tests plus poussés====&lt;br /&gt;
*Faire un :&lt;br /&gt;
&amp;lt;bash&amp;gt;nslookup structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Et un :&lt;br /&gt;
&amp;lt;bash&amp;gt;tracert structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Faire le test avec '''dig +trace''' :&lt;br /&gt;
&amp;lt;bash&amp;gt;dig +trace structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
Sous Windows, il faudra au préalable récupérer l'utilitaire (par exemple dans un package [http://www.isc.org./downloads bind]). Une fois téléchargé le package, il faut copier/coller le programme dig ainsi que les fichiers .dll dans un répertoire commun et se positionner dans ce répertoire depuis la fenêtre en ligne de commandes avec la commande dir '''&amp;quot;nom du chemin du répertoire&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
====Tester les résolutions DNS sous Mac====&lt;br /&gt;
De plus, nous disposons de commandes plus puissantes qui permettent d'avoir d'avantage d'informations :&lt;br /&gt;
*cat /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
===Vérifier la configuration de résolution des DNS===&lt;br /&gt;
====Vérifier la configuration de résolution des DNS sous Windows====&lt;br /&gt;
Si vous avez un problème de résolution DNS sous windows, il peut être utile de vérifier que la résolution DNS est dynamique :&lt;br /&gt;
#Double-cliquer sur la connexion réseau concernée (par exemple le symbole &amp;quot;WIFI&amp;quot;)&lt;br /&gt;
#Cliquer sur '''Propriétés''' dans l'onglet '''Général''' de l''''Etat de Connexion réseau sans fil''' (si WIFI))&lt;br /&gt;
#Sélectionner '''Protocole internet TCP/IP'''&lt;br /&gt;
#Cliquer sur '''Propriétés'''&lt;br /&gt;
#Vérifier qu'est sélectionné '''Obtenir les adresses des serveurs DNS automatiquement'''. (si ce n'est pas le cas, modifier).&lt;br /&gt;
#En dernier ressort, [[#Changer de serveur DNS|Changer de serveur DNS]] ou [[#Forcer_les_DNS|Forcer les DNS]].&lt;br /&gt;
&lt;br /&gt;
===Nous communiquez les adresses IP des serveurs DNS===&lt;br /&gt;
====Nous communiquez les adresses IP des serveurs DNS sous Windows====&lt;br /&gt;
#[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|Ouvrir une fenêtre en ligne de commande]]&lt;br /&gt;
#Taper : '''ipconfig /all'''&lt;br /&gt;
Les adresses IP des serveurs DNS se trouvent au droit de '''Serveurs DNS'''&lt;br /&gt;
&lt;br /&gt;
===Changer de serveur DNS===&lt;br /&gt;
Si vous rencontrez un problème de résolution de DNS avec votre fournisseur d'accès, vous pouvez changer les serveurs qui effectue la résolution des DNS pour votre accès.&lt;br /&gt;
====Changer de serveur DNS sous Mac====&lt;br /&gt;
*Dans '''Préférences Systèmes''', choisir '''Réseau''', puis une fois la bonne carte réseau sélectionnée, appuyer sur Avancé.&lt;br /&gt;
*Dans la fenêtre qui apparaît, aller sur l'onglet '''DNS''' et dans '''Serveurs DNS''' appuyer sur le + pour ajouter '''8.8.8.8''' et une autre fois pour ajouter '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Il ne reste plus qu'à '''Appliquer''' et à tester.&lt;br /&gt;
&lt;br /&gt;
====Changer de serveur DNS sous Windows XP====&lt;br /&gt;
*'''Démarrer &amp;gt; Connexions''' puis cliquer sur la connexion réseau active (par exemple la connexion WIFI)&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*Sélectionner '''Protocole Internet (TCP/IP)'''&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*En général, en bas de la fenêtre '''Propriétés de Protocole Internet (TCP/IP)''' la configuration active est : '''Obtenir les adresses des serveurs DNS automatiquement'''&lt;br /&gt;
*Cocher '''Utiliser l'adresse de serveur DNS suivante :'''&lt;br /&gt;
*Pour '''Serveur DNS préféré''', saisir '''8.8.8.8'''&lt;br /&gt;
*Pour '''Serveur DNS auxiliaire''', saisir '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''Fermer'''&lt;br /&gt;
&lt;br /&gt;
===Forcer les DNS===&lt;br /&gt;
====Forcer les DNS sous Windows====&lt;br /&gt;
Attention, avec Vista, il faut appliquer une [[#Particularit.C3.A9_avec_Windows_Vista|procédure préalable]].&lt;br /&gt;
*Il est possible de résoudre ce problème de DNS en éditant le fichier C:\WINDOWS\system32\drivers\etc\hosts (avec le bloc-notes) en rajoutant la ligne (il faut remplacer structure_aéro par le sous-domaine de l'espace OpenFlyers de votre structure aéronautique) :&lt;br /&gt;
**Pour OF 1.3 :&lt;br /&gt;
&amp;lt;pre&amp;gt;178.33.105.217 structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 2.1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;91.121.47.179  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 3.0alpha :&lt;br /&gt;
&amp;lt;pre&amp;gt;87.98.143.237  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Ensuite, il faut relancer votre PC&lt;br /&gt;
*Une fois la connexion correctement effectuée, il est parfois possible de supprimer cette entrée dans le fichier hosts tout en gardant la connexion.&lt;br /&gt;
&lt;br /&gt;
====Particularité avec Windows Vista====&lt;br /&gt;
*Il faut être administrateur pour pouvoir modifier le fichier hosts.&lt;br /&gt;
*Il faut également copier le fichier hosts sur le bureau pour le modifier puis ensuite le recopier dans le bon répertoire (si on édite directement le fichier hosts depuis (system32\drivers\etc\) on ne peut pas le ré-enregistrer).&lt;br /&gt;
&lt;br /&gt;
====Forcer les DNS sous Mac====&lt;br /&gt;
*lancer Terminal (dans Applications/Utilitaires)&lt;br /&gt;
*taper &amp;quot;sudo nano /etc/hosts&amp;quot; (il demande le mot de passe de l'utilisateur qui a les droits admin sur la machine)&lt;br /&gt;
*Ajouter les entrées sur le modèle de la [[#Forcer_les_DNS_sous_Windows|procédure sous Windows]]&lt;br /&gt;
*Faire controle-o pour enregistrer puis controle-x pour quitter&lt;br /&gt;
*Eventuellement, faire &amp;quot;dscacheutil -flushcache&amp;quot; si le changement n'est pas encore pris en compte.&lt;br /&gt;
&lt;br /&gt;
==A chaque fois que je change de page, je reviens sur la page d'identification ?==&lt;br /&gt;
Si le retour à la page d'identification est systématique, alors il doit s'agir d'un problème de '''cookies'''. Il faut modifier la configuration du navigateur de manière à [[#Autoriser_les_cookies|autoriser les cookies]].&lt;br /&gt;
&lt;br /&gt;
===Variante du problème : la déconnexion n'est pas systématique mais aléatoire===&lt;br /&gt;
Dans ce cas, il peut s'agir aussi d'un problème de proxy (si vous êtes sur un réseau d'entreprise par exemple) ou de fournisseurs d'accès (accès depuis un mobile, depuis un hôtel, bref, tout type d'accès qui change régulièrement l'adresse IP et ainsi ne permet de maintenir un accès authentifié dans la durée. La solution est présentée dans la procédure [[#Utiliser_OpenFlyers_sur_un_smartphone|Utiliser OpenFlyers sur un smartPhone]].&lt;br /&gt;
&lt;br /&gt;
==Plusieurs membres peuvent-ils ouvrir des sessions en même temps (sans le savoir) ?==&lt;br /&gt;
Oui, c'est même le but premier : permettre à plusieurs personnes de consulter en même temps le cahier de réservation.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez même avoir une personne qui ouvre plusieurs sessions avec son identifiant. Mais pour cela, elle doit utiliser des ordinateurs ou des navigateurs différents.&lt;br /&gt;
==Suite à une migration, impossible de naviguer dans la nouvelle version d'OpenFlyers==&lt;br /&gt;
Lorsque nous migrons d'une version vers une autre, bien souvent nous le faisons en changeant les &amp;quot;DNS&amp;quot;. Cela peut occasionner des problèmes d'accès. Il peut également apparaitre des problèmes de &amp;quot;cache&amp;quot; qui se résolvent d'eux sous 24 à 48 heures. Ces problèmes peuvent survenir lorsque l'ordinateur concerné a été connecté à l'ancienne plateforme OpenFlyers juste avant la migration.&lt;br /&gt;
&lt;br /&gt;
Voici différentes techniques qui permettent d'imposer à votre navigateur d'utiliser des DNS actualisées et d'utiliser un cache à jour :&lt;br /&gt;
#Penser à éteindre et rallumer complètement l'ordinateur&lt;br /&gt;
#Faites un CTRL+R (ou icône de &amp;quot;rafraichissement&amp;quot;). Bien souvent cela suffit au navigateur pour qu'il vide son cache et le ré-actualise&lt;br /&gt;
#Vider le cache dans le navigateur&lt;br /&gt;
#Supprimer les cookies dans le navigateur&lt;br /&gt;
Plus technique :&lt;br /&gt;
#Faites un ipconfig /flushdns en ligne de commande (menu démarrer, puis &amp;quot;Exécutez&amp;quot;, taper &amp;quot;cmd&amp;quot;)&lt;br /&gt;
#Forcer les nouvelles DNS dans le fichier C:\WINDOWS\system32\drivers\etc\hosts en ajoutant une ligne du genre : xxx.xxx.xxx.xxx xxx.openflyers.zz (nous demandez pour connaitre les valeurs à utiliser)&lt;br /&gt;
&lt;br /&gt;
De plus, afin de permettre quand même d'accéder à la nouvelle plateforme, nous mettons en place une deuxième URL temporaire pendant 1 semaine. Ainsi pour l'URL plateforme.openflyers.fr nous mettrons en place une URL temporaire plateforme2.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
=Navigation dans OpenFlyers=&lt;br /&gt;
OpenFlyers est un logiciel qui s'utilise grâce à votre navigateur internet. Les plus connus sont Chrome, Firefox, Internet Explorer ou Safari.&lt;br /&gt;
Une certaine configuration est nécessaire afin de faire fonctionner OpenFlyers : la configuration des cookies.&lt;br /&gt;
Si vous rencontrez des problèmes d'utilisations tels que :&lt;br /&gt;
&lt;br /&gt;
*Impossibilité de se connecter alors que votre identifiant et mot de passe est correct&lt;br /&gt;
*Impossibilité d'aller d'un page à l'autre une fois connecté (et retour sur la page de connexion)&lt;br /&gt;
&lt;br /&gt;
Voila comment régler votre navigateur.&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous Firefox==&lt;br /&gt;
*'''Outils &amp;gt; Options'''&lt;br /&gt;
*Onglet '''vie privée'''&lt;br /&gt;
*Cocher '''Accepter les cookies'''&lt;br /&gt;
*Bouton '''OK'''&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous Internet Explorer==&lt;br /&gt;
*'''Outils &amp;gt; Options internet'''&lt;br /&gt;
*Onglet '''Confidentialité'''&lt;br /&gt;
*Positionner le niveau de sécurité au maximum à '''Moyenne'''&lt;br /&gt;
*Bouton '''OK'''&lt;br /&gt;
&lt;br /&gt;
==Autoriser les cookies sous iPhone / Safari==&lt;br /&gt;
*'''Réglages &amp;gt; Safari'''&lt;br /&gt;
*Régler '''Accepter les cookies'''&lt;br /&gt;
[[Fichier:Accepter-cookies-iPhone-Safari.png]]&lt;br /&gt;
&lt;br /&gt;
==Problème de navigation sur un réseau GSM==&lt;br /&gt;
OpenFlyers est accessible sur les smartphones par le biais du navigateur embarqué. Cependant, des problèmes de session peuvent survenir du fait du changement dynamique de l'adresse IP du smartphone du fait du réseau GSM. Pour palier à ce problème et éviter des déconnexions intempestives, il faut se connecter en HTTPS.&lt;br /&gt;
&lt;br /&gt;
De plus, et toujours en HTTPS, il est possible de [[#Transmettre_l.27identifiant_et_le_mot_de_passe_dans_l.27URL|rajouter le couple identifiant/mot de passe à la suite de l'URL sécurisée]] et d'enregistrer cette URL en favori. Ainsi, il n'est plus nécessaire de saisir systématiquement son identifiant et son mot de passe.&lt;br /&gt;
&lt;br /&gt;
==Problèmes de navigation sous iPhone==&lt;br /&gt;
*Penser à mettre à jour le logiciel de l'iPhone. OpenFlyers fonctionne correctement pour une version au moins 4.02.&lt;br /&gt;
*Activer l'[[#Autoriser_les_cookies_sous_iPhone_.2F_Safari|acceptation des cookies]]&lt;br /&gt;
*Si la navigation était possible sur une version précédente d'OpenFlyers et qu'elle n'est plus possible sur une nouvelle version d'OpenFlyers, alors il peut être nécessaire de vider le cache du navigateur Safari de l'iPhone :&lt;br /&gt;
**'''Réglages &amp;gt; Safari'''&lt;br /&gt;
**'''Effacer cookies et données'''&lt;br /&gt;
&lt;br /&gt;
=Transmettre l'identifiant et le mot de passe dans l'URL=&lt;br /&gt;
Si vous souhaitez transmettre le couple identifiant/mot de passe dans l'URL dans le but de pouvoir les sauver facilement, vous avez besoin d'un [http://www.openflyers.com/doc/catalogue-tarifaire.pdf abonnement HTTPS] et alors l'URL doit avoir la forme :&lt;br /&gt;
 https://mySpaceName.openflyers.tld?login=myLogin&amp;amp;password=myPassword&lt;br /&gt;
où :&lt;br /&gt;
*mySpaceName doit être remplacé par le nom du compte openflyers&lt;br /&gt;
*tld doit être remplacé par l'extension (comme de, fr, us, etc.)&lt;br /&gt;
*myLogin doit être remplacé par votre identifiant&lt;br /&gt;
*myPassword doit être remplacé par votre mot de passe&lt;br /&gt;
&lt;br /&gt;
=Cahier de réservation=&lt;br /&gt;
==Que se passe t-il en cas de conflit de réservation ?==&lt;br /&gt;
Il ne peut y avoir de conflit de réservation. C'est l'un des principes durs d'OpenFlyers : à chaque instant donné, il ne peut y avoir plus d'une réservation pour chaque pilote, chaque avion ou chaque instructeur.&lt;br /&gt;
&lt;br /&gt;
Si vous arrivez à faire des réservations qui se chevauchent (pour un avion, un instructeur ou un pilote), alors vous avez mis en évidence un bug, et il faut nous le signaler pour que nous y remédions.&lt;br /&gt;
&lt;br /&gt;
==Si je suis en train de consulter une page, et que quelqu'un fait une modif sur cette page, vais-je voir la modif sans lancer un rafraichissement ?==&lt;br /&gt;
Non vous ne verrez pas la modification. Cependant, ce n'est pas grave car au moment où vous essayerez de faire votre réservation, OpenFlyers vérifiera à ce moment-là que le créneau que vous souhaitez est toujours disponible (pour empêcher les conflits justement).&lt;br /&gt;
&lt;br /&gt;
==Comment saisir une date rapidement dans la gestion des qualifications ?==&lt;br /&gt;
En cliquant sur l'icône &amp;quot;calendrier&amp;quot; placé par défaut au mois courant, vous pourrez vous déplacer mois par mois ou année par année en cliquant sur les flèches respectives. Pour des dates plus anciennes, passez le curseur de votre souris sur l'endroit où se trouve le texte correspondant à &amp;quot;Mois Année&amp;quot;. Ce texte s'encadre alors d'une bordure. Faites un clic dessus et une nouvelle petite fenêtre va s'ouvrir. Là vous pourrez saisir l'année en tapant les chiffres avec votre clavier.&lt;br /&gt;
&lt;br /&gt;
==A propos des horaires de la nuit aéronautique==&lt;br /&gt;
&lt;br /&gt;
Nous calculons les éphémérides d'après les définitions officielles.&lt;br /&gt;
&lt;br /&gt;
Ainsi, les heures de lever et de coucher du soleil correspondent au passage du centre du soleil sous l'horizon (donc 3 degrés sous l'horizon puisqu'il est considéré, en première approximation que le soleil a un diamètre apparent de 6 degrés).&lt;br /&gt;
&lt;br /&gt;
Les heures du jour et de la nuit aéronautique correspondent au passage du soleil 6 degrés sous l'horizon. Il s'agit de la définition officielle, aussi bien française, qu'internationale (OACI). Le calcul est validé pour les latitudes inférieures à 65 degrés. Sa précision est de l'ordre de la minute sous des latitudes inférieures à 50 degrés. La précision diminue au fur et à mesure que la latitude augmente (c'est à dire que l'on se rapproche des pôles).&lt;br /&gt;
&lt;br /&gt;
Conséquence du calcul : les résultats trouvés ne correspondent pas (forcément) à la simple addition de + ou - 30 minutes. Mais il n'a jamais été écrit dans un texte officiel que la journée aéronautique correspondait au lever du soleil moins trente minutes, et que la nuit aéronautique correspondait au coucher du soleil plus trente minutes. La seule chose que vous trouverez, si vous vous penchez sur les textes, c'est qu'il est admis d'utiliser + ou - 30 minutes pour faire les calculs sous des latitudes comprises entre 30 et 60 degrés et 15 minutes sous les latitudes inférieures à 30 degrés). Voir [http://www.anpi.asso.fr/Reglesair.pdf Règles de l'air - Chapitre 1er - Définitions]&lt;br /&gt;
Attention: certains pays n'utilisent pas la nuit aéronautique et ne permettent pas le vol en dehors du lever et du coucher du soleil&lt;br /&gt;
&lt;br /&gt;
Le résultat proposé est donc le bon résultat. Si vous ne souhaitez pas utiliser ce résultat, il vous suffit de retrancher ou d'ajouter 30 minutes au calcul du lever et du coucher du soleil.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous attirons votre attention sur l'intérêt d'utiliser le bon calcul : il vous met du bon côté du point de vue de la sécurité. En effet, si en été vous y gagnez, c'est parce que le soleil met plus de temps à se coucher. Par contre en hiver, notre calcul fait &amp;quot;perdre&amp;quot; une dizaine de minutes : c'est parce que le soleil met moins de temps à se coucher. Calculer l'écart entre la nuit aéronautique et le coucher du soleil (et comparer avec les 30 minutes) vous permettra d'avoir une idée de la &amp;quot;vitesse&amp;quot; avec laquelle se couche le soleil, donc de vous méfier encore plus de l'arrivée de la nuit et de ne pas vous faire surprendre par le crépuscule.&lt;br /&gt;
&lt;br /&gt;
Qui ne s'est jamais retrouvé au sol en ayant voulu &amp;quot;tangenter&amp;quot; avec la nuit et s'est surpris à constater qu'il faisait bien sombre, tout d'un coup ?&lt;br /&gt;
&lt;br /&gt;
Le programme calcule les heures de coucher/lever du soleil à partir des coordonnées géographique du terrain de base. Si vous constatez que vos heures sont erronées, demander à votre administrateur qu'il vérifie le code OACI dans les paramètres de la structure aéronautique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Saisie des vols=&lt;br /&gt;
==Nos avions ont des compteurs en heures, centièmes, peut-on avoir un affichage en heures, minutes ?==&lt;br /&gt;
Chaque utilisateur paramètre son affichage comme il le souhaite dans Données/Affichage et fiche personnelle&lt;br /&gt;
[[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format Patron de date et heure]]&lt;br /&gt;
&lt;br /&gt;
== Comment saisir plusieurs pilotes pour un vol ?==&lt;br /&gt;
Saisir les vols dans OF comme dans le carnet de route de l'avion&lt;br /&gt;
== Comment partager les coûts d'un vol ?==&lt;br /&gt;
Si un pilote veux partager les frais du vol (sans être pilote) il doit faire un transfert de son compte vers le compte du pilote&lt;br /&gt;
Menu Comtes/Transférer&lt;br /&gt;
&lt;br /&gt;
=Divers=&lt;br /&gt;
==Peut-il y avoir des accès à plusieurs sur la base ?==&lt;br /&gt;
Oui, sinon deux membres ne pourraient pas consulter le cahier en même temps.&lt;br /&gt;
&lt;br /&gt;
Par contre, lorsqu'un membre réserve un avion, au moment où OpenFlyers teste la disponibilité du créneau, il empêche toute autre écriture sur la base concernant les réservations. Le but est d'empécher justement les conflits de réservation.&lt;br /&gt;
&lt;br /&gt;
=Actions dynamiques non prises en compte par OpenFlyers=&lt;br /&gt;
OpenFlyers met en oeuvre des actions dites &amp;quot;dynamiques&amp;quot; c'est à dire qui ne nécessite pas un rafraîchissement complet de la page pour être prises en comptes. Ces actions sont basées sur le principe &amp;quot;[http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML AJAX]&amp;quot;. Elles nécessitent l'activation du moteur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] du navigateur pour être opérationnelles.&lt;br /&gt;
&lt;br /&gt;
De plus, certaines commandes [http://fr.wikipedia.org/wiki/JavaScript JavaScript] ne sont pas reconnues par tous les navigateurs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, lorsque vous lancez une action dynamique dans OpenFlyers qui reste sans résultat, avant de rapporter l'anomalie sur le [http://bts.openflyers.org BTS] il faut vérifier :&lt;br /&gt;
#L'activation de [http://fr.wikipedia.org/wiki/JavaScript JavaScript] dans le navigateur utilisé.&lt;br /&gt;
#Tester avec un autre navigateur&lt;br /&gt;
#Dans le cas où JavaScript est activé, il faut rapporter l'anomalie sur le [http://bts.openflyers.org BTS] en précisant le navigateur sur lequel l'action est inefficace et le navigateur sur lequel l'action est efficace.&lt;br /&gt;
Vous pouvez également nous facilitez la correction de l'anomalie en nous rapportant le message d'erreur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] s'il y a lieu.&lt;br /&gt;
&lt;br /&gt;
=Comment exporter les données ?=&lt;br /&gt;
OF affiche une page XHTML ce qui signifie un texte correctement formaté qui peut être récupéré par un simple copier coller. Le tableur Calc de Open Office ou Libre Office interprète correctement ce HTML et le formate en colonne conformément à la présentation de votre page.&lt;br /&gt;
 &lt;br /&gt;
Il a cependant un paramétrage à faire pour que les textes soit correctement encodé (affichage des caractères accentués) et que les cellules numériques affichent le format correct&lt;br /&gt;
&lt;br /&gt;
*Allez dans l'onglet Outils/Options/Chargement&amp;amp;Enegistrement/Compatibilité HTML (Tools/Options/Load&amp;amp;Save/HTML Compatibility)&lt;br /&gt;
*Cocher &amp;quot;Utiliser l'environnement linguistique Anglais (USA) pour les nombres&amp;quot;, (&amp;quot;Use English (USA) locale numbers&amp;quot;)&lt;br /&gt;
*Par la même occasion vous pouvez aussi changer le Jeu d'encodage (Character set) par Unicode (UTF-8) &lt;br /&gt;
&lt;br /&gt;
Le programme interprète alors le point comme le séparateur décimal et vous avez directement le bon copier/coller Si vous avec choisi l'encodage UTF-8 les caractères accentués seront aussi correctement traduits (A rechanger si vous avez à faire des copier coller depuis des programmes à l'encodage CP1252 &amp;quot;Windows Microsoft&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Pour les exports au format csv voir [[FAQ csv reading with Oo]]&lt;br /&gt;
&lt;br /&gt;
=Paramétrage et données personnelles=&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti automatiquement des réservations annulées ?==&lt;br /&gt;
Dans la version 3 d'OpenFlyers, il est possible pour chaque utilisateur de paramétrer OpenFlyers de sort à être averti par e-mail lorsqu'un créneau se libère. Voici comment configurer cela :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''', sélectionner '''Notification des réservations annulées'''&lt;br /&gt;
*Cliquer sur le bouton '''Sauver'''&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti des réservations sur plusieurs adresses e-mail ?==&lt;br /&gt;
&lt;br /&gt;
Il est possible d'utiliser plusieurs adresses e-mails afin d'être averti des réservations.&lt;br /&gt;
&lt;br /&gt;
Voici comment procéder :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''' puis au niveau du champ '''E-mail'''&lt;br /&gt;
*Rentrer chacune des adresses e-mails en les séparant d'une virgule&lt;br /&gt;
'''Attention : il ne faut jamais mettre d'espace : ni dans l'adresse e-mail elle même, ni avant ou après les virgules de séparation des adresses e-mails'''&lt;br /&gt;
&lt;br /&gt;
Exemple valide :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr,jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemples non valides :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr, jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Accéder à l'application et aller dans le menu Données &amp;gt; Affichage et fiche personnelle&lt;br /&gt;
&lt;br /&gt;
==Comment changer mes options d'affichage ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Option d'affichage'''&lt;br /&gt;
&lt;br /&gt;
Dans les champs choisissez les paramètres selon vos souhaits: langue, heure local ou UTC, format monétaire,...&lt;br /&gt;
&lt;br /&gt;
Sélectionner les avions et instructeurs que sous voulez afficher&lt;br /&gt;
&lt;br /&gt;
==Affichage des dates et des heures==&lt;br /&gt;
Chaque utilisateur paramètre son affichage des dates et des heures comme il le souhaite dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Ressources sur les [[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format patrons de date et heure]]&lt;br /&gt;
&lt;br /&gt;
==Comment modifier mes paramétrages ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Charger une photo pour le trombinoscope&lt;br /&gt;
&lt;br /&gt;
La date de naissance, le sexe et la nationalité sont obligatoire pour que les statistiques DGAC puisse être calculés &lt;br /&gt;
&lt;br /&gt;
Mettez votre email et vos numéros de téléphone pour qu'on puisse vous contacter. Vous pouvez choisir ceux qui sont public ou non. &lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas seul les personnes avec des droits administrateur pourrons voir ces infos.&lt;br /&gt;
&lt;br /&gt;
==J'ai oublié mon mot de passe, comment le récupérer ?==&lt;br /&gt;
Il n'est pas possible de &amp;quot;retrouver&amp;quot; son mot de passe perdu dans OpenFlyers. En effet, ces derniers sont cryptés dans la base de données pour des raisons de confidentialités.&lt;br /&gt;
&lt;br /&gt;
Si vous avez oublié votre mot de passe, vous n'avez pas besoin de demander à votre administrateur une ré-initialisation, OpenFlyers dispose d'une procédure de ré-initialisation automatique :&lt;br /&gt;
&lt;br /&gt;
*Sur la page de connexion d'une plateforme OpenFlyers, cliquer sur le lien &amp;quot;Mot de passe oublié&amp;quot;&lt;br /&gt;
*:[[Fichier:FAQ_user_forgottenPassword.png]]&lt;br /&gt;
*Sur la page qui s'affiche il y a deux zones de saisie. Saisissez l'email que vous avez indiqué dans votre page personnelle. Il vous sera envoyé un email vous donnant votre identifiant et un code d'activation&lt;br /&gt;
*Revenez sur la page de ré-initialisation et mettez ces informations. Un nouvel email vous sera envoyé avec votre mot de passe&lt;br /&gt;
&lt;br /&gt;
Vous pouvez maintenant accéder à l'application. Pour mettre un mot de passe personnalisé voir [[#Comment_changer_de_mot_de_passe|Comment changer son mot de passe]]&lt;br /&gt;
&lt;br /&gt;
==Comment changer de mot de passe==&lt;br /&gt;
*Dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Aller en bas de la page, dans le formulaire '''Changer de mot de passe''' et saisissez votre nouveau mot de passe&lt;br /&gt;
&lt;br /&gt;
Un indicateur vous indique le niveau de fiabilité. Mélanger les minuscules/majuscules/chiffres et sigles pour augmenter la difficulté pour des robots de trouver votre mot de passe. La sécurité de l'application de votre club sera ainsi accrue.&lt;br /&gt;
&lt;br /&gt;
=Trucs et astuces=&lt;br /&gt;
==Fenêtre en ligne de commande==&lt;br /&gt;
===Ouvrir une fenêtre en ligne de commande===&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
*Aller dans le menu &amp;quot;Démarrer&amp;quot;&lt;br /&gt;
*Puis Tous les programmes/Accessoires&lt;br /&gt;
*Lancer l'&amp;quot;invite de commandes&amp;quot;&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Sous OSX (mac) il faut lancer un Terminal. Pour cela 2 solutions :&lt;br /&gt;
*Taper &amp;quot;terminal&amp;quot; dans spotlight&lt;br /&gt;
ou&lt;br /&gt;
*lancer l'application qui est dans Applications &amp;gt; Utilitaires.&lt;br /&gt;
&lt;br /&gt;
===Copier/Coller dans une fenêtre en ligne de commande===&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
Vous pouvez faire un copier/coller en utilisant le bouton droit de la souris dans la fenêtre de l'invite de commandes puis en choisissant '''sélectionner''' et ensuite en appuyant sur le bouton gauche et en le laissant appuyer tout en sélectionnant la zone souhaitée)&lt;br /&gt;
&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Pour faire un copier/coller de ces informations et nous les communiquer, il suffit d'utiliser commande-C dans le terminal.&lt;br /&gt;
&lt;br /&gt;
=Comment imprimer la doc ?=&lt;br /&gt;
Si vous souhaitez imprimer la doc, il vous suffit de :&lt;br /&gt;
*cliquer sur le lien &amp;quot;version imprimable&amp;quot; de la &amp;quot;boîte à outils&amp;quot; présente sur le côté gauche des pages du wiki. Vous obtiendrez ainsi une version des pages destinée à être imprimer.&lt;br /&gt;
*ou bien, utiliser la fonction imprimer de votre navigateur. Une mise en page spécifique est générée pour obtenir un format papier&lt;br /&gt;
&lt;br /&gt;
Si vous imprimer avec une Imprimante pdf ([http://www.pdfforge.org/pdfcreator pdfCreator] par exemple) vous générerez alors un format pdf pour archivage&lt;br /&gt;
&lt;br /&gt;
=Problèmes=&lt;br /&gt;
==Signaler un problème==&lt;br /&gt;
Si vous rencontrer une anomalie ou un bug dans l'application OpenFlyers, il faut le rapporter sur le [http://bts.openflyers.org BTS] pour une prise en compte la plus rapide possible et pour permettre un meilleur traitement et suivi.&lt;br /&gt;
&lt;br /&gt;
Pour rapporter une anomalie il faut :&lt;br /&gt;
*Aller sur la page http://bts.openflyers.org&lt;br /&gt;
*S'inscrire sur le BTS en cliquant sur '''Signup for a new account''' : il faut choisir un identifiant, une adresse e-mail puis cliquer sur '''Signup'''.&lt;br /&gt;
Un e-mail est envoyé par le BTS permettant de valider votre adresse e-mail. Cliquer sur le lien présent sur cet e-mail.&lt;br /&gt;
*Sur le formulaire qui apparait, Choisir :&lt;br /&gt;
**Un mot de passe dans les champs '''Password''' et '''Confirm Password'''&lt;br /&gt;
**Compléter éventuellement le champ '''Real Name'''&lt;br /&gt;
*Cliquer sur le bouton '''Update account'''&lt;br /&gt;
Votre compte pour rapporter un problème sur le BTS est ainsi créé. Un nouveau formulaire d'identification s'affiche automatiquement :&lt;br /&gt;
*Renseigner les champs '''Username''' et '''Password'''&lt;br /&gt;
*Sélectionner éventuellement sur '''Remember my login in this browser''' afin de ne plus avoir à s'identifier lors d'une nouvelle connexion depuis le même navigateur internet.&lt;br /&gt;
*Dé-sélectionner éventuellement le champ '''Only allow your session to be used from this IP address.''' qui limite les possibilités de connexion&lt;br /&gt;
*Cliquer sur '''Login'''&lt;br /&gt;
*Aller dans l'onglet '''Preferences'''&lt;br /&gt;
*En bas du formulaire, modifier le champ '''Language''' pour choisir '''french'''.&lt;br /&gt;
*Cliquer sur '''Update Prefs'''&lt;br /&gt;
Vous pouvez alors tranquillement rapporter un bug depuis le formulaire '''Rapporter un bogue'''&lt;br /&gt;
&lt;br /&gt;
==Problème d'auto-complétion des terrains==&lt;br /&gt;
*Si les terrains d'arrivée et de départ ne s'affichent pas, vérifier la [[Browsers_compatibility#Versions_support.C3.A9es|compatibilité de votre navigateur]].&lt;br /&gt;
*La version 2.1 d'OpenFlyers n'est pas supportée par Internet Explorer 10.&lt;br /&gt;
*En revanche, la version 3.0.3 d'OpenFlyers est supportée par les versions d'Internet Explorer supérieures à 8.&lt;br /&gt;
Si vous êtes sous la version 2.1 d'OpenFlyers avec comme navigateur Internet Explorer alors vous avez 2 solutions :&lt;br /&gt;
*Changer de navigateur&lt;br /&gt;
*[[FAQ_client#Comment_se_fait_la_migration_vers_une_version_sup.C3.A9rieure_.3F|Demander à migrer]] sous la version 3.0.3 d'OpenFlyers.&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13235</id>
		<title>FAQ utilisateur</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=FAQ-utilisateur&amp;diff=13235"/>
				<updated>2015-04-16T12:47:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Autoriser les cookies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Connexion=&lt;br /&gt;
==Impossible de me connecter à la plateforme OpenFlyers de ma structure aéronautique==&lt;br /&gt;
Si vous n'arrivez pas à accéder une plateforme OpenFlyers il faut en rechercher la raison. Voici un certain nombre de questions qui peuvent vous permettre de solutionner votre problème :&lt;br /&gt;
*Accédez-vous à la page d'identification de la plateforme OpenFlyers ?&lt;br /&gt;
**Si non, alors il faut regarder la FAQ [[#Page_indisponible|Page indisponible]]&lt;br /&gt;
*Lorsque vous vous identifiez, avez-vous un message de rejet indiquant que votre identifiant et/ou votre mot de passe ne sont pas corrects ?&lt;br /&gt;
**Si oui, alors le problème peut venir du mot de passe qui a changé. Dans ce cas là, vous pouvez ré-initialiser votre mot de passe en suivant la procédure [[#J.27ai_oubli.C3.A9_mon_mot_de_passe.2C_comment_le_r.C3.A9cup.C3.A9rer_.3F|de réinitialisation de mot de passe]]. Cela peut également venir de votre identifiant qui n'est pas bon. Dans ce cas, il faut demander à la personne en charge de la gestion d'OpenFlyers au sein de votre structure aéronautique&lt;br /&gt;
*Une fois connecté, revenez-vous sur la page d'identification lorsque vous changez de page ?&lt;br /&gt;
**Si oui, alors il faut regarder la [[#A_chaque_fois_que_je_change_de_page.2C_je_reviens_sur_la_page_d.27identification_.3F|procédure de gestion des cookies du navigateur]].&lt;br /&gt;
Si vous n'êtes dans aucun des cas répertoriés ci-dessus, alors vous pouvez rapporter votre problème en nous envoyant un e-mail et en décrivant le plus précisément possible le problème que vous rencontrez :&lt;br /&gt;
*Navigateur utilisé&lt;br /&gt;
*Système d'exploitation&lt;br /&gt;
*type de PC, smartphone ou tablette&lt;br /&gt;
*Nom du fournisseur d'accès internet&lt;br /&gt;
*Actions effectuées&lt;br /&gt;
*Message d'erreur s'affichant&lt;br /&gt;
&lt;br /&gt;
==Page indisponible==&lt;br /&gt;
Si vous n'arrivez pas à accéder à la plateforme OpenFlyers de votre structure aéronautique. Voici une liste d'actions à effectuer :&lt;br /&gt;
*Redémarrer votre ordinateur&lt;br /&gt;
*Redémarrer la &amp;quot;box&amp;quot; ADSL&lt;br /&gt;
*Si cela ne fonctionne toujours pas, il faut [[#Tester_les_r.C3.A9solutions_DNS|tester les résolutions DNS]].&lt;br /&gt;
===Tester les résolutions DNS===&lt;br /&gt;
Pour effectuer les tests suivants, il faut ouvrir une fenêtre &amp;quot;[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|en ligne de commandes]]&amp;quot;. En cas de problème, il faut nous rapporter les résultats en ouvrant un rapport de bug sur le [http://bts.openflyers.ogr BTS]. Pour cela, il est pratique de procéder par [[#Copier.2FColler_dans_une_fen.C3.AAtre_en_ligne_de_commande|copier/coller]].&lt;br /&gt;
*Dans la fenêtre en ligne de commande taper ce qui suit (en remplaçant '''structure_aéro''' par le sous-domaine correspondant à votre structure aéronautique) :&lt;br /&gt;
&amp;lt;bash&amp;gt;ping structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
La réponse normale est pour OpenFlyers 3.0 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of3.openflyers.net [87.98.143.237] avec 32 octets de données :&lt;br /&gt;
 Réponse de 87.98.143.237 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of3.openflyers.net&amp;quot; ou &amp;quot;Réponse de 87.98.143.237&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 2.1 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of21.openflyers.net [91.121.47.179] avec 32 octets de données :&lt;br /&gt;
 Réponse de 91.121.47.179 : octets=32 temps=37 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur5-of21.openflyers.net&amp;quot; ou &amp;quot;Réponse de 91.121.47.179&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
&lt;br /&gt;
La réponse normale est pour OpenFlyers 1.3 :&lt;br /&gt;
 Envoi d'une requête 'ping' sur serveur6-of1.openflyers.net [178.33.105.217] avec 32 octets de données :&lt;br /&gt;
 Réponse de 178.33.105.217 : octets=32 temps=41 ms TTL=55&lt;br /&gt;
Si vous n'avez pas &amp;quot;serveur6-of1.openflyers.net&amp;quot; ou &amp;quot;Réponse de 178.33.105.217&amp;quot; cela veut dire que vous avez un [[#Vérifier la configuration de résolution des DNS|problème de résolution de DNS]].&lt;br /&gt;
====Tests plus poussés====&lt;br /&gt;
*Faire un :&lt;br /&gt;
&amp;lt;bash&amp;gt;nslookup structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Et un :&lt;br /&gt;
&amp;lt;bash&amp;gt;tracert structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
*Faire le test avec '''dig +trace''' :&lt;br /&gt;
&amp;lt;bash&amp;gt;dig +trace structure_aéro.openflyers.fr&amp;lt;/bash&amp;gt;&lt;br /&gt;
Sous Windows, il faudra au préalable récupérer l'utilitaire (par exemple dans un package [http://www.isc.org./downloads bind]). Une fois téléchargé le package, il faut copier/coller le programme dig ainsi que les fichiers .dll dans un répertoire commun et se positionner dans ce répertoire depuis la fenêtre en ligne de commandes avec la commande dir '''&amp;quot;nom du chemin du répertoire&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
====Tester les résolutions DNS sous Mac====&lt;br /&gt;
De plus, nous disposons de commandes plus puissantes qui permettent d'avoir d'avantage d'informations :&lt;br /&gt;
*cat /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
===Vérifier la configuration de résolution des DNS===&lt;br /&gt;
====Vérifier la configuration de résolution des DNS sous Windows====&lt;br /&gt;
Si vous avez un problème de résolution DNS sous windows, il peut être utile de vérifier que la résolution DNS est dynamique :&lt;br /&gt;
#Double-cliquer sur la connexion réseau concernée (par exemple le symbole &amp;quot;WIFI&amp;quot;)&lt;br /&gt;
#Cliquer sur '''Propriétés''' dans l'onglet '''Général''' de l''''Etat de Connexion réseau sans fil''' (si WIFI))&lt;br /&gt;
#Sélectionner '''Protocole internet TCP/IP'''&lt;br /&gt;
#Cliquer sur '''Propriétés'''&lt;br /&gt;
#Vérifier qu'est sélectionné '''Obtenir les adresses des serveurs DNS automatiquement'''. (si ce n'est pas le cas, modifier).&lt;br /&gt;
#En dernier ressort, [[#Changer de serveur DNS|Changer de serveur DNS]] ou [[#Forcer_les_DNS|Forcer les DNS]].&lt;br /&gt;
&lt;br /&gt;
===Nous communiquez les adresses IP des serveurs DNS===&lt;br /&gt;
====Nous communiquez les adresses IP des serveurs DNS sous Windows====&lt;br /&gt;
#[[#Ouvrir_une_fen.C3.AAtre_en_ligne_de_commande|Ouvrir une fenêtre en ligne de commande]]&lt;br /&gt;
#Taper : '''ipconfig /all'''&lt;br /&gt;
Les adresses IP des serveurs DNS se trouvent au droit de '''Serveurs DNS'''&lt;br /&gt;
&lt;br /&gt;
===Changer de serveur DNS===&lt;br /&gt;
Si vous rencontrez un problème de résolution de DNS avec votre fournisseur d'accès, vous pouvez changer les serveurs qui effectue la résolution des DNS pour votre accès.&lt;br /&gt;
====Changer de serveur DNS sous Mac====&lt;br /&gt;
*Dans '''Préférences Systèmes''', choisir '''Réseau''', puis une fois la bonne carte réseau sélectionnée, appuyer sur Avancé.&lt;br /&gt;
*Dans la fenêtre qui apparaît, aller sur l'onglet '''DNS''' et dans '''Serveurs DNS''' appuyer sur le + pour ajouter '''8.8.8.8''' et une autre fois pour ajouter '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Il ne reste plus qu'à '''Appliquer''' et à tester.&lt;br /&gt;
&lt;br /&gt;
====Changer de serveur DNS sous Windows XP====&lt;br /&gt;
*'''Démarrer &amp;gt; Connexions''' puis cliquer sur la connexion réseau active (par exemple la connexion WIFI)&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*Sélectionner '''Protocole Internet (TCP/IP)'''&lt;br /&gt;
*Cliquer sur '''Propriétés'''&lt;br /&gt;
*En général, en bas de la fenêtre '''Propriétés de Protocole Internet (TCP/IP)''' la configuration active est : '''Obtenir les adresses des serveurs DNS automatiquement'''&lt;br /&gt;
*Cocher '''Utiliser l'adresse de serveur DNS suivante :'''&lt;br /&gt;
*Pour '''Serveur DNS préféré''', saisir '''8.8.8.8'''&lt;br /&gt;
*Pour '''Serveur DNS auxiliaire''', saisir '''8.8.4.4''' (ce sont les [http://code.google.com/speed/public-dns/|serveurs DNS public Google])&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''OK'''&lt;br /&gt;
*Cliquer sur '''Fermer'''&lt;br /&gt;
&lt;br /&gt;
===Forcer les DNS===&lt;br /&gt;
====Forcer les DNS sous Windows====&lt;br /&gt;
Attention, avec Vista, il faut appliquer une [[#Particularit.C3.A9_avec_Windows_Vista|procédure préalable]].&lt;br /&gt;
*Il est possible de résoudre ce problème de DNS en éditant le fichier C:\WINDOWS\system32\drivers\etc\hosts (avec le bloc-notes) en rajoutant la ligne (il faut remplacer structure_aéro par le sous-domaine de l'espace OpenFlyers de votre structure aéronautique) :&lt;br /&gt;
**Pour OF 1.3 :&lt;br /&gt;
&amp;lt;pre&amp;gt;178.33.105.217 structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 2.1 :&lt;br /&gt;
&amp;lt;pre&amp;gt;91.121.47.179  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
**Pour OF 3.0alpha :&lt;br /&gt;
&amp;lt;pre&amp;gt;87.98.143.237  structure_aéro.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Ensuite, il faut relancer votre PC&lt;br /&gt;
*Une fois la connexion correctement effectuée, il est parfois possible de supprimer cette entrée dans le fichier hosts tout en gardant la connexion.&lt;br /&gt;
&lt;br /&gt;
====Particularité avec Windows Vista====&lt;br /&gt;
*Il faut être administrateur pour pouvoir modifier le fichier hosts.&lt;br /&gt;
*Il faut également copier le fichier hosts sur le bureau pour le modifier puis ensuite le recopier dans le bon répertoire (si on édite directement le fichier hosts depuis (system32\drivers\etc\) on ne peut pas le ré-enregistrer).&lt;br /&gt;
&lt;br /&gt;
====Forcer les DNS sous Mac====&lt;br /&gt;
*lancer Terminal (dans Applications/Utilitaires)&lt;br /&gt;
*taper &amp;quot;sudo nano /etc/hosts&amp;quot; (il demande le mot de passe de l'utilisateur qui a les droits admin sur la machine)&lt;br /&gt;
*Ajouter les entrées sur le modèle de la [[#Forcer_les_DNS_sous_Windows|procédure sous Windows]]&lt;br /&gt;
*Faire controle-o pour enregistrer puis controle-x pour quitter&lt;br /&gt;
*Eventuellement, faire &amp;quot;dscacheutil -flushcache&amp;quot; si le changement n'est pas encore pris en compte.&lt;br /&gt;
&lt;br /&gt;
==A chaque fois que je change de page, je reviens sur la page d'identification ?==&lt;br /&gt;
Si le retour à la page d'identification est systématique, alors il doit s'agir d'un problème de '''cookies'''. Il faut modifier la configuration du navigateur de manière à [[#Autoriser_les_cookies|autoriser les cookies]].&lt;br /&gt;
&lt;br /&gt;
===Variante du problème : la déconnexion n'est pas systématique mais aléatoire===&lt;br /&gt;
Dans ce cas, il peut s'agir aussi d'un problème de proxy (si vous êtes sur un réseau d'entreprise par exemple) ou de fournisseurs d'accès (accès depuis un mobile, depuis un hôtel, bref, tout type d'accès qui change régulièrement l'adresse IP et ainsi ne permet de maintenir un accès authentifié dans la durée. La solution est présentée dans la procédure [[#Utiliser_OpenFlyers_sur_un_smartphone|Utiliser OpenFlyers sur un smartPhone]].&lt;br /&gt;
&lt;br /&gt;
==Plusieurs membres peuvent-ils ouvrir des sessions en même temps (sans le savoir) ?==&lt;br /&gt;
Oui, c'est même le but premier : permettre à plusieurs personnes de consulter en même temps le cahier de réservation.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez même avoir une personne qui ouvre plusieurs sessions avec son identifiant. Mais pour cela, elle doit utiliser des ordinateurs ou des navigateurs différents.&lt;br /&gt;
==Suite à une migration, impossible de naviguer dans la nouvelle version d'OpenFlyers==&lt;br /&gt;
Lorsque nous migrons d'une version vers une autre, bien souvent nous le faisons en changeant les &amp;quot;DNS&amp;quot;. Cela peut occasionner des problèmes d'accès. Il peut également apparaitre des problèmes de &amp;quot;cache&amp;quot; qui se résolvent d'eux sous 24 à 48 heures. Ces problèmes peuvent survenir lorsque l'ordinateur concerné a été connecté à l'ancienne plateforme OpenFlyers juste avant la migration.&lt;br /&gt;
&lt;br /&gt;
Voici différentes techniques qui permettent d'imposer à votre navigateur d'utiliser des DNS actualisées et d'utiliser un cache à jour :&lt;br /&gt;
#Penser à éteindre et rallumer complètement l'ordinateur&lt;br /&gt;
#Faites un CTRL+R (ou icône de &amp;quot;rafraichissement&amp;quot;). Bien souvent cela suffit au navigateur pour qu'il vide son cache et le ré-actualise&lt;br /&gt;
#Vider le cache dans le navigateur&lt;br /&gt;
#Supprimer les cookies dans le navigateur&lt;br /&gt;
Plus technique :&lt;br /&gt;
#Faites un ipconfig /flushdns en ligne de commande (menu démarrer, puis &amp;quot;Exécutez&amp;quot;, taper &amp;quot;cmd&amp;quot;)&lt;br /&gt;
#Forcer les nouvelles DNS dans le fichier C:\WINDOWS\system32\drivers\etc\hosts en ajoutant une ligne du genre : xxx.xxx.xxx.xxx xxx.openflyers.zz (nous demandez pour connaitre les valeurs à utiliser)&lt;br /&gt;
&lt;br /&gt;
De plus, afin de permettre quand même d'accéder à la nouvelle plateforme, nous mettons en place une deuxième URL temporaire pendant 1 semaine. Ainsi pour l'URL plateforme.openflyers.fr nous mettrons en place une URL temporaire plateforme2.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
=Navigation dans OpenFlyers=&lt;br /&gt;
OpenFlyers est un logiciel qui s'utilise grâce à votre navigateur internet. Les plus connus sont Chrome, Firefox, Internet Explorer ou Safari.&lt;br /&gt;
Une certaine configuration est nécessaire afin de faire fonctionner OpenFlyers : la configuration des cookies.&lt;br /&gt;
Si vous rencontrez des problèmes d'utilisations tels que :&lt;br /&gt;
&lt;br /&gt;
*Impossibilité de se connecter alors que votre identifiant et mot de passe est correct&lt;br /&gt;
*Impossibilité d'aller d'un page à l'autre une fois connecté (et retour sur la page de connexion)&lt;br /&gt;
&lt;br /&gt;
Voila comment régler votre navigateur.&lt;br /&gt;
==Comment autoriser les cookies avec Firefox==&lt;br /&gt;
Allez dans le menu Outils puis choisissez Option&lt;br /&gt;
[[Image:Ff-1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Dans la rubrique '''Vie privée''', cochez '''Accepter les cookies'''. &lt;br /&gt;
[[Image:Ff-2.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Comment autoriser les cookies avec Internet Explorer==&lt;br /&gt;
Double cliquez sur la mappemonde situé dans la barre de tache (en bas). &lt;br /&gt;
&lt;br /&gt;
[[Image:Ie-1.jpg]]&lt;br /&gt;
Sélectionnez les '''Sites de confiances'''. Sélectionnez le niveau bas. Cliquez ensuite sur le bouton '''Sites'''.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ie-2.jpg]]&lt;br /&gt;
Rajoutez l'adresse du site de la réservation en décochant Â« Exigez un serveur sécurisé â€¦ Â». &lt;br /&gt;
&lt;br /&gt;
[[Image:Ie-3.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''Fermez puis redémarrez Internet Explorer.'''&lt;br /&gt;
&lt;br /&gt;
==Problème de navigation sur un réseau GSM==&lt;br /&gt;
OpenFlyers est accessible sur les smartphones par le biais du navigateur embarqué. Cependant, des problèmes de session peuvent survenir du fait du changement dynamique de l'adresse IP du smartphone du fait du réseau GSM. Pour palier à ce problème et éviter des déconnexions intempestives, il faut se connecter en HTTPS.&lt;br /&gt;
&lt;br /&gt;
De plus, et toujours en HTTPS, il est possible de [[#Transmettre_l.27identifiant_et_le_mot_de_passe_dans_l.27URL|rajouter le couple identifiant/mot de passe à la suite de l'URL sécurisée]] et d'enregistrer cette URL en favori. Ainsi, il n'est plus nécessaire de saisir systématiquement son identifiant et son mot de passe.&lt;br /&gt;
&lt;br /&gt;
==Problèmes de navigation sous iPhone==&lt;br /&gt;
*Penser à mettre à jour le logiciel de l'iPhone. OpenFlyers fonctionne correctement pour une version au moins 4.02.&lt;br /&gt;
*Activer l'[[#Autoriser_les_cookies_sous_iPhone_.2F_Safari|acceptation des cookies]]&lt;br /&gt;
*Si la navigation était possible sur une version précédente d'OpenFlyers et qu'elle n'est plus possible sur une nouvelle version d'OpenFlyers, alors il peut être nécessaire de vider le cache du navigateur Safari de l'iPhone :&lt;br /&gt;
**'''Réglages &amp;gt; Safari'''&lt;br /&gt;
**'''Effacer cookies et données'''&lt;br /&gt;
&lt;br /&gt;
=Transmettre l'identifiant et le mot de passe dans l'URL=&lt;br /&gt;
Si vous souhaitez transmettre le couple identifiant/mot de passe dans l'URL dans le but de pouvoir les sauver facilement, vous avez besoin d'un [http://www.openflyers.com/doc/catalogue-tarifaire.pdf abonnement HTTPS] et alors l'URL doit avoir la forme :&lt;br /&gt;
 https://mySpaceName.openflyers.tld?login=myLogin&amp;amp;password=myPassword&lt;br /&gt;
où :&lt;br /&gt;
*mySpaceName doit être remplacé par le nom du compte openflyers&lt;br /&gt;
*tld doit être remplacé par l'extension (comme de, fr, us, etc.)&lt;br /&gt;
*myLogin doit être remplacé par votre identifiant&lt;br /&gt;
*myPassword doit être remplacé par votre mot de passe&lt;br /&gt;
&lt;br /&gt;
=Cahier de réservation=&lt;br /&gt;
==Que se passe t-il en cas de conflit de réservation ?==&lt;br /&gt;
Il ne peut y avoir de conflit de réservation. C'est l'un des principes durs d'OpenFlyers : à chaque instant donné, il ne peut y avoir plus d'une réservation pour chaque pilote, chaque avion ou chaque instructeur.&lt;br /&gt;
&lt;br /&gt;
Si vous arrivez à faire des réservations qui se chevauchent (pour un avion, un instructeur ou un pilote), alors vous avez mis en évidence un bug, et il faut nous le signaler pour que nous y remédions.&lt;br /&gt;
&lt;br /&gt;
==Si je suis en train de consulter une page, et que quelqu'un fait une modif sur cette page, vais-je voir la modif sans lancer un rafraichissement ?==&lt;br /&gt;
Non vous ne verrez pas la modification. Cependant, ce n'est pas grave car au moment où vous essayerez de faire votre réservation, OpenFlyers vérifiera à ce moment-là que le créneau que vous souhaitez est toujours disponible (pour empêcher les conflits justement).&lt;br /&gt;
&lt;br /&gt;
==Comment saisir une date rapidement dans la gestion des qualifications ?==&lt;br /&gt;
En cliquant sur l'icône &amp;quot;calendrier&amp;quot; placé par défaut au mois courant, vous pourrez vous déplacer mois par mois ou année par année en cliquant sur les flèches respectives. Pour des dates plus anciennes, passez le curseur de votre souris sur l'endroit où se trouve le texte correspondant à &amp;quot;Mois Année&amp;quot;. Ce texte s'encadre alors d'une bordure. Faites un clic dessus et une nouvelle petite fenêtre va s'ouvrir. Là vous pourrez saisir l'année en tapant les chiffres avec votre clavier.&lt;br /&gt;
&lt;br /&gt;
==A propos des horaires de la nuit aéronautique==&lt;br /&gt;
&lt;br /&gt;
Nous calculons les éphémérides d'après les définitions officielles.&lt;br /&gt;
&lt;br /&gt;
Ainsi, les heures de lever et de coucher du soleil correspondent au passage du centre du soleil sous l'horizon (donc 3 degrés sous l'horizon puisqu'il est considéré, en première approximation que le soleil a un diamètre apparent de 6 degrés).&lt;br /&gt;
&lt;br /&gt;
Les heures du jour et de la nuit aéronautique correspondent au passage du soleil 6 degrés sous l'horizon. Il s'agit de la définition officielle, aussi bien française, qu'internationale (OACI). Le calcul est validé pour les latitudes inférieures à 65 degrés. Sa précision est de l'ordre de la minute sous des latitudes inférieures à 50 degrés. La précision diminue au fur et à mesure que la latitude augmente (c'est à dire que l'on se rapproche des pôles).&lt;br /&gt;
&lt;br /&gt;
Conséquence du calcul : les résultats trouvés ne correspondent pas (forcément) à la simple addition de + ou - 30 minutes. Mais il n'a jamais été écrit dans un texte officiel que la journée aéronautique correspondait au lever du soleil moins trente minutes, et que la nuit aéronautique correspondait au coucher du soleil plus trente minutes. La seule chose que vous trouverez, si vous vous penchez sur les textes, c'est qu'il est admis d'utiliser + ou - 30 minutes pour faire les calculs sous des latitudes comprises entre 30 et 60 degrés et 15 minutes sous les latitudes inférieures à 30 degrés). Voir [http://www.anpi.asso.fr/Reglesair.pdf Règles de l'air - Chapitre 1er - Définitions]&lt;br /&gt;
Attention: certains pays n'utilisent pas la nuit aéronautique et ne permettent pas le vol en dehors du lever et du coucher du soleil&lt;br /&gt;
&lt;br /&gt;
Le résultat proposé est donc le bon résultat. Si vous ne souhaitez pas utiliser ce résultat, il vous suffit de retrancher ou d'ajouter 30 minutes au calcul du lever et du coucher du soleil.&lt;br /&gt;
&lt;br /&gt;
Cependant, nous attirons votre attention sur l'intérêt d'utiliser le bon calcul : il vous met du bon côté du point de vue de la sécurité. En effet, si en été vous y gagnez, c'est parce que le soleil met plus de temps à se coucher. Par contre en hiver, notre calcul fait &amp;quot;perdre&amp;quot; une dizaine de minutes : c'est parce que le soleil met moins de temps à se coucher. Calculer l'écart entre la nuit aéronautique et le coucher du soleil (et comparer avec les 30 minutes) vous permettra d'avoir une idée de la &amp;quot;vitesse&amp;quot; avec laquelle se couche le soleil, donc de vous méfier encore plus de l'arrivée de la nuit et de ne pas vous faire surprendre par le crépuscule.&lt;br /&gt;
&lt;br /&gt;
Qui ne s'est jamais retrouvé au sol en ayant voulu &amp;quot;tangenter&amp;quot; avec la nuit et s'est surpris à constater qu'il faisait bien sombre, tout d'un coup ?&lt;br /&gt;
&lt;br /&gt;
Le programme calcule les heures de coucher/lever du soleil à partir des coordonnées géographique du terrain de base. Si vous constatez que vos heures sont erronées, demander à votre administrateur qu'il vérifie le code OACI dans les paramètres de la structure aéronautique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Saisie des vols=&lt;br /&gt;
==Nos avions ont des compteurs en heures, centièmes, peut-on avoir un affichage en heures, minutes ?==&lt;br /&gt;
Chaque utilisateur paramètre son affichage comme il le souhaite dans Données/Affichage et fiche personnelle&lt;br /&gt;
[[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format Patron de date et heure]]&lt;br /&gt;
&lt;br /&gt;
== Comment saisir plusieurs pilotes pour un vol ?==&lt;br /&gt;
Saisir les vols dans OF comme dans le carnet de route de l'avion&lt;br /&gt;
== Comment partager les coûts d'un vol ?==&lt;br /&gt;
Si un pilote veux partager les frais du vol (sans être pilote) il doit faire un transfert de son compte vers le compte du pilote&lt;br /&gt;
Menu Comtes/Transférer&lt;br /&gt;
&lt;br /&gt;
=Divers=&lt;br /&gt;
==Peut-il y avoir des accès à plusieurs sur la base ?==&lt;br /&gt;
Oui, sinon deux membres ne pourraient pas consulter le cahier en même temps.&lt;br /&gt;
&lt;br /&gt;
Par contre, lorsqu'un membre réserve un avion, au moment où OpenFlyers teste la disponibilité du créneau, il empêche toute autre écriture sur la base concernant les réservations. Le but est d'empécher justement les conflits de réservation.&lt;br /&gt;
&lt;br /&gt;
=Actions dynamiques non prises en compte par OpenFlyers=&lt;br /&gt;
OpenFlyers met en oeuvre des actions dites &amp;quot;dynamiques&amp;quot; c'est à dire qui ne nécessite pas un rafraîchissement complet de la page pour être prises en comptes. Ces actions sont basées sur le principe &amp;quot;[http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML AJAX]&amp;quot;. Elles nécessitent l'activation du moteur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] du navigateur pour être opérationnelles.&lt;br /&gt;
&lt;br /&gt;
De plus, certaines commandes [http://fr.wikipedia.org/wiki/JavaScript JavaScript] ne sont pas reconnues par tous les navigateurs.&lt;br /&gt;
&lt;br /&gt;
Ainsi, lorsque vous lancez une action dynamique dans OpenFlyers qui reste sans résultat, avant de rapporter l'anomalie sur le [http://bts.openflyers.org BTS] il faut vérifier :&lt;br /&gt;
#L'activation de [http://fr.wikipedia.org/wiki/JavaScript JavaScript] dans le navigateur utilisé.&lt;br /&gt;
#Tester avec un autre navigateur&lt;br /&gt;
#Dans le cas où JavaScript est activé, il faut rapporter l'anomalie sur le [http://bts.openflyers.org BTS] en précisant le navigateur sur lequel l'action est inefficace et le navigateur sur lequel l'action est efficace.&lt;br /&gt;
Vous pouvez également nous facilitez la correction de l'anomalie en nous rapportant le message d'erreur [http://fr.wikipedia.org/wiki/JavaScript JavaScript] s'il y a lieu.&lt;br /&gt;
&lt;br /&gt;
=Comment exporter les données ?=&lt;br /&gt;
OF affiche une page XHTML ce qui signifie un texte correctement formaté qui peut être récupéré par un simple copier coller. Le tableur Calc de Open Office ou Libre Office interprète correctement ce HTML et le formate en colonne conformément à la présentation de votre page.&lt;br /&gt;
 &lt;br /&gt;
Il a cependant un paramétrage à faire pour que les textes soit correctement encodé (affichage des caractères accentués) et que les cellules numériques affichent le format correct&lt;br /&gt;
&lt;br /&gt;
*Allez dans l'onglet Outils/Options/Chargement&amp;amp;Enegistrement/Compatibilité HTML (Tools/Options/Load&amp;amp;Save/HTML Compatibility)&lt;br /&gt;
*Cocher &amp;quot;Utiliser l'environnement linguistique Anglais (USA) pour les nombres&amp;quot;, (&amp;quot;Use English (USA) locale numbers&amp;quot;)&lt;br /&gt;
*Par la même occasion vous pouvez aussi changer le Jeu d'encodage (Character set) par Unicode (UTF-8) &lt;br /&gt;
&lt;br /&gt;
Le programme interprète alors le point comme le séparateur décimal et vous avez directement le bon copier/coller Si vous avec choisi l'encodage UTF-8 les caractères accentués seront aussi correctement traduits (A rechanger si vous avez à faire des copier coller depuis des programmes à l'encodage CP1252 &amp;quot;Windows Microsoft&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Pour les exports au format csv voir [[FAQ csv reading with Oo]]&lt;br /&gt;
&lt;br /&gt;
=Paramétrage et données personnelles=&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti automatiquement des réservations annulées ?==&lt;br /&gt;
Dans la version 3 d'OpenFlyers, il est possible pour chaque utilisateur de paramétrer OpenFlyers de sort à être averti par e-mail lorsqu'un créneau se libère. Voici comment configurer cela :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''', sélectionner '''Notification des réservations annulées'''&lt;br /&gt;
*Cliquer sur le bouton '''Sauver'''&lt;br /&gt;
&lt;br /&gt;
==Peut-on être averti des réservations sur plusieurs adresses e-mail ?==&lt;br /&gt;
&lt;br /&gt;
Il est possible d'utiliser plusieurs adresses e-mails afin d'être averti des réservations.&lt;br /&gt;
&lt;br /&gt;
Voici comment procéder :&lt;br /&gt;
*'''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Dans '''Fiche personnelle''' puis au niveau du champ '''E-mail'''&lt;br /&gt;
*Rentrer chacune des adresses e-mails en les séparant d'une virgule&lt;br /&gt;
'''Attention : il ne faut jamais mettre d'espace : ni dans l'adresse e-mail elle même, ni avant ou après les virgules de séparation des adresses e-mails'''&lt;br /&gt;
&lt;br /&gt;
Exemple valide :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr,jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemples non valides :&lt;br /&gt;
&amp;lt;pre&amp;gt;jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr , jesuisuntest@test.com&lt;br /&gt;
jesuisuntest@test.fr, jesuisuntest@test.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Accéder à l'application et aller dans le menu Données &amp;gt; Affichage et fiche personnelle&lt;br /&gt;
&lt;br /&gt;
==Comment changer mes options d'affichage ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Option d'affichage'''&lt;br /&gt;
&lt;br /&gt;
Dans les champs choisissez les paramètres selon vos souhaits: langue, heure local ou UTC, format monétaire,...&lt;br /&gt;
&lt;br /&gt;
Sélectionner les avions et instructeurs que sous voulez afficher&lt;br /&gt;
&lt;br /&gt;
==Affichage des dates et des heures==&lt;br /&gt;
Chaque utilisateur paramètre son affichage des dates et des heures comme il le souhaite dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Ressources sur les [[http://doc-en.openflyers.com/index.php?title=UserDoc2.0#Date_and_time_format patrons de date et heure]]&lt;br /&gt;
&lt;br /&gt;
==Comment modifier mes paramétrages ?==&lt;br /&gt;
Aller dans le menu '''Données &amp;gt; Affichage et fiche personnelle''' rubrique '''Fiche personnelle'''&lt;br /&gt;
&lt;br /&gt;
Charger une photo pour le trombinoscope&lt;br /&gt;
&lt;br /&gt;
La date de naissance, le sexe et la nationalité sont obligatoire pour que les statistiques DGAC puisse être calculés &lt;br /&gt;
&lt;br /&gt;
Mettez votre email et vos numéros de téléphone pour qu'on puisse vous contacter. Vous pouvez choisir ceux qui sont public ou non. &lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas seul les personnes avec des droits administrateur pourrons voir ces infos.&lt;br /&gt;
&lt;br /&gt;
==J'ai oublié mon mot de passe, comment le récupérer ?==&lt;br /&gt;
Il n'est pas possible de &amp;quot;retrouver&amp;quot; son mot de passe perdu dans OpenFlyers. En effet, ces derniers sont cryptés dans la base de données pour des raisons de confidentialités.&lt;br /&gt;
&lt;br /&gt;
Si vous avez oublié votre mot de passe, vous n'avez pas besoin de demander à votre administrateur une ré-initialisation, OpenFlyers dispose d'une procédure de ré-initialisation automatique :&lt;br /&gt;
&lt;br /&gt;
*Sur la page de connexion d'une plateforme OpenFlyers, cliquer sur le lien &amp;quot;Mot de passe oublié&amp;quot;&lt;br /&gt;
*:[[Fichier:FAQ_user_forgottenPassword.png]]&lt;br /&gt;
*Sur la page qui s'affiche il y a deux zones de saisie. Saisissez l'email que vous avez indiqué dans votre page personnelle. Il vous sera envoyé un email vous donnant votre identifiant et un code d'activation&lt;br /&gt;
*Revenez sur la page de ré-initialisation et mettez ces informations. Un nouvel email vous sera envoyé avec votre mot de passe&lt;br /&gt;
&lt;br /&gt;
Vous pouvez maintenant accéder à l'application. Pour mettre un mot de passe personnalisé voir [[#Comment_changer_de_mot_de_passe|Comment changer son mot de passe]]&lt;br /&gt;
&lt;br /&gt;
==Comment changer de mot de passe==&lt;br /&gt;
*Dans '''Données &amp;gt; Affichage et fiche personnelle'''&lt;br /&gt;
*Aller en bas de la page, dans le formulaire '''Changer de mot de passe''' et saisissez votre nouveau mot de passe&lt;br /&gt;
&lt;br /&gt;
Un indicateur vous indique le niveau de fiabilité. Mélanger les minuscules/majuscules/chiffres et sigles pour augmenter la difficulté pour des robots de trouver votre mot de passe. La sécurité de l'application de votre club sera ainsi accrue.&lt;br /&gt;
&lt;br /&gt;
=Trucs et astuces=&lt;br /&gt;
==Fenêtre en ligne de commande==&lt;br /&gt;
===Ouvrir une fenêtre en ligne de commande===&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
*Aller dans le menu &amp;quot;Démarrer&amp;quot;&lt;br /&gt;
*Puis Tous les programmes/Accessoires&lt;br /&gt;
*Lancer l'&amp;quot;invite de commandes&amp;quot;&lt;br /&gt;
====Ouvrir une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Sous OSX (mac) il faut lancer un Terminal. Pour cela 2 solutions :&lt;br /&gt;
*Taper &amp;quot;terminal&amp;quot; dans spotlight&lt;br /&gt;
ou&lt;br /&gt;
*lancer l'application qui est dans Applications &amp;gt; Utilitaires.&lt;br /&gt;
&lt;br /&gt;
===Copier/Coller dans une fenêtre en ligne de commande===&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Windows====&lt;br /&gt;
Vous pouvez faire un copier/coller en utilisant le bouton droit de la souris dans la fenêtre de l'invite de commandes puis en choisissant '''sélectionner''' et ensuite en appuyant sur le bouton gauche et en le laissant appuyer tout en sélectionnant la zone souhaitée)&lt;br /&gt;
&lt;br /&gt;
====Copier/Coller dans une fenêtre en ligne de commande sous Mac====&lt;br /&gt;
Pour faire un copier/coller de ces informations et nous les communiquer, il suffit d'utiliser commande-C dans le terminal.&lt;br /&gt;
&lt;br /&gt;
=Comment imprimer la doc ?=&lt;br /&gt;
Si vous souhaitez imprimer la doc, il vous suffit de :&lt;br /&gt;
*cliquer sur le lien &amp;quot;version imprimable&amp;quot; de la &amp;quot;boîte à outils&amp;quot; présente sur le côté gauche des pages du wiki. Vous obtiendrez ainsi une version des pages destinée à être imprimer.&lt;br /&gt;
*ou bien, utiliser la fonction imprimer de votre navigateur. Une mise en page spécifique est générée pour obtenir un format papier&lt;br /&gt;
&lt;br /&gt;
Si vous imprimer avec une Imprimante pdf ([http://www.pdfforge.org/pdfcreator pdfCreator] par exemple) vous générerez alors un format pdf pour archivage&lt;br /&gt;
&lt;br /&gt;
=Problèmes=&lt;br /&gt;
==Signaler un problème==&lt;br /&gt;
Si vous rencontrer une anomalie ou un bug dans l'application OpenFlyers, il faut le rapporter sur le [http://bts.openflyers.org BTS] pour une prise en compte la plus rapide possible et pour permettre un meilleur traitement et suivi.&lt;br /&gt;
&lt;br /&gt;
Pour rapporter une anomalie il faut :&lt;br /&gt;
*Aller sur la page http://bts.openflyers.org&lt;br /&gt;
*S'inscrire sur le BTS en cliquant sur '''Signup for a new account''' : il faut choisir un identifiant, une adresse e-mail puis cliquer sur '''Signup'''.&lt;br /&gt;
Un e-mail est envoyé par le BTS permettant de valider votre adresse e-mail. Cliquer sur le lien présent sur cet e-mail.&lt;br /&gt;
*Sur le formulaire qui apparait, Choisir :&lt;br /&gt;
**Un mot de passe dans les champs '''Password''' et '''Confirm Password'''&lt;br /&gt;
**Compléter éventuellement le champ '''Real Name'''&lt;br /&gt;
*Cliquer sur le bouton '''Update account'''&lt;br /&gt;
Votre compte pour rapporter un problème sur le BTS est ainsi créé. Un nouveau formulaire d'identification s'affiche automatiquement :&lt;br /&gt;
*Renseigner les champs '''Username''' et '''Password'''&lt;br /&gt;
*Sélectionner éventuellement sur '''Remember my login in this browser''' afin de ne plus avoir à s'identifier lors d'une nouvelle connexion depuis le même navigateur internet.&lt;br /&gt;
*Dé-sélectionner éventuellement le champ '''Only allow your session to be used from this IP address.''' qui limite les possibilités de connexion&lt;br /&gt;
*Cliquer sur '''Login'''&lt;br /&gt;
*Aller dans l'onglet '''Preferences'''&lt;br /&gt;
*En bas du formulaire, modifier le champ '''Language''' pour choisir '''french'''.&lt;br /&gt;
*Cliquer sur '''Update Prefs'''&lt;br /&gt;
Vous pouvez alors tranquillement rapporter un bug depuis le formulaire '''Rapporter un bogue'''&lt;br /&gt;
&lt;br /&gt;
==Problème d'auto-complétion des terrains==&lt;br /&gt;
*Si les terrains d'arrivée et de départ ne s'affichent pas, vérifier la [[Browsers_compatibility#Versions_support.C3.A9es|compatibilité de votre navigateur]].&lt;br /&gt;
*La version 2.1 d'OpenFlyers n'est pas supportée par Internet Explorer 10.&lt;br /&gt;
*En revanche, la version 3.0.3 d'OpenFlyers est supportée par les versions d'Internet Explorer supérieures à 8.&lt;br /&gt;
Si vous êtes sous la version 2.1 d'OpenFlyers avec comme navigateur Internet Explorer alors vous avez 2 solutions :&lt;br /&gt;
*Changer de navigateur&lt;br /&gt;
*[[FAQ_client#Comment_se_fait_la_migration_vers_une_version_sup.C3.A9rieure_.3F|Demander à migrer]] sous la version 3.0.3 d'OpenFlyers.&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12969</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12969"/>
				<updated>2015-04-03T14:07:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Le paramétrage lié aux [[OF_Configuration_Accounting3#Param.C3.A9trage_g.C3.A9n.C3.A9ral_des_comptabilit.C3.A9s|alertes de solde]] ou au [[UserDoc3#Rappel_des_r.C3.A9servations_par_e-mail|rappel des réservations]] par e-mail n'est pas effective sur la plateforme de test.&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** Si vous êtes sous la version 3.5 :&lt;br /&gt;
*** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo avec suppression du message d'accueil &amp;quot;La base de données cette plateforme de démonstration est réinitialisée toutes les heures, vers XX:45&amp;quot;.&lt;br /&gt;
*** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
** Si vous êtes sous la version 3.5 ou supérieure :&lt;br /&gt;
*** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12876</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12876"/>
				<updated>2015-03-26T11:43:34Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** Si vous êtes sous la version 3.5 :&lt;br /&gt;
*** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo avec suppression du message d'accueil &amp;quot;La base de données cette plateforme de démonstration est réinitialisée toutes les heures, vers XX:45&amp;quot;.&lt;br /&gt;
*** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
** Si vous êtes sous la version 3.5 ou supérieure :&lt;br /&gt;
*** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12874</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12874"/>
				<updated>2015-03-26T11:20:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Pour les clients sous la version 3.5, plusieurs choix sont proposés :&lt;br /&gt;
** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo avec suppression du message d'accueil &amp;quot;La base de données cette plateforme de démonstration est réinitialisée toutes les heures, vers XX:45&amp;quot;.&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
* Pour les clients sous la version 4, seulement ce choix est proposé :&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12865</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12865"/>
				<updated>2015-03-26T10:53:02Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo avec suppression du message d'accueil &amp;quot;La base de données cette plateforme de démonstration est réinitialisée toutes les heures, vers XX:45&amp;quot;.&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12863</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12863"/>
				<updated>2015-03-26T08:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo avec suppression du message d'accueil &amp;quot;La base de données cette plateforme de démonstration est réinitialisée toutes les heures, vers XX:45&amp;quot;.&lt;br /&gt;
&amp;quot; est supprimé lors de la recopie.&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Fichier:Refresh.png&amp;diff=12833</id>
		<title>Fichier:Refresh.png</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Fichier:Refresh.png&amp;diff=12833"/>
				<updated>2015-03-25T14:52:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : Jcheng uploaded a new version of Fichier:Refresh.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=12826</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=12826"/>
				<updated>2015-03-25T13:52:38Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* changeTime('date', 'année', 'mois', 'jour') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&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 ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=12825</id>
		<title>Formules de calcul</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Formules-de-calcul&amp;diff=12825"/>
				<updated>2015-03-25T13:46:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Formule calculant la date dans un an ou dans un an après la date d'expiration d'une validité déjà détenue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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')===&lt;br /&gt;
Retourne la date en changeant l'année, le mois et/ou le jour&lt;br /&gt;
&lt;br /&gt;
La date doit être au format '''AAAA-MM-JJ hh:mm:ss'''&lt;br /&gt;
&lt;br /&gt;
Les valeurs possibles pour l'année, le mois ou le jour sont :&lt;br /&gt;
* 0 = L'année, le mois ou le jour reste inchangé&lt;br /&gt;
* +X = L'année, le mois ou le jour est augmenté de X&lt;br /&gt;
* -X = L'année, le mois ou le jour est diminué de X&lt;br /&gt;
* X = L'année, le mois ou le jour est placé sur X&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&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-test', '0' ) donne 2011-05-15 car la valeur du mois n'est pas valide&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '-2', '0' ) donne 2011-03-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '+2', '0' ) donne 2011-07-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '0' ) donne 2011-02-15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( '2011-05-15', '0', '2', '-1' ) donne 2011-02-14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changeTime( %NOW_DATE, '2015', '1', '1' ) donne 2015-01-01&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 [[OF_doc-en::CommonFormula#Date_and_time_format|format de date et d'heure]]&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 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===getValidityExpiredDate('person id', 'validity type id')===&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é. La date est au format AAAA-MM-JJ.&lt;br /&gt;
* Retourne &amp;quot;0000-00-00&amp;quot; dans les autres cas&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) donne 0000-00-00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===hasValidity('user id', 'validity type id')===&lt;br /&gt;
&lt;br /&gt;
Vérifie si l'utilisateur possède la validité :&lt;br /&gt;
* Retourne '''1''' lorsque :&lt;br /&gt;
** C'est une validité à formule d'expérience récente et l'utilisateur a l'expérience requise&lt;br /&gt;
** La validité n'est pas soumise à échéance et que l'utilisateur possède la validité&lt;br /&gt;
** La validité est soumise à échéance et n'est pas encore expirée&lt;br /&gt;
* Retourne '''0''' dans les autres cas&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;
===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;
Exemple :&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;
===sumFlightHour('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&lt;br /&gt;
&lt;br /&gt;
===sumFlightTime(%PILOT, 'year', 'month', 'day', 'hour', 'minute', 'position', 'flight type' )===&lt;br /&gt;
&lt;br /&gt;
===sumLandingNumber('pilot id', 'position', 'day', 'aircraft type 1' , 'aircraft type 2', 'aircraft type X')===&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;
==Variables==&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;
===%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;
===%TIME_ARRIVAL===&lt;br /&gt;
Heure de fin saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%TIME_DEPARTURE===&lt;br /&gt;
Heure de début saisie dans le formulaire&lt;br /&gt;
&lt;br /&gt;
===%USER_ID===&lt;br /&gt;
&lt;br /&gt;
Id de l'utilisateur&lt;br /&gt;
&lt;br /&gt;
=Date d'expiration=&lt;br /&gt;
==Fonctions autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#changeTime.28.27date.27.2C_.27ann.C3.A9e.27.2C_.27mois.27.2C_.27jour.27.29|changeTime]]&lt;br /&gt;
* [[#formatDate.28.27patron.27.2C_.27date.27.29|formatDate]]&lt;br /&gt;
* [[#getValidityExpiredDate.28.27person_id.27.2C_.27validity_type_id.27.29|getValidityExpiredDate]]&lt;br /&gt;
* [[#hasValidity.28.27user_id.27.2C_.27validity_type_id.27.29|hasValidity]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la date d'expiration==&lt;br /&gt;
&lt;br /&gt;
* [[#.25NOW_DATE|%NOW_DATE]]&lt;br /&gt;
* [[#.25USER_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;
===Date fixe===&lt;br /&gt;
&amp;lt;pre&amp;gt;2012-12-31&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Formule calculant la 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;
===Formule calculant la 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;
===Formule calculant la 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 le l'identifiant du type de validité concerné :&lt;br /&gt;
&amp;lt;pre&amp;gt;formatDate( 'yyyy-MM-dd', changeTime( ( hasValidity(%USER_ID, 33) ? getValidityExpiredDate(%USER_ID, 33) : %NOW_DATE ), '+1', '0', '0' ) )&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;
*[[#sumFlightHour.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumFlightHour]]&lt;br /&gt;
*[[#sumFlightTime.28.25PILOT.2C_.27year.27.2C_.27month.27.2C_.27day.27.2C_.27hour.27.2C_.27minute.27.2C_.27position.27.2C_.27flight_type.27_.29|sumFlightTime]]&lt;br /&gt;
*[[#sumLandingNumber.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|sumLandingNumber]]&lt;br /&gt;
*[[#sumPreviousFlightTime.28.27pilot_id.27.2C_.27position.27.2C_.27day.27.2C_.27endingDate.27.2C_.27aircraft_type_1.27_.2C_.27aircraft_type_2.27.2C_.27aircraft_type_X.27.29|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;
==Exemples de formules de calcul de l'expérience récente==&lt;br /&gt;
&lt;br /&gt;
=Tarification=&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 tarification==&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul de la tarification==&lt;br /&gt;
&lt;br /&gt;
==Exemples de formules pour le calcul de la tarification==&lt;br /&gt;
===Motoplaneur : tarification à 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;
===Avion : 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;
===Avion : 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;
=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 types de ressource sur [[Resource-management3#Ajouter_un_type_de_ressource|version 3]] et [[Resource-management4#Ajouter_un_type_de_ressource|version 4]].&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 plus petit multiple commun au système décimal (centième) et au système sexagésimale (hh min). Nous avons appelé cela le format ''sexacentimal''.&lt;br /&gt;
&lt;br /&gt;
Cela permet de stocker les valeurs de temps sous la forme d'un entier. Cela supprime donc tout problème d'arrondi qui pourrait être problématique pour les additions.&lt;br /&gt;
&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;
&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.28X.29|abs]]&lt;br /&gt;
*[[#max.28X.2CY.29|max]]&lt;br /&gt;
*[[#roundCeil.28X.2CY.29|roundCeil]]&lt;br /&gt;
&lt;br /&gt;
==Variables autorisées pour le calcul du temps d'activité==&lt;br /&gt;
*[[#.25COUNTER_ARRIVAL|%COUNTER_ARRIVAL]]&lt;br /&gt;
*[[#.25COUNTER_DEPARTURE|%COUNTER_DEPARTURE]]&lt;br /&gt;
*[[#.25DURATION|%DURATION]]&lt;br /&gt;
*[[#.25TIME_ARRIVAL|%TIME_ARRIVAL]]&lt;br /&gt;
*[[#.25TIME_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 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 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>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12816</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12816"/>
				<updated>2015-03-25T12:47:04Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** '''De demo.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.test.openflyers.fr''' : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
** '''De acbd.openflyers.fr vers acbd.of4.openflyers.fr''' : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	<entry>
		<id>https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12815</id>
		<title>Modèle commercial et compte client OpenFlyers</title>
		<link rel="alternate" type="text/html" href="https://doc2-fr.openflyers.com/index.php?title=Mod%C3%A8le-commercial-et-compte-client-OpenFlyers&amp;diff=12815"/>
				<updated>2015-03-25T12:46:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jcheng : /* Plateforme supplémentaire de test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Le modèle commercial de la SARL OpenFlyers=&lt;br /&gt;
==Fonctionnement économique==&lt;br /&gt;
OpenFlyers fonctionne sur le modèle économique d'une ASP (=Application Service Provider) ou SaaS (= Software as a Service). On parle également de &amp;quot;cloud computing&amp;quot; (informatique dans les nuages). C'est-à-dire que nous fournissons un service applicatif par le biais d'internet pour lequel nous facturons un abonnement annuel.&lt;br /&gt;
&lt;br /&gt;
Les avantages de ce système pour les clients finaux sont les suivants :&lt;br /&gt;
*la maintenance logiciel est déportée et ne nécessite plus le déplacement d'un technicien. Cela permet également de mettre en œuvre plus rapidement des correctifs à la demande ;&lt;br /&gt;
*le coût des développements est mutualisé entre les différents clients ;&lt;br /&gt;
*nous assurons nous-mêmes la pérennité des données par sauvegardes journalières sur plusieurs serveurs en plusieurs lieux et cela sur 20 jours glissants.&lt;br /&gt;
&lt;br /&gt;
De plus, OpenFlyers existe en plusieurs versions dont certaines sont disponibles en téléchargement. Vous pouvez retrouver [http://wiki.openflyers.org/index.php?title=FAQ#May_I_install_OpenFlyers_on_my_own_server.3F plus d'infos sur notre support libre].&lt;br /&gt;
&lt;br /&gt;
==Arbitrage des demandes de développements==&lt;br /&gt;
Les demandes de développements pour avoir de nouvelles fonctionnalités sont infinies. Au début de son existence OpenFlyers devait arbitrer entre les demandes des différents clients. Pour cela, l'équipe de développement OpenFlyers tenait compte de la taille d'un client ou d'un prospect pour arbitrer les différentes demandes et du potentiel impact qui pouvait en résulter sur le chiffre d'affaire au travers des nouveaux clients qui pouvaient se décider à passer à OpenFlyers du fait de l'existence de telle ou telle fonctionnalité. Ces demandes étant nombreuses, les demandes non retenues étaient nombreuses et cela pouvait conduire à &amp;quot;vexer&amp;quot; un client qui pouvait considérer que sa demande non retenue ou mise en attente était plus pertinente qu'une autre demande retenue.&lt;br /&gt;
&lt;br /&gt;
Afin de ne plus être juge et parti, OpenFlyers a remis au goût du jour le [[Wikipedia-fr:Suffrage_censitaire|vote censitaire]] au travers des heures de bonus développement. Ainsi, les conditions générales d'OpenFlyers donne la possibilité aux clients de choisir eux-mêmes les développements qui leur seront le plus profitable. Le fonctionnement est le suivant :&lt;br /&gt;
*Tout client désireux de voir développer une nouvelle fonctionnalité peut faire '''une unique demande''' de devis développement '''par an'''. Cette demande doit être effectuée par e-mail en précisant le nom de la structure aéronautique cliente.&lt;br /&gt;
*En fonction du coût en heures de développement, ce développement peut être financé par les heures de bonus développement dont bénéficie chaque client. Plusieurs clients peuvent mutualiser leurs heures de bonus de développement. Les développements peuvent être également financés en partie ou en totalité par une facturation spécifique dans le cas où le bonus développement ne permet pas de couvrir l'intégralité du coût en heures.&lt;br /&gt;
*A l'issue d'une demande de devis, un client peut demander un nouveau devis à condition qu'il ait accepté le 1er devis. Le but est de limiter le temps consacré par l'équipe OpenFlyers à effectuer des devis.&lt;br /&gt;
Nous mutualisons les développements : tous nos développements sont intégrés au sein de l'unique version en cours de développement. Ainsi, tous les clients bénéficient des demandes de chacun d'entre-eux.&lt;br /&gt;
*Les développements &amp;quot;votés&amp;quot; sont triés par ordre d'arrivé sauf pour ceux dont une partie est financée en somme &amp;quot;sonnante et trébuchante&amp;quot; qui passent en priorité.&lt;br /&gt;
&lt;br /&gt;
Enfin, les clients peuvent, avant d'effectuer une demande de devis par e-mail, faire part de leur demande sur le [http://support-fr.openflyers.com/ forum] dans la partie '''Evolutions et Adaptations''' en vérifiant qu'elle n'existe pas déjà. C'est aussi un moyen pour le demandeur d'inviter d'autres clients à s'associer à leur demande en mutualisant leurs heures de bonus développement.&lt;br /&gt;
&lt;br /&gt;
=Compte client OpenFlyers=&lt;br /&gt;
Attention, il ne faut pas confondre son compte client OpenFlyers qui permet d'accéder à sa fiche client OpenFlyers et qui permet de renouveler son abonnement OpenFlyers avec son identifiant personnel permettant d'accéder à sa plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
==Accéder à son compte client OpenFlyers==&lt;br /&gt;
Aller sur le [https://client.openflyers.com compte client] OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'identifiant permettant d'accéder à votre compte client correspond au sous-domaine de votre plateforme.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si votre plateforme est référencée par l'adresse :&lt;br /&gt;
 http://mermoz.openflyers.fr&lt;br /&gt;
&lt;br /&gt;
Alors le sous-domaine est '''mermoz'''.&lt;br /&gt;
&lt;br /&gt;
C'est donc '''mermoz''' qu'il faut utiliser comme identifiant pour vous connecter au .&lt;br /&gt;
&lt;br /&gt;
Si vous n'avez pas le mot de passe, vous pouvez le réactiver avec la fonction '''Mot de passe oublié ?''' qui est sur la page d'identification.&lt;br /&gt;
&lt;br /&gt;
Une adresse e-mail vous sera demandée. Vous pourrez saisir l'adresse e-mail de la structure aéronautique ou celle du contact qui ont été saisies dans la fiche client (il s'agit des adresses e-mails sur lesquelles sont envoyées nos e-mails d'alerte de renouvellement ou d'information).&lt;br /&gt;
&lt;br /&gt;
Dans le but de ne pas être submergés par les demandes, nous facturons la ré-initialisation manuelle, par nos soins, du mot de passe ou la mise à jour des adresses e-mails présentes sur la fiche client pour les abonnement First Price (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
&lt;br /&gt;
==Changer de responsable en charge d'OpenFlyers==&lt;br /&gt;
Lorsqu'il y a un changement de responsable en charge d'OpenFlyers, pour que la passation se passe dans les meilleures conditions, il faut penser à effectuer les 2 changements suivants :&lt;br /&gt;
*Mettre à jour le [[AdminDoc3#Champ_Responsable_OpenFlyers|champ du responsable OpenFlyers au niveau de la plateforme]]&lt;br /&gt;
*Mettre à jour le nom du responsable OpenFlyers au niveau de la fiche client en effectuant la procédure suivante :&lt;br /&gt;
**[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client OpenFlyers]]&lt;br /&gt;
**Aller dans '''Fiche contact'''&lt;br /&gt;
**Mettre à jour la fiche&lt;br /&gt;
**Cliquer sur le bouton '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Dans le cas où la passation ne peut pas se faire ainsi car l'ancien responsable OpenFlyers ne peut pas effectuer ces opérations ou transmettre les couples (identifiants, mots de passe) au nouveau responsable pour qu'il effectue ces opérations, vous pouvez nous demandez, uniquement par e-mail, d'effectuer ces changements de responsable OpenFlyers, en joignant à l'e-mail :&lt;br /&gt;
*Un courrier signé du responsable de la structure (gérant, président, etc.) contenant la demande de mise à jour du responsable OpenFlyers désigné et indiquant explicitement le nom du nouveau responsable avec son adresse e-mail&lt;br /&gt;
*Une copie d'un document officiel (extrait K-BIS, procès-verbal d'assemblée générale, etc.) permettant de prouver la qualité du responsable de la structure.&lt;br /&gt;
Le courrier scanné n'est pas nécessaire dans le cas où le nouveau responsable OpenFlyers apparait sur l'extrait K-BIS.&lt;br /&gt;
&lt;br /&gt;
'''Attention :''' dans le cas d'une société, le responsable de la structure doit détenir plus de la moitié des parts dans la société. Dans le cas où il y a cogérance, alors il faut que le courrier soit signé de l'ensemble des responsables de sorte à représenter plus de la moitié des parts de la société.&lt;br /&gt;
&lt;br /&gt;
==Mettre à jour sa fiche client==&lt;br /&gt;
*[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter à l'espace client]]&lt;br /&gt;
*Cliquer sur le menu '''Fiche contact'''&lt;br /&gt;
*Mettre à jour le contenu des champs concernés&lt;br /&gt;
*Cliquer sur le bouton valider&lt;br /&gt;
''Conseil OpenFlyers :'' Il est fortement recommandé d'avoir 2 adresses e-mails différentes pour les champs '''E-mail client''' et '''E-mail contact'''&lt;br /&gt;
&lt;br /&gt;
==Migrer vers une nouvelle version OpenFlyers==&lt;br /&gt;
Chez OpenFlyers, nous parlons de migration vers une nouvelle version lorsqu'il s'agit de mettre à jour une plateforme d'une version X vers une version Y incluant des changements majeurs.&lt;br /&gt;
&lt;br /&gt;
Par contre, il existe les mises à jours. Les mises à jour ne changent pas le numéro de version principal (exemple : 3.2 ou 3.5 correspondent à la même version principale). OpenFlyers effectue ces mises à jour automatiquement. Leur objectif est de corriger des bugs ou de rajouter de nouvelles fonctionnalités.&lt;br /&gt;
&lt;br /&gt;
Hormis pour les abonnements Première, qui disposent d'une plateforme avec une version gelée et indépendante d'OpenFlyers, toutes les autres plateformes OpenFlyers sont sur un moteur commun qui est mis à jour de façon transparente plusieurs fois par semaine, voir même par jour.&lt;br /&gt;
&lt;br /&gt;
Nous ne présentons ci-dessous que les migrations &amp;quot;majeurs&amp;quot; qui peuvent impliquer des opérations de nettoyage manuel post-migration.&lt;br /&gt;
&lt;br /&gt;
===Coût d'une migration===&lt;br /&gt;
Lorsque vous êtes en production sur une version X d'OpenFlyers, vous pouvez demander à migrer vers la dernière version stable proposée aux nouveaux clients ou même vers la dernière version en développement dénommée &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; (par exemple &amp;quot;version 3.0alpha&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Les migrations sont incluses dans le support des abonnement Business, Première et Corporate.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'un abonnement First Price, la migration est facturée 50 € HT sauf dans le cas d'une migration vers une version alpha ou beta ou depuis vers une version alpha ou beta vers la version stable suivante. Exemple de migrations offertes en abonnement First Price :&lt;br /&gt;
*Migration depuis la version 3.0alpha vers la version 3&lt;br /&gt;
*Migration depuis la version 3.5 vers la version 4.0alpha&lt;br /&gt;
*Migration depuis la version 4.0alpha vers la version 4&lt;br /&gt;
&lt;br /&gt;
Certaines migrations peuvent induire des opérations de nettoyage à effectuer manuellement. Ces opérations sont prises en charge dans le cas des abonnements Business, Première et Corporate. Elles sont facturées dans le cas de l'abonnement First Price. La structure peut également effectuer elle-même les opérations de nettoyage dans le cas d'un abonnement First Price en suivant la [[Accueil#Proc.C3.A9dures_de_mont.C3.A9e_de_version|procédure de montée de version]] publiée par OpenFlyers. Exemple de procédure de nettoyage : [[Upgrade3|nettoyage suite à migration vers une version 3]].&lt;br /&gt;
&lt;br /&gt;
Enfin, dans le cas où la plateforme bénéficiait d'un ancien tarif, le fait de migrer implique le passage au tarif en vigueur au moment de la migration et à l'acquittement de la différence de tarif par rapport à l'ancien tarif.&lt;br /&gt;
&lt;br /&gt;
===Déroulement d'une migration===&lt;br /&gt;
#Il faut avoir pris connaissance des [[#Cons.C3.A9quences_d.27une_migration|conséquences d'une migration]] et accepter le fait qu'elle est irréversible&lt;br /&gt;
#Il faut éventuellement créer la ou les factures selon l'abonnement déjà souscrit et l'abonnement souhaité (cf. [[#Co.C3.BBt_d.27une_migration|Coût d'une migration]] en [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|se connectant sur l'espace client]].&lt;br /&gt;
#Il faut payer les factures correspondantes ainsi créées.&lt;br /&gt;
#Il faut en faire la demande par e-mail et précisant la date avant laquelle vous ne souhaitez pas qu'on effectue de migration. Il n'est pas possible de programmer une date pour une migration : cela se fait en fonction de la synchronisation des disponibilités des différents collaborateurs d'OpenFlyers qui doivent intervenir à tour de rôle.&lt;br /&gt;
#Nous créons alors les factures liées à la migration, à la différence de tarif et au forfait paramétrage selon votre abonnement et les options souscrites (cf. le [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire]).&lt;br /&gt;
#Vous payez.&lt;br /&gt;
#Nous procédons alors à cette migration et nous fournissons une URL de substitution pendant une semaine pour palier les problèmes de cache DNS.&lt;br /&gt;
#Selon ce qui a été convenu nous effectuons ou le client effectue [[Upgrade3|le nettoyage lié au passage à la version 3]].&lt;br /&gt;
#Si vous avez souscrit au forfait paramétrage ou qu'il est inclut dans votre abonnement, nous vous envoyons un questionnaire pour le paramétrage. Cf. [[#Comment_fonctionne_le_forfait_param.C3.A9trage_.3F|Forfait paramétrage]]&lt;br /&gt;
&lt;br /&gt;
===Conséquences d'une migration===&lt;br /&gt;
*Toute migration est irréversible : nous ne créons pas de script permettant de revenir vers une version antérieure. En effet, nous effectuons des migrations &amp;quot;cachées&amp;quot; plusieurs fois par semaine qui constituent des corrections de bugs ou l'ajout de nouvelles fonctionnalités. De ce fait, notre exploitation est organisée pour pouvoir palier à un défaut apparaissant à l'issue d'une migration tout comme elle est organisée pour faire face à l'apparition d'un nouveau bug lors d'une mise à jour transparente.&lt;br /&gt;
*Attention notamment à une migration vers une version &amp;quot;alpha&amp;quot; ou &amp;quot;beta&amp;quot; : en effet, une migration vers cette version implique que vous acceptiez de fonctionner sur une version qui évolue sans cesse. Outre les corrections de bugs, nous rajoutons sur la version beta régulièrement des fonctionnalités qui peuvent créer de nouvelles anomalies. Bien entendu, nous faisons le nécessaire dès que nous avons connaissance d'un problème (notamment par le [http://bts.openflyers.org BTS] pour résoudre les défauts. C'est d'ailleurs grâce aux clients volontaires pour fonctionner sur la version beta que nous pouvons faire évoluer le produit.&lt;br /&gt;
*Après une migration, il peut être nécessaire de forcer le rafraichissement du &amp;quot;cache&amp;quot; du navigateur en appuyant sur CTRL+R (ou icône &amp;quot;Actualiser&amp;quot; ou &amp;quot;Rafraichir&amp;quot; suivant les navigateurs) afin d'obliger le navigateur à charger en mémoire les scripts qui correspondent à la nouvelle version.&lt;br /&gt;
*De même, l'accès à la plateforme via son URL peut ne pas fonctionner pendant 1 ou 2 jours du fait des serveurs disposant de &amp;quot;caches DNS&amp;quot;. Afin de palier à ce défaut, nous fournissons une URL de substitution pendant une semaine qui permet quand même d'accéder à la plateforme.&lt;br /&gt;
*Le temps d'indisponibilité d'accès à la plateforme est de l'ordre de quelques minutes en général. Il est donc transparent pour la plupart des utilisateurs. Par contre, s'il y a un travail de nettoyage post-migration à effectuer par OpenFlyers, ce nettoyage peut durer plusieurs heures. Il n'empêche pas l'utilisation de la plateforme.&lt;br /&gt;
&lt;br /&gt;
==Ajouter une ressource à son abonnement OpenFlyers==&lt;br /&gt;
L'abonnement OpenFlyers est calculé en fonction du nombre de ressources. Le nombre est déterminé pour l'année civile complète.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez rajouter une ressource en cours d'année, alors vous devez [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|vous connecter sur l'espace client OpenFlyers]] et créer une facture d'ajout de ressource en indiquant le nombre de ressources supplémentaires. Le tarif appliqué sera alors celui de l'année complète.&lt;br /&gt;
&lt;br /&gt;
Une fois le paiement de la facture correspondante acquitté, il sera possible d'intervenir sur la plateforme concernée pour rajouter la ressource. Il y alors 2 cas possible :&lt;br /&gt;
*C'est une ressource dont les tarifs correspondent à un type de ressource déjà présent sur la plateforme concernée. Dans ce cas, l'opération est relativement simple et nous conseillons de suivre soi-même la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]].&lt;br /&gt;
*C'est une ressource qui nécessite la création d'un nouveau type de ressource avec de nouveaux tarifs : dans ce cas, l'opération est plus complexe. Elle peut être effectuée de façon autonome en suivant la [[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|procédure de création ci-dessous]] et en procédant par comparaison avec les types de ressources existantes. Cependant, si vous souhaitez éviter tout risque d'erreur, nous recommandons de nous confier cette tâche en nous communiquant les éléments comme lors de la mise en place du paramétrage par nos soins à l'aide du questionnaire. Nous décomptons notre intervention des heures de bonus assistance/développement à hauteur d'une heure.&lt;br /&gt;
&lt;br /&gt;
===Créer une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#Ajouter_un_avion|Ajouter un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#Ajouter_un_a.C3.A9ronef|Ajouter un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#Ajouter_une_ressource|Ajouter une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Enlever une ressource à son abonnement OpenFlyers==&lt;br /&gt;
Si vous enlevez une ressource en cours d'année, il n'y a aucun changement d'abonnement puisque les ressources sont souscrites pour toute l'année.&lt;br /&gt;
&lt;br /&gt;
===Désactiver une ressource sur sa plateforme OpenFlyers===&lt;br /&gt;
*[[AdminDoc1.2#D.C3.A9sactiver_un_avion|Désactiver un avion avec la version 1.3 d'OpenFlyers]]&lt;br /&gt;
*[[AdminDoc2.1#D.C3.A9sactiver_un_a.C3.A9ronef|Désactiver un aéronef avec la version 2.1 d'OpenFlyers]]&lt;br /&gt;
*[[Resource-management3#D.C3.A9sactiver_une_ressource|Désactiver une ressource avec la version 3 d'OpenFlyers]]&lt;br /&gt;
&lt;br /&gt;
==Remplacer une ressource par une autre dans son abonnement OpenFlyers==&lt;br /&gt;
S'il y a un remplacement de ressource, alors il n'y a pas besoin d'acquitter un nouvel abonnement pour la nouvelle ressource : il suffit de [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver l'ancienne ressource]] avant d'[[#Cr.C3.A9er_une_ressource_sur_sa_plateforme_OpenFlyers|activer la nouvelle]].&lt;br /&gt;
&lt;br /&gt;
Si vous ne souhaitez pas désactiver cette ressource, alors vous pouvez nous demander de [[#Ajouter_une_ressource_.C3.A0_son_abonnement_OpenFlyers|créer une facture complémentaire d'abonnement pour une ressource supplémentaire]].&lt;br /&gt;
&lt;br /&gt;
==Renouveler son abonnement OpenFlyers==&lt;br /&gt;
Pour renouveler l'abonnement, il faut :&lt;br /&gt;
#[[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|Se connecter]] sur le compte client OpenFlyers&lt;br /&gt;
#Créer la facture en fonction du choix d'abonnement (vous trouverez plus d'informations dans notre [http://www.openflyers.com/doc/catalogue-tarifaire.pdf catalogue tarifaire])&lt;br /&gt;
#Ensuite, payer soit :&lt;br /&gt;
#*par carte bancaire en cliquant sur le lien &amp;quot;paiement par carte bancaire&amp;quot; (le choix le plus pratique pour une prise en compte immédiate)&lt;br /&gt;
#*par transfert bancaire (dans ce cas, vous devez prendre en charge tous les frais liés à la transaction). Les coordonnées bancaires sont indiquées sur la facture.&lt;br /&gt;
#*par chèque (attention au délai d'acheminement du courrier)&lt;br /&gt;
&lt;br /&gt;
===Variation du nombre de ressources lors du renouvellement===&lt;br /&gt;
Lors du renouvellement, le nombre minimum de ressources proposées, dans l'interface de renouvellement de l'abonnement, correspond au nombre de ressources activées dans la plateforme OpenFlyers.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez augmenter le nombre de ressources pour l'année suivante, il suffit de modifier la valeur proposée par défaut.&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez diminuer le nombre de ressources pour l'année suivante, il faut [[#D.C3.A9sactiver_une_ressource_sur_sa_plateforme_OpenFlyers|désactiver des ressources dans la plateforme OpenFlyers]] afin que le nombre proposé par défaut diminue avant de créer la facture de renouvellement d'abonnement.&lt;br /&gt;
&lt;br /&gt;
==Plateforme supplémentaire de test==&lt;br /&gt;
Cette fonctionnalité disponible que pour les clients étant au moins sous la version 3.5 d'OpenFlyers, est utile dans le cas où vous souhaitez :&lt;br /&gt;
*effectuer des tests sur une recopie de la plateforme de démonstration.&lt;br /&gt;
*effectuer des tests sur une recopie de votre propre plateforme et ainsi modifier son paramétrage sur une version [[Wikipedia-fr:Sandbox_(sécurité_informatique)|sandbox]] sans impacter la version de production.&lt;br /&gt;
*essayer la version 4 d'OpenFlyers&lt;br /&gt;
&lt;br /&gt;
Pour cela, il faut :&lt;br /&gt;
*Se connecter sur son [[#Acc.C3.A9der_.C3.A0_son_compte_client_OpenFlyers|compte client]]&lt;br /&gt;
*Aller dans le menu '''Plateforme'''&lt;br /&gt;
* Plusieurs choix sont proposés :&lt;br /&gt;
** De demo.openflyers.fr vers acbd.test.openflyers.fr : Permet de créer une plateforme de test en effectuant une recopie de la plateforme démo&lt;br /&gt;
** De acbd.openflyers.fr vers acbd.test.openflyers.fr : Permet de créer une plateforme de test en effectuant une recopie de votre plateforme existante&lt;br /&gt;
** De acbd.openflyers.fr vers acbd.of4.openflyers.fr : Permet de créer une plateforme d'essai sous la version 4 d'OpenFlyers en effectuant une recopie de votre plateforme existante puis en faisant une montée de version sur cette recopie&lt;br /&gt;
* Cliquer sur '''Valider'''&lt;br /&gt;
&lt;br /&gt;
Si votre plateforme est référencée par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme de test se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.test.openflyers.fr&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'accès à la plateforme d'essai de la version 4 d'OpenFlyers se fait par l'adresse :&lt;br /&gt;
&amp;lt;pre&amp;gt;http://acbd.of4.openflyers.fr&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcheng</name></author>	</entry>

	</feed>