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:
@@ -130,6 +130,11 @@ Case {{ case.file_no if case else '' }} · Delphi Database
|
||||
</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if has_qdro %}
|
||||
<a class="btn btn-sm btn-outline-secondary" href="/qdro/{{ case.file_no }}">
|
||||
QDRO
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
75
app/templates/qdro.html
Normal file
75
app/templates/qdro.html
Normal file
@@ -0,0 +1,75 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}QDRO · {{ file_no }}{% if qdro %} · {{ qdro.version }}{% endif %} · Delphi Database{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row g-3">
|
||||
<div class="col-12 d-flex align-items-center">
|
||||
<a class="btn btn-sm btn-outline-secondary me-2" href="/dashboard">
|
||||
<i class="bi bi-arrow-left"></i>
|
||||
Back
|
||||
</a>
|
||||
<h2 class="mb-0">QDRO</h2>
|
||||
<div class="ms-auto">
|
||||
<a class="btn btn-sm btn-outline-secondary" href="/qdro/{{ file_no }}">All Versions</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">Versions</div>
|
||||
<div class="card-body p-0">
|
||||
<div class="list-group list-group-flush">
|
||||
{% if versions and versions|length > 0 %}
|
||||
{% for v in versions %}
|
||||
<a class="list-group-item list-group-item-action d-flex justify-content-between align-items-center" href="/qdro/{{ v.file_no }}/{{ v.version }}">
|
||||
<span>Version {{ v.version }}</span>
|
||||
<i class="bi bi-chevron-right"></i>
|
||||
</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="list-group-item text-muted">No QDRO versions for this file.</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-8">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">Details</div>
|
||||
<div class="card-body">
|
||||
{% if qdro %}
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6"><div class="text-muted small">File #</div><div class="fw-semibold">{{ qdro.file_no }}</div></div>
|
||||
<div class="col-md-6"><div class="text-muted small">Version</div><div class="fw-semibold">{{ qdro.version }}</div></div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6"><div class="text-muted small">Plan Id</div><div>{{ qdro.plan_id or '' }}</div></div>
|
||||
<div class="col-md-6"><div class="text-muted small">Case Number</div><div>{{ qdro.case_number or '' }}</div></div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6"><div class="text-muted small">Case Type</div><div>{{ qdro.case_type or '' }}</div></div>
|
||||
<div class="col-md-6"><div class="text-muted small">Section</div><div>{{ qdro.section or '' }}</div></div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6"><div class="text-muted small">Judgment Date</div><div>{{ qdro.judgment_date if qdro.judgment_date else '' }}</div></div>
|
||||
<div class="col-md-6"><div class="text-muted small">Valuation Date</div><div>{{ qdro.valuation_date if qdro.valuation_date else '' }}</div></div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6"><div class="text-muted small">Married On</div><div>{{ qdro.married_on if qdro.married_on else '' }}</div></div>
|
||||
<div class="col-md-6"><div class="text-muted small">Percent Awarded</div><div>{{ qdro.percent_awarded or '' }}</div></div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-12"><div class="text-muted small">Judge</div><div>{{ qdro.judge or '' }}</div></div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-muted">Select a version on the left to view details.</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
<form method="post" action="{{ '/rolodex/create' if not client else '/rolodex/' ~ client.id ~ '/update' }}">
|
||||
<div class="mb-2 text-muted small" id="fieldHelp" aria-live="polite">Focus a field to see help.</div>
|
||||
<div class="row g-3">
|
||||
<div class="col-md-2">
|
||||
<label for="prefix" class="form-label">Prefix</label>
|
||||
<input type="text" class="form-control" id="prefix" name="prefix" value="{{ client.prefix if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="last_name" class="form-label">Last Name</label>
|
||||
<input type="text" class="form-control" id="last_name" name="last_name" data-help="Client last name (surname)." value="{{ client.last_name if client else '' }}">
|
||||
@@ -26,6 +30,18 @@
|
||||
<label for="first_name" class="form-label">First Name</label>
|
||||
<input type="text" class="form-control" id="first_name" name="first_name" data-help="Client given name." value="{{ client.first_name if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="middle_name" class="form-label">Middle</label>
|
||||
<input type="text" class="form-control" id="middle_name" name="middle_name" value="{{ client.middle_name if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label for="suffix" class="form-label">Suffix</label>
|
||||
<input type="text" class="form-control" id="suffix" name="suffix" placeholder="Jr/Sr" value="{{ client.suffix if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="title" class="form-label">Title</label>
|
||||
<input type="text" class="form-control" id="title" name="title" value="{{ client.title if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="company" class="form-label">Company</label>
|
||||
<input type="text" class="form-control" id="company" name="company" data-help="Organization or employer (optional)." value="{{ client.company if client else '' }}">
|
||||
@@ -48,6 +64,30 @@
|
||||
<input type="text" class="form-control" id="zip_code" name="zip_code" data-help="5-digit ZIP or ZIP+4." value="{{ client.zip_code if client else '' }}">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label for="group" class="form-label">Group</label>
|
||||
<input type="text" class="form-control" id="group" name="group" value="{{ client.group if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="email" class="form-label">Email</label>
|
||||
<input type="email" class="form-control" id="email" name="email" value="{{ client.email if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label for="dob" class="form-label">DOB</label>
|
||||
<input type="date" class="form-control" id="dob" name="dob" value="{{ client.dob.strftime('%Y-%m-%d') if client and client.dob else '' }}">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="ssn" class="form-label">SS#</label>
|
||||
<input type="text" class="form-control" id="ssn" name="ssn" value="{{ client.ssn if client else '' }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="legal_status" class="form-label">Legal Status</label>
|
||||
<input type="text" class="form-control" id="legal_status" name="legal_status" value="{{ client.legal_status if client else '' }}">
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="memo" class="form-label">Memo / Notes</label>
|
||||
<textarea class="form-control" id="memo" name="memo" rows="3">{{ client.memo if client else '' }}</textarea>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="rolodex_id" class="form-label">Legacy Rolodex Id</label>
|
||||
<input type="text" class="form-control" id="rolodex_id" name="rolodex_id" data-help="Legacy ID used for migration and lookup; may be alphanumeric." value="{{ client.rolodex_id if client else '' }}">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user