Backend Aug 22-25: AI analysis, welcome-packet templating, LetterStream, DocuSeal, staff RBAC + tier gate

- analysis.py: deterministic claim scorer + /analyze /approve /letter /advance-tier endpoints (auto-runs on intake)
- packet.py + packet_fields.json: welcome-packet templating engine (6 onboarding docs, field catalog)
- letterstream.py + letters.py: certified-mail send pipeline + letter lifecycle (webhook verified)
- docuseal.py: DocuSeal signing integration
- staff.py/models.py/schema.sql/auth.py: approval actor from staff key, tier gate (APPROVED+ACTIVE+onboarding docs), onboarding_docs table
- frontend/: dependency-free static portal (intake, magic-link login/verify, dashboard)
- landing-mockups/: 4 design-stance mockups + favicons
- legal/: aup/privacy/sms-terms/terms HTML
- docs/: letter-queue scope, letterstream API contract, 6 welcome-packet templates
- review-dre-landing-2026-08-21.md: 3-variant landing feedback sprint
- compliance/DRE_Compliance_Manual.md: updated

Source synced from deployed /opt/dre-portal/app/ (was 4 days ahead of git).
This commit is contained in:
root
2026-08-26 02:26:33 -04:00
parent 7a5603b495
commit 7a62b0b340
46 changed files with 11004 additions and 35 deletions
+8 -1
View File
@@ -28,14 +28,18 @@ app.add_middleware(
allow_headers=["*"],
)
# Include routers (intake, claims, staff)
# Include routers (intake, claims, staff, packet)
from .intake import router as intake_router # noqa: E402
from .claims import router as claims_router # noqa: E402
from .staff import router as staff_router # noqa: E402
from .packet import router as packet_router # noqa: E402
from .letters import router as letters_router # noqa: E402
app.include_router(intake_router)
app.include_router(claims_router)
app.include_router(staff_router)
app.include_router(packet_router)
app.include_router(letters_router)
def _err(code: str, message: str, status_code: int):
@@ -46,6 +50,9 @@ def _err(code: str, message: str, status_code: int):
@app.on_event("startup")
async def _startup():
db.init_db()
# Ensure the welcome-packet overrides table exists on existing DBs.
from . import packet
packet.ensure_packet_table()
logger.info("DRE portal started; db=%s", db.get_db_path())