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
« 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
7@dataclass
8class Transaction(BaseModel):
9 def __init__(self, data: Dict[str, Any]):
10 super().__init__(data)
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 )
22 return to_float(amt)
24 @property
25 def id(self) -> Optional[str]:
26 return self.raw.get("id")
28 @property
29 def type(self) -> Optional[str]:
30 return self.raw.get("type")
32 @property
33 def type_description(self) -> Optional[str]:
34 return self.raw.get("type_description")
36 @property
37 def action_date(self) -> Optional[str]:
38 return to_date(self.raw.get("action_date"))
40 @property
41 def action_type(self) -> Optional[str]:
42 return self.raw.get("action_type")
44 @property
45 def action_type_description(self) -> Optional[str]:
46 return self.raw.get("action_type_description")
48 @property
49 def modification_number(self) -> Optional[str]:
50 return self.raw.get("modification_number")
52 @property
53 def award_description(self) -> Optional[str]:
54 return smart_sentence_case(self.raw.get("description", ""))
56 @property
57 def federal_action_obligation(self) -> Optional[float]:
58 return to_float(self.raw.get("federal_action_obligation"))
60 @property
61 def face_value_loan_guarantee(self) -> Optional[float]:
62 return to_float(self.raw.get("face_value_loan_guarantee"))
64 @property
65 def original_loan_subsidy_cost(self) -> Optional[float]:
66 return to_float(self.raw.get("original_loan_subsidy_cost"))
68 @property
69 def cfda_number(self) -> Optional[str]:
70 return self.raw.get("cfda_number")
72 def __repr__(self) -> str:
73 return f"<Txn {self.id or '?'} {str(self.action_date) or '?'} {self.amt}>"