Coverage for backend/django/Economics/results/services/financial_metrics/inputs.py: 86%
22 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1"""Financial metric study input resolution."""
3from __future__ import annotations
5from Economics.formulas.builders.metric_formulas import MetricFormulaStore
6from .baselines import target_assumptions_for_study, target_only_baseline_resolution
7from .calculation import calculate_financial_metrics
8from .contracts import FinancialMetricsError, FinancialMetricsResult, FinancialWarning
9from .input_snapshots import (
10 calculation_inputs_for_study,
11 snapshot_from_study_target_state,
12 target_annual_operating_expense,
13 target_base_capital_cost,
14)
15from Economics.studies.models import EconomicsStudy
18def calculate_study_financial_metrics(study: EconomicsStudy) -> FinancialMetricsResult:
19 """Resolve persisted study inputs and calculate fixed v1 financial metrics."""
21 formula_store = MetricFormulaStore(study)
22 try:
23 snapshot = snapshot_from_study_target_state(study)
24 inputs, baseline_resolution, _warnings = calculation_inputs_for_study(
25 study=study,
26 snapshot=snapshot,
27 )
28 calculation = calculate_financial_metrics(
29 inputs,
30 formula_store=formula_store,
31 )
32 formula_store.delete_stale_metric_formulas()
33 return FinancialMetricsResult(
34 metrics=calculation.metrics,
35 discounted_cash_flow=calculation.discounted_cash_flow,
36 baseline_resolution=baseline_resolution,
37 warnings=calculation.warnings,
38 input_snapshot_payload=snapshot.to_payload(),
39 )
40 except FinancialMetricsError as exc:
41 formula_store.delete_all_metric_formulas()
42 target_assumptions = target_assumptions_for_study(study)
43 return FinancialMetricsResult(
44 metrics={},
45 discounted_cash_flow=(),
46 baseline_resolution=target_only_baseline_resolution(
47 study=study,
48 target_assumptions=target_assumptions,
49 ),
50 warnings=(
51 FinancialWarning(
52 code=exc.code,
53 severity="error",
54 message=exc.message,
55 context=exc.context,
56 ),
57 ),
58 )
59 except Exception:
60 formula_store.delete_all_metric_formulas()
61 raise