Méthode ouverte · calcul déterministe

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 :

  • RESTGET ou POST /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.
  • MCPoutils get_pricing_spec et compute_mission_quote sur 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.

  1. base_effective
    base_effective = base_daily_ttc * specialty_factors[specialty] * complexity_factors[complexity]
    Un facteur absent vaut 1.0. Toutes les formules « base * … » ci-dessous utilisent base_effective.
  2. days_split
    remote_days = total_days - onsite_days
    onsite_days est plafonné à total_days.
  3. onsite_mix_key
    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
    Sélectionne le facteur dans factor_tables.onsite_mix_tjm_factors.
  4. production_tjm_factor
    production_tjm_factor = duration_factors[duration_tier] * onsite_mix_tjm_factors[onsite_mix_key] * confirmation_tjm_factors[reservation_urgency]
  5. remote_daily
    remote_daily = base_effective * production_tjm_factor
  6. onsite_daily
    onsite_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
  7. production_total
    production_total = remote_days * remote_daily + onsite_days * onsite_daily
  8. gross_mobility
    zone_unit = base_effective * zone_mobility_factors[zone]; gross_mobility = onsite_days * zone_unit * stability_factors[stability] * reservation_urgency_factors[reservation_urgency]
    reservation_urgency intervient deux fois : sur le TJM (confirmation) et sur la mobilité (urgency).
  9. 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
    target_factor = regularity_factors[regularity_key].
  10. regularity_factor
    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)
    smoothstep(e0,e1,x): t=clamp((x-e0)/(e1-e0),0,1); renvoie t*t*(3-2t).
  11. mobility_total
    mobility_total = gross_mobility * regularity; regularity_bonus = gross_mobility * (1 - regularity)
    regularity_bonus est une remise affichée, déjà retirée du total.
  12. travel_time_total
    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
    Si travel_days est omis, il vaut le nombre de blocs sur site de l'optimiseur (voir schedule.onsite_blocks du résultat).
  13. recovery_total
    recovery_total = recovery_days * base_effective * recovery_day_factor
  14. reimbursable_costs
    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
    Les frais de salle ne comptent que si le consultant loue (consultant_rents).
  15. change_fees
    change_fees = extra_mobilisations * base_effective * change_management_factor
  16. subtotal_ttc
    subtotal_ttc = production_total + mobility_total + travel_time_total + recovery_total + reimbursable_costs + change_fees
  17. promotions_and_total
    promo_discount = subtotal_ttc * promo_rate (0 unless a valid private code was supplied); total_ttc = max(0, subtotal_ttc - promo_discount)
    commercial_discount est un levier owner-only, toujours 0 sur le calcul public.
  18. taxes_and_deposit
    total_ht = total_ttc / (1 + vat_rate/100); vat = total_ttc - total_ht; deposit = total_ttc * deposit_rate
    Tous les montants sont arrondis au centime (arrondi commercial, demi vers le haut).

Constantes

CléValeur
base_daily_ttc900,0
vat_rate_pct20,0
hours_per_day7,0
hourly_factor1,05
travel_day_cap_factor0,75
recovery_day_factor0,5
change_management_factor0,2
onsite_priority_premium_factor0,04
facility_management_factor0,12
deposit_rate0,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_ai1,08
data_engineering0,94
ai_security1,06
blockchain1,08
training1,0
marketing_engineering0,88
reg_csv1,18
cdm1,0
pv1,02
healthtech1,08

complexity_factors

standard1,0
advanced1,08
regulated1,16
critical1,25

duration_factors

spot1,0
3m0,888889
6m0,833333
12m0,777778

onsite_premium_factors

spot0,133333
3m0,111111
6m0,1
12m0,1

onsite_mix_tjm_factors

remote_only0,96
light_onsite_under_100,98
balanced_under_251,0
onsite_heavy_under_501,03
onsite_majority_under_801,06
onsite_almost_full1,09

confirmation_tjm_factors

30_plus_days0,98
15_29_days1,0
7_14_days1,025
under_7_days1,06
under_72h1,1

regularity_factors

isolated1,0
2_consecutive0,85
3_4_consecutive0,7
5_9_consecutive0,55
10_plus_consecutive0,45
fixed_site_3m0,7
3_days_week_3m0,55

regularity_curve

onsite_half_life_days6,0
total_half_life_days45,0
minimum_strength0,35
onsite_volume_weight0,6
total_volume_weight0,3
density_weight0,1

stability_factors

same_address1,0
same_city_multiple_sites1,15
same_region_multiple_cities1,35
multiple_countries1,6
daily_city_change1,8

reservation_urgency_factors

30_plus_days1,0
15_29_days1,1
7_14_days1,2
under_7_days1,35
under_72h1,5

zone_mobility_factors

Z00,133333
Z10,177778
Z20,244444
Z30,311111
Z40,422222
Z50,611111
Z60,722222
Z70,888889

travel_coefficients

productive_train0,5
taxi_chauffeur0,5
airport_connections0,75
flight_non_productive0,75
night1,0
weekend_holiday1,0

Tarifs de spécialiste

TJM de référence par spécialité (TTC, complexité standard), avant modificateurs propres à la mission.

SpécialitéFacteurTJM TTC
marketing_engineering0,88792,0 EUR
data_engineering0,94846,0 EUR
training1,0900,0 EUR
cdm1,0900,0 EUR
pv1,02918,0 EUR
ai_security1,06954,0 EUR
agentic_ai1,08972,0 EUR
blockchain1,08972,0 EUR
healthtech1,08972,0 EUR
reg_csv1,181062,0 EUR

Exemple vérifiable

Recalculé en direct à chaque chargement. Reproduisez-le pour valider votre implémentation.

Entrée

specialtydata_engineering
complexitystandard
duration_tier3m
zoneZ2
stabilitysame_address
reservation_urgency15_29_days
travel_typeproductive_train
total_days20
onsite_days8
consecutive_days4
travel_hours10
travel_days4
transport880
nights4
hotel_nightly160
meals200
facility_responsibilityclient_provided
promo_code

Sortie

TJM remote TTC774,56 EUR
TJM sur site TTC902,4 EUR
Total HT16888,91 EUR
Total TTC20266,69 EUR
Acompte6080,01 EUR

Paramètres acceptés

ChampTypeValeurs / 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.

Discuter d’une mission