Files
fleet-management/app/templates/pdf/insurance_rider.html
T
alro65 5b7b41aa50 Initial commit: Fleet Management app with security hardening and background launcher
- Flask app with SQLAlchemy, Flask-Login, Flask-Mail
- Admin/owner roles, vessel management, charters, work orders
- Background launcher (Iniciar.vbs) runs server without terminal window
- Root redirect fixed: / → /login
- debug=False, use_reloader=False for pythonw.exe compatibility

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-05 02:54:10 -04:00

211 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Insurance Rider Confirmation</title>
<style>
@page { size: letter; margin: 1.8cm 2.2cm; }
body { font-family: 'Times New Roman', Times, serif; font-size: 11pt; color: #1a1a1a; line-height: 1.55; }
.header-banner { background: #0a2a3a; color: white; padding: 16px 22px; }
.header-banner .title { font-size: 17pt; font-weight: bold; color: #c4a747; letter-spacing: 1px; font-family: Arial, sans-serif; }
.header-banner .sub { font-size: 9pt; color: #aac4d0; margin-top: 3px; font-family: Arial, sans-serif; }
.gold-bar { background: #c4a747; height: 5px; margin-bottom: 16px; }
.doc-title { text-align: center; font-size: 14pt; font-weight: bold; color: #0a2a3a; margin: 14px 0 4px; text-transform: uppercase; letter-spacing: 1.5px; font-family: Arial, sans-serif; }
.doc-ref { text-align: center; font-size: 9pt; color: #666; margin-bottom: 18px; font-family: Arial, sans-serif; }
.status-issued { display: block; text-align: center; background: #d4edda; color: #155724; border: 2px solid #28a745; border-radius: 4px; padding: 10px; font-size: 14pt; font-weight: bold; margin-bottom: 18px; font-family: Arial, sans-serif; letter-spacing: 1px; }
.status-pending { display: block; text-align: center; background: #fff3cd; color: #856404; border: 2px solid #ffc107; border-radius: 4px; padding: 10px; font-size: 14pt; font-weight: bold; margin-bottom: 18px; font-family: Arial, sans-serif; letter-spacing: 1px; }
.section { margin-bottom: 14px; }
.section-title { background: #0a2a3a; color: #c4a747; padding: 4px 10px; font-size: 9.5pt; font-weight: bold; text-transform: uppercase; letter-spacing: 0.8px; margin-bottom: 8px; font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; font-size: 10.5pt; }
th { background: #0a2a3a; color: white; padding: 5px 8px; text-align: left; font-size: 9.5pt; font-family: Arial, sans-serif; }
td { padding: 6px 8px; border-bottom: 1px solid #ddd; }
tr:nth-child(even) td { background: #f9f9f9; }
.coverage-box { background: #eef6fc; border: 1px solid #b3d9ef; border-radius: 3px; padding: 14px 16px; }
.field-label { font-size: 9pt; color: #555; font-weight: bold; font-family: Arial, sans-serif; text-transform: uppercase; letter-spacing: 0.4px; display: block; margin-bottom: 3px; }
.field-value { font-size: 11.5pt; font-weight: bold; color: #0a2a3a; }
.field-blank { font-size: 11.5pt; color: #bbb; border-bottom: 1px solid #ccc; display: inline-block; min-width: 180px; }
.grid-2 { display: table; width: 100%; }
.grid-cell { display: table-cell; width: 50%; padding: 8px 10px; vertical-align: top; }
.instructions { background: #fff8e1; border-left: 4px solid #c4a747; padding: 11px 15px; margin-top: 12px; font-size: 10pt; }
.clearance-ok { background: #d4edda; border: 1.5px solid #28a745; border-radius: 3px; padding: 9px 14px; font-size: 10.5pt; color: #155724; font-weight: bold; margin-top: 12px; font-family: Arial, sans-serif; }
.clearance-no { background: #f8d7da; border: 1.5px solid #dc3545; border-radius: 3px; padding: 9px 14px; font-size: 10.5pt; color: #721c24; font-weight: bold; margin-top: 12px; font-family: Arial, sans-serif; }
.stamp-area { border: 2px dashed #ccc; border-radius: 6px; padding: 20px; text-align: center; color: #bbb; font-size: 10pt; margin-top: 14px; min-height: 80px; font-family: Arial, sans-serif; }
.footer { margin-top: 18px; border-top: 1px solid #ddd; padding-top: 7px; text-align: center; font-size: 8.5pt; color: #999; font-family: Arial, sans-serif; }
</style>
</head>
<body>
<div class="header-banner">
<div class="title">Insurance Rider — Private Charter</div>
<div class="sub">Temporary Named Insured Endorsement &bull; Private Recreational Vessel Use &bull; State of Florida</div>
</div>
<div class="gold-bar"></div>
<div class="doc-title">Insurance Rider Confirmation</div>
<div class="doc-ref">
Charter Ref. No. CHR-{{ '%04d' | format(charter.id) }} &nbsp;&bull;&nbsp;
Vessel: <strong>{{ vessel.name if vessel else 'N/A' }}</strong> &nbsp;&bull;&nbsp;
Date: {{ charter.start_datetime.strftime('%B %d, %Y') if charter.start_datetime else '________________' }}
</div>
{% if charter.insurance_rider_number %}
<div class="status-issued">&#10003; RIDER ISSUED &mdash; VESSEL CLEARED FOR DEPARTURE</div>
{% else %}
<div class="status-pending">&#9888; PENDING ISSUANCE &mdash; VESSEL NOT AUTHORIZED TO DEPART</div>
{% endif %}
<!-- 1. NAMED INSURED -->
<div class="section">
<div class="section-title">1. Named Insured (Temporary)</div>
<div class="coverage-box">
<div class="grid-2">
<div class="grid-cell">
<span class="field-label">Full Name</span>
<span class="field-value">{{ charter.charterer_name }}</span>
</div>
<div class="grid-cell">
<span class="field-label">Contact</span>
<span class="field-value">{{ charter.charterer_email or charter.charterer_phone or '—' }}</span>
</div>
</div>
</div>
</div>
<!-- 2. VESSEL -->
<div class="section">
<div class="section-title">2. Insured Vessel</div>
<table>
<tr><th>Vessel Name</th><th>HIN / USCG Doc.</th><th>Make / Model</th><th>LOA</th><th>Engines</th></tr>
<tr>
<td><strong>{{ vessel.name if vessel else '—' }}</strong></td>
<td>{{ vessel.hin if vessel and vessel.hin else '_______________' }}</td>
<td>{{ ((vessel.make or '') ~ ' ' ~ (vessel.model or '')) | trim if vessel else '—' }}</td>
<td>{{ (vessel.length | string ~ ' ft') if vessel and vessel.length else '—' }}</td>
<td>{{ vessel.engines if vessel and vessel.engines else '—' }}</td>
</tr>
</table>
</div>
<!-- 3. COVERAGE -->
<div class="section">
<div class="section-title">3. Coverage Details</div>
<div class="coverage-box">
<div class="grid-2">
<div class="grid-cell">
<span class="field-label">Rider / Endorsement No.</span>
{% if charter.insurance_rider_number %}
<span class="field-value">{{ charter.insurance_rider_number }}</span>
{% else %}
<span class="field-blank">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
{% endif %}
</div>
<div class="grid-cell">
<span class="field-label">Insurer</span>
{% if charter.insurer_name %}
<span class="field-value">{{ charter.insurer_name }}</span>
{% else %}
<span class="field-blank">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
{% endif %}
</div>
</div>
<div class="grid-2" style="margin-top:10px;">
<div class="grid-cell">
<span class="field-label">Coverage Amount</span>
{% if charter.coverage_amount %}
<span class="field-value">${{ '%,.2f' | format(charter.coverage_amount) }} USD</span>
{% else %}
<span class="field-blank">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
{% endif %}
</div>
<div class="grid-cell">
<span class="field-label">Coverage Type</span>
<span class="field-value">Liability — Private Recreational Use Only</span>
</div>
</div>
<div class="grid-2" style="margin-top:10px;">
<div class="grid-cell">
<span class="field-label">Coverage Start</span>
<span class="field-value">{{ charter.start_datetime.strftime('%B %d, %Y %I:%M %p') if charter.start_datetime else '___________________________' }}</span>
</div>
<div class="grid-cell">
<span class="field-label">Coverage End</span>
<span class="field-value">{{ end_dt.strftime('%B %d, %Y %I:%M %p') if end_dt else '___________________________' }}</span>
</div>
</div>
{% if charter.damage_waiver and charter.damage_waiver > 0 %}
<div style="margin-top:10px;">
<span class="field-label">Damage Waiver (paid by Charterer)</span>
<span class="field-value">${{ '%.2f' | format(charter.damage_waiver) }} USD</span>
</div>
{% endif %}
</div>
{% if charter.insurance_rider_number %}
<div class="clearance-ok">&#9989; DEPARTURE CLEARANCE GRANTED &mdash; Coverage active {{ charter.start_datetime.strftime('%I:%M %p') if charter.start_datetime else '—' }} to {{ end_dt.strftime('%I:%M %p') if end_dt else '—' }}</div>
{% else %}
<div class="clearance-no">&#128683; NO CLEARANCE &mdash; Vessel may NOT depart until this rider is issued and the rider number is recorded.</div>
{% endif %}
</div>
<!-- 4. SCOPE -->
<div class="section">
<div class="section-title">4. Scope and Exclusions</div>
<table>
<tr><th style="width:50%;">Covered</th><th style="width:50%;">Excluded</th></tr>
<tr>
<td>Third-party bodily injury and property damage liability during the coverage period</td>
<td>Commercial use, for-hire transport, or any income-generating activity</td>
</tr>
<tr>
<td>Passenger liability for the named insured's guests aboard during the coverage period</td>
<td>Operation under the influence of alcohol or controlled substances</td>
</tr>
<tr>
<td>Navigation within agreed Florida coastal / intracoastal operational area</td>
<td>Navigation outside approved area or overnight use without prior written consent</td>
</tr>
<tr>
<td>Accidental vessel damage if Damage Waiver was purchased</td>
<td>Intentional damage, gross negligence, or willful misconduct</td>
</tr>
</table>
</div>
{% if not charter.insurance_rider_number %}
<div class="instructions">
<strong>TO ISSUE THIS RIDER:</strong> Contact your marine insurance broker with the vessel and charterer details above.<br>
Recommended Florida marine insurers: <strong>Markel Marine</strong> &bull; <strong>BoatUS / GEICO Marine</strong> &bull; <strong>Progressive Marine</strong> &bull; <strong>Pantaenius America</strong><br>
Most brokers issue short-term hourly riders via online portal or email within minutes.
Once issued, enter the Rider No. in the charter record to grant departure clearance.
</div>
{% endif %}
<!-- 5. INSURER CONFIRMATION -->
<div class="section" style="margin-top:16px;">
<div class="section-title">5. Insurer Confirmation</div>
<table style="border:none;">
<tr>
<td style="border:none;vertical-align:bottom;padding:8px 5px;width:55%;">
<div style="font-size:10pt;margin-bottom:4px;"><strong>{{ charter.insurer_name or 'Insurer' }}</strong></div>
<div style="font-size:9.5pt;color:#666;margin-bottom:4px;">Authorized Representative: ___________________________</div>
<div style="font-size:9.5pt;color:#666;margin-bottom:40px;">Date of Issuance: ___________________________</div>
<div style="border-top:1px solid #333;padding-top:5px;font-size:9pt;color:#555;font-family:Arial,sans-serif;">Authorized Signature</div>
</td>
<td style="border:none;padding:8px 5px;width:45%;vertical-align:top;">
<div class="stamp-area">Insurer Stamp / Seal</div>
</td>
</tr>
</table>
</div>
<div class="footer">
Insurance Rider &bull; Charter Ref. CHR-{{ '%04d' | format(charter.id) }} &bull;
Vessel: {{ vessel.name if vessel else 'N/A' }} &bull;
{{ charter.start_datetime.strftime('%B %d, %Y %I:%M %p') if charter.start_datetime else '' }}
&ndash; {{ end_dt.strftime('%I:%M %p') if end_dt else '' }} &bull;
Private Recreational Use Only &bull; State of Florida
</div>
</body>
</html>