{{ entry.detail }}
- -Person or entity being insured
+ ++ Using same person as insured +
+ +Choose insurance providers to get quotes from
+ ++ {{ task.application_id }} +
+ + {{ task.policy_type?.toUpperCase() }} + ++ {{ task.provider_name || 'Unknown Provider' }} +
+ + + + + Urgent + + + +| + {{ formatKey(key) }} + | +
+ |
+
| Field | +Value | +
|---|---|
| {{ key.replace(/_/g, ' ') }} | +{{ value || '—' }} | +
| Field | +Value | +
|---|---|
| {{ key.replace(/_/g, ' ') }} | +{{ value || '—' }} | +
| Field | +Value | +
|---|---|
| {{ key.replace(/_/g, ' ') }} | +{{ value || '—' }} | +
{{ item.provider_id }}
+ + +{{ item.name }}
+ + +{{ formatPremium(item.premium) }}
+ + ++ Valid until {{ formatDate(item.valid_until) }} +
+ + ++ {{ item.coverage_details }} +
+ + +{{ model.title }}
-{{ model.tagline }}
-Cotización
-{{ fmtDate(model.quoteDateIso) }}
-{{ fmtUsd(model.request.sumAssuredUsd) }}
-Suma asegurada
-- {{ fmtUsd(model.request.monthlyPremiumUsd) }} - / mes -
-- Prima anual equivalente: {{ fmtUsd(model.request.annualPremiumUsd) }} / año -
-| Suma asegurada | -- {{ c.yearLabel }} - Edad {{ c.ageLabel }} - | -Destacado | -
|---|---|---|
| {{ fmtUsd(row.sumAssuredUsd) }} | -- {{ fmtUsd(c.guaranteed) }} - {{ fmtUsd(c.projected) }} - | -
- - {{ fmtUsd(row.highlightProjectedUsd) }} - -- {{ row.highlightNote }} - - |
-
- {{ row.footnote }} -
-Primas acumuladas pagadas (referencia)
-Review and send quote requests to carrier quoting inboxes.
-Person or entity being insured — we'll use this for carrier notifications.
- -{{ customerDisplayName(c) }}
-{{ customerSubtitle(c) }}
-{{ customerDisplayName(selectedCustomer) }}
-{{ customerSubtitle(selectedCustomer) }}
-Single quote or comparative — same workflow; comparative opens the comparison sheet after you send requests.
-- Choose carriers (quoting emails are maintained per provider in Settings). Pick coverage packages to request. -
-Review the health quote request before sending or saving.
-Single quote or comparative PDF — same steps; comparative opens the comparison sheet after acceptance.
-- Choose carriers and product shells to request. Quoting contacts live per provider in Settings. -
-Review the life quote request before sending or saving.
-Single quote or comparative PDF — same steps; comparative opens the comparison sheet after acceptance.
-- Choose carriers and plan shells to request. Quoting contacts live per provider in Settings. -
-- Consolidated view — production, claims, pipeline, and service KPIs with interactive charts. -
+Track production, claims, pipeline, and service metrics
{{ kpi.label }}
- {{ kpi.change }} -{{ kpi.value }}
-{{ kpi.hint }}
- -
-
Pick any metric, chart type, and time range.
-- {{ chartBuilderData[chartBuilderData.length - 1]?.display }} -
- {{ chartBuilderMetricObj.change }} - {{ chartBuilderMetricObj.label }} -{{ metric.label }}
- {{ metric.change }} -Analytics data will be available once you have policies and quotes in the system.
Created {{ formatDate(task.created_at) }}
+Task Info
+Request Details
+Response
+Attachments
+Submission
+{{ JSON.stringify(task.submission, null, 2) }}
+ Attachments
+Plans
+Plan {{ i + 1 }}
+Quote & Solicitation Tasks
++ {{ task.application_id }} +
++ Provider: {{ task.provider_id }} +
+Received
+{{ formatDate(task.created_at) }}
+No tasks found
+Adjust your filters or wait for new requests
+{{ allTasks.length }} tasks
+No claim with ID {{ claimId }} exists.
-{{ claim.aiRecap }}
- -| - | Task | -Status | -Assignee | -Due | -SLA | -
|---|---|---|---|---|---|
| - |
- {{ task.title }}
- System suggested
- |
- {{ TASK_STATUS_LABELS[task.status] }} | -{{ task.assignee }} | -{{ fmtDate(task.dueDate) }} | -- - {{ task.slaPercent }}% - | -
Intake complete — forms ready to generate.
- - - - No generated forms yet. Complete the intake form first. - -| Date | Amount | Type | Description |
|---|---|---|---|
| {{ fmtDate(e.date) }} | -{{ fmtMoney(e.amount) }} | -Reserve Change | -- {{ e.description }} - {{ e.annotation }} - | -
| No reserve changes recorded. | |||
| Date | Amount | Description |
|---|---|---|
| {{ fmtDate(e.date) }} | -{{ fmtMoney(e.amount) }} | -{{ e.description }} | -
| No payments recorded. | ||
| Date | Amount | Description |
|---|---|---|
| {{ fmtDate(e.date) }} | -{{ fmtMoney(e.amount) }} | -{{ e.description }} | -
| No subrogation activity. | ||
- Track claims lifecycle from first notice of loss through resolution and payment. -
-Open claims
-{{ kpis.openClaims }}
-Under review
-{{ kpis.underReview }}
-SLA breached
-{{ kpis.breached }}
-Avg days open
-{{ kpis.avgDays }}d
-Total reserved
-{{ formatCurrency(kpis.totalReserved) }}
-| - | Claim | -Customer / Agent | -Line / Type | -Carrier | -Status | -Reserved | -Paid | -Days | -Priority | -Docs | -
|---|---|---|---|---|---|---|---|---|---|---|
| - |
- |
-
- {{ c.customer || 'Unnamed customer' }} -{{ c.agent || '—' }} - |
-
- {{ c.line }} -{{ c.type }} - |
- {{ c.carrier }} | -
-
- {{ CARRIER_STATUS_LABELS[c.carrierStatus] }}
- {{ WORKFLOW_STATUS_LABELS[c.workflowStatus] }}
-
- |
- {{ c.reserved }} | -{{ c.paid }} | -- {{ c.daysOpen }}d - | -- {{ priorityMeta[c.priority].label }} - | -- {{ c.docsPending }} - — - | -
This intake form link is invalid or has expired. Please contact your broker for a new link.
-This intake form link expired on {{ new Date(claim.expiresAt).toLocaleDateString() }}. Please contact your broker to request a new link.
-Your claim information for {{ claim.id }} has been submitted successfully.
-Your broker {{ claim.handler }} will review the information and follow up with you shortly.
-When and where did the incident occur?
- -Your vehicle and other parties involved.
- -Information about the patient and medical provider.
- -Details about the affected property.
- -Upload photos and supporting documents. Take clear, well-lit photos.
- -Please review your information before submitting.
- -{{ Object.values(uploadedPhotos).filter(Boolean).length }} of {{ photoSlots.length }} photos uploaded
-Configure SLA rules, escalation tiers, required documents, and alert thresholds.
-Set target resolution days per line of business. Escalation tiers auto-compute from percentages.
-| Line of Business | -Target Days | -Tier 1 ({{ slaRules[0]?.tier1Pct ?? 50 }}%) | -Tier 2 ({{ slaRules[0]?.tier2Pct ?? 75 }}%) | -Tier 3 ({{ slaRules[0]?.tier3Pct ?? 100 }}%) | -
|---|---|---|---|---|
| {{ rule.lob }} | -- - | -{{ tierDays(rule, rule.tier1Pct) }} days | -{{ tierDays(rule, rule.tier2Pct) }} days | -{{ tierDays(rule, rule.tier3Pct) }} days | -
Actions triggered when SLA thresholds are reached.
-Check which documents are required at each carrier status stage. Missing docs generate tasks automatically.
-| Status ↓ / Doc → | -- {{ doc }} - | -
|---|---|
| {{ status }} | -- ✓ - · - | -
Configure when the system flags claims for attention.
-Alert when reserve changes by more than this percentage.
-Highlight claims older than this threshold.
-Suggest escalation when carrier hasn't responded.
-Flag overdue required documents after this many days.
-Manage which carrier-specific forms are available for generation. Government forms (FUD) are not managed here.
-| Form Name | -Carrier | -LOB | -Active | -
|---|---|---|---|
| {{ ft.name }} | -{{ ft.carrier }} | -{{ ft.lob }} | -- - | -
{{ serviceGrade.name }}
-{{ serviceScore }} pts
+ +
-
Nothing upcoming — all clear
-Total Premium
-{{ totalPremium }}
-/year across {{ mock.policies.length }} {{ mock.policies.length === 1 ? 'policy' : 'policies' }}
-Active Policies
-{{ activePolicies.length }}
-{{ coveredLines.join(', ') || 'None' }}
-Open Claims
-{{ openClaims.length }}
-{{ openClaims.length > 0 ? openClaims.map(c => c.id).join(', ') : 'No open claims' }}
-Client Since
-{{ mock.since.slice(0, 4) }}
-{{ yearsSince }}+ years{{ mock.tags.length ? ' \u00b7 ' + mock.tags[0] : '' }}
-Payment Status
-{{ mock.paymentStatus }}
-{{ mock.paymentStatus === 'Current' ? 'All premiums up to date' : mock.paymentStatus === 'Overdue' ? 'Payment action required' : mock.paymentStatus === 'N/A' ? 'No active billing' : 'Payment pending' }}
-Coverage Lines
-{{ coveredLines.length }} of {{ ALL_LINES.length }}
-{{ coveredLines.length === ALL_LINES.length ? 'Full coverage' : coverageGaps.length + ' gap' + (coverageGaps.length === 1 ? '' : 's') }}
-{{ pol.line }} — {{ pol.carrier }}
-{{ pol.id }}
-Recent Activity
-{{ event.text }}
-{{ event.date }}
+No recent activity
Open Actions
-No open actions
-Recently Closed
-No recently closed items
-{{ pol.product }}
- {{ pol.line }} - {{ pol.status }} -{{ pol.details }}
-${{ pol.premium.toLocaleString() }}
-/year
-Pending
-{{ pol.product }}
- {{ pol.line }} - {{ pol.status }} -{{ pol.details }}
-${{ pol.premium.toLocaleString() }}
-/year
-{{ pol.product }}
- {{ pol.line }} - {{ pol.status }} -{{ pol.details }}
-${{ pol.premium.toLocaleString() }}
-/year
-No policies on file
-{{ claim.id }} — {{ claim.type }}
- {{ claim.status }} -Policy {{ claim.policy }} · Filed {{ formatDate(claim.date) }}
-${{ claim.amount.toLocaleString() }}
-No claims on file
-| Date | -Policy | -Method | -Status | -Amount | -
|---|---|---|---|---|
| {{ formatDate(pay.date) }} | -{{ pay.policy }} | -{{ pay.method }} | -- - {{ pay.status }} - - | -${{ pay.amount.toLocaleString() }} | -
No payment history
-{{ event.text }}
-No activity recorded
-{{ entry.detail }}
- -This customer has {{ customerPolicies.length }} policy{{ customerPolicies.length !== 1 ? 'ies' : '' }} on file.
No entries match this filter
-No linked household members
-Corporación Tecnológica del Valle
-Employee · Linked to cust-009
+{{ policy.policy_type }}
+ {{ policy.status }} +Policy {{ policy.application_id }}
No business affiliations
-No professional contacts
-{{ note.text }}
-No policies on file
Customer not found
+{{ customerSubtitle(c) }}
| Type | Phone | -Agent | -Policies | -Premium | -Payment | -||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + |
No customers found Try adjusting your search or create a new customer @@ -344,32 +205,6 @@ const customerTypeColor = (type: string) => |
{{ c.email ?? '—' }} | {{ c.phone ?? '—' }} | -{{ c._mock ? c._mock.agent : '—' }} | -- {{ c._mock ? c._mock.policies.length : '—' }} - | -- {{ c._mock ? fmtMoney(c._mock.policies.reduce((s: number, p: any) => s + p.premium, 0)) + '/yr' : '—' }} - | -- {{ c._mock.paymentStatus }} - — - | -- - | |||||||||||
| ID | -Customer | -Insurer | -Product | -Premium | -Docs | -Status | -Submitted | -Actions | -
|---|---|---|---|---|---|---|---|---|
| {{ em.id }} | -
- {{ em.customer }} -{{ em.agent }} - |
- {{ em.insurer }} | -
- {{ em.line }} -{{ em.product }} - |
- {{ em.premium }} | -- - {{ em.docs }}/{{ em.docsTotal }} - - | -- - {{ statusMeta[em.status].label }} - - | -{{ em.submitted }} | -
-
-
-
-
-
-
- |
-
| Created | -Customer | -Insurer | -Sub-ramo | -Line | -Status | -Actions | -
|---|---|---|---|---|---|---|
| {{ row.createdAt.slice(0, 10) }} | -{{ row.customerLabel }} | -{{ row.insurerSlug }} | -{{ row.subRamoKey }} | -{{ row.productLine }} | -- - {{ statusMeta[row.status as EmissionStatus]?.label ?? row.status }} - - | -
-
-
-
-
-
- |
-
{{ filteredDeals.length }} opportunities · {{ fmt(filteredDeals.reduce((s, d) => s + d.premium, 0)) }} total premium
-No deals in this stage
-{{ deal.customer }}
- {{ deal.line }} -{{ deal.product }}
- - -{{ deal.note }}
- - -- Register a policy and become the broker of record. Scan a document with AI or enter details manually, then link to an existing customer or create a new one. -
-Customer
-Select the customer this policy belongs to. AI scan will also attempt automatic matching.
-A new customer profile will be created from the policy details.
-Upload policy document
-- Drop a PDF here, or click to browse. AI will read the policy and extract all fields. -
-PDF, PNG, or JPG up to 25 MB
-Policy details
-Enter the policy information manually. All fields can be edited later.
-Customer details will be pulled from the selected existing profile.
-Uploading {{ fileName }}
-Sending document to processing pipeline...
-AI is reading the policy
-Extracting insured details, coverage terms, carrier info, and matching against existing customers...
-- Matched to existing customer: {{ extracted.matchedCustomerName }} - ({{ extracted.matchedCustomerId }}) -
-This policy will be added to their existing profile.
-New customer will be created
-No matching customer found. A new profile will be set up from the extracted data.
-Policy details
-Review and correct any fields before initiating the transfer.
-How it works
-Upload the policy
-Drop a PDF or image of the policy from the outgoing brokerage.
-AI extracts the data
-Policy number, carrier, coverage, insured details, and dates are read automatically.
-Customer matching
-The system checks if the insured is an existing customer or creates a new profile.
-Review and transfer
-Verify the extracted fields, then initiate the broker of record change.
-Potential lead entry form coming online.
-
- Choose insurer, sub-ramo, person type, and product line. Required forms come from the
-
{{ g.description }}
-Keys: {{ g.fieldKeys.join(', ') }}
-| Name | Relationship | Date of Birth | Cédula | -
|---|---|---|---|
| {{ d.name }} | -{{ d.relationship }} | -{{ fmtDate(d.dob) }} | -{{ d.cedula }} | -
| Name | Relationship | Type | % | -
|---|---|---|---|
| {{ b.name }} | -{{ b.relationship }} | -{{ b.type }} | -{{ b.percentage }}% | -
| ID | Date | Type | Description | Premium Impact | -
|---|---|---|---|---|
| {{ e.id }} | -{{ fmtDate(e.date) }} | -{{ e.type }} | -{{ e.description }} | -+{{ fmtMoney(e.premium) }} | -
| Date | Amount | Method | Status | -
|---|---|---|---|
| {{ fmtDate(p.date) }} | -{{ fmtMoney(p.amount) }} | -{{ p.method }} | -{{ p.status }} | -
| Policy # | LOB | Titular | Status | -
|---|---|---|---|
| {{ rp.lob }} | -{{ rp.titular }} | -{{ statusLabel(rp.status) }} | -
| Claim ID | Date Filed | Type | Status | Amount | - |
|---|---|---|---|---|---|
| {{ fmtDate(c.date) }} | -{{ c.type }} | -{{ c.status }} | -{{ fmtMoney(c.amount) }} | -
- |
- |
|
- {{ c.description }} - |
- |||||
| Period | Premium | Change | Status | -
|---|---|---|---|
| {{ r.period }} | -{{ fmtMoney(r.premium) }} | -- - {{ Number(renewalChange(idx)) > 0 ? '+' : '' }}{{ renewalChange(idx) }}% - - — - | -{{ r.status }} | -