Coverage for domain/trackers.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-11-04 17:24 +0000

1"""Loan milestone trackers (spec §13.2, §16.4). 

2 

316 canonical milestones (TRID, Lock, Appraisal, Title, HOI, Credit, AUS, etc.). 

4Pure domain logic with zero external dependencies. 

5""" 

6 

7from __future__ import annotations 

8 

9from dataclasses import dataclass 

10 

11from domain.enums import TrackerStatus 

12 

13 

14@dataclass(frozen=True) 

15class TrackerDef: 

16 key: str 

17 label: str 

18 category: str 

19 

20 

21TRACKER_DEFS: tuple[TrackerDef, ...] = ( 

22 TrackerDef(key="trid", label="TRID / LE timing", category="Compliance"), 

23 TrackerDef(key="intent_to_proceed", label="Intent to Proceed", category="Compliance"), 

24 TrackerDef(key="lock", label="Rate Lock", category="Lock"), 

25 TrackerDef(key="appraisal", label="Appraisal", category="Services"), 

26 TrackerDef(key="title", label="Title", category="Services"), 

27 TrackerDef(key="hoi", label="Homeowner's Insurance (HOI)", category="Services"), 

28 TrackerDef(key="flood", label="Flood Certification", category="Services"), 

29 TrackerDef(key="hoa", label="HOA / Condo", category="Services"), 

30 TrackerDef(key="credit", label="Credit", category="Underwriting"), 

31 TrackerDef(key="aus", label="AUS", category="Underwriting"), 

32 TrackerDef(key="submitted_uw", label="Submitted to Underwriting", category="Underwriting"), 

33 TrackerDef(key="conditions", label="Conditions", category="Underwriting"), 

34 TrackerDef(key="cd", label="Closing Disclosure", category="Closing"), 

35 TrackerDef(key="ctc", label="Clear to Close", category="Closing"), 

36 TrackerDef(key="docs_out", label="Closing Docs Out", category="Closing"), 

37 TrackerDef(key="funding", label="Funding", category="Closing"), 

38) 

39 

40 

41@dataclass(frozen=True) 

42class TrackerRow: 

43 loan_id: int | str 

44 key: str 

45 label: str 

46 category: str 

47 status: TrackerStatus = TrackerStatus.NOT_STARTED 

48 

49 

50def fresh_trackers(loan_id: int | str) -> list[TrackerRow]: 

51 """Generate default initial tracker rows for a newly created loan.""" 

52 return [ 

53 TrackerRow( 

54 loan_id=loan_id, 

55 key=d.key, 

56 label=d.label, 

57 category=d.category, 

58 status=TrackerStatus.NOT_STARTED, 

59 ) 

60 for d in TRACKER_DEFS 

61 ]