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

1"""Financial metric study input resolution.""" 

2 

3from __future__ import annotations 

4 

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 

16 

17 

18def calculate_study_financial_metrics(study: EconomicsStudy) -> FinancialMetricsResult: 

19 """Resolve persisted study inputs and calculate fixed v1 financial metrics.""" 

20 

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