// data-2026.jsx — Source de vérité RAYCAST 2026 (LISTE_PRIX_RAYCOM_v4_FINALE_3.xlsx)
// Édition 20 mai 2026 · RBQ 5590-9402-01 · Mascouche, QC
//
// ⚠️ NE PAS MODIFIER À LA MAIN sans synchroniser l'Excel "LISTE_PRIX_RAYCOM_v4_FINALE_3.xlsx".
// L'Excel reste l'unique source de vérité — ce fichier en est la projection JS.
//
// Architecture : exposé via window.RAYCOM_DATA_2026 — coexiste avec window.RAYCOM_DATA (v25)
// pour ne pas casser les anciennes soumissions. Sélection via state.data_version.

const RAYCOM_DATA_2026 = {
  meta: {
    version: "7.0.0",
    excel_source: "LISTE_PRIX_RAYCOM_v4_RECONSTRUITE.xlsx (Solaire au watt) · GHL/QBO aligné",
    excel_date: "2026-05-29",
    edition: "V7.0 — sans commission · tarifs HQ 4 · FinanceIt 0%/3mois · login premium + dashboard vivant · lien client sécurisé",
    rbq: "5590-9402",  // RBQ officiel (sans suffixe -01) — corrigé Phase 2
    rbq_sous_categories: ["11.2", "13.5"],
    cmeq_member: true,
    phone: "(450) 474-8470",
    email: "info@raycomelectrique.com",
    website: "raycomelectrique.com",
    address: "Mascouche · Lanaudière · Grand Montréal",
    slogan: "Prenez le contrôle de votre énergie.",
    social: {
      facebook: "facebook.com/raycomelec",
      x: "x.com/raycomelec",
      linkedin: "linkedin.com/in/raycomelectrique"
    },
    partner_certifications: ["Tesla Powerwall installer", "Sigenergy", "Fox ESS", "FLO"],
    logo_path: "raycom-assets/raycom-logo-cropped.png",  // standard partout (header app + PDF)
    logo_dark_filter: "brightness(0) invert(1)",          // sur fond bleu marine
    notes: "Phase 2 (20 mai 2026) : LogisVert HT_admissible · Commission 4% HT · V2X · Commercial · FSA irradiation · Payment schedule"
  },

  // ============================================================================
  // RÈGLES D'OR 2026 — référence interne pour calc et UI
  // ============================================================================
  rules: {
    // Prix le moins cher multi-fournisseurs (Lumen/Westburne/Guillevin/mPower/Nedco/FrankenSolar)
    prefer_cheapest_supplier: true,
    // Marges intelligentes : pas de règle 35% minimum
    marges_intelligentes: [
      { max: 50,    margin: 0.50, label: "<50$ → 50%" },
      { max: 200,   margin: 0.40, label: "50-200$ → 40%" },
      { max: 1000,  margin: 0.325, label: "200-1000$ → 30-35%" },
      { max: 5000,  margin: 0.25, label: "1000-5000$ → 25%" },
      { max: Infinity, margin: 0.20, label: ">5000$ → 20%" }
    ],
    tesla_markup: { primaire: 0.25, accessoires: 0.50 },
    fox_sig_markup: 0.30, // uniforme
    permis_municipal_inclus: false, // JAMAIS dans les forfaits
    garantie_mo_raycom_annees: 2,
    z1_inclus: true // 0-30 km Mascouche toujours inclus
  },

  // ============================================================================
  // ☀️ SOLAIRE AU WATT — Table client (24 paliers × 3 pentes)
  // ============================================================================
  // Source : feuille "Solaire au watt" — prix VENDANT TOTAL solaire (sans onduleur ni forfait install)
  // Logique interne : Larks public × 0.85 = coûtant brut → − forfait $/W (Solo 2350 ÷ watts) = solaire pur
  //                  → ÷ 0.82 (marge 18%) = vendant $/W → × watts = TOTAL
  //                  → lissage monotone +350$/panneau min entre paliers
  panneau_ref: {
    sku: "FRK-5000398", // FIX 2026-06-10 : SKU QBO réel (Thornova TS-BBT54(500)-G11). Ancien "FRK-Thornova-BBT54-500" = fantôme (absent QBO).
    name: "Thornova BBT54 500W (All Black bifacial)",
    watts: 500,
    bifacial: true,
    notes: "Panneau de référence Raycom 2026. Si autre panneau, recalcul nécessaire."
  },

  // 4 brackets de pente UI (design iter-06) mappés sur 3 colonnes Excel
  pitch_brackets_ui: [
    { key: "plat",      label: "Plat",      degrees: "0-5°",   ratio: "0-3/12",   excel_col: "p1", design_idx: 0,
      requires_quote_for: ["beton", "membrane_tpo", "membrane_epdm"] },
    { key: "faible",    label: "Faible",    degrees: "5-15°",  ratio: "4-6/12",   excel_col: "p1", design_idx: 1 },
    { key: "standard",  label: "Standard",  degrees: "15-30°", ratio: "7-8/12",   excel_col: "p1", design_idx: 2, default: true },
    { key: "forte",     label: "Forte",     degrees: "30-40°", ratio: "9-10/12",  excel_col: "p2", design_idx: 3 },
    { key: "tres_forte",label: "Très forte",degrees: "40-45°", ratio: "11-12/12", excel_col: "p3", design_idx: 4,
      sub: "Cathédrale / mansardé — installation spécialisée" }
  ],

  // Table client EXACTE - Catalogue Raycom v4 RECONSTRUITE (feuille "Solaire au watt", colonne "Aucun extra")
  // Colonnes : panneaux, kw, p1 (0-8/12), p2 (9-10/12), p3 (11-12/12)
  // = Solaire SEUL HT (panneaux + pose au toit), SANS onduleur ni forfait install.
  // Modele : coutant sous-traitant (Larks, panneaux inclus) x 1,25 (marge 20%). 76 paliers 5-80.
  // Onduleur (battery_sell) + forfait (install_sell) ajoutes separement par fullCalc2026.
  // Aligne GHL/QBO : panneau Thornova 225$/u + pose = (ce total - N x 225). MaJ 29 mai 2026.
  solar_table_vendant: [
    { panneaux:  5, kw:   2.5, p1:   4201, p2:   4467, p3:   4732 },
    { panneaux:  6, kw:   3.0, p1:   5529, p2:   5848, p3:   6167 },
    { panneaux:  7, kw:   3.5, p1:   6857, p2:   7229, p3:   7601 },
    { panneaux:  8, kw:   4.0, p1:   8186, p2:   8610, p3:   9036 },
    { panneaux:  9, kw:   4.5, p1:   9514, p2:   9992, p3:  10470 },
    { panneaux: 10, kw:   5.0, p1:  10842, p2:  11373, p3:  11904 },
    { panneaux: 11, kw:   5.5, p1:  11586, p2:  12170, p3:  12754 },
    { panneaux: 12, kw:   6.0, p1:  12860, p2:  13498, p3:  14136 },
    { panneaux: 13, kw:   6.5, p1:  14136, p2:  14826, p3:  15517 },
    { panneaux: 14, kw:   7.0, p1:  15410, p2:  16154, p3:  16898 },
    { panneaux: 15, kw:   7.5, p1:  16686, p2:  17482, p3:  18279 },
    { panneaux: 16, kw:   8.0, p1:  17960, p2:  18810, p3:  19660 },
    { panneaux: 17, kw:   8.5, p1:  19236, p2:  20139, p3:  21042 },
    { panneaux: 18, kw:   9.0, p1:  20510, p2:  21467, p3:  22423 },
    { panneaux: 19, kw:   9.5, p1:  21786, p2:  22795, p3:  23804 },
    { panneaux: 20, kw:  10.0, p1:  23060, p2:  24123, p3:  25186 },
    { panneaux: 21, kw:  10.5, p1:  23220, p2:  24336, p3:  25451 },
    { panneaux: 22, kw:  11.0, p1:  24442, p2:  25610, p3:  26779 },
    { panneaux: 23, kw:  11.5, p1:  25664, p2:  26886, p3:  28107 },
    { panneaux: 24, kw:  12.0, p1:  26886, p2:  28160, p3:  29436 },
    { panneaux: 25, kw:  12.5, p1:  28107, p2:  29436, p3:  30764 },
    { panneaux: 26, kw:  13.0, p1:  29329, p2:  30710, p3:  32092 },
    { panneaux: 27, kw:  13.5, p1:  30551, p2:  31986, p3:  33420 },
    { panneaux: 28, kw:  14.0, p1:  31773, p2:  33260, p3:  34748 },
    { panneaux: 29, kw:  14.5, p1:  32995, p2:  34536, p3:  36076 },
    { panneaux: 30, kw:  15.0, p1:  34217, p2:  35810, p3:  37404 },
    { panneaux: 31, kw:  15.5, p1:  33792, p2:  35439, p3:  37086 },
    { panneaux: 32, kw:  16.0, p1:  34960, p2:  36660, p3:  38360 },
    { panneaux: 33, kw:  16.5, p1:  36129, p2:  37882, p3:  39636 },
    { panneaux: 34, kw:  17.0, p1:  37298, p2:  39104, p3:  40910 },
    { panneaux: 35, kw:  17.5, p1:  38467, p2:  40326, p3:  42186 },
    { panneaux: 36, kw:  18.0, p1:  39636, p2:  41548, p3:  43460 },
    { panneaux: 37, kw:  18.5, p1:  40804, p2:  42770, p3:  44736 },
    { panneaux: 38, kw:  19.0, p1:  41973, p2:  43992, p3:  46010 },
    { panneaux: 39, kw:  19.5, p1:  43142, p2:  45214, p3:  47286 },
    { panneaux: 40, kw:  20.0, p1:  44310, p2:  46436, p3:  48560 },
    { panneaux: 41, kw:  20.5, p1:  45479, p2:  47657, p3:  49836 },
    { panneaux: 42, kw:  21.0, p1:  46648, p2:  48879, p3:  51110 },
    { panneaux: 43, kw:  21.5, p1:  47817, p2:  50101, p3:  52386 },
    { panneaux: 44, kw:  22.0, p1:  48986, p2:  51323, p3:  53660 },
    { panneaux: 45, kw:  22.5, p1:  50154, p2:  52545, p3:  54936 },
    { panneaux: 46, kw:  23.0, p1:  51323, p2:  53767, p3:  56210 },
    { panneaux: 47, kw:  23.5, p1:  52492, p2:  54989, p3:  57486 },
    { panneaux: 48, kw:  24.0, p1:  53660, p2:  56210, p3:  58760 },
    { panneaux: 49, kw:  24.5, p1:  54829, p2:  57432, p3:  60036 },
    { panneaux: 50, kw:  25.0, p1:  55998, p2:  58654, p3:  61310 },
    { panneaux: 51, kw:  25.5, p1:  57167, p2:  59876, p3:  62586 },
    { panneaux: 52, kw:  26.0, p1:  58336, p2:  61098, p3:  63860 },
    { panneaux: 53, kw:  26.5, p1:  59504, p2:  62320, p3:  65136 },
    { panneaux: 54, kw:  27.0, p1:  60673, p2:  63542, p3:  66410 },
    { panneaux: 55, kw:  27.5, p1:  61842, p2:  64764, p3:  67686 },
    { panneaux: 56, kw:  28.0, p1:  63010, p2:  65986, p3:  68960 },
    { panneaux: 57, kw:  28.5, p1:  64179, p2:  67207, p3:  70236 },
    { panneaux: 58, kw:  29.0, p1:  65348, p2:  68429, p3:  71510 },
    { panneaux: 59, kw:  29.5, p1:  66517, p2:  69651, p3:  72786 },
    { panneaux: 60, kw:  30.0, p1:  67686, p2:  70873, p3:  74060 },
    { panneaux: 61, kw:  30.5, p1:  68854, p2:  72095, p3:  75336 },
    { panneaux: 62, kw:  31.0, p1:  70023, p2:  73317, p3:  76610 },
    { panneaux: 63, kw:  31.5, p1:  71192, p2:  74539, p3:  77886 },
    { panneaux: 64, kw:  32.0, p1:  72360, p2:  75760, p3:  79160 },
    { panneaux: 65, kw:  32.5, p1:  73529, p2:  76982, p3:  80436 },
    { panneaux: 66, kw:  33.0, p1:  74698, p2:  78204, p3:  81710 },
    { panneaux: 67, kw:  33.5, p1:  75867, p2:  79426, p3:  82986 },
    { panneaux: 68, kw:  34.0, p1:  77036, p2:  80648, p3:  84260 },
    { panneaux: 69, kw:  34.5, p1:  78204, p2:  81870, p3:  85536 },
    { panneaux: 70, kw:  35.0, p1:  79373, p2:  83092, p3:  86810 },
    { panneaux: 71, kw:  35.5, p1:  80542, p2:  84314, p3:  88086 },
    { panneaux: 72, kw:  36.0, p1:  81710, p2:  85536, p3:  89360 },
    { panneaux: 73, kw:  36.5, p1:  82879, p2:  86757, p3:  90636 },
    { panneaux: 74, kw:  37.0, p1:  84048, p2:  87979, p3:  91910 },
    { panneaux: 75, kw:  37.5, p1:  85217, p2:  89201, p3:  93186 },
    { panneaux: 76, kw:  38.0, p1:  86386, p2:  90423, p3:  94460 },
    { panneaux: 77, kw:  38.5, p1:  87554, p2:  91645, p3:  95736 },
    { panneaux: 78, kw:  39.0, p1:  88723, p2:  92867, p3:  97010 },
    { panneaux: 79, kw:  39.5, p1:  89892, p2:  94089, p3:  98286 },
    { panneaux: 80, kw:  40.0, p1:  91060, p2:  95310, p3:  99560 }
  ],

  // Règles solaire 2026 — alignées sur le Catalogue v4 RECONSTRUITE (feuille "Solaire au watt")
  // Modèle : coûtant sous-traitant (Larks, panneaux inclus) ÷ 0,80 (marge 20%). Lookup table direct.
  solar_rules: {
    margin_solar_pct: 0.20,             // 20% sur solaire pur (coûtant s.-traitant ÷ 0,80)
    forfait_solo_vendant: 2296,         // Forfait Solo Fox/Sig réel (référence interne, plus utilisé dans le lookup)
    larks_discount: 0.85,               // escompte Raycom sur Larks public (legacy, non utilisé — table directe)
    panneau_vendant_ghl: 225,           // prix panneau Thornova ligne facture GHL/QBO (le solde = pose)
    lissage_min_per_panel: 250,         // $ min par panneau aux transitions paliers (lissage monotone)
    rounding_step: 25,                  // arrondi indicatif
    floors_default: 2,                  // étages par défaut (standard)
    floors_extra_per_w_per_floor: 0.10, // +0,10 $/W par étage au-delà de 2 (3 étages: +0,10, 4: +0,20, etc.)
    min_panels_auto: 5,                 // <5 → hors grille (catalogue min = 5 panneaux)
    max_panels_auto: 80,                // 81+ → sur soumission (table couvre 5-80)
    max_pitch_ratio_auto: 12,           // >12/12 → sur soumission
    forbidden_roofs_auto: ["beton", "membrane_lourde"], // sur soumission ad hoc
    panel_watts_ref: 500,               // Thornova BBT54 500W
    // Multiplicateurs autres toitures (non couverts par grille Larks bardeau/métal)
    roof_multipliers: {
      bardeau: 1.00,
      metal:   1.00,
      tpo:     1.20,   // toit plat membrane : +20%
      epdm:    1.20,
      membrane: 1.20,
      mural:   1.25,   // mural : +25%
      ground:  1.15,   // au sol : +15%
      beton:   null    // sur soumission (bloquant)
    }
  },

  // Grille Larks Q1 2026 — $/W selon (palier panneaux, pente)
  // Source : feuille "Grille Larks Q1 2026" du catalogue + RAYCOM_Solaire_Calcul_Validation.xlsx
  larks_grid_2026: {
    "5-10":  { p1: 2.50, p2: 2.60, p3: 2.70 },  // 4 panneaux utilise aussi ce palier (minimum)
    "11-20": { p1: 2.40, p2: 2.50, p3: 2.60 },
    "21-30": { p1: 2.30, p2: 2.40, p3: 2.50 },
    "31-40": { p1: 2.20, p2: 2.30, p3: 2.40 },
    "41+":   { p1: 2.10, p2: 2.20, p3: 2.30 }   // Extrapolé palier suivant -0,10
  },

  // ============================================================================
  // 📦 FORFAITS INSTALL — 21 forfaits (12 Fox/Sig + 9 Tesla)
  // ============================================================================
  // Source : feuille "Forfaits install" — Marges +4% (Solo 35% → Trio 49%) + vendant majoré +12% mai 2026
  // Marge moyenne globale : 33.1% sur 21 forfaits
  forfaits_install: [
    // Fox/Sig (13 forfaits — v5 2026-06 — Solo/Duo/Trio × Base/DIM/DIM+Batt/DIM+Batt+Backup + Solo Batt+Backup SANS DIM)
    { id: 1,  code: "FS-SOLO",           label: "Solo",                                          brand: "fox_sig", onds: 1, dim: false, batt: false, bu: false, cost: 1515, sell: 2350, marge: 0.3553 },
    { id: 2,  code: "FS-SOLO-DIM",       label: "Solo avec DIM",                                 brand: "fox_sig", onds: 1, dim: true,  batt: false, bu: false, cost: 1995, sell: 3100, marge: 0.3565 },
    { id: 3,  code: "FS-SOLO-DIM-BAT",   label: "Solo avec DIM et batteries",                    brand: "fox_sig", onds: 1, dim: true,  batt: true,  bu: false, cost: 2205, sell: 3400, marge: 0.3515 },
    { id: 4,  code: "FS-SOLO-DIM-BAT-BU",label: "Solo avec DIM, batteries et panneau backup",    brand: "fox_sig", onds: 1, dim: true, batt: true, bu: true, cost: 3370, sell: 5200, marge: 0.3519 },
    { id: 5,  code: "FS-SOLO-BAT-BU",    label: "Solo avec batteries et panneau backup (sans DIM)", brand: "fox_sig", onds: 1, dim: false, batt: true, bu: true, cost: 3200, sell: 5000, marge: 0.3600 },
    { id: 6,  code: "FS-DUO",            label: "Duo",                                           brand: "fox_sig", onds: 2, dim: false, batt: false, bu: false, cost: 2195, sell: 3400, marge: 0.3544 },
    { id: 7,  code: "FS-DUO-DIM",        label: "Duo avec DIM",                                  brand: "fox_sig", onds: 2, dim: true,  batt: false, bu: false, cost: 2675, sell: 4150, marge: 0.3554 },
    { id: 8,  code: "FS-DUO-DIM-BAT",    label: "Duo avec DIM et batteries",                     brand: "fox_sig", onds: 2, dim: true,  batt: true,  bu: false, cost: 2885, sell: 4450, marge: 0.3517 },
    { id: 9,  code: "FS-DUO-DIM-BAT-BU", label: "Duo avec DIM, batteries et panneau backup",     brand: "fox_sig", onds: 2, dim: true, batt: true, bu: true, cost: 4050, sell: 6250, marge: 0.3520 },
    { id: 10, code: "FS-TRIO",           label: "Trio",                                          brand: "fox_sig", onds: 3, dim: false, batt: false, bu: false, cost: 2875, sell: 4450, marge: 0.3539 },
    { id: 11, code: "FS-TRIO-DIM",       label: "Trio avec DIM",                                 brand: "fox_sig", onds: 3, dim: true,  batt: false, bu: false, cost: 3355, sell: 5200, marge: 0.3548 },
    { id: 12, code: "FS-TRIO-DIM-BAT",   label: "Trio avec DIM et batteries",                    brand: "fox_sig", onds: 3, dim: true,  batt: true,  bu: false, cost: 3565, sell: 5500, marge: 0.3518 },
    { id: 13, code: "FS-TRIO-DIM-BAT-BU",label: "Trio avec DIM, batteries et panneau backup",    brand: "fox_sig", onds: 3, dim: true, batt: true, bu: true, cost: 4730, sell: 7300, marge: 0.3521 },
    // Tesla (9 forfaits — v5 2026-06)
    { id: 14, code: "TES-SOLO",          label: "Tesla Solo",                                    brand: "tesla", onds: 1, dim: true, batt: true, bu: false, full_backup: false, cost: 2205, sell: 3400, marge: 0.3515 },
    { id: 15, code: "TES-SOLO-BU",       label: "Tesla Solo avec panneau backup partiel",        brand: "tesla", onds: 1, dim: true, batt: true, bu: true,  full_backup: false, cost: 3070, sell: 4800, marge: 0.3604 },
    { id: 16, code: "TES-SOLO-FBU",      label: "Tesla Solo avec full home backup",              brand: "tesla", onds: 1, dim: true, batt: true, bu: true,  full_backup: true,  cost: 3215, sell: 4925, marge: 0.3472 },
    { id: 17, code: "TES-DUO",           label: "Tesla Duo",                                     brand: "tesla", onds: 2, dim: true, batt: true, bu: false, full_backup: false, cost: 2885, sell: 4450, marge: 0.3517 },
    { id: 18, code: "TES-DUO-BU",        label: "Tesla Duo avec panneau backup partiel",         brand: "tesla", onds: 2, dim: true, batt: true, bu: true,  full_backup: false, cost: 3750, sell: 5850, marge: 0.3590 },
    { id: 19, code: "TES-DUO-FBU",       label: "Tesla Duo avec full home backup",               brand: "tesla", onds: 2, dim: true, batt: true, bu: true,  full_backup: true,  cost: 3895, sell: 5975, marge: 0.3481 },
    { id: 20, code: "TES-TRIO",          label: "Tesla Trio",                                    brand: "tesla", onds: 3, dim: true, batt: true, bu: false, full_backup: false, cost: 3565, sell: 5500, marge: 0.3518 },
    { id: 21, code: "TES-TRIO-BU",       label: "Tesla Trio avec panneau backup partiel",        brand: "tesla", onds: 3, dim: true, batt: true, bu: true,  full_backup: false, cost: 4430, sell: 6900, marge: 0.3580 },
    { id: 22, code: "TES-TRIO-FBU",      label: "Tesla Trio avec full home backup",              brand: "tesla", onds: 3, dim: true, batt: true, bu: true,  full_backup: true,  cost: 4575, sell: 7025, marge: 0.3488 }
  ],

  // ============================================================================
  // 🔋 TESLA — mPower (catalogue v7-3) — 34 SKUs
  // ============================================================================
  tesla_skus: {
    "MPW-1841000-01-E": { name: "Tesla Energy Gateway 3",                    cat: "primaire",    cost: 1165, markup: 0.25, sell: 1456.25 },
    "MPW-1707000-11-M": { name: "Tesla Powerwall 3",                         cat: "primaire",    cost: 9840, markup: 0.25, sell: 12300,    kwh: 13.5, kw: 11.5 },
    "MPW-1807000-20-B": { name: "Tesla Powerwall 3 DC Expansion",            cat: "primaire",    cost: 7800, markup: 0.25, sell: 9750,     kwh: 13.5 },
    "MPW-1232100-00-H": { name: "Tesla Backup Energy Gateway 2",             cat: "primaire",    cost: 1165, markup: 0.25, sell: 1456.25 },
    "MPW-1856187-00-G": { name: "Powerwall Lifting Dolly",                   cat: "primaire",    cost: 3246, markup: 0.25, sell: 4057.50 },
    "MPW-1879359-15-B": { name: "Tesla MCI-2, ASY, 1000V, 15A, 19A-ISC, EVO2", cat: "accessoires", cost: 60,   markup: 0.50, sell: 90 },
    "MPW-1875157-05-F": { name: "0.5 m Expansion Harness",                   cat: "accessoires", cost: 156,  markup: 0.50, sell: 234 },
    "MPW-1875157-20-D": { name: "2 m Expansion Harness",                     cat: "accessoires", cost: 258,  markup: 0.50, sell: 387 },
    "MPW-1875157-40-D": { name: "4 m Expansion Harness",                     cat: "accessoires", cost: 390,  markup: 0.50, sell: 585 },
    "MPW-1893723-00-B": { name: "Bolt-on Portcover, PW3",                    cat: "accessoires", cost: 12,   markup: 0.50, sell: 18 },
    "MPW-1978074-00-A": { name: "Expansion Harness Straps",                  cat: "accessoires", cost: 8,    markup: 0.50, sell: 12 },
    "MPW-1486318-20-A": { name: "Gateway 3 Replacement Glass Door",          cat: "accessoires", cost: 135,  markup: 0.50, sell: 202.50 },
    "MPW-2065063-00-A": { name: "Gateway 3 Square D Lug Divider Kit",        cat: "accessoires", cost: 5,    markup: 0.50, sell: 7.50 },
    "MPW-1857363-00-F": { name: "Powerwall 3 Accessory Bag",                 cat: "accessoires", cost: 108,  markup: 0.50, sell: 162 },
    "MPW-1978070-00-C": { name: "Powerwall 3 Expansion Stacking Kit",        cat: "accessoires", cost: 186,  markup: 0.50, sell: 279 },
    "MPW-1978069-00-C": { name: "Powerwall 3 Expansion Wall Mount Kit",      cat: "accessoires", cost: 186,  markup: 0.50, sell: 279 },
    "MPW-1808482-00-B": { name: "Powerwall 3 Leveling Foot",                 cat: "accessoires", cost: 6,    markup: 0.50, sell: 9 },
    "MPW-1899124-00-C": { name: "Powerwall 3 On/Off Switch Cover",           cat: "accessoires", cost: 2,    markup: 0.50, sell: 3 },
    "MPW-1763418-11-C": { name: "Powerwall 3 Replacement Front Cover",       cat: "accessoires", cost: 126,  markup: 0.50, sell: 189 },
    "MPW-2033376-00-C": { name: "Tesla 200A SPLIT CORE CT",                  cat: "accessoires", cost: 43,   markup: 0.50, sell: 64.50 },
    "MPW-2045796-00-A": { name: "Tesla Primary Remote Meter Kit + 2×200A CT", cat: "accessoires",cost: 313,  markup: 0.50, sell: 469.50 },
    "MPW-2045794-00-D": { name: "Tesla RS485 HARNESS, TRM, NAM",             cat: "accessoires", cost: 25,   markup: 0.50, sell: 37.50 },
    "MPW-2060713-00-B": { name: "CT Extension Harness TRM",                  cat: "accessoires", cost: 64,   markup: 0.50, sell: 96 },
    "MPW-1549184-01-B": { name: "Tesla 1.25 inch Conduit Hub Kit",           cat: "accessoires", cost: 13,   markup: 0.50, sell: 19.50 },
    "MPW-1549184-00-C": { name: "Tesla 2-inch Conduit Hub Kit",              cat: "accessoires", cost: 11,   markup: 0.50, sell: 16.50 }
  },

  // ============================================================================
  // 🔋 SIGENERGY — Catalogue partenaire (mars 2026) — 13 SKUs · Markup 30% uniforme
  // ============================================================================
  sigenergy_skus: {
    "SIG-CTRL-115":    { name: "Contrôleur 11,5 kW (onduleur SigenStor)",         cost: 2368, markup: 0.30, sell: 3078.40, kw: 11.5 },
    "SIG-BAT-9":       { name: "Batterie 9 kWh",                                    cost: 3799, markup: 0.30, sell: 4938.70, kwh: 9 },
    "SIG-BAT-6":       { name: "Batterie 6 kWh",                                    cost: 2896, markup: 0.30, sell: 3764.80, kwh: 6 },
    "SIG-LOADHUB":     { name: "LoadHub (DIM Panneau intelligent 200A)",            cost: 1509, markup: 0.30, sell: 1961.70 },
    "SIG-V2X":         { name: "Borne V2X (NACS ou CCS1) + 0,15$/kWh client",       cost: 3517, markup: 0.30, sell: 4572.10 },
    "SIG-AC-J1772":    { name: "Borne AC 11,5 kW J1772 + 0,15$/kWh client",         cost: 1111, markup: 0.30, sell: 1444.30 },
    "SIG-AC-NACS":     { name: "Borne AC 11,5 kW NACS + 0,15$/kWh client",          cost: 1111, markup: 0.30, sell: 1444.30 },
    "SIG-MNTH-OND":    { name: "Manteau hivernal — Onduleur (Contrôleur)",          cost: 119,  markup: 0.30, sell: 154.70 },
    "SIG-MNTH-V2X":    { name: "Manteau hivernal — V2X ou Batterie",                cost: 99,   markup: 0.30, sell: 128.70 },
    "SIG-LTE-5Y":      { name: "Module LTE (Connectivité 5 ans incluse)",           cost: 299,  markup: 0.30, sell: 388.70 },
    "SIG-CT200-SNS":   { name: "Sensor CT200-DH",                                   cost: 338,  markup: 0.30, sell: 439.40 },
    "SIG-CT200-BOX":   { name: "Boîtier CT200-DH",                                  cost: 319,  markup: 0.30, sell: 414.70 },
    "SIG-INSTKIT":     { name: "Kit installation murale",                           cost: 82,   markup: 0.30, sell: 106.60 }
  },

  // ============================================================================
  // 🦊 FOX ESS — 2 systèmes DISTINCTS (AIO ≠ H1 Hybrid) · NE JAMAIS mélanger
  // ============================================================================
  fox_ess: {
    // === SYSTÈME AIO — Onduleur + Batteries intégrées (modules EQ4000 empilables)
    aio: {
      onduleurs: {
        "FRK-5101082": { name: "AIO H1-9.6kW-US Flex",  kw: 9.6,  cost: 2518.12, sell: 3273.56, spec: "Hybride DC · 3 MPPT · Off-grid prêt" },
        "FRK-5101083": { name: "AIO H1-11.4kW-US Flex", kw: 11.4, cost: 2518.12, sell: 3273.56, spec: "Hybride DC · 3 MPPT · Off-grid prêt" }
      },
      batteries: {
        "FRK-5600743": { name: "EQ4000 Battery Module", kwh: 4, usable_kwh: 3.84, cost: 1689.13, sell: 2195.87, stack_max: 7, spec: "Module empilable AIO (min 2)" }
      },
      bundles: [
        { id: "aio-96-2eq", label: "AIO 9.6kW + 2× EQ4000",   inv_sku: "FRK-5101082", eq_qty: 2, kwh: 7.7,  cost: 5896.38,  sell: 7665.29  },
        { id: "aio-96-3eq", label: "AIO 9.6kW + 3× EQ4000",   inv_sku: "FRK-5101082", eq_qty: 3, kwh: 11.5, cost: 7585.51,  sell: 9861.16  },
        { id: "aio-114-3eq",label: "AIO 11.4kW + 3× EQ4000",  inv_sku: "FRK-5101083", eq_qty: 3, kwh: 11.5, cost: 7585.51,  sell: 9861.16  },
        { id: "aio-114-4eq",label: "AIO 11.4kW + 4× EQ4000",  inv_sku: "FRK-5101083", eq_qty: 4, kwh: 15.4, cost: 9274.64,  sell: 12057.03 },
        { id: "aio-114-5eq",label: "AIO 11.4kW + 5× EQ4000",  inv_sku: "FRK-5101083", eq_qty: 5, kwh: 19.2, cost: 10963.77, sell: 14252.90 },
        { id: "aio-114-6eq",label: "AIO 11.4kW + 6× EQ4000",  inv_sku: "FRK-5101083", eq_qty: 6, kwh: 23,   cost: 12652.90, sell: 16448.77 },
        { id: "aio-114-7eq",label: "AIO 11.4kW + 7× EQ4000",  inv_sku: "FRK-5101083", eq_qty: 7, kwh: 26.9, cost: 14342.03, sell: 18644.64 }
      ]
    },
    // === SYSTÈME H1 HYBRID — Onduleur + batteries séparés (CM4000 + CS4000) + Hub G2 OBLIGATOIRE + Inverter Kit
    h1_hybrid: {
      onduleurs: {
        "FRK-5101085": { name: "Hybrid H1-9.6 US 2.0 Flex",  kw: 9.6,  cost: 1637.83, sell: 2129.18, spec: "DC couplé · 2 MPPT · hybrid grid-tie" },
        "FRK-5101086": { name: "Hybrid H1-11.4 US 2.0 Flex", kw: 11.4, cost: 1680.45, sell: 2184.59, spec: "DC couplé · 2 MPPT · hybrid grid-tie" }
      },
      batteries: {
        "FRK-5600744": { name: "CM4000 Standalone Controller", kwh: 4, cost: 1805.59, sell: 2347.27, role: "controller", required: true,  spec: "OBLIGATOIRE — 1 seul par stack (BMS intégré)" },
        "FRK-5600745": { name: "CS4000 Standalone Slave",      kwh: 4, cost: 1775.12, sell: 2307.66, role: "slave",      required: false, spec: "Module additionnel — 1 à 7 par stack après CM4000" }
      },
      accessoires_obligatoires: {
        "FRK-5101084": { name: "Hub G2",       cost: 564.69, sell: 734.10, spec: "OBLIGATOIRE — Comm BMS ↔ onduleur" },
        "FRK-5101089": { name: "Inverter Kit", cost: 128.31, sell: 166.80, spec: "OBLIGATOIRE — Câblage onduleur ↔ batteries" }
      },
      bundles: [
        { id: "h1-96-1cm-1cs",  label: "H1 9.6kW + CM + 1×CS",  inv_sku: "FRK-5101085", cm: 1, cs: 1, kwh: 7.7,  cost: 5911.54,  sell: 7685.00  },
        { id: "h1-96-1cm-2cs",  label: "H1 9.6kW + CM + 2×CS",  inv_sku: "FRK-5101085", cm: 1, cs: 2, kwh: 11.5, cost: 7686.66,  sell: 9992.66  },
        { id: "h1-114-1cm-2cs", label: "H1 11.4kW + CM + 2×CS", inv_sku: "FRK-5101086", cm: 1, cs: 2, kwh: 11.5, cost: 7729.28,  sell: 10048.06 },
        { id: "h1-114-1cm-3cs", label: "H1 11.4kW + CM + 3×CS", inv_sku: "FRK-5101086", cm: 1, cs: 3, kwh: 15.4, cost: 9504.40,  sell: 12355.72 },
        { id: "h1-114-1cm-4cs", label: "H1 11.4kW + CM + 4×CS", inv_sku: "FRK-5101086", cm: 1, cs: 4, kwh: 19.2, cost: 11279.52, sell: 14663.38 },
        { id: "h1-114-1cm-5cs", label: "H1 11.4kW + CM + 5×CS", inv_sku: "FRK-5101086", cm: 1, cs: 5, kwh: 23,   cost: 13054.64, sell: 16971.03 }
      ]
    },
    // === ACCESSOIRES UNIVERSELS (AIO + H1)
    universel: {
      "FRK-5101087": { name: "4G Dongle",                          cost: 288.69, sell: 375.30, optional: true,  spec: "Monitoring cellulaire si pas de Wi-Fi" },
      "FRK-5101081": { name: "ProJoy PEFS — Rapid Shutdown Box",   cost: 385.18, sell: 500.73, optional: false, spec: "OBLIGATOIRE pour tout système solaire au Canada (norme)" }
    },
    rules: {
      eq4000_h1_incompat: true,         // EQ4000 ne fonctionne PAS avec H1 Hybrid
      cm_cs_aio_incompat: true,         // CM/CS ne fonctionnent PAS avec AIO
      aio_no_hub_external: true,        // AIO = BMS intégré
      h1_hub_required: true,            // H1 = Hub G2 obligatoire
      eq4000_max_per_aio: 7,
      eq4000_min_per_aio: 2,
      cs4000_max_per_stack: 7
    }
  },

  // ============================================================================
  // 🔌 BORNES EV — Forfait base 495$ + 6 sliders de câblage + modèles bornes + DCC
  // ============================================================================
  borne_ev: {
    // Forfait BASE : MO 2h + Z1 + disjoncteur 60A 2P + connecteurs AC90 + caulking
    forfait_base: {
      label: "Forfait base borne EV (MO 2h + Z1 + breaker 60A 2P + connecteurs + caulking)",
      composants: [
        { label: "Main-d'œuvre 2h × 90$/h coûtant",       cost: 180,   note: "Install + fixation + mise en marche" },
        { label: "Déplacement Z1 inclus (0-30 km)",       cost: 30,    note: "Mascouche / Terrebonne / Laval / Repentigny" },
        { label: "Disjoncteur 60A 2P Siemens Q260",       cost: 28.33, sku: "LMN-SIEQ260" },
        { label: "Connecteurs AC90 + petits matériels",   cost: 25,    note: "Connecteurs, fixations, accessoires" },
        { label: "Caulking + tyraps + vis",               cost: 15,    note: "Étanchéité et fixation" }
      ],
      cost_total: 278.33,
      sell: 495,
      marge: 0.4378
    },
    // 6 sliders de câblage — choisir UN selon configuration installation
    // Chaque slider a 20 longueurs (1m à 50m). Le prix INCLUT le forfait base.
    // Table : { m: longueur, mat: matériel câble/PVC, accessoires, mo, cost_per_m, sell_per_m, total_with_base }
    sliders: {
      A_int_nmd: {
        label: "A — INTÉRIEUR NMD90 6/2 rouge (cloison/grenier)",
        spec: "LUM-CAB6/2D7RED 14,01 $/m · MO 5min/m intérieur · Marge ~30% +15% bonus",
        lengths: [
          { m: 1,  cable: 14.01,  mat: 0.5,  mo: 4.5,   cost_m: 19.01,  sell_m: 31.23,  total: 526.23 },
          { m: 2,  cable: 28.02,  mat: 1,    mo: 9,     cost_m: 38.02,  sell_m: 62.46,  total: 557.46 },
          { m: 3,  cable: 42.03,  mat: 1.5,  mo: 13.5,  cost_m: 57.03,  sell_m: 93.69,  total: 588.69 },
          { m: 4,  cable: 56.04,  mat: 2,    mo: 18,    cost_m: 76.04,  sell_m: 124.92, total: 619.92 },
          { m: 5,  cable: 70.05,  mat: 2.5,  mo: 22.5,  cost_m: 95.05,  sell_m: 156.15, total: 651.15 },
          { m: 6,  cable: 84.06,  mat: 3,    mo: 27,    cost_m: 114.06, sell_m: 187.38, total: 682.38 },
          { m: 7,  cable: 98.07,  mat: 3.5,  mo: 31.5,  cost_m: 133.07, sell_m: 218.61, total: 713.61 },
          { m: 8,  cable: 112.08, mat: 4,    mo: 36,    cost_m: 152.08, sell_m: 249.84, total: 744.84 },
          { m: 9,  cable: 126.09, mat: 4.5,  mo: 40.5,  cost_m: 171.09, sell_m: 281.07, total: 776.07 },
          { m: 10, cable: 140.10, mat: 5,    mo: 45,    cost_m: 190.10, sell_m: 312.30, total: 807.30 },
          { m: 12, cable: 168.12, mat: 6,    mo: 54,    cost_m: 228.12, sell_m: 374.76, total: 869.76 },
          { m: 15, cable: 210.15, mat: 7.5,  mo: 67.5,  cost_m: 285.15, sell_m: 468.45, total: 963.45 },
          { m: 18, cable: 252.18, mat: 9,    mo: 81,    cost_m: 342.18, sell_m: 562.14, total: 1057.14 },
          { m: 20, cable: 280.20, mat: 10,   mo: 90,    cost_m: 380.20, sell_m: 624.60, total: 1119.60 },
          { m: 25, cable: 350.25, mat: 12.5, mo: 112.5, cost_m: 475.25, sell_m: 780.75, total: 1275.75 },
          { m: 30, cable: 420.30, mat: 15,   mo: 135,   cost_m: 570.30, sell_m: 936.90, total: 1431.90 },
          { m: 35, cable: 490.35, mat: 17.5, mo: 157.5, cost_m: 665.35, sell_m: 1093.05,total: 1588.05 },
          { m: 40, cable: 560.40, mat: 20,   mo: 180,   cost_m: 760.40, sell_m: 1249.20,total: 1744.20 },
          { m: 45, cable: 630.45, mat: 22.5, mo: 202.5, cost_m: 855.45, sell_m: 1405.35,total: 1900.35 },
          { m: 50, cable: 700.50, mat: 25,   mo: 225,   cost_m: 950.50, sell_m: 1561.50,total: 2056.50 }
        ]
      },
      B_garage_pvc: {
        label: "B — GARAGE PVC 3/4\" + 3× #6 AWG RW90 cuivre",
        spec: "PVC 3/4\" rigide Westburne IPEPVC3/4X10 · #6 RW90 cuivre · Marge 30%",
        lengths: [
          { m: 1,  cable: 18.15,   mat: 1,    mo: 5.5,   cost_m: 24.65,   sell_m: 35.21,   total: 530.21 },
          { m: 2,  cable: 36.30,   mat: 2,    mo: 11,    cost_m: 49.30,   sell_m: 70.42,   total: 565.42 },
          { m: 3,  cable: 54.45,   mat: 3,    mo: 16.5,  cost_m: 73.95,   sell_m: 105.63,  total: 600.63 },
          { m: 4,  cable: 72.60,   mat: 4,    mo: 22,    cost_m: 98.60,   sell_m: 140.84,  total: 635.84 },
          { m: 5,  cable: 90.75,   mat: 5,    mo: 27.5,  cost_m: 123.25,  sell_m: 176.05,  total: 671.05 },
          { m: 6,  cable: 108.90,  mat: 6,    mo: 33,    cost_m: 147.90,  sell_m: 211.26,  total: 706.26 },
          { m: 7,  cable: 127.05,  mat: 7,    mo: 38.5,  cost_m: 172.55,  sell_m: 246.47,  total: 741.47 },
          { m: 8,  cable: 145.20,  mat: 8,    mo: 44,    cost_m: 197.20,  sell_m: 281.68,  total: 776.68 },
          { m: 9,  cable: 163.35,  mat: 9,    mo: 49.5,  cost_m: 221.85,  sell_m: 316.89,  total: 811.89 },
          { m: 10, cable: 181.50,  mat: 10,   mo: 55,    cost_m: 246.50,  sell_m: 352.10,  total: 847.10 },
          { m: 12, cable: 217.80,  mat: 12,   mo: 66,    cost_m: 295.80,  sell_m: 422.52,  total: 917.52 },
          { m: 15, cable: 272.25,  mat: 15,   mo: 82.5,  cost_m: 369.75,  sell_m: 528.15,  total: 1023.15 },
          { m: 18, cable: 326.70,  mat: 18,   mo: 99,    cost_m: 443.70,  sell_m: 633.78,  total: 1128.78 },
          { m: 20, cable: 363.00,  mat: 20,   mo: 110,   cost_m: 493.00,  sell_m: 704.20,  total: 1199.20 },
          { m: 25, cable: 453.75,  mat: 25,   mo: 137.5, cost_m: 616.25,  sell_m: 880.25,  total: 1375.25 },
          { m: 30, cable: 544.50,  mat: 30,   mo: 165,   cost_m: 739.50,  sell_m: 1056.30, total: 1551.30 },
          { m: 35, cable: 635.25,  mat: 35,   mo: 192.5, cost_m: 862.75,  sell_m: 1232.35, total: 1727.35 },
          { m: 40, cable: 726.00,  mat: 40,   mo: 220,   cost_m: 986.00,  sell_m: 1408.40, total: 1903.40 },
          { m: 45, cable: 816.75,  mat: 45,   mo: 247.5, cost_m: 1109.25, sell_m: 1584.45, total: 2079.45 },
          { m: 50, cable: 907.50,  mat: 50,   mo: 275,   cost_m: 1232.50, sell_m: 1760.50, total: 2255.50 }
        ]
      },
      C_garage_teck: {
        label: "C — GARAGE TECK 6/3 1KV cuivre clippé en surface",
        spec: "LMN-CAB6TECK3C1KV 23,14 $/m · Pas de conduit · Clippé directement au mur · Marge 30%",
        lengths: [
          { m: 1,  cable: 23.14,   mat: 0.5,  mo: 3.5,   cost_m: 27.14,   sell_m: 38.77,   total: 533.77 },
          { m: 2,  cable: 46.28,   mat: 1,    mo: 7,     cost_m: 54.28,   sell_m: 77.54,   total: 572.54 },
          { m: 3,  cable: 69.42,   mat: 1.5,  mo: 10.5,  cost_m: 81.42,   sell_m: 116.31,  total: 611.31 },
          { m: 4,  cable: 92.56,   mat: 2,    mo: 14,    cost_m: 108.56,  sell_m: 155.08,  total: 650.08 },
          { m: 5,  cable: 115.70,  mat: 2.5,  mo: 17.5,  cost_m: 135.70,  sell_m: 193.85,  total: 688.85 },
          { m: 6,  cable: 138.84,  mat: 3,    mo: 21,    cost_m: 162.84,  sell_m: 232.62,  total: 727.62 },
          { m: 7,  cable: 161.98,  mat: 3.5,  mo: 24.5,  cost_m: 189.98,  sell_m: 271.39,  total: 766.39 },
          { m: 8,  cable: 185.12,  mat: 4,    mo: 28,    cost_m: 217.12,  sell_m: 310.16,  total: 805.16 },
          { m: 9,  cable: 208.26,  mat: 4.5,  mo: 31.5,  cost_m: 244.26,  sell_m: 348.93,  total: 843.93 },
          { m: 10, cable: 231.40,  mat: 5,    mo: 35,    cost_m: 271.40,  sell_m: 387.70,  total: 882.70 },
          { m: 12, cable: 277.68,  mat: 6,    mo: 42,    cost_m: 325.68,  sell_m: 465.24,  total: 960.24 },
          { m: 15, cable: 347.10,  mat: 7.5,  mo: 52.5,  cost_m: 407.10,  sell_m: 581.55,  total: 1076.55 },
          { m: 18, cable: 416.52,  mat: 9,    mo: 63,    cost_m: 488.52,  sell_m: 697.86,  total: 1192.86 },
          { m: 20, cable: 462.80,  mat: 10,   mo: 70,    cost_m: 542.80,  sell_m: 775.40,  total: 1270.40 },
          { m: 25, cable: 578.50,  mat: 12.5, mo: 87.5,  cost_m: 678.50,  sell_m: 969.25,  total: 1464.25 },
          { m: 30, cable: 694.20,  mat: 15,   mo: 105,   cost_m: 814.20,  sell_m: 1163.10, total: 1658.10 },
          { m: 35, cable: 809.90,  mat: 17.5, mo: 122.5, cost_m: 949.90,  sell_m: 1356.95, total: 1851.95 },
          { m: 40, cable: 925.60,  mat: 20,   mo: 140,   cost_m: 1085.60, sell_m: 1550.80, total: 2045.80 },
          { m: 45, cable: 1041.30, mat: 22.5, mo: 157.5, cost_m: 1221.30, sell_m: 1744.65, total: 2239.65 },
          { m: 50, cable: 1157.00, mat: 25,   mo: 175,   cost_m: 1357.00, sell_m: 1938.50, total: 2433.50 }
        ]
      },
      D_ext_pvc: {
        label: "D — EXTÉRIEUR PVC 3/4\" mural + 3× #6 AWG RW90 cuivre",
        spec: "PVC 3/4\" rigide · #6 RW90 cuivre · Fixation murale ext + étanchéité · Marge 30%",
        lengths: [
          { m: 1,  cable: 18.15,   mat: 1.5,  mo: 5.5,   cost_m: 25.15,   sell_m: 32.68,   total: 527.68 },
          { m: 2,  cable: 36.30,   mat: 3,    mo: 11,    cost_m: 50.30,   sell_m: 65.36,   total: 560.36 },
          { m: 3,  cable: 54.45,   mat: 4.5,  mo: 16.5,  cost_m: 75.45,   sell_m: 98.04,   total: 593.04 },
          { m: 4,  cable: 72.60,   mat: 6,    mo: 22,    cost_m: 100.60,  sell_m: 130.72,  total: 625.72 },
          { m: 5,  cable: 90.75,   mat: 7.5,  mo: 27.5,  cost_m: 125.75,  sell_m: 163.40,  total: 658.40 },
          { m: 6,  cable: 108.90,  mat: 9,    mo: 33,    cost_m: 150.90,  sell_m: 196.08,  total: 691.08 },
          { m: 7,  cable: 127.05,  mat: 10.5, mo: 38.5,  cost_m: 176.05,  sell_m: 228.76,  total: 723.76 },
          { m: 8,  cable: 145.20,  mat: 12,   mo: 44,    cost_m: 201.20,  sell_m: 261.44,  total: 756.44 },
          { m: 9,  cable: 163.35,  mat: 13.5, mo: 49.5,  cost_m: 226.35,  sell_m: 294.12,  total: 789.12 },
          { m: 10, cable: 181.50,  mat: 15,   mo: 55,    cost_m: 251.50,  sell_m: 326.80,  total: 821.80 },
          { m: 12, cable: 217.80,  mat: 18,   mo: 66,    cost_m: 301.80,  sell_m: 392.16,  total: 887.16 },
          { m: 15, cable: 272.25,  mat: 22.5, mo: 82.5,  cost_m: 377.25,  sell_m: 490.20,  total: 985.20 },
          { m: 18, cable: 326.70,  mat: 27,   mo: 99,    cost_m: 452.70,  sell_m: 588.24,  total: 1083.24 },
          { m: 20, cable: 363.00,  mat: 30,   mo: 110,   cost_m: 503.00,  sell_m: 653.60,  total: 1148.60 },
          { m: 25, cable: 453.75,  mat: 37.5, mo: 137.5, cost_m: 628.75,  sell_m: 817.00,  total: 1312.00 },
          { m: 30, cable: 544.50,  mat: 45,   mo: 165,   cost_m: 754.50,  sell_m: 980.40,  total: 1475.40 },
          { m: 35, cable: 635.25,  mat: 52.5, mo: 192.5, cost_m: 880.25,  sell_m: 1143.80, total: 1638.80 },
          { m: 40, cable: 726.00,  mat: 60,   mo: 220,   cost_m: 1006.00, sell_m: 1307.20, total: 1802.20 },
          { m: 45, cable: 816.75,  mat: 67.5, mo: 247.5, cost_m: 1131.75, sell_m: 1470.60, total: 1965.60 },
          { m: 50, cable: 907.50,  mat: 75,   mo: 275,   cost_m: 1257.50, sell_m: 1634.00, total: 2129.00 }
        ]
      },
      E_ext_teck: {
        label: "E — EXTÉRIEUR TECK 6/3 1KV cuivre (clippé ou enfoui)",
        spec: "LMN-CAB6TECK3C1KV 23,14 $/m · Câble TECK robuste extérieur · Marge 30%",
        lengths: [
          { m: 1,  cable: 23.14,   mat: 1,    mo: 5,     cost_m: 29.14,   sell_m: 41.63,   total: 536.63 },
          { m: 2,  cable: 46.28,   mat: 2,    mo: 10,    cost_m: 58.28,   sell_m: 83.26,   total: 578.26 },
          { m: 3,  cable: 69.42,   mat: 3,    mo: 15,    cost_m: 87.42,   sell_m: 124.89,  total: 619.89 },
          { m: 4,  cable: 92.56,   mat: 4,    mo: 20,    cost_m: 116.56,  sell_m: 166.52,  total: 661.52 },
          { m: 5,  cable: 115.70,  mat: 5,    mo: 25,    cost_m: 145.70,  sell_m: 208.15,  total: 703.15 },
          { m: 6,  cable: 138.84,  mat: 6,    mo: 30,    cost_m: 174.84,  sell_m: 249.78,  total: 744.78 },
          { m: 7,  cable: 161.98,  mat: 7,    mo: 35,    cost_m: 203.98,  sell_m: 291.41,  total: 786.41 },
          { m: 8,  cable: 185.12,  mat: 8,    mo: 40,    cost_m: 233.12,  sell_m: 333.04,  total: 828.04 },
          { m: 9,  cable: 208.26,  mat: 9,    mo: 45,    cost_m: 262.26,  sell_m: 374.67,  total: 869.67 },
          { m: 10, cable: 231.40,  mat: 10,   mo: 50,    cost_m: 291.40,  sell_m: 416.30,  total: 911.30 },
          { m: 12, cable: 277.68,  mat: 12,   mo: 60,    cost_m: 349.68,  sell_m: 499.56,  total: 994.56 },
          { m: 15, cable: 347.10,  mat: 15,   mo: 75,    cost_m: 437.10,  sell_m: 624.45,  total: 1119.45 },
          { m: 18, cable: 416.52,  mat: 18,   mo: 90,    cost_m: 524.52,  sell_m: 749.34,  total: 1244.34 },
          { m: 20, cable: 462.80,  mat: 20,   mo: 100,   cost_m: 582.80,  sell_m: 832.60,  total: 1327.60 },
          { m: 25, cable: 578.50,  mat: 25,   mo: 125,   cost_m: 728.50,  sell_m: 1040.75, total: 1535.75 },
          { m: 30, cable: 694.20,  mat: 30,   mo: 150,   cost_m: 874.20,  sell_m: 1248.90, total: 1743.90 },
          { m: 35, cable: 809.90,  mat: 35,   mo: 175,   cost_m: 1019.90, sell_m: 1457.05, total: 1952.05 },
          { m: 40, cable: 925.60,  mat: 40,   mo: 200,   cost_m: 1165.60, sell_m: 1665.20, total: 2160.20 },
          { m: 45, cable: 1041.30, mat: 45,   mo: 225,   cost_m: 1311.30, sell_m: 1873.35, total: 2368.35 },
          { m: 50, cable: 1157.00, mat: 50,   mo: 250,   cost_m: 1457.00, sell_m: 2081.50, total: 2576.50 }
        ]
      },
      F_int_emt: {
        label: "F — INTÉRIEUR EMT 3/4\" + 3× #6 AWG RW90 cuivre",
        spec: "EMT 3/4\" Guillevin COND-EMT34 · #6 RW90 cuivre · Connecteurs Lumen APPTW75S · Local technique propre · Marge 30%",
        lengths: [
          { m: 1,  cable: 15.55,  mat: 1.4,  mo: 5.5,   cost_m: 22.45,  sell_m: 29.18,   total: 524.18 },
          { m: 2,  cable: 31.10,  mat: 2.8,  mo: 11,    cost_m: 44.90,  sell_m: 58.36,   total: 553.36 },
          { m: 3,  cable: 46.65,  mat: 4.2,  mo: 16.5,  cost_m: 67.35,  sell_m: 87.54,   total: 582.54 },
          { m: 4,  cable: 62.20,  mat: 5.6,  mo: 22,    cost_m: 89.80,  sell_m: 116.72,  total: 611.72 },
          { m: 5,  cable: 77.75,  mat: 7,    mo: 27.5,  cost_m: 112.25, sell_m: 145.90,  total: 640.90 },
          { m: 6,  cable: 93.30,  mat: 8.4,  mo: 33,    cost_m: 134.70, sell_m: 175.08,  total: 670.08 },
          { m: 7,  cable: 108.85, mat: 9.8,  mo: 38.5,  cost_m: 157.15, sell_m: 204.26,  total: 699.26 },
          { m: 8,  cable: 124.40, mat: 11.2, mo: 44,    cost_m: 179.60, sell_m: 233.44,  total: 728.44 },
          { m: 9,  cable: 139.95, mat: 12.6, mo: 49.5,  cost_m: 202.05, sell_m: 262.62,  total: 757.62 },
          { m: 10, cable: 155.50, mat: 14,   mo: 55,    cost_m: 224.50, sell_m: 291.80,  total: 786.80 },
          { m: 12, cable: 186.60, mat: 16.8, mo: 66,    cost_m: 269.40, sell_m: 350.16,  total: 845.16 },
          { m: 15, cable: 233.25, mat: 21,   mo: 82.5,  cost_m: 336.75, sell_m: 437.70,  total: 932.70 },
          { m: 18, cable: 279.90, mat: 25.2, mo: 99,    cost_m: 404.10, sell_m: 525.24,  total: 1020.24 },
          { m: 20, cable: 311.00, mat: 28,   mo: 110,   cost_m: 449.00, sell_m: 583.60,  total: 1078.60 },
          { m: 25, cable: 388.75, mat: 35,   mo: 137.5, cost_m: 561.25, sell_m: 729.50,  total: 1224.50 },
          { m: 30, cable: 466.50, mat: 42,   mo: 165,   cost_m: 673.50, sell_m: 875.40,  total: 1370.40 },
          { m: 35, cable: 544.25, mat: 49,   mo: 192.5, cost_m: 785.75, sell_m: 1021.30, total: 1516.30 },
          { m: 40, cable: 622.00, mat: 56,   mo: 220,   cost_m: 898.00, sell_m: 1167.20, total: 1662.20 },
          { m: 45, cable: 699.75, mat: 63,   mo: 247.5, cost_m: 1010.25,sell_m: 1313.10, total: 1808.10 },
          { m: 50, cable: 777.50, mat: 70,   mo: 275,   cost_m: 1122.50,sell_m: 1459.00, total: 1954.00 }
        ]
      }
    },
    // Modèles bornes (matériel seul — install via forfait base + slider)
    // Phase 2 : ajout sigenergy_v2x (directive JF #13)
    modeles: {
      // sku = SKU QBO réel. FLO X3/X6/X8 vérifiés contre QBO (LMN-FLOX3/6/8). Tesla = à fournir par JF (null → PDF affiche "[code QBO à confirmer]", jamais de faux code).
      tesla_gen3_nacs:        { brand: "Tesla",       model: "Wall Connector Gen 3 NACS",            sku: null,          kw: 11.5, connector: "NACS",       cost: 630,  markup: 0.11, sell: 699,  rve: true,  v2x: false },
      tesla_universal:        { brand: "Tesla",       model: "Universal Wall Connector NACS+J1772", sku: null,          kw: 11.5, connector: "NACS+J1772", cost: 860,  markup: 0.11, sell: 960,  rve: true,  v2x: false },
      flo_x3:                 { brand: "FLO",         model: "Home X3",                              sku: "LMN-FLOX3",   kw: 7.7,  connector: "J1772",      cost: 579,  markup: 0.20, sell: 699,  rve: true,  v2x: false },
      flo_x6:                 { brand: "FLO",         model: "Home X6",                              sku: "LMN-FLOX6",   kw: 9.6,  connector: "J1772",      cost: 710,  markup: 0.23, sell: 879,  rve: true,  v2x: false },
      flo_x8:                 { brand: "FLO",         model: "Home X8 80A",                          sku: "LMN-FLOX8",   kw: 19.2, connector: "J1772",      cost: 1206, markup: 0.24, sell: 1499, rve: true,  v2x: false },
      flo_cable_remplacement: { brand: "FLO",         model: "Câble de remplacement",                sku: null,          kw: 0,    connector: "—",          cost: 285,  markup: 0.40, sell: 399,  rve: false, v2x: false },
      sigenergy_v2x:          { brand: "Sigenergy",   model: "Borne V2X NACS/CCS1 (bidirectionnel)", sku: null,          kw: 11.5, connector: "NACS+CCS1",  cost: 3517, markup: 0.30, sell: 4572, rve: true,  v2x: true, v2x_rate_per_kwh: 0.15,
                                note: "Recharge bidirectionnelle V2X — crédit Hydro-Québec 0,15 $/kWh injecté · estim. 300 $/an (2 000 kWh)" },
      fournie_client:         { brand: "Client",      model: "Borne fournie par le client",          sku: null,          kw: 0,    connector: "—",          cost: 0,    markup: 0,    sell: 0,    rve: false, v2x: false }
    },
    // Contrôleurs DCC (RVE) — option supplémentaire
    dcc: {
      "OPT-DCC-12":     { label: "RVE DCC-12 — Contrôleur charge universel", cost: 815, markup: 0.45, sell: 1495 },
      "OPT-DCC-10-40A": { label: "RVE DCC-10-40A — Disj 40A inclus",         cost: 815, markup: 0.45, sell: 1495 },
      "OPT-DCC-10-50A": { label: "RVE DCC-10-50A — Disj 50A inclus",         cost: 815, markup: 0.45, sell: 1495 },
      "OPT-DCC-10-60A": { label: "RVE DCC-10-60A — Disj 60A inclus",         cost: 815, markup: 0.45, sell: 1495 }
    }
  },

  // ============================================================================
  // 🗺️ ZONES — Z1-Z7 par axe géographique
  // ============================================================================
  // V3 (mai 2026) : 292 FSA validés JF · Z1 inclus · Z2 75$ · Z3 150$ · Z4 225$ · Z5 350$ · Z6/Z7 sur soumission
  zones: [
    { key: "Z1", label: "Z1 — Rive-Nord immédiate",            sub: "Mascouche · Terrebonne · Repentigny · Lachenaie · La Plaine · Lorraine · Rosemère · L'Assomption · Charlemagne · Le Gardeur", sell_client: 0,    sell_partenaire: 0,    covered: true,  baked_in: true },
    { key: "Z2", label: "Z2 — Lanaudière nord + Laurentides",  sub: "Saint-Lin · Joliette · Boisbriand · Blainville · Sainte-Thérèse · Mirabel · Deux-Montagnes · Saint-Eustache · Saint-Jérôme · Rawdon",                              sell_client: 75,   sell_partenaire: 55,   covered: true,  baked_in: false },
    { key: "Z3", label: "Z3 — Rive-Sud + Montréal/Laval",      sub: "Tout Montréal (H1-H9) · Laval (H7) · Longueuil/Brossard/Boucherville/St-Bruno (J4) · Beloeil/Chambly/St-Hilaire (J3) · St-Jean-sur-Richelieu · Vaudreuil · Châteauguay", sell_client: 150,  sell_partenaire: 105,  covered: true,  baked_in: false },
    { key: "Z4", label: "Z4 — Lanaudière éloignée + Cantons",  sub: "Granby · Cowansville · Saint-Hyacinthe · Sorel-Tracy · Laurentides rural/centre",                                                                                       sell_client: 225,  sell_partenaire: 160,  covered: true,  baked_in: false },
    { key: "Z5", label: "Z5 — Estrie + Mauricie + Outaouais",  sub: "Sherbrooke/Magog (J1) · Drummondville · Mont-Tremblant · Trois-Rivières · Bécancour · Shawinigan · Mauricie · Gatineau (J8)",                                              sell_client: 350,  sell_partenaire: 245,  covered: true,  baked_in: false },
    { key: "Z6", label: "Z6 — Régions éloignées (sur soumission)", sub: "Capitale-Nationale · Portneuf · Charlevoix · Bas-St-Laurent · Saguenay · Lac-Saint-Jean · La Tuque · Maniwaki",                                                          sell_client: null, sell_partenaire: null, covered: false, baked_in: false, quoted: true },
    { key: "Z7", label: "Z7 — Régions très éloignées (non couvert)", sub: "Abitibi · Côte-Nord · Gaspésie · Îles-de-la-Madeleine · tout FSA non listé",                                                                                          sell_client: null, sell_partenaire: null, covered: false, baked_in: false, quoted: true }
  ],

  // ============================================================================
  // 🗺️ FSA → ZONE — V3 : Mapping 292 FSA validés par JF (mai 2026)
  // ============================================================================
  // Source : RAYCOM_FSA.txt (export Tesla) + validation JF
  // Z1=inclus, Z2=+75$, Z3=+150$, Z4=+225$, Z5=+350$, Z6=hors couverture standard, Z7=fallback hors couverture
  fsa_to_zone: {
    // === Z1 — Rive-Nord immédiate (18 FSA, inclus) — Banlieue Mascouche ===
    "J7K": "Z1", "J7L": "Z1",                                  // Mascouche
    "J7M": "Z1",                                                // Terrebonne
    "J6X": "Z1",                                                // Lachenaie
    "J6N": "Z1", "J6R": "Z1", "J6S": "Z1", "J6T": "Z1",        // Repentigny
    "J6Z": "Z1",                                                // Charlemagne
    "J6V": "Z1", "J6W": "Z1",                                  // L'Assomption
    "J6Y": "Z1",                                                // Le Gardeur
    "J5T": "Z1", "J5V": "Z1", "J5W": "Z1",                     // Mascouche/Terrebonne nord
    "J5R": "Z1",                                                // La Plaine
    "J7J": "Z1",                                                // Lorraine
    "J7H": "Z1",                                                // Rosemère

    // === Z2 — Lanaudière nord + Laurentides (28 FSA, +75$) ===
    "J5M": "Z2",                                                // St-Lin
    "J6A": "Z2", "J6E": "Z2", "J6J": "Z2", "J6K": "Z2",        // Joliette
    "J7A": "Z2", "J7P": "Z2",                                  // Boisbriand
    "J7B": "Z2", "J7C": "Z2",                                  // Blainville
    "J7E": "Z2", "J7G": "Z2",                                  // Sainte-Thérèse
    "J7N": "Z2",                                                // Mirabel
    "J7R": "Z2",                                                // Deux-Montagnes
    "J7T": "Z2", "J7V": "Z2",                                  // St-Eustache
    "J7Z": "Z2", "J8A": "Z2", "J8B": "Z2", "J8C": "Z2",        // St-Jérôme
    "J5C": "Z2", "J5K": "Z2", "J5L": "Z2", "J5N": "Z2",        // Lanaudière (autres)
    "J5X": "Z2", "J5Y": "Z2", "J5Z": "Z2",                     // Lanaudière (autres)
    "J0H": "Z2", "J0K": "Z2",                                  // Lanaudière rural

    // === Z3 — Rive-Sud + Montréal/Laval (155 FSA, +150$, traverse pont) ===
    // Montréal H1
    "H1A": "Z3", "H1B": "Z3", "H1C": "Z3", "H1E": "Z3", "H1G": "Z3",
    "H1H": "Z3", "H1J": "Z3", "H1K": "Z3", "H1L": "Z3", "H1M": "Z3",
    "H1N": "Z3", "H1P": "Z3", "H1R": "Z3", "H1S": "Z3", "H1T": "Z3",
    "H1V": "Z3", "H1W": "Z3", "H1X": "Z3", "H1Y": "Z3", "H1Z": "Z3",
    // Montréal H2
    "H2A": "Z3", "H2B": "Z3", "H2C": "Z3", "H2E": "Z3", "H2G": "Z3",
    "H2H": "Z3", "H2J": "Z3", "H2K": "Z3", "H2L": "Z3", "H2M": "Z3",
    "H2N": "Z3", "H2P": "Z3", "H2R": "Z3", "H2S": "Z3", "H2T": "Z3",
    "H2V": "Z3", "H2W": "Z3", "H2X": "Z3", "H2Y": "Z3", "H2Z": "Z3",
    // Montréal H3
    "H3A": "Z3", "H3B": "Z3", "H3C": "Z3", "H3E": "Z3", "H3G": "Z3",
    "H3H": "Z3", "H3J": "Z3", "H3K": "Z3", "H3L": "Z3", "H3M": "Z3",
    "H3N": "Z3", "H3P": "Z3", "H3R": "Z3", "H3S": "Z3", "H3T": "Z3",
    "H3V": "Z3", "H3W": "Z3", "H3X": "Z3", "H3Y": "Z3", "H3Z": "Z3",
    // Montréal H4
    "H4A": "Z3", "H4B": "Z3", "H4C": "Z3", "H4E": "Z3", "H4G": "Z3",
    "H4H": "Z3", "H4J": "Z3", "H4K": "Z3", "H4L": "Z3", "H4M": "Z3",
    "H4N": "Z3", "H4P": "Z3", "H4R": "Z3", "H4S": "Z3", "H4T": "Z3",
    "H4V": "Z3", "H4W": "Z3", "H4X": "Z3", "H4Y": "Z3",
    "H5A": "Z3", "H5B": "Z3",                                  // H5 centre-ville
    // Laval H7
    "H7A": "Z3", "H7B": "Z3", "H7C": "Z3", "H7E": "Z3", "H7G": "Z3",
    "H7H": "Z3", "H7J": "Z3", "H7K": "Z3", "H7L": "Z3", "H7M": "Z3",
    "H7N": "Z3", "H7P": "Z3", "H7R": "Z3", "H7S": "Z3", "H7T": "Z3",
    "H7V": "Z3", "H7W": "Z3", "H7X": "Z3", "H7Y": "Z3",
    // Montréal H8 (LaSalle/Lachine/Pierrefonds)
    "H8N": "Z3", "H8P": "Z3", "H8R": "Z3", "H8S": "Z3", "H8T": "Z3",
    "H8Y": "Z3", "H8Z": "Z3",
    // Montréal H9 (DDO/Pointe-Claire/Baie-d'Urfé)
    "H9A": "Z3", "H9B": "Z3", "H9C": "Z3", "H9E": "Z3", "H9G": "Z3",
    "H9H": "Z3", "H9J": "Z3", "H9K": "Z3", "H9P": "Z3", "H9R": "Z3",
    "H9S": "Z3", "H9W": "Z3", "H9X": "Z3",
    // Rive-Sud J4 (Longueuil/Brossard/Boucherville/St-Bruno/St-Hubert)
    "J4B": "Z3", "J4G": "Z3", "J4H": "Z3", "J4J": "Z3", "J4K": "Z3",
    "J4L": "Z3", "J4M": "Z3", "J4N": "Z3", "J4P": "Z3", "J4R": "Z3",
    "J4S": "Z3", "J4T": "Z3", "J4V": "Z3", "J4W": "Z3", "J4X": "Z3",
    "J4Y": "Z3", "J4Z": "Z3",
    // J3 Beloeil/St-Hilaire/Chambly
    "J3G": "Z3", "J3H": "Z3", "J3L": "Z3", "J3M": "Z3", "J3N": "Z3",
    "J3V": "Z3", "J3X": "Z3", "J3Y": "Z3", "J3Z": "Z3",
    // St-Jean-sur-Richelieu
    "J2X": "Z3", "J2Y": "Z3", "J3A": "Z3", "J3B": "Z3",
    "J5A": "Z3",                                                // Châteauguay
    "J5J": "Z3", "J7X": "Z3", "J7Y": "Z3", "J7W": "Z3",       // Vaudreuil/St-Lazare/Hudson/St-Joseph-du-Lac

    // === Z4 — Plus éloigné (22 FSA, +225$) ===
    "J2A": "Z4", "J2B": "Z4", "J2G": "Z4", "J2H": "Z4",        // Granby
    "J2J": "Z4", "J2K": "Z4", "J2L": "Z4", "J2M": "Z4",        // Granby
    "J2N": "Z4",                                                // Cowansville
    "J2R": "Z4", "J2S": "Z4", "J2T": "Z4", "J2W": "Z4",        // St-Hyacinthe
    "J3E": "Z4", "J3P": "Z4", "J3R": "Z4", "J3T": "Z4", "J5B": "Z4", // Sorel-Tracy
    "J0G": "Z4", "J0J": "Z4",                                  // Rural sud
    "J0L": "Z4", "J0T": "Z4",                                  // Laurentides centre/rural

    // === Z5 — Long déplacement (44 FSA, +350$) ===
    // Estrie (Sherbrooke/Magog/J1 complet)
    "J1C": "Z5", "J1E": "Z5", "J1G": "Z5", "J1H": "Z5", "J1J": "Z5",
    "J1K": "Z5", "J1L": "Z5", "J1M": "Z5", "J1N": "Z5", "J1R": "Z5",
    "J1S": "Z5", "J1T": "Z5", "J1X": "Z5", "J1Z": "Z5",
    "J2C": "Z5", "J2E": "Z5",                                  // Drummondville
    "J0R": "Z5", "J8E": "Z5",                                  // Mont-Tremblant
    "J0N": "Z5",                                                // Laurentides extrême nord
    "J0A": "Z5", "J0B": "Z5", "J0C": "Z5", "J0E": "Z5",        // Estrie rural
    // Trois-Rivières
    "G8T": "Z5", "G8V": "Z5", "G8W": "Z5", "G8Y": "Z5", "G8Z": "Z5",
    "G9A": "Z5", "G9B": "Z5", "G9C": "Z5",
    "G9H": "Z5",                                                // Bécancour
    "G9N": "Z5", "G9P": "Z5",                                  // Shawinigan
    "G9T": "Z5", "G9X": "Z5",                                  // Mauricie
    // Gatineau (Outaouais)
    "J8G": "Z5", "J8H": "Z5", "J8L": "Z5", "J8M": "Z5", "J8P": "Z5", "J8V": "Z5",
    "J0P": "Z5", "J0W": "Z5",                                  // Outaouais rural

    // === Z6 — Hors couverture standard (25 FSA, sur soumission) ===
    "G0P": "Z6", "G0S": "Z6", "G0X": "Z6", "G0Z": "Z6",        // Mauricie/Centre-du-QC extrême
    "G3L": "Z6", "G3M": "Z6", "G3N": "Z6", "G3S": "Z6", "G3Z": "Z6", // Portneuf/Capitale/Charlevoix
    "G4W": "Z6", "G5J": "Z6", "G5R": "Z6", "G5Y": "Z6", "G5Z": "Z6", // Bas-Saint-Laurent
    "G8B": "Z6", "G8H": "Z6", "G8J": "Z6", "G8L": "Z6", "G8M": "Z6", // Saguenay/Lac-St-Jean
    "G9R": "Z6",                                                // La Tuque
    "J0S": "Z6",                                                // Centre-du-Québec rural
    "J9E": "Z6", "J9P": "Z6", "J9V": "Z6", "J9Z": "Z6"         // Outaouais extrême nord (Maniwaki)
    // Z7 (fallback) géré dans calc-2026.detectZone pour tout FSA non listé ci-dessus
  },

  // ============================================================================
  // 💰 SUBVENTIONS 2026 — vérifiées web
  // ============================================================================
  subventions: {
    logisvert: {
      label: "LogisVert — Panneaux solaires (résidentiel)",
      organisme: "Hydro-Québec",
      actif_depuis: "2026-04-02",
      retroactif_depuis: "2025-06-30",
      montant_par_kw: 1000,
      montant_iles_madeleine_par_kw: 2000,
      iles_madeleine_fsa: ["G4T", "G5J"], // mapping FSA spécial
      plafond_pct_cout_admissible: 0.40,
      plafond_dollar_fixe: null, // pas de plafond $ fixe
      puissance_max_kw: 40,
      bonification_combinee_pct: 0.05,
      delai_demande_mois: 9,
      rbq_requis: ["11.2", "13.5"],
      habitations_admissibles: ["unifamilial", "duplex", "chalet", "multilog_19_ou_moins"],
      batterie_admissible: false, // ⚠️ La facture DOIT séparer ligne solaire et ligne batterie
      formule: "min(kW × 1000, 40% × HT_solaire)"
    },
    roulez_vert_resid: {
      label: "Roulez Vert — Borne résidentielle",
      organisme: "Gouvernement du Québec (MERN)",
      montant_max: 600,
      pct_couts: 0.50,
      couvre: "Achat + installation borne niveau 2 (240V)",
      fin_programme: "2026-12-31",
      delai_demande_mois: 12,
      municipal_cumulable: true, // 100-250$ selon ville
      alerte_raycast_oct_2026: true
    },
    roulez_vert_zev_multilog: {
      label: "Roulez Vert + ZEV — Multilogement (5+ unités)",
      roulez_vert_max_par_borne: 5000,
      roulez_vert_pct_couts: 0.50,
      zev_max_par_projet: 14000,
      zev_par_borne: 1400,
      zev_pct_couts: 0.50,
      plan_ev_ready: 3000,
      infrastructure_par_place: 600,
      infrastructure_max_par_projet: 120000
    },
    solaire_commercial: {
      label: "Solaire commercial (Raycom Énergie)",
      solutions_efficaces_hq_par_kw: 1000,
      solutions_efficaces_hq_max_kw: 1000, // 1 MW
      moyenne_dollar: 45000,
      cii_federal_pct: 0.30,
      cumul_logisvert: true
    },

    // Subventions commerciales détaillées (Phase 2 — directive JF #6)
    commercial: {
      label: "Subventions commerciales 2026",
      solutions_efficaces_par_kw: 1000,            // 1 000 $/kW commercial
      solutions_efficaces_max_kw: 1000,            // plafond 1 MW
      solutions_efficaces_plafond_pct: 0.40,       // 40% du HT admissible (panneaux + install)
      cii_federal_pct: 0.30,                       // 30% crédit d'impôt fédéral technologies propres
      cii_federal_cumul_logisvert: true,
      pivez_par_borne: 5000,                       // Programme installation VÉ en milieu de travail (estim)
      pivez_max_par_projet: 50000,
      rv_milieu_travail_par_borne: 5000,           // RV milieu travail (commercial)
      rv_milieu_travail_pct_couts: 0.50,
      note: "Sources : transitionenergetique.gouv.qc.ca · cra-arc.gc.ca CII technologies propres · vehiculeselectriques.gouv.qc.ca"
    }
  },

  // ============================================================================
  // 💳 FINANCEMENT + TAXES
  // ============================================================================
  financement: {
    taxes: { tps: 0.05, tvq: 0.09975, combine: 0.14975 },
    plans: [
      { id: "comptant",      label: "Comptant",                        apr: 0,      months: 0,   fee_pct: 0, category: "Comptant",   popular: true },
      { id: "fit_promo_0_3", label: "FinanceIT — 0 $ et 0 % · 3 mois", apr: 0,      months: 3,   fee_pct: 0, category: "FinanceIT",  popular: true,
        promo: true, then_plan_id: "fit_240m", min_amount: 1000, fournisseur: "FinanceIT" },
      { id: "fit_240m",      label: "FinanceIT 240 mois @ 12,99%",     apr: 12.99, months: 240, fee_pct: 0, category: "FinanceIT",  popular: false,
        min_amount: 1000, fournisseur: "FinanceIT" }
    ],
    formule_mensualite: "P × (r / (1 − (1+r)^-n))" // r = taux/12, n = mois
  },

  // ============================================================================
  // ⚙️ OPTIONS ÉLECTRIQUES — 51 options (catalogue Raycom direct)
  // ============================================================================
  options_electriques: [
    { code: "OPT-TECK-6-METRE",       label: "Câblage AC/Borne EV TECK 6/3 1KV (FUSION ex-AC-METRE + TECK-6-ENF)", unit: "m",        cost: 34.08, sell: 49.41, marge: 0.45 },
    { code: "OPT-PV-1S-METRE",        label: "Câblage PV 1 string — TECK 10/2",                                    unit: "m",        cost: 18.93, sell: 27.44, marge: 0.45 },
    { code: "OPT-PV-2S-METRE",        label: "Câblage PV 2 strings — TECK 10/4",                                   unit: "m",        cost: 23.07, sell: 33.45, marge: 0.45 },
    { code: "OPT-PV-34S-METRE",       label: "Câblage PV 3-4 strings — TECK 10/4 + TECK 10/2",                     unit: "m",        cost: 34.99, sell: 50.74, marge: 0.45 },
    { code: "OPT-CONDUIT-METRE",      label: "Conduit PVC 2 po extérieur",                                          unit: "m",        cost: 19.33, sell: 28.03, marge: 0.45 },
    { code: "OPT-RESEAU-WIFI",        label: "Câblage réseau Wi-Fi (onduleur ↔ routeur)",                          unit: "forfait",  cost: 105,   sell: 147,   marge: 0.40 },
    { code: "OPT-V2X-SIG",            label: "V2X CCS1 (Sigenergy uniquement) — installation seule",                unit: "forfait",  cost: 620,   sell: 837,   marge: 0.35 },
    { code: "OPT-MO-EXTRA",           label: "Main-d'œuvre additionnelle (équipe 2 personnes)",                     unit: "h-équipe", cost: 140,   sell: 196,   marge: 0.40 },
    { code: "OPT-HEBERGEMENT",        label: "Hébergement nuit terrain (par personne)",                             unit: "nuit/pers",cost: 280,   sell: 378,   marge: 0.35 },
    { code: "OPT-DEPL-Z2",            label: "Frais déplacement Zone 2 (en sus de Zone 1)",                         unit: "deplct",   cost: 30,    sell: 43.5,  marge: 0.45 },
    { code: "OPT-DEPL-Z3",            label: "Frais déplacement Zone 3 (en sus de Zone 1)",                         unit: "deplct",   cost: 100,   sell: 140,   marge: 0.40 },
    { code: "OPT-DEPL-Z4",            label: "Frais déplacement Zone 4 (en sus de Zone 1)",                         unit: "deplct",   cost: 185,   sell: 259,   marge: 0.40 },
    { code: "OPT-DEPL-Z5",            label: "Frais déplacement Zone 5 (en sus de Zone 1)",                         unit: "deplct",   cost: 285,   sell: 385,   marge: 0.35 },
    { code: "OPT-DEPL-Z6",            label: "Frais déplacement Zone 6 — Capitale-Nationale + Saguenay",            unit: "deplct",   cost: 415,   sell: 554,   marge: 0.25, quote_only: false },
    { code: "OPT-DEPL-Z7",            label: "Frais déplacement Zone 7 — Régions très éloignées",                   unit: "deplct",   cost: 0,     sell: 0,     marge: 0,    quote_only: true,  note: "Abitibi / Côte-Nord / Gaspésie / Îles-de-la-Madeleine — sur soumission" },
    { code: "OPT-PANNEAU-RECUP",      label: "Upgrade panneau 100A→200A — RÉCUP breakers existants",                unit: "forfait",  cost: 1170,  sell: 1800,  marge: 0.35 },
    { code: "OPT-PANNEAU-NEUFS",      label: "Upgrade panneau 100A→200A — 40 BREAKERS NEUFS",                       unit: "forfait",  cost: 1820,  sell: 2800,  marge: 0.35 },
    { code: "OPT-PANNEAU-200-300",    label: "Mise à niveau panneau 200A → 300A",                                    unit: "forfait",  cost: 0,     sell: 0,     marge: 0,    quote_only: true,  note: "Sur soumission — chantier spécifique" },
    { code: "OPT-PANNEAU-200-400",    label: "Mise à niveau panneau 200A → 400A",                                    unit: "forfait",  cost: 0,     sell: 0,     marge: 0,    quote_only: true,  note: "Sur soumission — chantier spécifique" },
    { code: "OPT-ENTREE-NEUVE",       label: "Entrée électrique neuve avec panneau (sans breakers)",                unit: "forfait",  cost: 2470,  sell: 3211,  marge: 0.30 },
    { code: "OPT-ENTREE-200A",        label: "Remplacement d'entrée électrique 200A",                               unit: "forfait",  cost: 3231,  sell: 4200,  marge: 0.30 },
    { code: "OPT-CABLE-NMD-14",       label: "Filage NMD 14/2 — circuits 15 A",                                     unit: "m",        cost: 7.85,  sell: 11.77, marge: 0.50 },
    { code: "OPT-CABLE-NMD-12",       label: "Filage NMD 12/2 — circuits 20 A",                                     unit: "m",        cost: 8.15,  sell: 12.23, marge: 0.50 },
    { code: "OPT-CABLE-NMD-10",       label: "Filage NMD 10/2 — circuits 30 A",                                     unit: "m",        cost: 11.18, sell: 16.22, marge: 0.45 },
    { code: "OPT-CABLE-8RW90",        label: "Filage #8 RW90 — circuits 40 A",                                      unit: "m",        cost: 12.18, sell: 17.67, marge: 0.45 },
    { code: "OPT-CABLE-NMWU-6",       label: "Câble enfoui NMWU 6/3 — 50 A",                                        unit: "m",        cost: 19.17, sell: 27.79, marge: 0.45 },
    { code: "OPT-CABLE-TECK-6-ENF",   label: "Câble TECK 6/3 enfoui dans conduit",                                  unit: "m",        cost: 34.08, sell: 49.41, marge: 0.45 },
    { code: "OPT-CONDUIT-PVC-1.5-ENF",label: "Conduit PVC 1,5 po enfoui (avec excavation)",                         unit: "m",        cost: 17.67, sell: 25.62, marge: 0.45 },
    { code: "OPT-CONDUIT-PVC-2-ENF",  label: "Conduit PVC 2 po enfoui (avec excavation)",                           unit: "m",        cost: 20.17, sell: 29.24, marge: 0.45 },
    { code: "OPT-SPA-240V",           label: "Branchement spa 240 V (50 A)",                                        unit: "forfait",  cost: 780,   sell: 1053,  marge: 0.35 },
    { code: "OPT-PISCINE-CREUSE",     label: "Branchement piscine creusée complète",                                unit: "forfait",  cost: 2275,  sell: 2957.5,marge: 0.30 },
    { code: "OPT-GENERATRICE-TRANSFERT", label: "Branchement génératrice fixe avec transfert auto",                 unit: "forfait",  cost: 1820,  sell: 2366,  marge: 0.30 },
    { code: "OPT-BORNE-EXT-200A",     label: "Sectionneur extérieur 200 A pour générateur portatif",                unit: "forfait",  cost: 780,   sell: 1053,  marge: 0.35 },
    { code: "OPT-CHAUFFE-EAU",        label: "Branchement chauffe-eau électrique 240V/30A",                         unit: "forfait",  cost: 320,   sell: 432,   marge: 0.35 },
    { code: "OPT-SECHEUSE",           label: "Branchement sécheuse 240V/30A",                                       unit: "forfait",  cost: 290,   sell: 391.5, marge: 0.35 },
    { code: "OPT-CUISINIERE",         label: "Branchement cuisinière 240V/40A",                                     unit: "forfait",  cost: 340,   sell: 459,   marge: 0.35 },
    { code: "OPT-RV-1450",            label: "Prise NEMA 14-50 (roulotte / VR / Tesla mobile)",                     unit: "forfait",  cost: 470,   sell: 634.5, marge: 0.35 },
    { code: "OPT-ATELIER-240",        label: "Sortie 240V atelier (compresseur, tour, soudeuse)",                   unit: "forfait",  cost: 380,   sell: 513,   marge: 0.35 },
    { code: "OPT-PANNEAU-60A-CABANON",label: "Panneau secondaire 60A — cabanon/garage",                             unit: "forfait",  cost: 580,   sell: 783,   marge: 0.35 },
    { code: "OPT-PANNEAU-100A-BATIMENT",label: "Panneau secondaire 100A — bâtiment détaché",                        unit: "forfait",  cost: 820,   sell: 1107,  marge: 0.35 },
    { code: "OPT-SOUS-COMPTEUR",      label: "Sous-compteur électrique multilogement (par unité)",                  unit: "unité",    cost: 380,   sell: 513,   marge: 0.35 },
    { code: "OPT-DOMOTIQUE-PANEL",    label: "Tableau de commande domotique (panel)",                               unit: "forfait",  cost: 1500,  sell: 1950,  marge: 0.30 },
    { code: "OPT-DETECTEUR-CABLE",    label: "Détecteur fumée/CO câblé (par unité)",                                unit: "unité",    cost: 95,    sell: 133,   marge: 0.40 },
    { code: "OPT-AFCI-DEDIE",         label: "Disjoncteur AFCI dédié (par circuit)",                                unit: "circuit",  cost: 110,   sell: 154,   marge: 0.40 },
    { code: "OPT-GFCI-DEDIE",         label: "Disjoncteur GFCI dédié (par circuit)",                                unit: "circuit",  cost: 130,   sell: 182,   marge: 0.40 },
    { code: "OPT-VENTIL-HOTTE",       label: "Branchement hotte de ventilation / échangeur d'air",                  unit: "unité",    cost: 220,   sell: 297,   marge: 0.35 },
    { code: "OPT-MALT-AVANCEE",       label: "Mise à la terre avancée (tige supplémentaire)",                       unit: "tige",     cost: 145,   sell: 203,   marge: 0.40 },
    { code: "OPT-CONDUIT-EMT-METRE",  label: "Conduit EMT 3/4 + 2x #6 cuivre + 1x #8 vert (multilogement)",         unit: "m",        cost: 42.67, sell: 61.87, marge: 0.45 },
    { code: "OPT-TESLA-MCI",          label: "MCI Tesla — Mid-Circuit Interrupter (par unité, si solaire)",         unit: "MCI",      cost: 60,    sell: 84,    marge: 0.40 },
    { code: "OPT-SECTIONNEUR-60A",    label: "Sectionneur AC 60A 3P 600V NEMA 1 non-fus Eaton 1HD362 [Westburne]",  unit: "unité",    cost: 263.95,sell: 329.94,marge: 0.20 }
  ],

  // ============================================================================
  // 🛠️ SERVICES VENDEUR — 7 services internes (NE PAS PARTAGER À LARKS)
  // ============================================================================
  services_vendeur: [
    { code: "OPT-LEVAGE-PW3",    label: "Levage Tesla PW3 — accès difficile",                  cost: 240, sell: 348, marge: 0.45 },
    { code: "OPT-LEVAGE-FOX-AIO",label: "Levage Fox AIO — accès difficile",                    cost: 260, sell: 377, marge: 0.45 },
    { code: "OPT-URGENCE-247",   label: "Service d'urgence 24/7 (panne onduleur)",             cost: 520, sell: 780, marge: 0.50 },
    { code: "OPT-DEMOLITION",    label: "Démolition et évacuation ancien système",             cost: 450, sell: 630, marge: 0.40 },
    { code: "OPT-HAUTEUR",       label: "Câblage en hauteur (échafaudage requis)",             cost: 520, sell: 754, marge: 0.45 },
    { code: "OPT-GRENIER",       label: "Travail en grenier / vide sanitaire",                 cost: 175, sell: 245, marge: 0.40 },
    { code: "OPT-HIVER",         label: "Travail extérieur hivernal (avec accommodations)",    cost: 260, sell: 377, marge: 0.45 }
  ],

  // ============================================================================
  // 🏠 TYPES BÂTIMENT — base pour matrices futures
  // ============================================================================
  building_types: [
    { key: "residentiel_unifam", label: "Résidentiel unifamilial",   segment: "res",   kw_max: 20,   logisvert_eligible: true },
    { key: "multilog",           label: "Multilogement (4–19 log.)", segment: "res",   kw_max: 50,   logisvert_eligible: true },
    { key: "com_petit",          label: "Commercial petit (<50 kW)", segment: "com_p", kw_max: 50,   logisvert_eligible: false },
    { key: "com_moyen",          label: "Commercial moyen (50–200 kW)", segment: "com_m", kw_max: 200, logisvert_eligible: false },
    { key: "com_grand",          label: "Commercial grand (>200 kW)",   segment: "com_g", kw_max: 1000,logisvert_eligible: false }
  ],

  // ============================================================================
  // 🏗️ TYPES TOITURE — alignés avec design iter-06
  // ============================================================================
  roof_types: [
    { key: "bardeau",       label: "Bardeau",  sub: "Asphalte (bardeaux) — standard, install rapide", flat: false, supported: true,  larks_supported: true },
    { key: "metal",         label: "Métal",    sub: "Joint debout ou tôle agricole",                  flat: false, supported: true,  larks_supported: true },
    { key: "tpo",           label: "TPO",      sub: "Membrane TPO — lestage ou collage",              flat: true,  supported: true,  larks_supported: false, warning: "Soumission personnalisée requise (visite technique)" },
    { key: "epdm",          label: "EPDM",     sub: "Membrane EPDM — lestage ou collage",             flat: true,  supported: true,  larks_supported: false, warning: "Soumission personnalisée requise (visite technique)" },
    { key: "beton",         label: "Béton",    sub: "Béton ou membrane lourde — ingénierie additionnelle", flat: true, supported: false, larks_supported: false, requires_quote: true, warning: "INGÉNIERIE ADDITIONNELLE — sur soumission" },
    { key: "ground",        label: "Au sol",   sub: "Ground mount — excavation + structure",          flat: true,  supported: false, larks_supported: false, warning: "Soumission personnalisée requise (visite technique)" }
  ],

  // ============================================================================
  // 🏷️ TARIFS HQ — pour calc production / économies
  // ============================================================================
  hq_tariffs: [
    { id: "D",     label: "D — Résidentiel régulier",          rate: 7.78 },
    { id: "FlexD", label: "Flex D — Tarif dynamique",          rate: 8.10 },
    { id: "G",     label: "G — Petite puissance commerciale",  rate: 9.15 },
    { id: "M",     label: "M — Moyenne puissance commerciale", rate: 6.20 }
  ],

  // ============================================================================
  // 🌍 RÉGIONS — production solaire kWh/kW/an
  // ============================================================================
  regions: [
    { key: "mascouche",      label: "Mascouche / Lanaudière sud",        kwh_per_kw: 1170, zone: "Z1" },
    { key: "laval",          label: "Laval / Rive-Nord",                  kwh_per_kw: 1175, zone: "Z1" },
    { key: "montreal",       label: "Montréal",                           kwh_per_kw: 1180, zone: "Z2" },
    { key: "longueuil",      label: "Longueuil / Rive-Sud",               kwh_per_kw: 1175, zone: "Z2" },
    { key: "joliette",       label: "Joliette / Saint-Jérôme",            kwh_per_kw: 1170, zone: "Z3" },
    { key: "granby",         label: "Granby / Saint-Hyacinthe",           kwh_per_kw: 1195, zone: "Z3" },
    { key: "drummondville",  label: "Drummondville / Centre-du-Québec",   kwh_per_kw: 1180, zone: "Z4" },
    { key: "tremblant",      label: "Mont-Tremblant / Laurentides nord",  kwh_per_kw: 1160, zone: "Z4" },
    { key: "sherbrooke",     label: "Sherbrooke / Estrie",                kwh_per_kw: 1195, zone: "Z5" },
    { key: "trois_rivieres", label: "Trois-Rivières / Mauricie",          kwh_per_kw: 1160, zone: "Z5" },
    { key: "gatineau",       label: "Gatineau / Outaouais",               kwh_per_kw: 1210, zone: "Z5" }
  ],

  // ============================================================================
  // 📋 INCLUSIONS / EXCLUSIONS — pour PDF et soumission
  // ============================================================================
  inclusions_exclusions: {
    fox_sig: {
      inclusions: [
        "Évaluation technique préalable (visite ou photos)",
        "Installation onduleur(s) Fox ou Sigenergy (1, 2 ou 3 selon variant)",
        "Raccordement AC à panneau électrique principal (disjoncteur dédié)",
        "Raccordement à la mise à la terre",
        "Mise en service de l'onduleur et tests de fonctionnement",
        "Configuration application mobile (FoxCloud, mySigenergy, etc.)",
        "Configuration onduleur (modes : autoconsommation, autocharge, etc.)",
        "Documentation client (manuel, garanties, contacts SAV)",
        "Demande d'autorisation HQ (DA) et demande de travaux (DT) — formulaire E.12-07",
        "Transport et 2 visites incluses (peu importe la zone Z1-Z5)",
        "Forfait Larks pour panneaux solaires si solaire ajouté (escompte 15% Raycom)",
        "Permis municipal d'installation (si requis)",
        "Garantie 1 an main-d'œuvre Raycom"
      ],
      exclusions: [
        "Mise à niveau panneau électrique (100A→200A) — voir OPT-PANNEAU-RECUP/NEUFS",
        "200→300A et 200→400A : sur soumission ad hoc",
        "Entrée électrique neuve — voir OPT-ENTREE-NEUVE",
        "Mise à la terre avancée (tige supplémentaire) — voir OPT-MALT-AVANCEE",
        "Travaux d'excavation (conduits enfouis) — voir OPT-CONDUIT-PVC-*-ENF",
        "Câblage AC additionnel — voir OPT-TECK-6-METRE",
        "Câblage PV string — voir OPT-PV-*-METRE",
        "Bornes EV (Wall Connector) — catalogue Bornes EV séparé",
        "Coûts d'inspection HQ post-installation",
        "Taxes (TPS 5% + TVQ 9,975%) — toujours séparées (Loi 96)",
        "Service d'urgence 24/7 — voir OPT-URGENCE-247 (780 $)",
        "Surcharge zone Z2-Z5 à partir de la 3e visite",
        "Zones Z6 (>200 km) et Z7 : HORS COUVERTURE — sur soumission"
      ]
    },
    tesla: {
      inclusions: [
        "Évaluation technique préalable + scan Tesla One",
        "Installation Powerwall 3 (onduleur intégré) — 1, 2 ou 3 PW3 selon variant",
        "Installation Gateway 3 (commutation et monitoring)",
        "Stacking Kit entre PW3 (si Duo/Trio)",
        "Raccordement complet AC à panneau principal + mise à la terre",
        "Mise en service + activation cloud Tesla",
        "Configuration application Tesla One (compte client)",
        "Documentation Tesla officielle + garanties",
        "Demande d'autorisation HQ (DA) et demande de travaux (DT)",
        "Transport et 2 visites incluses (peu importe la zone Z1-Z5)",
        "Permis municipal d'installation (si requis)",
        "Garantie Tesla 10 ans + 1 an MO Raycom"
      ],
      exclusions: [
        // Mêmes exclusions que Fox/Sig sauf les références aux modes onduleur
        "Mise à niveau panneau électrique (100A→200A) — voir OPT-PANNEAU-RECUP/NEUFS",
        "200→300A et 200→400A : sur soumission ad hoc",
        "Entrée électrique neuve — voir OPT-ENTREE-NEUVE",
        "Mise à la terre avancée (tige supplémentaire) — voir OPT-MALT-AVANCEE",
        "Travaux d'excavation (conduits enfouis) — voir OPT-CONDUIT-PVC-*-ENF",
        "Câblage AC additionnel — voir OPT-TECK-6-METRE",
        "Câblage PV string — voir OPT-PV-*-METRE",
        "Bornes EV (Wall Connector) — catalogue Bornes EV séparé",
        "Coûts d'inspection HQ post-installation",
        "Taxes (TPS 5% + TVQ 9,975%) — toujours séparées (Loi 96)",
        "Surcharge zone Z2-Z5 à partir de la 3e visite",
        "Zones Z6 (>200 km) et Z7 : HORS COUVERTURE — sur soumission"
      ]
    }
  },

  // ============================================================================
  // 🎯 DESIGN TOKENS — pour cohérence avec iterations 1-10
  // ============================================================================
  design_tokens: {
    colors: {
      primary: "#0a2540",         // Bleu marine Raycom
      accent: "#3b82f6",          // Bleu clair accent
      ink_1: "#0a2540",
      ink_2: "#475569",
      ink_3: "#94a3b8",
      ink_4: "#cbd5e1",
      line: "#e2e8f0",
      bg: "#f8fafc",
      surface: "#ffffff",
      success: "#10b981",
      warning: "#f59e0b",
      error: "#ef4444"
    },
    fonts: {
      sans: "'Inter', system-ui, sans-serif",
      mono: "'JetBrains Mono', monospace"
    },
    radii: { sm: 4, md: 8, lg: 12, xl: 16 },
    no_emoji_in_pdf: true
  },

  // ============================================================================
  // 🔄 MAPPING design pitch → Excel column
  // ============================================================================
  pitch_design_to_excel: {
    plat:       "p1", // Pente 0-8/12
    faible:     "p1",
    standard:   "p1",
    forte:      "p2", // Pente 9-10/12
    tres_forte: "p3"  // Pente 11-12/12
  },

  // ============================================================================
  // ☀️ IRRADIATION SOLAIRE par FSA (NRCan PVWatts QC, kWh/kW/an)
  // ============================================================================
  // Source : Ressources naturelles Canada — PVWatts 5° latitude + données municipales
  // Fallback (si FSA non trouvé) : moyenne provinciale QC = 1311 kWh/kW/an
  // Référence : ftp.maps.canada.ca/pub/nrcan_rncan/Energy_Energie/solar_solaire
  //
  // Phase 2 — directive JF #7 : table statique, pas d'API live
  irradiation_by_fsa: {
    // === Z1 Rive-Nord (Mascouche/Terrebonne/Laval N/Repentigny) ===
    "J7K": 1380, "J6V": 1380, "J6W": 1380, "J6X": 1380, "J6Y": 1380, "J6Z": 1375,
    "J5Y": 1370, "J5Z": 1370, "J6A": 1370,
    "H7E": 1370, "H7K": 1370, "H7L": 1370, "H7M": 1370,
    // === Z2 Montréal / Laval / Rive-Sud ===
    "H1A": 1360, "H1B": 1360, "H1C": 1360, "H1G": 1360,
    "H2A": 1355, "H2C": 1355, "H2H": 1355,
    "H3A": 1350, "H4N": 1355, "H4X": 1355,
    "H7N": 1370, "H7P": 1370, "H7T": 1370, "H7W": 1370, "H7X": 1370, "H7Y": 1370,
    "J0R": 1375, "J7Y": 1375, "J7Z": 1375,
    "J4B": 1360, "J4G": 1360, "J4H": 1360, "J4J": 1360, "J4K": 1360, "J4L": 1360,
    "J4N": 1360, "J4P": 1360, "J4R": 1360, "J4V": 1360, "J4W": 1360, "J4Y": 1360,
    "J3Y": 1360, "J3V": 1365, "J3L": 1365, "J3G": 1365,
    // === Z3 Lanaudière éloignée / Laurentides centre / Estrie sud ===
    "J6E": 1370, "J6K": 1370, "J7T": 1370, "J7V": 1370,
    "J0K": 1370, "J0E": 1395, "J2G": 1395, "J2H": 1395, "J2J": 1395,
    "J3B": 1390, "J3H": 1380, "J0H": 1395,
    // === Z4 Drummondville / Saint-Hyacinthe / Tremblant / Bromont ===
    "J2A": 1380, "J2B": 1380, "J2C": 1380,
    "J2T": 1395, "J2R": 1395, "J2S": 1395,
    "J8E": 1360, "J8B": 1360, "J1G": 1390,
    // === Z5 Sherbrooke / Trois-Rivières / Gatineau ===
    "J1H": 1395, "J1J": 1395, "J1K": 1395, "J1L": 1395, "J1M": 1395, "J1N": 1395, "J1R": 1395,
    "G8Y": 1360, "G8Z": 1360, "G9A": 1360, "G9B": 1360, "G9C": 1360,
    "J8X": 1410, "J8Y": 1410, "J8Z": 1410, "J9A": 1410, "J9H": 1410, "J9J": 1410,
    // === Z6 Capitale-Nationale / Saguenay (hors couverture mais info utile) ===
    "G1A": 1350, "G1B": 1350, "G1C": 1350, "G1E": 1350,
    "G1G": 1350, "G1H": 1350, "G1J": 1350,
    "G7A": 1300, "G7B": 1300, "G7H": 1300, "G7J": 1300, "G7N": 1300,
    // === Z7 Régions éloignées ===
    "G5L": 1330, "G5R": 1330, "G4Z": 1280, "G5C": 1280,
    "J9P": 1300, "J9X": 1300, "G0E": 1320,
    // Îles-de-la-Madeleine (zone spéciale LogisVert 2000$/kW)
    "G4T": 1320, "G5J": 1320
  }
};

window.RAYCOM_DATA_2026 = RAYCOM_DATA_2026;
