a3-architecture
FreeComplete architecture reference for the A3 insurance platform — file locations, data flow, conventions, microservice map, and fullstack patterns
The English summary is being prepared. Showing the original description.
Страховой агрегатор: архитектура, калькуляторы, адаптеры СК, CRM, лояльность, реферальная программа. Обучен на InsSmart, Sravni Labs, Polis.Online, Pampadu. Use when: страхование, ОСАГО, КАСКО, ВЗР, ипотечное, агрегатор, калькулятор, котировки, страховой агент, полис, СК, комиссия.
The English summary is being prepared. Showing the original description.
Run score Not tested
See how to installReview the instructions the agent will receive before you install.
Этот skill содержит ВСЕ знания, необходимые для создания продакшн-уровня страхового агрегатора — B2B/B2C платформы для расчёта, сравнения и оформления страховых полисов.
Обучен на реальных данных 4 B2B-платформ (InsSmart, Sravni Labs, Polis.Online, Pampadu), потребительском Sravni.ru и 20+ open-source проектах.
┌─────────────────────────────────────────────────────────────┐
│ INSURANCE PLATFORM │
├─────────────┬──────────────────────┬────────────────────────┤
│ Пользователь│ Агент │ Админ │
│ (B2C) │ (B2B) │ (Internal) │
├─────────────┼──────────────────────┼────────────────────────┤
│ Поиск полиса│ Калькулятор │ Управление СК │
│ Сравнение │ Результаты + комиссия│ Комиссионные правила │
│ Покупка │ Оформление │ Управление агентами │
│ Мои полисы │ CRM клиентов │ Отчёты (глобальные) │
│ Напоминания │ Баланс / Финансы │ Лояльность (настройки) │
│ │ Отчёты │ Модерация │
│ │ Реферальная программа│ │
│ │ Инструменты продаж │ │
│ │ Лояльность (уровни) │ │
└─────────────┴──────────────────────┴────────────────────────┘
| Модуль | Приоритет | Описание |
|---|---|---|
| Калькуляторы | P0 | Multi-step wizard для каждого продукта, автозаполнение |
| Quote Engine | P0 | Параллельные запросы к адаптерам СК, кеширование, ранжирование |
| Результаты | P0 | Список предложений: цена, СК, рейтинг, покрытие, комиссия агента |
| Оформление полиса | P0 | Checkout: оплата, подтверждение, генерация полиса |
| Мои полисы | P0 | Активные, истекающие, архив, статусы |
| CRM клиентов | P0 | Карточка клиента: ФИО, полисы, расчёты, контакты |
| Баланс / Финансы | P0 | Начисления, списания, вывод средств |
| Черновики | P1 | Автосохранение незавершённых расчётов |
| Отчёты | P1 | Продажи, воронка, Excel export, группировка |
| Реферальная программа | P1 | Генерация ссылок, метрики, типы |
| Лояльность | P2 | 5 уровней, квартальный расчёт, бонусные комиссии |
| Планировщик | P2 | Календарь: ДР, пролонгации, events |
| Инструменты продаж | P2 | Виджеты, визитки, контент, обучение |
| Управление агентами | P2 | Подагенты, иерархия, квоты |
| Справочники СК | P2 | Рейтинги, отзывы, claim settlement ratio |
Черновик → Расчёт → Выбор → Оформление → Оплата → Активный → Пролонгация
↓
Истекающий (за 30 дней)
↓
Истёкший (архив)
↓
Claims (при страховом случае)
| Услуга | Описание |
|---|---|
| Техосмотр | Запись на ТО: город, категория ТС, станция |
| ДКП | Бесплатный шаблон договора купли-продажи |
| Проверка ОСАГО | По VIN — актуальность полиса |
| Подбор ипотеки | 20+ банков, сравнение условий |
| Оценка имущества | Для страхования / ипотеки |
| Биржа ОСАГО | 100+ исполнителей, аукционная модель |
interface WizardStep {
id: string
title: string
fields: FieldConfig[]
validation: ZodSchema
autoFill?: AutoFillConfig // автозаполнение (госномер → данные ТС)
skipCondition?: (data: FormData) => boolean // пропустить шаг
}
interface FieldConfig {
name: string
label: string
type: 'text' | 'select' | 'date' | 'number' | 'checkbox' | 'toggle' | 'phone' | 'masked'
mask?: string // '#### ######' для паспорта
required: boolean
defaultValue?: unknown
options?: SelectOption[] // для select
autoComplete?: AutoCompleteConfig
dependsOn?: string // показать только если заполнено другое поле
copyFrom?: string // «Скопировать из собственника»
}
Шаг 1: Данные ТС
fields:
- gosNumber: { type: 'masked', mask: 'A ### AA ###', autoComplete: vehicleLookup }
- noGosNumber: { type: 'checkbox', label: 'Госномер отсутствует' }
- withTrailer: { type: 'checkbox', label: 'ТС с прицепом' }
- category: { type: 'select', options: ['B', 'A', 'C', 'D', 'BE', ...], default: 'B' }
- purpose: { type: 'select', options: ['Личная', 'Такси', 'Учебная', 'Перевозка'], default: 'Личная' }
- brand: { type: 'select', autoFilled: true }
- model: { type: 'select', dependsOn: 'brand', autoFilled: true }
- year: { type: 'number', min: 1970, max: currentYear, autoFilled: true }
- power: { type: 'number', suffix: 'л.с.', autoFilled: true }
- powerKw: { type: 'number', suffix: 'кВт' }
- vin: { type: 'masked', mask: 'XXXXXXXXXXXXXXXXX' }
- docType: { type: 'select', options: ['ПТС', 'СТС', 'ЭПТС'] }
- docSeries: { type: 'masked', mask: '## ##' }
- docNumber: { type: 'masked', mask: '######' }
- docDate: { type: 'date' }
Шаг 2: Собственник
fields:
- ownerType: { type: 'select', options: ['ФЛ', 'ИП', 'ЮЛ'], default: 'ФЛ' }
- lastName: { type: 'text', required: true }
- firstName: { type: 'text', required: true }
- middleName: { type: 'text' }
- birthDate: { type: 'date', required: true }
- passportSeries: { type: 'masked', mask: '## ##' }
- passportNumber: { type: 'masked', mask: '######' }
- passportDate: { type: 'date' }
- address: { type: 'text', autoComplete: addressSuggest }
Шаг 3: Страхователь
fields:
- isOwner: { type: 'checkbox', label: 'Является собственником', default: true }
// если isOwner=false → показать те же поля что у собственника
- lastName, firstName, middleName, birthDate, passport*, address (skipIf: isOwner)
Шаг 4: Водители
fields:
- multiDrive: { type: 'toggle', label: 'Без ограничений (мультидрайв)' }
// если multiDrive=false → показать список водителей
- drivers[]: {
lastName, firstName, middleName: { type: 'text' }
birthDate: { type: 'date' }
licSeries: { type: 'masked', mask: '## ##' }
licNumber: { type: 'masked', mask: '######' }
licDate: { type: 'date' } // дата выдачи ВУ
expStart: { type: 'date' } // дата начала стажа
foreignLic: { type: 'checkbox', label: 'Иностранное ВУ' }
prevLic: { type: 'checkbox', label: 'Указать предыдущее ВУ (для переноса КБМ)' }
prevLicSeries, prevLicNumber: { dependsOn: 'prevLic' }
copyFromOwner: { type: 'button', label: 'Скопировать из собственника' }
copyFromInsurer: { type: 'button', label: 'Скопировать из страхователя' }
}
- addDriver: { type: 'button', label: '+ Ещё один водитель' }
Шаг 5: Данные полиса
fields:
- startDate: { type: 'date', min: tomorrow }
- period: { type: 'select', options: ['3 мес', '6 мес', '12 мес'], default: '12 мес' }
- greenCorridor: { type: 'checkbox', label: 'Предыдущий полис (зелёный коридор)' }
- prevPolicyNumber: { dependsOn: 'greenCorridor', type: 'masked' }
Шаг 6: Контакты
fields:
- phone: { type: 'phone', mask: '+7 (###) ###-##-##' }
- email: { type: 'text', validation: email }
Шаг 7: Подтверждение
fields:
- consentPD: { type: 'checkbox', required: true, label: 'Согласие на обработку ПД (152-ФЗ)' }
- consentSK: { type: 'checkbox', required: true, label: 'Согласие на передачу данных СК' }
- consentAccuracy: { type: 'checkbox', required: true, label: 'Подтверждаю достоверность' }
- consentRules: { type: 'checkbox', required: true, label: 'Ознакомлен с правилами' }
actions:
- saveDraft: { label: 'Сохранить черновик', variant: 'outline' }
- calculate: { label: 'Рассчитать', variant: 'primary' }
Пользователь вводит госномер (напр. А123БВ777)
→ Edge Function insurance-vehicle-lookup
→ API запрос к сервису (ГИБДД / RSA / коммерческий API)
→ Возврат: { brand, model, year, power, vin, engineVolume }
→ Форма автозаполняется
→ Пользователь проверяет и корректирует
Для каждого водителя:
→ Edge Function insurance-kbm-check
→ Запрос к АИС РСА (по ФИО + ДР + ВУ)
→ Возврат: { kbmClass: number, kbmValue: number, prevInsurer: string }
→ КБМ автоподставляется в расчёт
→ Кеширование: 30 дней (КБМ меняется 1 раз/год 1 апреля)
┌─────────────┐
│ Calculator │ ← пользователь заполнил форму
│ (Frontend) │
└──────┬──────┘
│ POST /api/insurance-quote
▼
┌──────────────┐
│ Quote Engine │ ← Edge Function
│ │
│ 1. Validate │ ← Zod schema validation
│ 2. Cache? │ ← Есть ли кешированный результат?
│ 3. Fan-out │ ← Promise.allSettled([...adapters])
│ 4. Collect │ ← Собрать ответы
│ 5. Rank │ ← Отсортировать
│ 6. Cache │ ← Сохранить в quote_sessions
│ 7. Return │ ← Отдать клиенту
└──────────────┘
│
├────────────┬───────────────┬──────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Adapter: │ │ Adapter: │ │ Adapter: │ │ Adapter: │
│ Ингос │ │ Альфа │ │ СОГАЗ │ │ Ренессанс│
└──────────┘ └──────────┘ └──────────┘ └──────────┘
interface InsuranceProviderAdapter {
code: string // 'ingos', 'alpha', 'sogaz'
name: string // 'Ингосстрах'
logo: string // URL логотипа
supportedProducts: ProductCode[]
timeout: number // ms, per-provider
getQuote(req: QuoteRequest): Promise<ProviderQuote[]>
purchase(req: PurchaseRequest): Promise<PurchaseResult>
getStatus(policyId: string): Promise<PolicyStatus>
cancel(policyId: string): Promise<CancelResult>
}
interface ProviderQuote {
providerId: string
providerName: string
providerLogo: string
providerRating: number // 1-5
productCode: ProductCode
premium: number // стоимость полиса ₽
commission: number // комиссия агента ₽
commissionPercent: number
coverage: CoverageDetails
franchise?: number // франшиза ₽
paymentOptions: PaymentOption[]
purchaseUrl?: string
validUntil: string // ISO date, когда котировка истекает
}
interface QuoteSession {
id: string // uuid
userId: string
productCode: ProductCode
params: QuoteRequest // входные параметры
paramsHash: string // SHA-256 для дедупликации
status: 'pending' | 'partial' | 'complete' | 'expired'
results: ProviderQuote[]
errors: ProviderError[] // какие адаптеры упали
createdAt: string
expiresAt: string // TTL 15 минут
}
Layer 1: React Query (staleTime: 5 min) — фронтенд
Layer 2: Quote Session (TTL: 15 min) — те же параметры → тот же результат
Layer 3: КБМ кеш (TTL: 30 days) — обновляется 1 раз/год 1 апреля
Layer 4: Vehicle кеш (TTL: 365 days) — данные ТС меняются редко
Layer 5: Provider rate кеш (TTL: 24h) — тарифы СК для аналитики
┌─────────────────────────────────────────────────┐
│ [Лого СК] Ингосстрах ★ 4.7 (1,234) │
│ │
│ ОСАГО 12 450 ₽ │
│ Покрытие: стандартное │
│ Рейтинг надёжности: A++ Комиссия: 8% │
│ │
│ [Подробнее] [Сравнить] [== Оформить ==] │
└─────────────────────────────────────────────────┘
Сортировка:
Фильтры:
Пользователь выбирает 2-4 предложения → side-by-side таблица:
| Параметр | Ингосстрах | АльфаСтрахование | СОГАЗ |
|---|---|---|---|
| Цена | 12,450₽ | 11,890₽ | 13,200₽ |
| Рейтинг | 4.7 | 4.5 | 4.3 |
| Покрытие | Стандарт | Стандарт | Расширенное |
| Франшиза | 0₽ | 0₽ | 15,000₽ |
| Комиссия | 8% | 7% | 9% |
| CSR | 96% | 93% | 91% |
┌─ Клиент ────────────────────────────────────┐
│ Иванов Иван Иванович │
│ ДР: 15.03.1985 (39 лет) │
│ Тел: +7 (999) 123-45-67 │
│ Email: ivanov@example.com │
│ │
│ Авто: BMW X5, 2020, 249 л.с. │
│ Госномер: А123БВ777 │
│ │
│ ┌─ Полисы ─────────────────────────────────┐ │
│ │ ОСАГО #XXX до 15.09.2026 ✅ активен │ │
│ │ КАСКО #YYY до 15.09.2026 ✅ активен │ │
│ │ ОСАГО #ZZZ до 15.09.2025 ⛔ истёк │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌─ Расчёты ────────────────────────────────┐ │
│ │ ОСАГО 12 предложений 15.08.2026 │ │
│ │ КАСКО 8 предложений 14.08.2026 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ [Новый расчёт] [Пролонгация] [Редактировать]│
└──────────────────────────────────────────────┘
InsSmart и Sravni Labs автоматически отслеживают полисы и показывают:
Polis.Online и InsSmart поддерживают:
Оформлен полис → Комиссия начислена на баланс агента
→ Status: 'pending' (ожидает подтверждения СК)
→ Status: 'confirmed' (СК подтвердила оплату)
→ Status: 'available' (можно вывести)
→ Status: 'withdrawn' (выведено)
InsSmart: минимум 1,000₽, на карту / расчётный счёт Polis.Online: быстрые выплаты на карту (для самозанятых)
По периоду: Текущий месяц, Прошлый, Квартал, Год, Все время, Custom dates Метрики:
const LOYALTY_LEVELS = [
{ name: 'Новичок', threshold: 0, bonus: 0 },
{ name: 'Агент', threshold: 30_000, bonus: 5 },
{ name: 'Агент 2.0', threshold: 75_000, bonus: 8 },
{ name: 'Уполномоченный', threshold: 150_000, bonus: 12 },
{ name: 'Уполномоченный+', threshold: 300_000, bonus: 15 },
] as const
// Расчёт: квартальные премии → определяют уровень
// bonus — процент надбавки к базовой комиссии
Агент A приглашает Агент B → A получает X% от продаж B
Агент B приглашает Агент C → A получает Y% от продаж C (2-й уровень)
type ReferralType =
| 'mentorship' // Кураторство
| 'partnership' // Партнёрская программа
| 'osago' // Оформление ОСАГО
| 'mortgage' // Оформление ипотечного полиса
interface ReferralLink {
id: string
url: string
type: ReferralType
name: string
quotaPercent: number // размер квоты %
activations: number
calculations: number
policies: number // оформлено
createdAt: string
}
-- Страховые продукты (справочник)
CREATE TABLE insurance_products (
code TEXT PRIMARY KEY, -- 'osago', 'kasko', 'mortgage', 'vzr'
name TEXT NOT NULL,
description TEXT,
icon TEXT,
sort_order INTEGER DEFAULT 0,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Страховые компании (справочник)
CREATE TABLE insurance_companies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
code TEXT UNIQUE NOT NULL, -- 'ingos', 'alpha', 'sogaz'
name TEXT NOT NULL,
logo_url TEXT,
rating NUMERIC(2,1), -- 1.0-5.0
csr NUMERIC(4,1), -- claim settlement ratio %
is_active BOOLEAN DEFAULT true,
supported_products TEXT[], -- {'osago','kasko','mortgage'}
adapter_config JSONB, -- конфиг адаптера (timeout, base_url, etc.)
created_at TIMESTAMPTZ DEFAULT now()
);
-- Агенты
CREATE TABLE insurance_agents (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
loyalty_level TEXT DEFAULT 'novice', -- 'novice'|'agent'|'agent2'|'authorized'|'authorized_plus'
quarterly_premiums NUMERIC DEFAULT 0,
balance NUMERIC DEFAULT 0,
referrer_id UUID REFERENCES insurance_agents(id),
referral_code TEXT UNIQUE,
is_self_employed BOOLEAN DEFAULT false,
inn TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Клиенты агента (CRM)
CREATE TABLE insurance_clients (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
agent_id UUID NOT NULL REFERENCES insurance_agents(id),
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
middle_name TEXT,
birth_date DATE,
phone TEXT,
email TEXT,
passport_series TEXT,
passport_number TEXT,
address TEXT,
notes TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- ТС клиента
CREATE TABLE insurance_vehicles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
client_id UUID REFERENCES insurance_clients(id),
gos_number TEXT,
brand TEXT,
model TEXT,
year INTEGER,
power INTEGER, -- л.с.
vin TEXT,
doc_type TEXT, -- 'pts', 'sts', 'epts'
doc_series TEXT,
doc_number TEXT,
doc_date DATE,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Черновики расчётов
CREATE TABLE insurance_drafts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id),
product_code TEXT NOT NULL REFERENCES insurance_products(code),
step INTEGER DEFAULT 1,
form_data JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- Сессии расчёта (quote sessions)
CREATE TABLE insurance_quote_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id),
product_code TEXT NOT NULL,
params JSONB NOT NULL,
params_hash TEXT NOT NULL, -- SHA-256 для дедупликации
status TEXT DEFAULT 'pending', -- 'pending'|'partial'|'complete'|'expired'
results JSONB DEFAULT '[]',
errors JSONB DEFAULT '[]',
created_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ DEFAULT (now() + interval '15 minutes')
);
-- Полисы
CREATE TABLE insurance_policies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id),
agent_id UUID REFERENCES insurance_agents(id),
client_id UUID REFERENCES insurance_clients(id),
product_code TEXT NOT NULL,
company_id UUID REFERENCES insurance_companies(id),
policy_number TEXT,
status TEXT DEFAULT 'active', -- 'active'|'expiring'|'expired'|'cancelled'
premium NUMERIC NOT NULL,
commission NUMERIC DEFAULT 0,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
coverage JSONB,
raw_data JSONB, -- данные формы для пролонгации
created_at TIMESTAMPTZ DEFAULT now()
);
-- Транзакции баланса агента
CREATE TABLE insurance_transactions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
agent_id UUID NOT NULL REFERENCES insurance_agents(id),
policy_id UUID REFERENCES insurance_policies(id),
type TEXT NOT NULL, -- 'commission'|'bonus'|'withdrawal'|'referral'
amount NUMERIC NOT NULL,
status TEXT DEFAULT 'pending', -- 'pending'|'confirmed'|'available'|'withdrawn'
description TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Реферальные ссылки
CREATE TABLE insurance_referral_links (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
agent_id UUID NOT NULL REFERENCES insurance_agents(id),
type TEXT NOT NULL, -- 'mentorship'|'partnership'|'osago'|'mortgage'
name TEXT,
code TEXT UNIQUE NOT NULL,
quota_percent NUMERIC DEFAULT 0,
activations INTEGER DEFAULT 0,
calculations INTEGER DEFAULT 0,
policies INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT now()
);
-- КБМ кеш
CREATE TABLE insurance_kbm_cache (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
driver_hash TEXT UNIQUE NOT NULL, -- SHA-256(ФИО+ДР+ВУ)
kbm_class INTEGER NOT NULL,
kbm_value NUMERIC NOT NULL,
prev_insurer TEXT,
checked_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ DEFAULT (now() + interval '30 days')
);
-- Vehicle кеш
CREATE TABLE insurance_vehicle_cache (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
lookup_key TEXT UNIQUE NOT NULL, -- госномер или VIN
brand TEXT,
model TEXT,
year INTEGER,
power INTEGER,
vin TEXT,
engine_volume INTEGER,
checked_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ DEFAULT (now() + interval '365 days')
);
CREATE INDEX idx_policies_user ON insurance_policies(user_id);
CREATE INDEX idx_policies_agent ON insurance_policies(agent_id);
CREATE INDEX idx_policies_status ON insurance_policies(status);
CREATE INDEX idx_policies_end_date ON insurance_policies(end_date);
CREATE INDEX idx_clients_agent ON insurance_clients(agent_id);
CREATE INDEX idx_transactions_agent ON insurance_transactions(agent_id);
CREATE INDEX idx_quote_sessions_hash ON insurance_quote_sessions(params_hash);
CREATE INDEX idx_quote_sessions_expires ON insurance_quote_sessions(expires_at);
CREATE INDEX idx_drafts_user ON insurance_drafts(user_id);
CREATE INDEX idx_kbm_cache_hash ON insurance_kbm_cache(driver_hash);
CREATE INDEX idx_vehicle_cache_key ON insurance_vehicle_cache(lookup_key);
CREATE INDEX idx_referral_links_agent ON insurance_referral_links(agent_id);
CREATE INDEX idx_referral_links_code ON insurance_referral_links(code);
-- Агент видит только своих клиентов
ALTER TABLE insurance_clients ENABLE ROW LEVEL SECURITY;
CREATE POLICY "agent_own_clients" ON insurance_clients
FOR ALL USING (agent_id = auth.uid());
-- Пользователь видит свои полисы, агент видит полисы своих клиентов
ALTER TABLE insurance_policies ENABLE ROW LEVEL SECURITY;
CREATE POLICY "user_own_policies" ON insurance_policies
FOR SELECT USING (user_id = auth.uid() OR agent_id = auth.uid());
-- Агент видит свои транзакции
ALTER TABLE insurance_transactions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "agent_own_transactions" ON insurance_transactions
FOR SELECT USING (agent_id = auth.uid());
-- Черновики — только владелец
ALTER TABLE insurance_drafts ENABLE ROW LEVEL SECURITY;
CREATE POLICY "user_own_drafts" ON insurance_drafts
FOR ALL USING (user_id = auth.uid());
-- Quote sessions — только владелец
ALTER TABLE insurance_quote_sessions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "user_own_quotes" ON insurance_quote_sessions
FOR ALL USING (user_id = auth.uid());
// supabase/functions/insurance-quote/index.ts
// POST: { productCode, params }
// Response: { sessionId, results: ProviderQuote[], errors: ProviderError[] }
// Логика:
// 1. Validate params (Zod)
// 2. Check cache (params_hash)
// 3. Get adapters for productCode
// 4. Promise.allSettled(adapters.map(a => a.getQuote(params)))
// 5. Collect results + errors
// 6. Rank by price ASC
// 7. Cache in quote_sessions
// 8. Return
// GET: ?gosNumber=А123БВ777 или ?vin=XXXXXXXXXXXXXXXXX
// Response: { brand, model, year, power, vin, engineVolume }
// Cache: 365 days
// POST: { lastName, firstName, middleName, birthDate, licSeries, licNumber }
// Response: { kbmClass, kbmValue, prevInsurer }
// Cache: 30 days
// POST: { quoteId, sessionId, paymentMethod }
// Response: { policyId, policyNumber, policyUrl, status }
| Преимущество | Описание |
|---|---|
| Суперприложение | Страхование = модуль экосистемы (чат + соцсеть + такси + маркетплейс) |
| Встроенный мессенджер | Агент ведёт клиента в чате платформы |
| E2EE | Паспорт, ВУ — шифрованная передача документов |
| Нативное приложение | Capacitor Android/iOS — push, offline, камера для документов |
| AI-ассистент | Claude-powered рекомендации, навигация, ответы |
| Realtime | Supabase Realtime — live-обновления статуса |
| Видеозвонки с агентом | E2EE звонки через WebRTC |
| Антипаттерн | Как правильно |
|---|---|
| Mock-данные вместо реальных API | Sandbox от реальных СК, fallback на формулу ЦБ |
| Все поля на одной странице | Multi-step wizard (7 шагов для ОСАГО) |
Promise.all для адаптеров | Promise.allSettled — одна СК упала → остальные ОК |
| Нет черновиков | Автосохранение каждый step |
| Нет КБМ-автопроверки | Edge Function с кешем 30 дней |
| Захардкоженные коэффициенты | Справочники в БД, обновляемые при изменении ЦБ |
| Один калькулятор на все продукты | Product-agnostic wizard engine + конфигурация per-product |
| Нет комиссии для агента | Commission engine: per-product × per-company × loyalty_level |
| Баланс без вывода | Полный финансовый модуль: начисления → подтверждение → вывод |
Skill создан на основе живого тестирования 4 B2B-платформ (InsSmart, Pampadu, Sravni Labs, Polis.Online) и анализа 20+ GitHub-проектов.
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Complete architecture reference for the A3 insurance platform — file locations, data flow, conventions, microservice map, and fullstack patterns
The English summary is being prepared. Showing the original description.
Drafts U.S. commercial real estate access and indemnity (right-of-entry) agreements for pre-closing due diligence. Covers license grants, non-invasive vs invasive testing gates, insurance/endorsement requirements, indemnity with discovery carve-outs, restoration and lien remedies, confidentiality, and anti-indemnity guardrails. Trigger: access agreement, right of entry, due diligence access, Phase I/II, invasive testing, pre-PSA site inspection.
The English summary is being prepared. Showing the original description.
当用户需要对意外险投保问卷进行专业、结构化的核保审查,提取职业类别、工作环境、作业内容、危险活动参与情况、交通出行习惯、特殊工作暴露及其他可能影响意外险承保判断的高风险信息,并生成适合意外险核保、补问流转和风险分层处理的结构化分析结果时使用本 skill。
The English summary is being prepared. Showing the original description.
Inspect, schema, and fill true AcroForm PDFs using sciClaw's pdf_form_inspect, pdf_form_schema, and pdf_form_fill tools. Use when: (1) checking whether a PDF is a real fillable AcroForm, (2) listing form field names, types, and choices, (3) filling a supported form from structured values, (4) preparing reviewable insurance, legal, administrative, or clinical form drafts, (5) reporting skipped fields or unused input keys after a fill. Do not use for scanned PDFs, OCR tasks, or XFA-only forms.
The English summary is being prepared. Showing the original description.
Guide actuarial analysis for insurance pricing. TRIGGERS - Use when user needs help with actuarial-analysis related tasks.
The English summary is being prepared. Showing the original description.
Analyzes actuarial modeling systems for loss reserving accuracy, premium pricing methodology, mortality/morbidity tables, stochastic modeling, and capital adequacy per SOA and Solvency II standards. USE THIS SKILL WHEN: - You need to review or audit actuarial models (reserving, pricing, capital) - Someone asks about loss triangle analysis or reserve adequacy - You are evaluating IBNR calculations, chain ladder methods, or Bornhuetter-Ferguson - A project involves insurance pricing, GLM rating models, or ratemaking - You need to assess Solvency II SCR calculations or RBC compliance - Someone mentions actuarial opinions, ASOP compliance, or SOA standards - You are reviewing stochastic models, ESG configurations, or DFA frameworks - A codebase uses actuarial libraries (chainladder, lifetables, ChainLadder R package) TRIGGER PHRASES: "actuarial", "loss reserving", "IBNR", "chain ladder", "premium pricing", "mortality table", "Solvency II", "capital adequacy", "ratemaking", "GLM pricing", "risk-based capital", "reserve analysis", "actuarial opinion"
The English summary is being prepared. Showing the original description.