1"""Template: age-life depreciation with year-by-year curve."""23from __future__ import annotations45from typing import Any678def build(p: dict[str, Any]) -> dict[str, Any]:9 cn = float(p.get("cout_neuf", 450000))10 age_eff = float(p.get("age_effectif", 12))11 dve = float(p.get("duree_vie_economique", 60))12 inputs = [13 {"cell": "B4", "label": "Coût neuf C_N ($)", "value": cn, "format": "currency",14 "name": "Cout_Neuf"},15 {"cell": "B5", "label": "Âge effectif A_e (ans)", "value": age_eff, "format": "number",16 "name": "Age_Effectif"},17 {"cell": "B6", "label": "Durée de vie économique DVE (ans)", "value": dve,18 "format": "number", "name": "DVE"},19 ]20 results = {21 "anchor": "A9",22 "columns": [{"header": "Résultat", "type": "text"}, {"header": "Valeur", "type": "currency"}],23 "rows": [24 ["Taux de dépréciation (A_e / DVE)", "=B5/B6"],25 ["Dépréciation D ($)", "=B4*B5/B6"],26 ["Coût déprécié ($)", "=B4-B11"],27 ["Durée de vie restante (ans)", "=B6-B5"],28 ],29 "row_formats": {0: "percent", 3: "number"},30 }31 years = int(min(dve, 80))32 curve_rows = [[y, f"=MIN(1,{'A'}{16 + y}/$B$6)", f"=$B$4*(1-B{16 + y})"] for y in range(0, years + 1)]33 curve = {34 "anchor": "A15",35 "columns": [{"header": "Âge (ans)", "type": "integer"},36 {"header": "Taux de dépréciation", "type": "percent"},37 {"header": "Coût déprécié ($)", "type": "currency"}],38 "rows": curve_rows,39 }40 return {41 "filename": p.get("filename", "depreciation_age_vie.xlsx"),42 "style": "uqo",43 "sheets": [{44 "name": "Âge-vie",45 "title": "Dépréciation par la méthode âge-vie",46 "inputs": inputs,47 "tables": [results, curve],48 "charts": [{"type": "line", "title": "Courbe âge-vie du coût déprécié",49 "categories_range": f"A16:A{16 + years}",50 "values_range": f"C16:C{16 + years}", "anchor": "E9"}],51 "notes": ["D = (A_e / DVE) × C_N ; la méthode suppose une dépréciation linéaire.",52 "L'âge effectif reflète l'état observé, pas l'âge chronologique."],53 }],54 }55