Customer 360: extended Client fields, auto-migrate, updated Rolodex CRUD/templates, QDRO routes/views, importer mapping

QDRO links appear in rolodex_view.html case rows and case.html header when QDRO data exists, matching legacy flows.
This commit is contained in:
HotSwapp
2025-10-13 14:04:35 -05:00
parent 4cd35c66fd
commit 2e2380552e
32 changed files with 194632 additions and 9 deletions

View File

@@ -23,7 +23,7 @@
<div class="row mb-3">
<div class="col-md-4">
<div class="text-muted small">Name</div>
<div class="fw-semibold">{{ client.last_name or '' }}, {{ client.first_name or '' }}</div>
<div class="fw-semibold">{{ client.prefix or '' }} {{ client.first_name or '' }} {{ client.middle_name or '' }} {{ client.last_name or '' }} {{ client.suffix or '' }}</div>
</div>
<div class="col-md-4">
<div class="text-muted small">Company</div>
@@ -52,6 +52,34 @@
<div>{{ client.zip_code or '' }}</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-3">
<div class="text-muted small">Group</div>
<div>{{ client.group or '' }}</div>
</div>
<div class="col-md-3">
<div class="text-muted small">Email</div>
<div>{{ client.email or '' }}</div>
</div>
<div class="col-md-3">
<div class="text-muted small">DOB</div>
<div>{{ client.dob.strftime('%Y-%m-%d') if client.dob else '' }}</div>
</div>
<div class="col-md-3">
<div class="text-muted small">SS#</div>
<div>{{ client.ssn or '' }}</div>
</div>
</div>
<div class="row mb-3">
<div class="col-md-3">
<div class="text-muted small">Legal Status</div>
<div>{{ client.legal_status or '' }}</div>
</div>
<div class="col-md-9">
<div class="text-muted small">Memo / Notes</div>
<div>{{ client.memo or '' }}</div>
</div>
</div>
<div class="d-flex gap-2">
<a class="btn btn-primary" href="/rolodex/{{ client.id }}/edit">
@@ -121,7 +149,15 @@
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header">Related Cases</div>
<div class="card-header d-flex justify-content-between align-items-center">
<span>Related Cases</span>
<div class="btn-group btn-group-sm" role="group" aria-label="Case filters">
{% set status_filter = request.query_params.get('status') or 'all' %}
<a class="btn btn-outline-secondary {% if status_filter == 'all' %}active{% endif %}" href="?status=all">All</a>
<a class="btn btn-outline-secondary {% if status_filter == 'open' %}active{% endif %}" href="?status=open">Open</a>
<a class="btn btn-outline-secondary {% if status_filter == 'closed' %}active{% endif %}" href="?status=closed">Closed</a>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-sm mb-0 align-middle">
@@ -131,23 +167,34 @@
<th>Description</th>
<th style="width: 90px;">Status</th>
<th style="width: 110px;">Opened</th>
<th class="text-end" style="width: 110px;">Actions</th>
<th class="text-end" style="width: 150px;">Actions</th>
</tr>
</thead>
<tbody>
{% if client.cases and client.cases|length > 0 %}
{% for c in client.cases %}
{% if status_filter == 'all' or (status_filter == 'open' and (c.status != 'closed')) or (status_filter == 'closed' and c.status == 'closed') %}
<tr>
<td>{{ c.file_no }}</td>
<td>{{ c.description or '' }}</td>
<td>{{ c.status or '' }}</td>
<td>
{% if c.status == 'closed' %}
<span class="badge bg-secondary">Closed</span>
{% else %}
<span class="badge bg-success">Open</span>
{% endif %}
</td>
<td>{{ c.open_date.strftime('%Y-%m-%d') if c.open_date else '' }}</td>
<td class="text-end">
<a class="btn btn-sm btn-outline-primary" href="/case/{{ c.id }}">
<i class="bi bi-folder2-open"></i>
</a>
<a class="btn btn-sm btn-outline-secondary" href="/qdro/{{ c.file_no }}">
QDRO
</a>
</td>
</tr>
{% endif %}
{% endfor %}
{% else %}
<tr><td colspan="5" class="text-center text-muted py-3">No related cases.</td></tr>