Modéliser l'impact d'un sinistre auto sur votre prime d'assurance en JavaScript

La logique métier derrière doisjedeclarermonsinistre.fr : comment j'ai modélisé le coefficient de bonus-malus en JavaScript pour répondre précisément à la question "Vaut-il mieux déclarer ou payer soi-même ?"


Après un accrochage en voiture, la question revient souvent : vaut-il mieux déclarer le sinistre à son assurance ou régler à l’amiable ? La réponse dépend d’un calcul que beaucoup d’automobilistes ne savent pas faire (et que les assureurs ne facilitent pas). J’ai construit doisjedeclarermonsinistre.fr pour y répondre précisément. Voici la logique métier derrière l’outil.

Le système bonus-malus en France

Le coefficient de bonus-malus (CRM, coefficient de réduction-majoration) est encadré par l’article A121-1 du Code des Assurances. Les règles de base :

  • Sans sinistre responsable dans l’année : le CRM est multiplié par 0,95 (−5 %)
  • Avec un sinistre responsable : le CRM est multiplié par 1,25 (+25 %)
  • Coefficient minimum : 0,50 (atteint après 13 ans sans accident, c’est le plafond de réduction)
  • Coefficient maximum : 3,50
  • Point de départ pour un nouveau conducteur : 1,00

La prime annuelle est le produit de la prime de référence de l’assureur par le CRM du conducteur. Un conducteur avec un CRM de 0,60 paie 40 % de moins que la prime de référence.

La question à modéliser

L’outil compare deux trajectoires à partir du CRM et de la prime actuelle de l’utilisateur :

  1. Avec déclaration : le CRM augmente, la prime bondit puis redescend progressivement sur plusieurs années.
  2. Sans déclaration : le conducteur paie la réparation de sa poche, son CRM continue à descendre normalement.

La simulation projette les deux trajectoires jusqu’à ce que les deux CRM atteignent 0,50 (bonus maximum). L’utilisateur compare ensuite le surcoût de prime calculé par l’outil au coût réel de sa réparation.

La logique de calcul

Le cœur du système est calculateNewCRM, qui applique les règles officielles à partir de la liste des accidents de l’année :

function calculateNewCRM(currentCRM, yearAccidents, isProfessional) {
  if (yearAccidents.length === 0) {
    return Math.max(Number((currentCRM * 0.95).toFixed(3)), 0.5)
  }

  let multiplier
  if (isProfessional && yearAccidents.length > 1) {
    multiplier = Math.max(...yearAccidents.map(acc => getAccidentMultiplier(acc)))
  } else {
    multiplier = yearAccidents.reduce((total, acc) => total * getAccidentMultiplier(acc), 1)
  }

  return Math.min(Math.max(Number((currentCRM * multiplier).toFixed(3)), 0.5), 3.5)
}

Deux trajectoires sont simulées en parallèle, et le surcoût cumulé est calculé sur toute la période :

const withoutAccident = simulateTrajectory(currentCRM, false)
const withAccident    = simulateTrajectory(currentCRM, true)

const totalExtraCost =
  withAccident.reduce((sum, y)    => sum + y.annualCost, 0) -
  withoutAccident.reduce((sum, y) => sum + y.annualCost, 0)

Si totalExtraCost est inférieur au coût de la réparation, mieux vaut payer de sa poche. Sinon, déclarer.

Un exemple concret

Conducteur avec :

  • CRM actuel : 0,60 → prime actuelle : 480 €/an
  • Sinistre responsable

Sans déclaration : CRM continue : 0,57 → 0,54 → 0,51 → 0,50. Primes sur 8 ans : 480 + 456 + 432 + 408 + 400 + 400 + 400 + 400 = 3 376 €.

Avec déclaration : CRM passe à 0,75. Primes sur 8 ans : 600 + 570 + 541 + 514 + 488 + 463 + 440 + 416 = 4 032 €.

totalExtraCost = 656 €. Si la réparation coûte moins de 656 €, mieux vaut payer directement. Au-delà, déclarer est le bon choix.

Cas particuliers gérés

Responsabilité partielle : un sinistre partagé (50/50) n’augmente le CRM que de 12,5 % au lieu de 25 %.

Circonstances aggravantes : délit de fuite, conduite en état d’ivresse ou sous stupéfiants, excès de vitesse supérieur à 50 km/h, suspension ou annulation de permis… chaque circonstance applique un multiplicateur supplémentaire au-dessus du +25 % de base :

const SPECIAL_CIRCUMSTANCES_MULTIPLIERS = {
  hit_and_run:               2.0,  // délit de fuite
  drunk_driving:             2.5,  // conduite en état d'ivresse
  drug_driving:              2.5,  // conduite sous stupéfiants
  license_suspension_short:  1.5,  // suspension 2 à 6 mois
  license_suspension_long:   2.0,  // suspension > 6 mois
  license_cancellation:      3.0,  // annulation de permis
  major_speeding:            1.5,  // excès > 50 km/h
}

Usage professionnel : pour les conducteurs professionnels (VTC, livreurs…), la règle de la tournée s’applique. En cas de plusieurs sinistres la même année, seul l’accident le plus pénalisant compte, au lieu du cumul :

if (isProfessional && yearAccidents.length > 1) {
  multiplier = Math.max(...yearAccidents.map(acc => getAccidentMultiplier(acc)))
}

Conducteur au bonus maximum (CRM = 0,50) depuis au moins 3 ans : le premier sinistre responsable n’a aucun impact sur le CRM (franchise d’événement). L’outil le détecte et avertit l’utilisateur que la simulation n’est pas pertinente dans ce cas.

Pourquoi Nuxt 3 avec SSR

L’outil est développé en Nuxt 3 avec rendu côté serveur. Le référencement est la raison principale : la page doit être indexée par Google pour être trouvée. Le mot-clé “déclarer sinistre assurance” génère un trafic organique significatif, et une SPA rendue uniquement côté client pénaliserait l’indexation.

Le calcul est entièrement exécuté côté client via un composable Vue (aucune donnée n’est envoyée à un serveur). L’outil est disponible sur doisjedeclarermonsinistre.fr.

Bon dév, et bisou.

Keiro

Lire aussi