5b7b41aa50
- 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>
211 lines
13 KiB
HTML
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 • Private Recreational Vessel Use • 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) }} •
|
|
Vessel: <strong>{{ vessel.name if vessel else 'N/A' }}</strong> •
|
|
Date: {{ charter.start_datetime.strftime('%B %d, %Y') if charter.start_datetime else '________________' }}
|
|
</div>
|
|
|
|
{% if charter.insurance_rider_number %}
|
|
<div class="status-issued">✓ RIDER ISSUED — VESSEL CLEARED FOR DEPARTURE</div>
|
|
{% else %}
|
|
<div class="status-pending">⚠ PENDING ISSUANCE — 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"> </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"> </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"> </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">✅ DEPARTURE CLEARANCE GRANTED — 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">🚫 NO CLEARANCE — 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> • <strong>BoatUS / GEICO Marine</strong> • <strong>Progressive Marine</strong> • <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 • Charter Ref. CHR-{{ '%04d' | format(charter.id) }} •
|
|
Vessel: {{ vessel.name if vessel else 'N/A' }} •
|
|
{{ charter.start_datetime.strftime('%B %d, %Y %I:%M %p') if charter.start_datetime else '' }}
|
|
– {{ end_dt.strftime('%I:%M %p') if end_dt else '' }} •
|
|
Private Recreational Use Only • State of Florida
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|