La méthode de calcul du tarif, publique et reproductible.
Toutes les formules et tous les coefficients sont publiés. À partir de quelques paramètres, on obtient toujours le même montant. Un humain, un moteur de recherche ou un LLM peut recalculer le prix, puis le vérifier via l’API ouverte.
Comment accéder au calcul
Trois portes d’entrée, toutes publiques et déterministes :
- REST —
GETouPOST/api/public/quote renvoie le montant. Les paramètres sont ceux décrits plus bas. - Spécification — /api/public/pricing-spec publie l’intégralité des formules et coefficients pour recalculer hors-ligne.
- MCP — outils
get_pricing_specetcompute_mission_quotesur le serveur /mcp.
Le calcul ne stocke rien, n’exige aucune authentification et ne dépend d’aucun service externe. Les codes promotionnels sont le seul levier volontairement privé.
L’algorithme, étape par étape
Chaque ligne reproduit une étape exacte du moteur. Les noms renvoient aux constantes et tables de coefficients publiées plus bas.
-
base_effective
Un facteur absent vaut 1.0. Toutes les formules « base * … » ci-dessous utilisent base_effective.base_effective = base_daily_ttc * specialty_factors[specialty] * complexity_factors[complexity] -
days_split
onsite_days est plafonné à total_days.remote_days = total_days - onsite_days -
onsite_mix_key
Sélectionne le facteur dans factor_tables.onsite_mix_tjm_factors.ratio = onsite_days / total_days; key = remote_only if onsite_days<=0 else light_onsite_under_10 if ratio<0.10 else balanced_under_25 if ratio<0.25 else onsite_heavy_under_50 if ratio<0.50 else onsite_majority_under_80 if ratio<0.80 else onsite_almost_full -
production_tjm_factorproduction_tjm_factor = duration_factors[duration_tier] * onsite_mix_tjm_factors[onsite_mix_key] * confirmation_tjm_factors[reservation_urgency] -
remote_dailyremote_daily = base_effective * production_tjm_factor -
onsite_dailyonsite_priority_premium = base_effective * onsite_priority_premium_factor if onsite_days>0 else 0; onsite_premium = base_effective * onsite_premium_factors[duration_tier] + onsite_priority_premium; onsite_daily = remote_daily + onsite_premium -
production_totalproduction_total = remote_days * remote_daily + onsite_days * onsite_daily -
gross_mobility
reservation_urgency intervient deux fois : sur le TJM (confirmation) et sur la mobilité (urgency).zone_unit = base_effective * zone_mobility_factors[zone]; gross_mobility = onsite_days * zone_unit * stability_factors[stability] * reservation_urgency_factors[reservation_urgency] -
regularity_key
target_factor = regularity_factors[regularity_key].isolated if onsite_days<=0 else 3_days_week_3m if (total_days>=60 and onsite_days>=24) else 10_plus_consecutive if consecutive_days>=10 else 5_9_consecutive if consecutive_days>=5 else 3_4_consecutive if consecutive_days>=3 else 2_consecutive if consecutive_days>=2 else isolated -
regularity_factor
smoothstep(e0,e1,x): t=clamp((x-e0)/(e1-e0),0,1); renvoie t*t*(3-2t).target_discount = clamp(1 - target_factor, 0, 0.85); onsite_volume = 1 - exp(-onsite_days / regularity_curve.onsite_half_life_days); total_volume = 1 - exp(-total_days / regularity_curve.total_half_life_days); density = smoothstep(0.03, 0.25, onsite_days / total_days); blended = (onsite_volume*onsite_volume_weight + total_volume*total_volume_weight + density*density_weight) / (onsite_volume_weight + total_volume_weight + density_weight); curve_strength = minimum_strength + (1 - minimum_strength) * blended; regularity = clamp(1 - target_discount * curve_strength, 0, 1) -
mobility_total
regularity_bonus est une remise affichée, déjà retirée du total.mobility_total = gross_mobility * regularity; regularity_bonus = gross_mobility * (1 - regularity) -
travel_time_total
Si travel_days est omis, il vaut le nombre de blocs sur site de l'optimiseur (voir schedule.onsite_blocks du résultat).hourly_remote = base_effective / hours_per_day * hourly_factor; travel_raw = travel_hours * hourly_remote * travel_coefficients[travel_type]; travel_cap = travel_days * base_effective * travel_day_cap_factor; travel_time_total = min(travel_raw, travel_cap) if travel_days>0 else travel_raw -
recovery_totalrecovery_total = recovery_days * base_effective * recovery_day_factor -
reimbursable_costs
Les frais de salle ne comptent que si le consultant loue (consultant_rents).facility_direct_costs = (facility_rental_daily*facility_rental_days + facility_setup + training_equipment + training_materials + specialty_costs + catering) if facility_responsibility=='consultant_rents' else 0; facility_management_fee = facility_direct_costs * facility_management_factor; reimbursable_costs = transport + nights*hotel_nightly + local_transport + meals + visa_baggage + other_costs + facility_direct_costs + facility_management_fee -
change_feeschange_fees = extra_mobilisations * base_effective * change_management_factor -
subtotal_ttcsubtotal_ttc = production_total + mobility_total + travel_time_total + recovery_total + reimbursable_costs + change_fees -
promotions_and_total
commercial_discount est un levier owner-only, toujours 0 sur le calcul public.promo_discount = subtotal_ttc * promo_rate (0 unless a valid private code was supplied); total_ttc = max(0, subtotal_ttc - promo_discount) -
taxes_and_deposit
Tous les montants sont arrondis au centime (arrondi commercial, demi vers le haut).total_ht = total_ttc / (1 + vat_rate/100); vat = total_ttc - total_ht; deposit = total_ttc * deposit_rate
Constantes
| Clé | Valeur |
|---|---|
base_daily_ttc | 900,0 |
vat_rate_pct | 20,0 |
hours_per_day | 7,0 |
hourly_factor | 1,05 |
travel_day_cap_factor | 0,75 |
recovery_day_factor | 0,5 |
change_management_factor | 0,2 |
onsite_priority_premium_factor | 0,04 |
facility_management_factor | 0,12 |
deposit_rate | 0,3 |
Tables de coefficients
Multiplicateurs du TJM de base selon la spécialité et la complexité, puis les tables appliquées à chaque étape.
specialty_factors
agentic_ai | 1,08 |
data_engineering | 0,94 |
ai_security | 1,06 |
blockchain | 1,08 |
training | 1,0 |
marketing_engineering | 0,88 |
reg_csv | 1,18 |
cdm | 1,0 |
pv | 1,02 |
healthtech | 1,08 |
complexity_factors
standard | 1,0 |
advanced | 1,08 |
regulated | 1,16 |
critical | 1,25 |
duration_factors
spot | 1,0 |
3m | 0,888889 |
6m | 0,833333 |
12m | 0,777778 |
onsite_premium_factors
spot | 0,133333 |
3m | 0,111111 |
6m | 0,1 |
12m | 0,1 |
onsite_mix_tjm_factors
remote_only | 0,96 |
light_onsite_under_10 | 0,98 |
balanced_under_25 | 1,0 |
onsite_heavy_under_50 | 1,03 |
onsite_majority_under_80 | 1,06 |
onsite_almost_full | 1,09 |
confirmation_tjm_factors
30_plus_days | 0,98 |
15_29_days | 1,0 |
7_14_days | 1,025 |
under_7_days | 1,06 |
under_72h | 1,1 |
regularity_factors
isolated | 1,0 |
2_consecutive | 0,85 |
3_4_consecutive | 0,7 |
5_9_consecutive | 0,55 |
10_plus_consecutive | 0,45 |
fixed_site_3m | 0,7 |
3_days_week_3m | 0,55 |
regularity_curve
onsite_half_life_days | 6,0 |
total_half_life_days | 45,0 |
minimum_strength | 0,35 |
onsite_volume_weight | 0,6 |
total_volume_weight | 0,3 |
density_weight | 0,1 |
stability_factors
same_address | 1,0 |
same_city_multiple_sites | 1,15 |
same_region_multiple_cities | 1,35 |
multiple_countries | 1,6 |
daily_city_change | 1,8 |
reservation_urgency_factors
30_plus_days | 1,0 |
15_29_days | 1,1 |
7_14_days | 1,2 |
under_7_days | 1,35 |
under_72h | 1,5 |
zone_mobility_factors
Z0 | 0,133333 |
Z1 | 0,177778 |
Z2 | 0,244444 |
Z3 | 0,311111 |
Z4 | 0,422222 |
Z5 | 0,611111 |
Z6 | 0,722222 |
Z7 | 0,888889 |
travel_coefficients
productive_train | 0,5 |
taxi_chauffeur | 0,5 |
airport_connections | 0,75 |
flight_non_productive | 0,75 |
night | 1,0 |
weekend_holiday | 1,0 |
Tarifs de spécialiste
TJM de référence par spécialité (TTC, complexité standard), avant modificateurs propres à la mission.
| Spécialité | Facteur | TJM TTC |
|---|---|---|
marketing_engineering | 0,88 | 792,0 EUR |
data_engineering | 0,94 | 846,0 EUR |
training | 1,0 | 900,0 EUR |
cdm | 1,0 | 900,0 EUR |
pv | 1,02 | 918,0 EUR |
ai_security | 1,06 | 954,0 EUR |
agentic_ai | 1,08 | 972,0 EUR |
blockchain | 1,08 | 972,0 EUR |
healthtech | 1,08 | 972,0 EUR |
reg_csv | 1,18 | 1062,0 EUR |
Exemple vérifiable
Recalculé en direct à chaque chargement. Reproduisez-le pour valider votre implémentation.
Entrée
specialty | data_engineering |
complexity | standard |
duration_tier | 3m |
zone | Z2 |
stability | same_address |
reservation_urgency | 15_29_days |
travel_type | productive_train |
total_days | 20 |
onsite_days | 8 |
consecutive_days | 4 |
travel_hours | 10 |
travel_days | 4 |
transport | 880 |
nights | 4 |
hotel_nightly | 160 |
meals | 200 |
facility_responsibility | client_provided |
promo_code |
Sortie
| TJM remote TTC | 774,56 EUR |
| TJM sur site TTC | 902,4 EUR |
| Total HT | 16888,91 EUR |
| Total TTC | 20266,69 EUR |
| Acompte | 6080,01 EUR |
Paramètres acceptés
| Champ | Type | Valeurs / bornes |
|---|---|---|
specialty |
enum | agentic_ai, data_engineering, ai_security, blockchain, training, marketing_engineering, reg_csv, cdm, pv, healthtech |
complexity |
enum | standard, advanced, regulated, critical |
duration_tier |
enum | spot, 3m, 6m, 12m |
zone |
enum | Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7 |
stability |
enum | same_address, same_city_multiple_sites, same_region_multiple_cities, multiple_countries, daily_city_change |
reservation_urgency |
enum | 30_plus_days, 15_29_days, 7_14_days, under_7_days, under_72h |
travel_type |
enum | productive_train, taxi_chauffeur, airport_connections, flight_non_productive, night, weekend_holiday |
facility_responsibility |
enum | client_provided, consultant_rents |
destination |
string | type, required, desc_fr, desc_en |
promo_code |
string | type, required, desc_fr, desc_en |
total_days requis |
number | type, min, max, required, desc_fr, desc_en |
onsite_days requis |
number | type, min, max, required, desc_fr, desc_en |
consecutive_days |
number | type, min, max, required, desc_fr, desc_en |
travel_hours |
number | type, min, max, required, desc_fr, desc_en |
travel_days |
number | type, min, max, required, desc_fr, desc_en |
recovery_days |
number | type, min, max, required, desc_fr, desc_en |
transport |
number | type, min, max, required, desc_fr, desc_en |
nights |
number | type, min, max, required, desc_fr, desc_en |
hotel_nightly |
number | type, min, max, required, desc_fr, desc_en |
local_transport |
number | type, min, max, required, desc_fr, desc_en |
meals |
number | type, min, max, required, desc_fr, desc_en |
visa_baggage |
number | type, min, max, required, desc_fr, desc_en |
other_costs |
number | type, min, max, required, desc_fr, desc_en |
facility_rental_daily |
number | type, min, max, required, desc_fr, desc_en |
facility_rental_days |
number | type, min, max, required, desc_fr, desc_en |
facility_setup |
number | type, min, max, required, desc_fr, desc_en |
training_equipment |
number | type, min, max, required, desc_fr, desc_en |
training_materials |
number | type, min, max, required, desc_fr, desc_en |
specialty_costs |
number | type, min, max, required, desc_fr, desc_en |
catering |
number | type, min, max, required, desc_fr, desc_en |
extra_mobilisations |
number | type, min, max, required, desc_fr, desc_en |
Estimation indicative et non contractuelle. Les frais réels, disponibilités et règles de remboursement sont validés avant tout devis engageant.