SPB Git forge

spb/uqo-chat

Public
14commits 1branches 0releases
1.4 MBsize
maindefault branch
17 days agolast push
Python 64.6% TypeScript 33.7% CSS 0.8%
4.4 KB · 91 lines python
Raw Blame History
1"""Template: cost approach grid (land + cost new − depreciation)."""23from __future__ import annotations45from typing import Any67from app.tools.coerce import num, pct8910def _f(p: dict[str, Any], key: str, default: float) -> float:11    """Tolerant numeric param; keys ending in `_pct` / starting with `taux` are ratios."""12    raw = p.get(key)13    v = pct(raw, None) if (key.endswith("_pct") or key.startswith("taux")) else num(raw, None)14    return float(default) if v is None else v151617def build(p: dict[str, Any]) -> dict[str, Any]:18    adresse = p.get("adresse", "Immeuble fictif — Gatineau")19    superficie = _f(p, "superficie_m2", 210)20    cout_unitaire = _f(p, "cout_unitaire_m2", 2450)21    indirects = _f(p, "couts_indirects_pct", 0.12)22    profit = _f(p, "profit_pct", 0.15)23    terrain = _f(p, "valeur_terrain", 185000)24    site = _f(p, "ameliorations_site", 25000)25    age_eff = _f(p, "age_effectif", 12)26    dve = _f(p, "duree_vie_economique", 60)27    dep_fonct = _f(p, "depreciation_fonctionnelle", 0)28    dep_econ = _f(p, "depreciation_economique", 0)29    inputs = [30        {"cell": "B4", "label": "Superficie brute (m²)", "value": superficie, "format": "area",31         "name": "Superficie"},32        {"cell": "B5", "label": "Coût unitaire direct ($/m²)", "value": cout_unitaire,33         "format": "currency", "name": "Cout_Unitaire"},34        {"cell": "B6", "label": "Coûts indirects (% des coûts directs)", "value": indirects,35         "format": "percent", "name": "Indirects_Pct"},36        {"cell": "B7", "label": "Profit de l'entrepreneur (%)", "value": profit,37         "format": "percent", "name": "Profit_Pct"},38        {"cell": "B8", "label": "Âge effectif (ans)", "value": age_eff, "format": "number",39         "name": "Age_Effectif"},40        {"cell": "B9", "label": "Durée de vie économique (ans)", "value": dve,41         "format": "number", "name": "DVE"},42        {"cell": "B10", "label": "Valeur du terrain ($)", "value": terrain, "format": "currency",43         "name": "Valeur_Terrain"},44        {"cell": "B11", "label": "Améliorations du site ($)", "value": site,45         "format": "currency", "name": "Ameliorations_Site"},46        {"cell": "B12", "label": "Dépréciation fonctionnelle ($)", "value": dep_fonct,47         "format": "currency"},48        {"cell": "B13", "label": "Dépréciation économique ($)", "value": dep_econ,49         "format": "currency"},50    ]51    table = {52        "anchor": "A16",53        "columns": [{"header": "Poste", "type": "text"}, {"header": "Montant ($)", "type": "currency"},54                    {"header": "Calcul", "type": "text"}],55        "rows": [56            ["Coûts directs", "=B4*B5", "Superficie × coût unitaire"],57            ["Coûts indirects", "=B17*B6", "Directs × % indirects"],58            ["Profit de l'entrepreneur", "=(B17+B18)*B7", "(Directs + indirects) × % profit"],59            ["Coût neuf (C_N)", "=B17+B18+B19", "Somme"],60            ["Dépréciation physique (âge-vie)", "=B20*B8/B9", "C_N × (âge effectif / DVE)"],61            ["Dépréciation fonctionnelle", "=B12", "Hypothèse"],62            ["Dépréciation économique", "=B13", "Hypothèse"],63            ["Dépréciation totale (D)", "=B21+B22+B23", "Somme"],64            ["Coût déprécié des améliorations", "=B20-B24", "C_N − D"],65            ["Valeur du terrain", "=B10", "Hypothèse"],66            ["Améliorations du site", "=B11", "Hypothèse"],67        ],68        "totals": {"label": "VALEUR INDIQUÉE (méthode du coût)", "formula": "=B25+B26+B27",69                   "name": "Valeur_Indiquee"},70        "bold_rows": [3, 7],71    }72    return {73        "filename": p.get("filename", "methode_du_cout.xlsx"),74        "style": "uqo",75        "sheets": [{76            "name": "Méthode du coût",77            "title": f"Estimation par la méthode du coût — {adresse}",78            "inputs_title": "Hypothèses (cellules bleues modifiables)",79            "inputs": inputs,80            "tables": [table],81            "charts": [{"type": "bar", "title": "Ventilation de la valeur",82                        "categories_range": "A25:A27", "values_range": "B25:B27",83                        "anchor": "E16"}],84            "notes": [85                "V = V_T + (C_N − D) + améliorations du site.",86                "Dépréciation physique estimée par la méthode âge-vie : D = (A_e / DVE) × C_N.",87                "Les cellules bleues sont des hypothèses ; tout le reste est calculé par formule.",88            ],89        }],90    }91