| name | insurance-aggregator |
| description | Страховой агрегатор: архитектура, калькуляторы, адаптеры СК, CRM, лояльность, реферальная программа. Обучен на InsSmart, Sravni Labs, Polis.Online, Pampadu. Use when: страхование, ОСАГО, КАСКО, ВЗР, ипотечное, агрегатор, калькулятор, котировки, страховой агент, полис, СК, комиссия. |
Insurance Aggregator — Полная экспертиза
Этот skill содержит ВСЕ знания, необходимые для создания продакшн-уровня страхового агрегатора — B2B/B2C платформы для расчёта, сравнения и оформления страховых полисов.
Обучен на реальных данных 4 B2B-платформ (InsSmart, Sravni Labs, Polis.Online, Pampadu), потребительском Sravni.ru и 20+ open-source проектах.
Часть 1: Архитектура платформы
1.1 Три роли
┌─────────────────────────────────────────────────────────────┐
│ INSURANCE PLATFORM │
├─────────────┬──────────────────────┬────────────────────────┤
│ Пользователь│ Агент │ Админ │
│ (B2C) │ (B2B) │ (Internal) │
├─────────────┼──────────────────────┼────────────────────────┤
│ Поиск полиса│ Калькулятор │ Управление СК │
│ Сравнение │ Результаты + комиссия│ Комиссионные правила │
│ Покупка │ Оформление │ Управление агентами │
│ Мои полисы │ CRM клиентов │ Отчёты (глобальные) │
│ Напоминания │ Баланс / Финансы │ Лояльность (настройки) │
│ │ Отчёты │ Модерация │
│ │ Реферальная программа│ │
│ │ Инструменты продаж │ │
│ │ Лояльность (уровни) │ │
└─────────────┴──────────────────────┴────────────────────────┘
1.2 Модули платформы
| Модуль | Приоритет | Описание |
|---|
| Калькуляторы | 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 |
1.3 Жизненный цикл полиса
Черновик → Расчёт → Выбор → Оформление → Оплата → Активный → Пролонгация
↓
Истекающий (за 30 дней)
↓
Истёкший (архив)
↓
Claims (при страховом случае)
Часть 2: Продуктовый каталог
2.1 Страховые продукты
ОСАГО (обязательное, регулируется ЦБ РФ)
- Формула: ТБ × КТ × КБМ × КВС × КО × КМ × КС × КП × КН
- Коэффициенты:
- ТБ: 2746-4942₽ (коридор ЦБ для категории B)
- КТ: 0.6-2.1 (территориальный, по 88 регионам)
- КБМ: 0.46-3.92 (бонус-малус, 14 классов, проверка АИС РСА)
- КВС: 0.83-1.87 (возраст × стаж, матрица)
- КО: 1.0 (ограниченный список) / 1.94 (без ограничений)
- КМ: 0.6-1.6 (мощность двигателя)
- КС: 0.5-1.0 (период использования)
- КП: 0.2-1.0 (период страхования)
- КН: 1.0-1.5 (нарушения)
- Автозаполнение: по госномеру → марка, модель, год, мощность
- КБМ: автоматическая проверка через АИС РСА (Edge Function)
КАСКО (добровольное, устанавливается СК)
- Примерная стоимость: 4-8% от стоимости авто
- Базовая формула: стоимость_авто × базовая_ставка × К_возраст_авто × К_регион × К_франшиза × К_стаж × К_КБМ
- Доп.факторы: кол-во ключей, срок владения, КАСКО-убытки за год, кредитный авто, автозапуск, праворульный
- Покрытие: полное КАСКО, мини-КАСКО (ограниченные риски), КАСКО + GAP
Ипотечное (обязательное для ипотеки)
- Типы покрытия: Имущество (конструктив), Жизнь заёмщика, Титул
- Стоимость: 0.15-0.5% от остатка кредита
- Факторы: банк-кредитор, остаток, год постройки, тип объекта, пол, возраст, здоровье
- Особенность: банк диктует минимальный набор покрытий
ВЗР / Travel
- Стоимость: ~90-300₽/день
- Факторы: страна, дни, возраст, сумма покрытия
- Опции: спорт, беременность, хронические заболевания
- Quick-picks стран: Грузия, Таиланд, Шенген, Китай, Вьетнам, Турция
НС (Несчастный случай)
- Типы: На период / На год
- Опции: Для лагеря, Для спорта
- Простая форма: возраст, даты, кол-во
Антиклещ
- Стоимость: 340-390₽
- Поля: возраст, дата начала (на год)
- Референс: Зетта 340₽, СберСтрах 360₽, ВСК 390₽, Ингосстрах 390₽
ИФЛ (Имущество физлиц)
- Покрытие: Отделка/ремонт, Мебель/техника, Ответственность перед соседями
- Фильтры: газ, деревянные перекрытия, аренда
- Стоимость: от 1,800₽/год (квартира)
Титул
- Период: годовой
- Стоимость: зависит от рыночной стоимости имущества (300K-50M₽)
2.2 Дополнительные услуги
| Услуга | Описание |
|---|
| Техосмотр | Запись на ТО: город, категория ТС, станция |
| ДКП | Бесплатный шаблон договора купли-продажи |
| Проверка ОСАГО | По VIN — актуальность полиса |
| Подбор ипотеки | 20+ банков, сравнение условий |
| Оценка имущества | Для страхования / ипотеки |
| Биржа ОСАГО | 100+ исполнителей, аукционная модель |
Часть 3: Multi-Step Wizard — калькулятор
3.1 Архитектура визарда
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[]
autoComplete?: AutoCompleteConfig
dependsOn?: string
copyFrom?: string
}
3.2 ОСАГО — Golden Standard (7 шагов)
Шаг 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' }
3.3 Автозаполнение по госномеру
Пользователь вводит госномер (напр. А123БВ777)
→ Edge Function insurance-vehicle-lookup
→ API запрос к сервису (ГИБДД / RSA / коммерческий API)
→ Возврат: { brand, model, year, power, vin, engineVolume }
→ Форма автозаполняется
→ Пользователь проверяет и корректирует
3.4 Проверка КБМ
Для каждого водителя:
→ Edge Function insurance-kbm-check
→ Запрос к АИС РСА (по ФИО + ДР + ВУ)
→ Возврат: { kbmClass: number, kbmValue: number, prevInsurer: string }
→ КБМ автоподставляется в расчёт
→ Кеширование: 30 дней (КБМ меняется 1 раз/год 1 апреля)
Часть 4: Quote Engine
4.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: │
│ Ингос │ │ Альфа │ │ СОГАЗ │ │ Ренессанс│
└──────────┘ └──────────┘ └──────────┘ └──────────┘
4.2 Adapter interface
interface InsuranceProviderAdapter {
code: string
name: string
logo: string
supportedProducts: ProductCode[]
timeout: number
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
productCode: ProductCode
premium: number
:
:
:
?:
: []
?:
:
}
4.3 Quote Session
interface QuoteSession {
id: string
userId: string
productCode: ProductCode
params: QuoteRequest
paramsHash: string
status: 'pending' | 'partial' | 'complete' | 'expired'
results: ProviderQuote[]
errors: ProviderError[]
createdAt: string
expiresAt: string
}
4.4 Кеширование
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) — тарифы СК для аналитики
Часть 5: Результаты расчёта
5.1 Карточка предложения
┌─────────────────────────────────────────────────┐
│ [Лого СК] Ингосстрах ★ 4.7 (1,234) │
│ │
│ ОСАГО 12 450 ₽ │
│ Покрытие: стандартное │
│ Рейтинг надёжности: A++ Комиссия: 8% │
│ │
│ [Подробнее] [Сравнить] [== Оформить ==] │
└─────────────────────────────────────────────────┘
5.2 Сортировка и фильтры
Сортировка:
- По цене (↑↓) — default
- По рейтингу СК (↑↓)
- По сумме покрытия (↑↓)
- По комиссии агента (↑↓) — только для агентов
Фильтры:
- Страховая компания (мультивыбор)
- Франшиза (0 / 10K / 20K / 50K)
- Минимальное покрытие
- Рейтинг СК (от 3.0 / от 4.0 / от 4.5)
5.3 Сравнение (Comparison Mode)
Пользователь выбирает 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% |
Часть 6: CRM клиентов
6.1 Карточка клиента (референс: InsSmart)
┌─ Клиент ────────────────────────────────────┐
│ Иванов Иван Иванович │
│ ДР: 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 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ [Новый расчёт] [Пролонгация] [Редактировать]│
└──────────────────────────────────────────────┘
6.2 Пролонгации
InsSmart и Sravni Labs автоматически отслеживают полисы и показывают:
- Полисы, истекающие через 30 дней → badge «Пролонгация»
- Автоматическое уведомление агенту и клиенту
- One-click переход к расчёту нового полиса (данные предзаполнены)
6.3 Excel Export
Polis.Online и InsSmart поддерживают:
- Экспорт CRM в Excel
- Настройка колонок (какие поля включить)
- Фильтры (по датам, продуктам, статусам)
- Группировка (по дням, неделям, месяцам)
Часть 7: Финансы и баланс
7.1 Модель начислений
Оформлен полис → Комиссия начислена на баланс агента
→ Status: 'pending' (ожидает подтверждения СК)
→ Status: 'confirmed' (СК подтвердила оплату)
→ Status: 'available' (можно вывести)
→ Status: 'withdrawn' (выведено)
7.2 Вывод средств
InsSmart: минимум 1,000₽, на карту / расчётный счёт
Polis.Online: быстрые выплаты на карту (для самозанятых)
7.3 Отчётность
По периоду: Текущий месяц, Прошлый, Квартал, Год, Все время, Custom dates
Метрики:
- Оформлено полисов (шт.)
- Премии (₽)
- Комиссия (₽)
- Средний чек
- Конверсия (расчёты → оформления)
Часть 8: Лояльность
8.1 5-уровневая система (InsSmart)
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
8.2 Механика
- Период оценки: квартал (3 месяца)
- Метрика: сумма премий оформленных полисов за квартал
- Повышение уровня: автоматическое при достижении порога
- Понижение уровня: если за квартал не дотянул до текущего порога → понижение на 1
Часть 9: Реферальная программа
9.1 Модель InsSmart (2-уровневая)
Агент A приглашает Агент B → A получает X% от продаж B
Агент B приглашает Агент C → A получает Y% от продаж C (2-й уровень)
9.2 Модель Polis.Online (типизированные ссылки)
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
}
Часть 10: Схема базы данных
10.1 Основные таблицы
CREATE TABLE insurance_products (
code TEXT PRIMARY KEY,
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,
name TEXT NOT NULL,
logo_url TEXT,
rating NUMERIC(2,1),
csr NUMERIC(4,1),
is_active BOOLEAN DEFAULT true,
supported_products TEXT[],
adapter_config JSONB,
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',
quarterly_premiums NUMERIC ,
balance ,
referrer_id UUID insurance_agents(id),
referral_code TEXT ,
is_self_employed ,
inn TEXT,
created_at TIMESTAMPTZ now()
);
insurance_clients (
id UUID gen_random_uuid(),
agent_id UUID insurance_agents(id),
first_name TEXT ,
last_name TEXT ,
middle_name TEXT,
birth_date ,
phone TEXT,
email TEXT,
passport_series TEXT,
passport_number TEXT,
address TEXT,
notes TEXT,
created_at TIMESTAMPTZ now(),
updated_at TIMESTAMPTZ now()
);
insurance_vehicles (
id UUID gen_random_uuid(),
client_id UUID insurance_clients(id),
gos_number TEXT,
brand TEXT,
model TEXT,
,
power ,
vin TEXT,
doc_type TEXT,
doc_series TEXT,
doc_number TEXT,
doc_date ,
created_at TIMESTAMPTZ now()
);
insurance_drafts (
id UUID gen_random_uuid(),
user_id UUID auth.users(id),
product_code TEXT insurance_products(code),
step ,
form_data JSONB ,
created_at TIMESTAMPTZ now(),
updated_at TIMESTAMPTZ now()
);
insurance_quote_sessions (
id UUID gen_random_uuid(),
user_id UUID auth.users(id),
product_code TEXT ,
params JSONB ,
params_hash TEXT ,
status TEXT ,
results JSONB ,
errors JSONB ,
created_at TIMESTAMPTZ now(),
expires_at TIMESTAMPTZ (now() )
);
insurance_policies (
id UUID gen_random_uuid(),
user_id UUID auth.users(id),
agent_id UUID insurance_agents(id),
client_id UUID insurance_clients(id),
product_code TEXT ,
company_id UUID insurance_companies(id),
policy_number TEXT,
status TEXT ,
premium ,
commission ,
start_date ,
end_date ,
coverage JSONB,
raw_data JSONB,
created_at TIMESTAMPTZ now()
);
insurance_transactions (
id UUID gen_random_uuid(),
agent_id UUID insurance_agents(id),
policy_id UUID insurance_policies(id),
type TEXT ,
amount ,
status TEXT ,
description TEXT,
created_at TIMESTAMPTZ now()
);
insurance_referral_links (
id UUID gen_random_uuid(),
agent_id UUID insurance_agents(id),
type TEXT ,
name TEXT,
code TEXT ,
quota_percent ,
activations ,
calculations ,
policies ,
created_at TIMESTAMPTZ now()
);
insurance_kbm_cache (
id UUID gen_random_uuid(),
driver_hash TEXT ,
kbm_class ,
kbm_value ,
prev_insurer TEXT,
checked_at TIMESTAMPTZ now(),
expires_at TIMESTAMPTZ (now() )
);
insurance_vehicle_cache (
id UUID gen_random_uuid(),
lookup_key TEXT ,
brand TEXT,
model TEXT,
,
power ,
vin TEXT,
engine_volume ,
checked_at TIMESTAMPTZ now(),
expires_at TIMESTAMPTZ (now() )
);
10.2 Индексы
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);
10.3 RLS политики
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());
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());
Часть 11: Edge Functions
11.1 insurance-quote (расчёт котировок)
11.2 insurance-vehicle-lookup (распознавание ТС)
11.3 insurance-kbm-check (проверка КБМ)
11.4 insurance-purchase (оформление полиса)
Часть 12: Конкурентные преимущества
Что отличает нашу платформу от InsSmart/Sravni/Polis.Online:
| Преимущество | Описание |
|---|
| Суперприложение | Страхование = модуль экосистемы (чат + соцсеть + такси + маркетплейс) |
| Встроенный мессенджер | Агент ведёт клиента в чате платформы |
| E2EE | Паспорт, ВУ — шифрованная передача документов |
| Нативное приложение | Capacitor Android/iOS — push, offline, камера для документов |
| AI-ассистент | Claude-powered рекомендации, навигация, ответы |
| Realtime | Supabase Realtime — live-обновления статуса |
| Видеозвонки с агентом | E2EE звонки через WebRTC |
Часть 13: Антипаттерны
| Антипаттерн | Как правильно |
|---|
| 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-проектов.