Coverage for src/usaspending/models/transaction.py: 100%

50 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-03 17:15 -0700

1from .base_model import BaseModel 

2from dataclasses import dataclass 

3from typing import Dict, Any, Optional 

4from ..utils.formatter import to_float, smart_sentence_case, to_date 

5 

6 

7@dataclass 

8class Transaction(BaseModel): 

9 def __init__(self, data: Dict[str, Any]): 

10 super().__init__(data) 

11 

12 @property 

13 def amt(self) -> Optional[float]: 

14 """Get the transaction amount.""" 

15 amt = ( 

16 self.federal_action_obligation 

17 or self.face_value_loan_guarantee 

18 or self.original_loan_subsidy_cost 

19 or None 

20 ) 

21 

22 return to_float(amt) 

23 

24 @property 

25 def id(self) -> Optional[str]: 

26 return self.raw.get("id") 

27 

28 @property 

29 def type(self) -> Optional[str]: 

30 return self.raw.get("type") 

31 

32 @property 

33 def type_description(self) -> Optional[str]: 

34 return self.raw.get("type_description") 

35 

36 @property 

37 def action_date(self) -> Optional[str]: 

38 return to_date(self.raw.get("action_date")) 

39 

40 @property 

41 def action_type(self) -> Optional[str]: 

42 return self.raw.get("action_type") 

43 

44 @property 

45 def action_type_description(self) -> Optional[str]: 

46 return self.raw.get("action_type_description") 

47 

48 @property 

49 def modification_number(self) -> Optional[str]: 

50 return self.raw.get("modification_number") 

51 

52 @property 

53 def award_description(self) -> Optional[str]: 

54 return smart_sentence_case(self.raw.get("description", "")) 

55 

56 @property 

57 def federal_action_obligation(self) -> Optional[float]: 

58 return to_float(self.raw.get("federal_action_obligation")) 

59 

60 @property 

61 def face_value_loan_guarantee(self) -> Optional[float]: 

62 return to_float(self.raw.get("face_value_loan_guarantee")) 

63 

64 @property 

65 def original_loan_subsidy_cost(self) -> Optional[float]: 

66 return to_float(self.raw.get("original_loan_subsidy_cost")) 

67 

68 @property 

69 def cfda_number(self) -> Optional[str]: 

70 return self.raw.get("cfda_number") 

71 

72 def __repr__(self) -> str: 

73 return f"<Txn {self.id or '?'} {str(self.action_date) or '?'} {self.amt}>"