Files
Bridge-and-Join-s/docs/tasks/PR-2-fansy-ddl.md
T
zuevav 3fdc526031 docs: план проекта + промпты задач PR-1..PR-6 для Claude Code на ВМ
- docs/architecture/plan.md — полный план проекта (архитектура,
  стек, SLA, регуляторика, Реестр ПО, roadmap M1–M5, открытые
  вопросы и решения).
- docs/tasks/README.md — индекс задач и инструкция запуска для
  Claude Code на dev-ВМ.
- docs/tasks/PR-1-go-models-m2m.md — Go-модели M2M, парсер
  windows-1251, NSDDateTime, round-trip тесты на эталонах.
- docs/tasks/PR-2-fansy-ddl.md — DDL принимающей БД для команды
  Fansy (контракт данных, ETL-требования, словарь полей,
  тестовые данные).
- docs/tasks/PR-3-lk-openapi.md — OpenAPI контракт lk-gateway по
  ESIA Finance API V1, для синхронизации с командой ЛК.
- docs/tasks/PR-4-m2m-core-skeleton.md — FSM сделки,
  репозиторий, идемпотентность по GUID, метрики SLA.
- docs/tasks/PR-5-nsd-adapter-skeleton.md — REST-клиент ИШ НРД,
  маршрутизация типов пакетов (M2MTR/M2MTD/M2MER/SUBBR/SUBER/SUB16).
- docs/tasks/PR-6-crypto-service-skeleton.md — gRPC-каркас
  Java-сервиса криптографии (КриптоПро JCP, UDS, Provider-абстракция).

С этого коммита дальнейшая разработка идёт на dev-ВМ через
запущенный там Claude Code. Промпты PR-1..PR-3 готовы к параллельному
запуску; PR-4 после PR-1; PR-5 и PR-6 ждут поставку артефактов
(ИШ НРД, сертификаты, КриптоПро JCP).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:48:21 +03:00

149 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PR-2: DDL принимающей БД для команды Fansy
## Цель
Спроектировать DDL принимающей БД `fansy-store` под требования
документации НРД к данным M2M и передать его команде Fansy как
контракт для их ETL.
ETL **делает команда Fansy** в автоматизированном режиме. Наша
ответственность — схема таблиц, индексы, миграции, типизированный
Go-репозиторий чтения и контракт данных.
## Источники правды
- `DOC/M2MSchemas_260408/*.xsd` — какие поля и типы нужны для
формирования M2M-сообщений.
- `DOC/Справочник пользователей.pdf` — перечень контрагентов
(БКС 5406121446, Ренессанс Брокер 7709258228, Альфа-банк 7728168971).
- `docs/architecture/plan.md` — контракт с командой Fansy (раздел
«Контракт с командой Fansy — что мы передаём»).
## Состав PR
### 1. `docs/fansy-contract/v1/ddl/` — SQL-миграции
PostgreSQL 16 / PostgreSQL Pro Certified. Используй `goose` или
просто пронумерованные файлы `001__init.sql`, `002__staging.sql` и т. д.
Схема разделена на две:
- `fansy_staging` — куда пишет команда Fansy (только их роль может
делать INSERT/UPDATE);
- `fansy` — рабочая, куда переливаются актуальные данные триггерами
или процедурами после валидации.
Минимальный набор таблиц (повторяй структуру и в staging, и в
рабочей):
- `clients` — депоненты/инвесторы:
- `id` (uuid), `inn` (для юрлиц), `last_name`, `first_name`,
`middle_name`, `birth_date`, `created_at`, `updated_at`.
- `client_documents` — документы инвестора:
- `id`, `client_id (FK)`, `document_type` (enum по
`IdentityDocumentCode`), `series`, `number`, `issued_at`,
`issuer`.
- `iia_contracts` — ИИС-договоры:
- `id`, `client_id (FK)`, `agreement_type` (`T12` | `T03`),
`agreement_number`, `agreement_date`, `broker_inn`.
- `depo_accounts` — депо-счета и разделы:
- `id`, `client_id (FK)`, `deponent_code`, `account_id`,
`section_id`, `depository_inn`, `is_active`, `is_trading`.
- `settlement_requisites` — реквизиты расчётов:
- `id`, `inn`, `display_name`, `created_at`.
- `portfolios` — портфели/остатки ЦБ:
- `id`, `client_id (FK)`, `depo_account_id (FK)`, `security_code`,
`isin`, `quantity_whole` (numeric), `quantity_fractional`
(numeric(38,16)), `isolation_status` (`SGDN`), `valued_at`.
- `securities` — справочник ЦБ:
- `id`, `security_code` (PK), `isin`, `classification`
(`BOND`|`SHAR`|`MFUN`), `category` (`ORDN`|`PREF`|`UKWN`),
`security_type`, `security_series`, `reg_number`,
`fund_class`, `display_name`.
- `participants` — контрагенты-участники сервиса MOST:
- `id`, `inn` (PK), `ogrn`, `full_name_rus`, `short_name_rus`,
`display_name_rus`, `full_name_eng`, `short_name_eng`,
`display_name_eng`, `depository_participant_code`,
`broker_participant_code`, `is_available_for_m2m`, `comment`.
- Предзаполни записями из `Справочник пользователей.pdf`.
Дополнительно:
- `etl_errors` — таблица для ошибок выгрузки Fansy (id, source_table,
source_pk, payload jsonb, error_message, created_at).
- В `_staging`-таблицах поле `loaded_at timestamptz default now()`.
**Индексы.** Минимум: PK, FK, индекс по `inn` и `deponent_code` в
основных таблицах, индекс по `valued_at` в `portfolios`.
**Роль `fansy_etl`.** В отдельном `000__roles.sql`:
- роль `fansy_etl` с правами INSERT/UPDATE/SELECT на схему
`fansy_staging`;
- роль `bj_reader` с SELECT на схему `fansy` — для нашего
`m2m-core`/`lk-gateway`;
- DDL-права (CREATE/ALTER/DROP) — только у миграционной роли,
не у Fansy-ETL.
### 2. `docs/fansy-contract/v1/data-dictionary.md`
Таблица: «поле → семантика → источник в Fansy (если известен) →
nullable → пример». На каждую колонку каждой таблицы.
### 3. `docs/fansy-contract/v1/etl-requirements.md`
Технические требования к процессу выгрузки от команды Fansy:
- Подключение: PostgreSQL, роль `fansy_etl`, отдельная учётная запись.
- Тип load: **инкрементный UPSERT в staging-таблицы** по бизнес-ключу;
полная перезаливка — только для справочников (`securities`,
`participants`), не чаще раза в сутки.
- SLA свежести данных:
- `portfolios` — не позднее 1 минуты после изменения в Fansy;
- `clients`, `depo_accounts`, `client_documents`, `iia_contracts`
— не позднее 5 минут;
- `securities`, `participants` — раз в сутки или по событию.
- Формат timestamp — UTC с явной зоной (`timestamptz`).
- Обработка ошибок: запись в `etl_errors`.
- Окно простоя для регламентных работ — согласовать.
### 4. `docs/fansy-contract/v1/examples/`
- `example-claim.md` — какие поля из БД нужны `m2m-core` для одной
типовой M2M-заявки (с конкретными SQL-запросами).
- `seed-data.sql` — 5–10 тестовых клиентов, портфелей, заявок для
совместного приёмочного теста.
### 5. `migrations/fansy-store/`
Скопировать `*.sql` из `docs/fansy-contract/v1/ddl/` — отсюда будут
исполняться миграциями в нашем сервисе.
### 6. Обновить `docs/fansy-contract/v1/README.md`
Описать состав каталога и порядок согласования с командой Fansy.
## Требования к коду
- Все DDL-файлы — на одной кодировке UTF-8.
- Имена таблиц и колонок — `snake_case` английский.
- Комментарии в DDL (`COMMENT ON COLUMN ... IS '...'`) — на русском.
- Без эмодзи.
## Коммит
```
feat(fansy-store): DDL принимающей БД + контракт данных для команды Fansy
- docs/fansy-contract/v1/ddl/ — миграции PostgreSQL
- docs/fansy-contract/v1/data-dictionary.md — словарь данных
- docs/fansy-contract/v1/etl-requirements.md — требования к ETL
- docs/fansy-contract/v1/examples/ — пример заявки + seed-data
- migrations/fansy-store/ — рабочие копии миграций
- предзаполнен справочник контрагентов из DOC/Справочник пользователей.pdf
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
```
## После коммита
1. Обновить `docs/tasks/README.md`: PR-2 — «выполнено».
2. Сообщить заказчику, что DDL готов и можно отправлять команде Fansy.