LOT P1.0 : paquet @transformer/moteurs v0.1.0
Extraction du cœur autonomie de calculs.trans-former.fr (12 modules, sans singleton, couplages sans mutation, console derrière debug), découpage en trois moteurs d'axe + intégrateur (mode global = calculs, mode par_axe = plateforme), moteurs commun.contexte (Corse 2A/2B, DOM 97x corrigés) et commun.geometrie, table des coefficients harmonisés (docs/CONSTANTES.md pour Jules, R-7), validation structurelle des données (schemas/), tests hors ligne : 28 assertions d'origine + épingle générée depuis le code d'astro-pro + écarts d'harmonisation figés + contrat des moteurs. dist/ committé. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019UBHYPdeQYy2m1GVJp6b12
This commit is contained in:
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
// argent.ts — fourchettes, arrondis, annuité d'un prêt. Fonctions pures,
|
||||
// sans formatage (l'affichage « 1 200 € HT » appartient aux sites, pas au
|
||||
// paquet : Intl dépend de l'environnement).
|
||||
export function fourchette(min, max) {
|
||||
return min <= max ? { min, max } : { min: max, max: min };
|
||||
}
|
||||
export function pointMedian(f) {
|
||||
return (f.min + f.max) / 2;
|
||||
}
|
||||
/** Somme de fourchettes ; une borne manquante est remplacée par l'autre. */
|
||||
export function additionneFourchettes(liste) {
|
||||
let min = 0;
|
||||
let max = 0;
|
||||
for (const f of liste) {
|
||||
if (f.min == null && f.max == null)
|
||||
continue;
|
||||
const a = f.min ?? f.max ?? 0;
|
||||
const b = f.max ?? f.min ?? 0;
|
||||
min += a;
|
||||
max += b;
|
||||
}
|
||||
return { min, max };
|
||||
}
|
||||
/** Arrondi au pas donné (pas ≤ 0 → valeur inchangée). */
|
||||
export function arrondiAuPas(valeur, pas) {
|
||||
if (!pas || pas <= 0)
|
||||
return valeur;
|
||||
return Math.round(valeur / pas) * pas;
|
||||
}
|
||||
/** Arrondi à deux décimales. */
|
||||
export function arrondi2(n) {
|
||||
return Math.round(n * 100) / 100;
|
||||
}
|
||||
/**
|
||||
* Mensualité d'un prêt à taux fixe (formule d'annuité constante).
|
||||
* @param capital montant emprunté
|
||||
* @param taux_annuel_pct taux nominal annuel en % (0 → capital / nombre de mois)
|
||||
* @param duree_annees durée en années
|
||||
*/
|
||||
export function mensualite(capital, taux_annuel_pct, duree_annees) {
|
||||
const n = Math.round(duree_annees * 12);
|
||||
if (n <= 0 || capital <= 0)
|
||||
return 0;
|
||||
const r = taux_annuel_pct / 100 / 12;
|
||||
if (r === 0)
|
||||
return capital / n;
|
||||
return (capital * r) / (1 - Math.pow(1 + r, -n));
|
||||
}
|
||||
/** Annuité (12 mensualités). */
|
||||
export function annuite(capital, taux_annuel_pct, duree_annees) {
|
||||
return mensualite(capital, taux_annuel_pct, duree_annees) * 12;
|
||||
}
|
||||
/** Coût total du crédit (intérêts seuls). */
|
||||
export function coutDuCredit(capital, taux_annuel_pct, duree_annees) {
|
||||
const n = Math.round(duree_annees * 12);
|
||||
return mensualite(capital, taux_annuel_pct, duree_annees) * n - capital;
|
||||
}
|
||||
Reference in New Issue
Block a user