{{define "content"}}
PostgreSQL 16 (или PostgreSQL Pro Certified). Хранит сделки, журнал событий, справочники и данные, поступающие из внешних систем через ETL.
DSN указывается в разделе Настройка → PostgreSQL. Формат:
postgres://USER:PASSWORD@HOST:PORT/DBNAME?sslmode=disable
Локальный дев-стенд:
postgres://bj:bj_dev@127.0.0.1:5432/bj?sslmode=disable
При сохранении выполняется pgx.Connect и Ping. Если БД недоступна, форма покажет ошибку.
| Схема | Назначение | Кто пишет | Кто читает |
|---|---|---|---|
fansy_staging |
Промежуточные таблицы для ETL Fansy | Команда Fansy (роль fansy_etl) |
Наша процедура перелива в fansy |
fansy |
Рабочие данные: клиенты, документы, ИИС, депо-счета, портфели, справочники ЦБ и участников | Наша процедура перелива (после валидации) | Наша система (роль bj_reader): m2m-core при формировании заявок |
m2m_core |
Сделки M2M, журнал событий FSM | bj-server | bj-server, admin-ui |
Команда Fansy через инкрементный UPSERT в staging-таблицы:
| Таблица staging | SLA свежести | Что в ней |
|---|---|---|
clients | ≤ 5 минут | Анкеты инвесторов (ФИО, дата рождения, ИНН) |
client_documents | ≤ 5 минут | Документы (паспорт, ИНН и др.) |
iia_contracts | ≤ 5 минут | Договоры ИИС (тип T12/T03, номер, дата, ИНН брокера) |
depo_accounts | ≤ 5 минут | Депо-счета и разделы у разных депозитариев |
portfolios | ≤ 1 минута | Остатки ЦБ (целое/дробное количество, статус обособления) |
securities / participants | раз в сутки | Справочники ЦБ и участников MOST |
Полный data-dictionary: docs/fansy-contract/v1/data-dictionary.md. Требования к ETL: docs/fansy-contract/v1/etl-requirements.md.
Только в схему m2m_core:
deals — корневая запись сделки. Уникальность по guid = идемпотентность приёма заявок.deal_events — журнал FSM-событий (event sourcing).Старт сделки происходит при POST /api/v1/back_office/claims/. FSM проходит этапы:
draft → validated → submitted_to_nsd → awaiting_decision →
confirmed → awaiting_sub16 → done
↘ rejected
↘ timed_out
↘ manual_approval
| Роль | Права | Создаёт |
|---|---|---|
fansy_etl | SELECT/INSERT/UPDATE на fansy_staging.* | миграция 000__roles.sql |
bj_reader | SELECT на fansy.* | миграция 000__roles.sql |
bj_migrator | Владелец схем, DDL-права | миграция 000__roles.sql |
Пароли проставляются администратором БД через ALTER ROLE, в репозиторий не попадают.
Файлы лежат в migrations/fansy-store/ и migrations/m2m-core/. Применить локально:
cd /home/fontvielle/Bridge-and-Join-s
for f in migrations/fansy-store/*.sql migrations/m2m-core/*.sql; do
podman exec -i bj-postgres psql -U bj -d bj -v ON_ERROR_STOP=1 < "$f"
done
Порядок:
fansy-store/000__roles.sql — ролиfansy-store/001__schemas.sql — схемы и грантыfansy-store/002__working.sql — рабочая схемаfansy-store/003__staging.sql — stagingfansy-store/004__seed_participants.sql — справочник участников (НРД, БКС, Ренессанс, Альфа-Банк)m2m-core/001__deals.sql — сделки M2Mm2m-core/002__stages.sql — jsonb-колонка истории FSM-- Состояние сделок за последний час SELECT state, count(*) FROM m2m_core.deals WHERE created_at > now() - interval '1 hour' GROUP BY state; -- Журнал событий по сделке SELECT created_at, type, actor, payload FROM m2m_core.deal_events WHERE deal_id = '...' ORDER BY created_at; -- Свежесть данных Fansy SELECT 'portfolios' AS t, max(loaded_at) FROM fansy_staging.portfolios UNION ALL SELECT 'clients', max(loaded_at) FROM fansy_staging.clients;