Files
moteurs/dist/commun/schemas.js
T
JulesandClaude Fable 5.1 69809df5d1 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
2026-09-28 17:06:49 +02:00

122 lines
5.5 KiB
JavaScript

// schemas.ts — forme attendue de chaque JSON de données injecté dans les
// moteurs. Source de vérité des fichiers `schemas/<table>.schema.json`, que
// `npm run build` réécrit depuis ce module (scripts/ecrire-schemas.mjs) : le
// paquet reste sans I/O, et un consommateur peut lire les JSON.
//
// Sous-ensemble de JSON Schema compris par `valider()` : type (simple ou
// liste), required, properties, items, enum, minItems. Vérification
// structurelle maison, pas un validateur JSON Schema complet.
const nombreOuNull = { type: ['number', 'null'] };
const chaineOuNull = { type: ['string', 'null'] };
const booleenOuNull = { type: ['boolean', 'null'] };
export const SCHEMAS = {
postes: {
$id: 'https://git.trans-former.fr/jules/moteurs/schemas/postes.schema.json',
description: 'Postes du simulateur autonomie (calculs.trans-former.fr/calculs/data/postes.json). Champs lus par les moteurs.',
type: 'array',
minItems: 1,
items: {
type: 'object',
required: ['Id', 'axe', 'code', 'poste'],
properties: {
Id: { type: 'integer' },
axe: { type: 'string', enum: ['eau', 'energie', 'alimentation'] },
code: { type: 'string' },
poste: { type: 'string' },
ordre: nombreOuNull,
obligatoire: booleenOuNull,
actif: booleenOuNull,
description: chaineOuNull,
},
},
},
options: {
$id: 'https://git.trans-former.fr/jules/moteurs/schemas/options.schema.json',
description: 'Typologies (options) du simulateur autonomie. Les prix y sont des DONNÉES publiées par calculs, jamais des constantes du paquet. parametre_dim, couplages_requis et couplages_exclus arrivent en JSON sérialisé (NocoDB) ou déjà parsés.',
type: 'array',
minItems: 1,
items: {
type: 'object',
required: ['Id', 'poste_id', 'code', 'nom'],
properties: {
Id: { type: 'integer' },
poste_id: { type: 'integer' },
code: { type: 'string' },
nom: { type: 'string' },
typologie: chaineOuNull,
actif: booleenOuNull,
prix_mat_min: nombreOuNull,
prix_mat_max: nombreOuNull,
prix_pro_min: nombreOuNull,
prix_pro_max: nombreOuNull,
prix_par_unite: nombreOuNull,
prix_fixe: nombreOuNull,
unite: chaineOuNull,
quantite_default: nombreOuNull,
parametre_dim: { type: ['string', 'object', 'null'] },
couplages_requis: { type: ['string', 'array', 'null'] },
couplages_exclus: { type: ['string', 'array', 'null'] },
flag_diy: booleenOuNull,
complexite_pose: nombreOuNull,
accessible_fr: booleenOuNull,
filiere_agreee: booleenOuNull,
surface_min_m2: nombreOuNull,
surface_optimale_m2: nombreOuNull,
tags: { type: ['array', 'null'] },
source: chaineOuNull,
source_date: chaineOuNull,
description: chaineOuNull,
description_pedago: chaineOuNull,
notes_techniques: chaineOuNull,
},
},
},
france_climat: {
$id: 'https://git.trans-former.fr/jules/moteurs/schemas/france_climat.schema.json',
description: 'Une ligne par département (2A, 2B et 971-976 compris) : zone RT, pluviométrie, DJU base 18, zone biogéographique numérique.',
type: 'array',
minItems: 1,
items: {
type: 'object',
required: ['dept', 'zone_rt'],
properties: {
dept: { type: 'string' },
nom_dept: chaineOuNull,
zone_rt: { type: 'string', enum: ['H1a', 'H1b', 'H1c', 'H2a', 'H2b', 'H2c', 'H2d', 'H3'] },
pluvio_mm_an: nombreOuNull,
dju_base_18: nombreOuNull,
zone_biogeo: nombreOuNull,
source_climat: chaineOuNull,
source_date: chaineOuNull,
},
},
},
algo_config: {
$id: 'https://git.trans-former.fr/jules/moteurs/schemas/algo_config.schema.json',
description: 'Heuristiques de conception du simulateur autonomie (poids, modulateurs, matrices, tolérances, alias, poids des postes). Données non sourcées, injectées, jamais importées.',
type: 'object',
required: ['poids_axes_base', 'modulateurs', 'adequation_weights', 'tolerances', 'bonus_malus', 'couplages_alias', 'postes_poids'],
properties: {
poids_axes_base: {
type: 'object',
required: ['eau', 'energie', 'alim'],
properties: { eau: { type: 'number' }, energie: { type: 'number' }, alim: { type: 'number' } },
},
modulateurs: { type: 'object' },
adequation_weights: { type: 'object' },
tolerances: {
type: 'object',
properties: {
budget_overrun_pct: { type: 'number' },
budget_underspend_pct: { type: 'number' },
tolerance_par_poste_pct: { type: 'number' },
},
},
bonus_malus: { type: 'object' },
couplages_alias: { type: 'object' },
postes_poids: { type: 'object' },
},
},
};
export const NOMS_TABLES = Object.keys(SCHEMAS);