Coverage for domain/trackers.py: 100%
18 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 14:06 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 14:06 +0000
1"""Loan milestone trackers (spec §13.2, §16.4).
316 canonical milestones (TRID, Lock, Appraisal, Title, HOI, Credit, AUS, etc.).
4Pure domain logic with zero external dependencies.
5"""
7from __future__ import annotations
9from dataclasses import dataclass
11from domain.enums import TrackerStatus
14@dataclass(frozen=True)
15class TrackerDef:
16 key: str
17 label: str
18 category: str
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)
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
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 ]