SPB Git

spb/uqo-chat

Public
2.3 KB · 55 lines python
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
Files · cd08d441f7c277e8fedd6f3d3be82f02b44553ba
Menu

Theme