Фича-лист
Дата: 2026-04-13
Максимальная глубина: два уровня (родитель → дочерний пункт).
Дочерний пункт не может иметь детей.
РНП [все роли] BI [ГД, Админ, Супер-Админ] Администрирование [Админ, Супер-Админ] └── Сотрудники └── Отделы └── Настройки └── Мониторинг данных └── Аудит
| Пункт меню | Менеджер | РОП | ГД | Админ | Супер-Админ |
|---|---|---|---|---|---|
| РНП | ✓ | ✓ | ✓ | ✓ | ✓ |
| BI | — | — | ✓ | ✓ | ✓ |
| Администрирование | — | — | — | ✓ | ✓ |
| → Сотрудники | — | — | — | ✓ | ✓ |
| → Отделы | — | — | — | ✓ | ✓ |
| → Настройки | — | — | — | ✓ | ✓ |
| → Мониторинг данных | — | — | — | ✓ | ✓ |
| → Аудит | — | — | — | ✓ | ✓ |
Пункты, недоступные роли, не отображаются (не скрыты визуально, а отсутствуют в DOM).
Визуальные макеты интерфейсов — макеты интерфейса (PDF).
Система ролей определяет, какие разделы и данные видит пользователь.
Детальная матрица доступа — отдельный документ.
| Роль | Описание | Назначение |
|---|---|---|
| Супер-админ | Единственная стартовая учётка. Видит всё. | Создаётся при деплое, роль неизменна |
| Админ | Назначенный администратор. Видит всё. | Назначается супер-админом вручную |
| ГД | Генеральный директор. Видит сводку и BI (Superset). | Назначается вручную |
| РОП | Руководитель отдела продаж. Видит товары своих менеджеров. | Назначается вручную или как руководитель отдела |
| Менеджер | Базовая роль. Видит только свои товары. | Роль по умолчанию при создании из 1С |
SCD-назначениям, а не по текущей оргструктуреSCD связь на выбранный период не подтверждается, данные не показываемМатрица доступа — «RBAC — Матрица доступа».
Раздел доступен только супер-админу и назначенным админам.
Содержит: глобальные настройки системы, управление пользователями, управление отделами.
Список параметров, которые администратор может изменить через UI:
| Параметр | Описание | По умолчанию |
|---|---|---|
| Время жизни ссылки восстановления пароля | Через сколько часов ссылка сброса истекает | 1 час |
| Предлагать смену пароля при первом входе | Флаг для новых пользователей | уточнить |
| Кол-во дней для Dead Stock | N дней без заказов → товар в DS | уточнить |
| Отдел по умолчанию для новых сотрудников | Куда попадает сотрудник из 1С, если не указан отдел | обязательная настройка системы |
| Срок хранения журнала аудита | Кол-во дней хранения записей (от 1 до 365) | уточнить |
API-токены внешних сервисов:
| Параметр | Описание |
|---|---|
| WB API токен | Токен Wildberries для выгрузки данных и write-back операций |
| MPStats токен | Токен для получения внешней аналитики |
Список токенов и настроек будет пополняться.
Таблица всех пользователей системы.
Доступные действия на пользователе:
Логика блокировки:
deleted -> уволен -> заблокирован -> inactive -> allowФункциональность:
Руководитель отдела:
Пользователь с ролью РОП (RBAC), назначенный руководителем отдела через атрибут head_user_id на сущности отдела.
Роль РОП определяет уровень доступа, head_user_id определяет конкретный отдел.
head_user_id может ссылаться только на пользователя из этого же отдела.
Руководитель видит товары всех сотрудников своего отдела.
При удалении отдела:
Все сотрудники отдела переводятся в отдел по умолчанию.
Отдел по умолчанию удалить нельзя.
Глобальная настройка: отдел по умолчанию — куда попадает новый сотрудник из 1С, если явно не указан отдел.
Технически критичные глобальные настройки храним как typed-поля, а не как произвольный JSON. В этот слой входят как минимум:
Раздел доступен только супер-админу и назначенным админам.
Показывает состояние ETL-пайплайнов (cron) и потока синхронизации из 1С. Только чтение — управление пайплайнами (перезапуск и т.д.) не предусмотрено в текущей версии.
Таблица всех cron-задач. Данные получаются из PG_ETL_PIPELINE_STATUS.
Колонки:
| Поле | Описание |
|---|---|
| Название пайплайна | Идентификатор / описание пайплайна |
| Статус последнего запуска | success / failed / running / no runs |
| Время старта | Дата и время последнего запуска |
| Время завершения | Когда завершился последний запуск |
| Длительность | Время выполнения последнего запуска |
| Следующий запуск | Следующее время по расписанию |
| Watermark данных | До какой бизнес-даты / времени данные фактически догружены |
| Freshness lag | Насколько текущие данные отстают от ожидаемой свежести |
| Обработано строк | Кол-во строк / событий, успешно обработанных последним прогоном |
| Rejected / skipped / duplicates | Технические счётчики качества загрузки |
| Сообщение об ошибке | Только при статусе failed — краткое сообщение из лога пайплайна |
Поведение:
failed строка визуально выделяетсяМониторинг синхронизации состоит из трёх operational-слоёв:
На UI это может быть сведено в компактный блок, но логически это не одна универсальная “лента всего подряд”.
Базовый экран MVP: лента последних событий из Kafka-топика синхронизации сотрудников + ошибки обработки.
Колонки:
| Поле | Описание |
|---|---|
| Время события | Timestamp из Kafka |
| Тип | новый сотрудник / обновление / увольнение |
| Email сотрудника | Идентификатор из события |
| Статус обработки | принято / ошибка |
| Детали ошибки | Заполняется при статусе ошибка |
Параметры:
Отдельный компактный блок, который показывает здоровье не только пайплайна, но и самих данных по каждому источнику.
Колонки:
| Поле | Описание |
|---|---|
| Источник | Например: 1С Номенклатура, 1С Сотрудники, WB Sales Funnel, WB Stocks, Скрапер СПП |
| Статус | healthy / lagging / failed / no data |
| Последняя успешная синхронизация | Когда источник последний раз успешно обновился |
| Watermark данных | До какого момента источник фактически догружен |
| Freshness lag | Насколько источник отстаёт от ожидаемой свежести |
| Обработано / rejected / skipped / duplicates | Краткие счётчики качества загрузки |
| Последняя ошибка | Если источник сейчас в проблемном состоянии |
Раздел доступен только супер-админу и назначенным админам.
Фиксирует все административные действия в системе. Только чтение.
Колонки:
| Поле | Описание |
|---|---|
| Дата и время | Timestamp действия |
| Администратор | Кто выполнил действие (email / имя) |
| Тип действия | Категория события (см. ниже) |
| Объект | На кого / что направлено действие |
| Детали | Подробности: старое и новое значение, где применимо |
Пользователи:
Отделы:
Глобальные настройки:
Сессии:
Классическая авторизация по логину и паролю. Без SSO, LDAP, OAuth.
Источник пользователей — 1С, синхронизация через Kafka.
Роли и субординация — отдельный документ.
Поля:
Дополнительно:
Правило доступа к логину / reset:
deleted_at заполнен — вход и reset запрещеныemployment_status = fired) — вход и reset запрещеныactive = false) — вход и reset запрещеныИсточник: 1С Справочник Сотрудники / Физические лица → Kafka
Требования к данным из 1С:
Сценарий: новый пользователь появился в 1С
GUID из 1СФИО используется как отображаемое имяemail уже есть в модели — отправляем письмо на авторизациюemail ещё нет — пользователь создаётся без возможности входа до появления emailСценарий: пользователь уволен (признак активности = неактивен)
Технические требования auth-слоя:
password_changed_atПостоянный элемент интерфейса, доступный из любого экрана. Расположение: правый верхний угол.
Инициалы пользователя или аватар → клик → дропдаун:
Поля:
Фильтры применяются глобально ко всему экрану РНП и определяют
какой срез данных видит пользователь. Все фильтры работают в комбинации (AND).
Менеджер по умолчанию видит только свои артикулы — фильтр по менеджеру
проставляется автоматически из его роли.
АПИ ВБ История остатков1С справочник Номенклатура1С справочник Номенклатура1С Воронка продаж1С Воронка продажхранения как SCD Type 2 по артикулам и периодам
1С Воронка продаж1С Воронка продажМенеджер видит только свои артикулы — фильтр проставляется из RBAC автоматически.
РОП и ГД видят всё.
В новой системе считаем сами.
АПИ ВБ История остатковАПИ ВБ История остатковПитает: Артикул WB, Артикул поставщика, Период (даты), Категория WB (предмет), Бренд
АПИ ВБ История остатковПитает: Категория 1С, Сезон продаж, Материал верха, Фабрика
Питает: Коллекция, Менеджер (назначение артикула)
Питает: ABC, Количество дней на сайте, ВП%
Блок сводных KPI-карточек в верхней части экрана РНП. Отображает агрегированные показатели
по текущему фильтру. Все значения пересчитываются при изменении фильтров.
Структура отображения для первых трёх метрик: план / факт / % выполнения плана / дельта (факт − план).
1С Планирование продажAPI WB v3 Sales Funnel, поле buyoutSum, раз в деньфакт / план)факт − план)1С Планирование продаж1С Планирование продаж(сумма заказов по товарам, участвовавшим хотя бы в одной акции) / (сумма всех заказов) * 1006 предыдущим днямK = 0.7 Выполнение_по_выручке + 0.3 Выполнение_плана_по_валовой_прибылиK >= 95% → бонус 50 000K >= 100% → бонус 100 000K >= 105% → бонус 150 0005% → доплата ещё 50 0005% * (П102 - П157) при положительной разницеПитает: Выручка факт (Показатель 20)
POST /api/analytics/v3/sales-funnel/productsПитает: план по Выручке, % проданного, ЧП (Показатели 67, 69, 77)
Питает: % проданного факт, все показатели % плана и дельты, % участия в акциях, мотивация менеджера (Показатели 79, 115–122)
Паспорт — первый из трёх блоков в раскрываемой строке товара на экране РНП.
Содержит идентификационные и справочные данные по артикулу: кто производит, откуда, в какой коллекции, сколько заказано.
Данные преимущественно статичные (справочник), обновляются редко.
| Поле | Показатель | Источник | Частота |
|---|---|---|---|
| Фото товара | — | API WB Карточка товара — проксируем URL, бинарники не храним | раз в день |
| Артикул WB | 2 | API WB История остатков | раз в день |
| Артикул поставщика | 3 | API WB История остатков | раз в день |
| Юр лицо | 5 | API WB seller-info, поле tin | раз в день |
| Бренд | 6 | API WB История остатков | раз в день |
| Повтор | 59 | 1С справочник Номенклатура | справочник |
| Поле | Показатель | Источник | Частота |
|---|---|---|---|
| Категория 1С | 50 | 1С справочник Номенклатура | справочник |
| Вид категории | 51 | 1С справочник Номенклатура | справочник |
| Товарная категория | 52 | 1С справочник Номенклатура | справочник |
| Особенности модели | 53 | 1С справочник Номенклатура | справочник |
| Пол | 54 | 1С справочник Номенклатура | справочник |
| Категория WB (Предмет) | 4 | API WB История остатков | раз в день |
| Сезон продаж | 55 | 1С справочник Номенклатура | справочник |
| Страна происхождения | 56 | 1С справочник Номенклатура | справочник |
| Направление | 57 | 1С справочник Номенклатура | справочник |
| Группа списка | 58 | 1С справочник Номенклатура | справочник |
| Коллекция | 44 | 1С Воронка продаж | по событию изменения |
| Материал верха | 48 | 1С справочник Номенклатура | справочник |
| Материал подкладки | 49 | 1С справочник Номенклатура | справочник |
| Цвет материала верха | 60 | 1С справочник Номенклатура | справочник |
| Цвет | 61 | 1С справочник Номенклатура | справочник |
| Фабрика | 47 | 1С справочник Номенклатура | справочник |
| Поле | Показатель | Источник | Частота |
|---|---|---|---|
| Заказано, шт | 45 | 1С Заказ поставщику | событийно |
| Дозаказ, шт | — | 1С Заказ поставщику | событийно |
| Себестоимость, руб | 62 | 1С Приобретение товаров и услуг → Kafka | при поступлении товара |
| Себестоимость, юани | 91 | 1С Заказ поставщику → Kafka | событийно |
Дозаказ, шт считаем на нашей стороне как сумму количества по строкам заказов поставщику, где документ помечен признаком дозаказ, только в рамках актуального сезона / коллекции для артикула.
| Поле | Показатель | Источник | Частота |
|---|---|---|---|
| Кол-во дней на сайте | 113 | расчётная величина | раз в день |
| Рейтинг по отзывам | 40 | API WB | раз в день |
График зависимости заказов от цены и СПП/WB Club.
Визуализирует как менялись заказы при изменении цены.
Статус: MVP.
Источники: заказы (П7), цена факт (П42), СПП (П65) — все ежедневные.
Формулы: П42 = П20 / П19, П64 = П42 * (1 - П65).
Технический момент: СПП и цену нужно хранить историчски (запись раз в день), не только текущее значение.
Таймлайн с вехами: изменения фото, SEO, описания, категории, цены.
Статус: MVP.
Реализация: аудит-лог товара — при каждой ежедневной выгрузке из API сравниваем ключевые поля с предыдущим снимком, фиксируем дельту как событие. WB API историю не отдаёт, фиксируем сами.
Функционал write-back через API WB — merge/split карточек товара.
Статус: MVP — выделяется в отдельный feature-документ, обсуждается отдельно.
Питает: Артикул WB, Артикул поставщика, Категория WB, Бренд
Питает: Юр лицо
GET /api/v1/seller-infosellerId, name, tinПитает: Категория 1С, Сезон продаж, Материал верха, Фабрика, Повтор
Питает: Коллекция
Питает: Заказано шт, Себестоимость руб/юани
1С Заказ поставщику, 1С Приобретение товаров и услугДозаказ, шт в 1С Заказ поставщику нужен явный признак документа основной заказ / дозаказПитает: Кол-во дней на сайте
Функционал write-back через API WB. Позволяет объединить несколько карточек товара
в одну группу (единый imtID) или разъединить сгруппированные карточки.
Доступ: из блока "Паспорт" на экране РНП. Кнопка видна Менеджеру, РОП, Админу, Супер-Админу (по матрице «RBAC — Матрица доступа»). ГД — только чтение, кнопка скрыта.
Один эндпоинт для обоих операций:
POST https://content-api.wildberries.ru/content/v2/cards/moveNm
Объединение — указываем targetIMT (imtID группы, куда добавляем) и массив nmIDs:
{
"targetIMT": 123456,
"nmIDs": [837459235, 828572090]
}
Разъединение — тот же эндпоинт, targetIMT не передаём, только nmIDs.
WB генерирует новые imtID для разъединённых карточек.
Если передать несколько nmID без targetIMT — они объединятся в новую группу с новым imtID.
Чтобы дать каждой карточке отдельный imtID — отправлять по одной за запрос.
Ограничения WB:
Группа в API:
При запросе списка карточек (POST /content/v2/get/cards) каждая карточка возвращает nmID и imtID.
Карточки с одинаковым imtID — в одной группе. Это основа для отображения связей.
nmID и imtID известны)POST /content/v2/cards/moveNm с targetIMT и nmIDs: [текущий nmID]POST /content/v2/cards/moveNm без targetIMT, по одной карточке за запрос (если нужен уникальный imtID каждой)Второй из трёх блоков в раскрываемой строке товара на экране РНП.
По умолчанию свёрнут — отображается по клику на заголовок блока.
Содержит метрики план/факт/% плана/дельта за выбранный в фильтре период, воронку продаж и операционные показатели по конкретному артикулу.
Структура отображения: план / факт / % выполнения плана / дельта (факт − план).
| Метрика | Пок. план | Источник план | Пок. факт | Источник факт | % плана | Дельта |
|---|---|---|---|---|---|---|
| Выручка, млн. руб | П67 | 1С Планирование продаж | П20 | API WB v3 Sales Funnel, buyoutSum | П115 | П116 |
| Выручка, шт | П71 | 1С Планирование продаж | П19 | API WB v3 Sales Funnel, buyoutCount | П123 | П124 |
| Цена, руб | П68 | 1С Планирование продаж | П42 | расчётная (П20 / П19) | П125 | П126 |
| % проданного | П69 | 1С Планирование продаж | П79 | расчётная (П20 / П45) | П117 | П118 |
| ЧП, % | П140 | расчётная | П96 | расчётная (П95 / П20) | П127 | П128 |
| ЧП, руб | П77 | 1С Планирование продаж | П95 | расчётная (П80 - П84 - П86 - П87 - П88 - П21) | П119 | П120 |
| Расходы на рекламу, руб | П102 | 1С Планирование продаж, поле Реклама внутренняя, руб | П21 | API WB Продвижение | П129 | П130 |
| ДРР, % | П131 | расчётная | П82 | расчётная | П132 | П133 |
П97 в исходном xlsx — опечатка. Клиент подтвердил: факт ЧП = П95.
| Метрика | Показатель | Источник |
|---|---|---|
| АВС | П99 | расчётная, еженедельно |
Источник переходов и конверсий: POST /api/analytics/v3/sales-funnel/products (API WB v3) — openCount, addToCartCount, ordersCount ежедневно по nmID.
Источник показов: внешний скрапер другой команды (данные из LK WB, раздел «Воронка продаж», поле «Показы»).
Примечание: полеviews(показы) в WB API не реализовано. Реальное поле —openCount(переходы в карточку). Показы доступны только через внешний скрапер другой команды.
| Показатель | Пок. | Формула |
|---|---|---|
| CTR клик (по товару) | П18 | openCount / показы (внешний скрапер другой команды) |
| CR корзина | П135 | addToCartCount / openCount |
| CR заказ | П136 | ordersCount / openCount |
| % выкупа (по товару) | П26 | выкупы / заказы |
| Метрика | Пок. | Источник | Примечание |
|---|---|---|---|
| % отгруженного от заказа | П137 | расчётная | П155 / П45 |
| Индекс локализации | П138 | расчётная | localOrderPercent из парсинга WB Analytics (см. scraping §4.1). Средневзвешенный КТР по заказам за 13 недель |
| КТР (коэф. территориального распределения + размерная горка) | П139 | расчётная | index из таблицы соответствия left <= П138 <= right (см. scraping §4.2). Детали: WB инструкция |
| Аутоффсток | П89 | расчётная | % отсутствующих размеров от полной размерной горки артикула. Пример: горка 6 размеров, в наличии 4 → аутовсток 33% |
СПП в WB API недоступен. Источник — внешний скрапер другой команды.
Частота: раз в час (текущая практика клиента).
Хранить историчски ежедневно — необходимо для графика эластичности спроса в паспорте.
Питает: Выручка факт (П20), Выручка шт факт (П19), воронка (П18, П135, П136, П26)
POST /api/analytics/v3/sales-funnel/productsПитает: Расходы на рекламу факт (П21)
Питает: все плановые показатели и исходные плановые величины для downstream-расчётов (П67, П68, П69, П70, П71, П72–П78, П100, П102, П141, П156)
П102 используем поле Реклама внутренняя, рубПитает: СПП (П65), Показы для CTR (П18)
Питает: % проданного, ЧП%, ЧП руб, ДРР, АВС, воронка расчётные, операционные (П79, П80, П82, П89, П96, П99, П115–П133, П135–П140)
Третий блок в раскрываемой строке товара на экране РНП. Показывает исторические данные по артикулу в разрезе дней.
По умолчанию свёрнут — отображается по клику.
Строки = метрики / поля.
Колонки = дни: первая колонка после названий — сегодня, следующая — вчера, и т.д. вправо в глубину истории.
Производительность: горизонтальный виртуальный скролл с ленивой подгрузкой колонок — браузер рендерит только видимые дни, остальные подгружаются по мере прокрутки.
Пустое состояние: до выбора фильтра таблица РНП не отображается вообще — соответственно и этот блок тоже.
| Поле | Пок. | Источник | Примечание |
|---|---|---|---|
| Акция (название) | П104 | API WB Promotion | calendar/promotions + calendar/promotions/nomenclatures; название акции + статус участия для конкретного nmID |
| АВС | П99 | расчётная, еженедельно | Класс артикула на эту неделю |
| План отгрузки | — | 1С Приходный ордер | Расчётная дата: дата проведения приходного ордера + 4 дня. Поле не хранится напрямую — вычисляется при каждой загрузке. |
Текстовое поле на каждый день.
| Метрика | Пок. план | Пок. факт | Источник факт |
|---|---|---|---|
| Заказы, шт | П72 (1С Планирование продаж) | П7 | API WB v3 Sales Funnel, orderCount |
Плановая оборачиваемость (П29, П30) и связанный с ней блок в текущий MVP не входят. Возвращаемся к ним в следующих итерациях после появления устойчивого источника в 1С.
| Метрика | Пок. | Источник | |
|---|---|---|---|
| Остатки на текущий день, шт | П33 | API WB История остатков | |
| Остаток в пути | П37 | расчётная | |
| Аутоффсток | П89 | расчётная | % отсутствующих размеров от полной размерной горки |
| Метрика | Пок. | Источник |
|---|---|---|
| Цена план (текущий месяц) | П68 | 1С Планирование продаж |
| Цена план (следующий месяц) | П141 | 1С Планирование продаж |
| Цена факт | П42 | расчётная (П20 / П19) |
| % скидки (факт) | П66 | WB Reports API, supplier/orders.discountPercent |
| СПП | П65 | внешний скрапер другой команды, раз в час |
| Цена для покупателя (минус СПП) | П64 | расчётная (П42 * (1 - П65)) |
| Цена для покупателя (минус Клуб WB) | П142 | API WB |
| Метрика | Пок. план | Пок. факт |
|---|---|---|
| ВП, % | П145 (П144 / П67) | П81 |
| ВП, руб | П144 (П67 - П156) | П80 (П20 - П63) |
| Метрика | Пок. | Источник |
|---|---|---|
| Себестоимость, юани | П91 | 1С Заказ поставщику → Kafka |
| Себестоимость, руб | П62 | 1С Приобретение товаров и услуг → Kafka |
| Курс юань/руб | П90 | 1С Справочник Сезон продаж |
| Переменные на ед. | П87 | 1С Нормативы для расчета планов |
| Постоянные на ед. | П88 | 1С Нормативы для расчета планов |
| Все комиссии | П84 | расчётная (П20 * П83) |
| Налоговая нагрузка, % | П85 | 1С Нормативы для расчета планов |
| Метрика | Пок. | Источник |
|---|---|---|
| CTR клик (по товару) | П18 | openCount / показы; показы — внешний скрапер другой команды, openCount — API WB v3 Sales Funnel |
| CR корзина | П135 | addToCartCount / openCount — API WB v3 Sales Funnel |
| CR заказ | П136 | ordersCount / openCount — API WB v3 Sales Funnel |
| % выкупа (по товару) | П26 | расчётная |
| CTR клик рекламный | П150 | расчётная из API WB Продвижение |
| CPO рекламный | П153 | расчётная |
| Расходы на рекламу план | П102 | 1С Планирование продаж, поле Реклама внутренняя, руб |
| Расходы на рекламу факт | П21 | API WB Продвижение |
| Метрика | Источник |
|---|---|
| Рейтинг по отзывам (П40) | API WB v3 Sales Funnel, feedbackRating |
| Кол-во негативных отзывов | API WB |
| Расчётное кол-во для перекрытия негатива | расчётная |
Кнопки "Выгрузка новой цены" и "Выгрузка новой скидки" — inline-форма в строке истории.
Механика:
POST /api/v2/upload/task с nmId, price, discountОграничения WB:
По текущим ответам клиента механика блока акций в MVP выглядит так:
1/1 означает количество доступных акций для артикула; один артикул может участвовать одновременно в 2+ акциях100% товаров и затем добавляет участников поартикульноВ строке каждого дня (или в отдельном блоке на сегодня) отображается:
| Элемент | Описание |
|---|---|
| Название акции | Из П104 — текущая акция WB |
| Предложение WB | Рекомендованные скидка и цена для участия (из API WB акций) |
| Статус участия | Да / Нет — участвует ли товар в этой акции |
| Индикатор участия | "1/1" или аналог — количество доступных акций для артикула |
| Кнопка "Участвовать" | Менеджер вводит параметры участия; write-back идёт в WB promotion-контур |
DS-товары и акции:
Главная часть экрана РНП. Отображает список артикулов, соответствующих выбранным фильтрам.
Каждая строка — один артикул (nmID). Строка раскрывается аккордеоном в три блока:
«РНП — Паспорт товара» → «РНП — Аналитика товара» → «РНП — История товара».
Пустое состояние: пока фильтр не применён — таблица не отображается вовсе.
Колонки видимые по умолчанию (без раскрытия строки):
| Колонка | Пок. | Источник | Примечание |
|---|---|---|---|
| Фото | — | API WB Карточка товара | Первое (главное) фото, проксируется через backend |
| Артикул WB | П2 | API WB История остатков | nmID |
| Артикул поставщика | П3 | API WB История остатков | Vendor code |
| Бренд | П6 | API WB История остатков | |
| Категория 1С | П50 | 1С справочник Номенклатура | |
| Коллекция | П44 | 1С Воронка продаж | Текущая (по SCD Type 2) |
| Менеджер | П46 | 1С Воронка продаж | Текущий (по SCD Type 2) |
| ABC | П99 | расчётная, еженедельно | Бейдж: A / B / C / DS |
| Остатки, шт | П33 | API WB История остатков | На текущий день |
| Заказы, шт (факт) | П7 | API WB v3 Sales Funnel, orderCount | За выбранный период |
| Выручка, руб (факт) | П20 | API WB v3 Sales Funnel, buyoutSum | За выбранный период |
| ЧП, % (факт) | П96 | расчётная | За выбранный период |
| Цена для покупателя | П64 | расчётная (П42 * (1 - П65)) | Актуальная |
| Аутоффсток | П89 | расчётная | За выбранный период |
Клик на строку — строка раскрывается аккордеоном, под ней появляются три вложенных блока:
▼ Строка артикула (раскрыта) ├── [Паспорт товара] ← первый, раскрыт по умолчанию ├── [Аналитика товара] ← второй, свёрнут └── [История товара] ← третий, свёрнут
offset, limit, perPage (дефолтное значение уточнить при разработке)| Роль | Видит |
|---|---|
| Менеджер | Только свои артикулы (фильтр по менеджеру проставляется автоматически из RBAC) |
| РОП | Все артикулы своего отдела |
| ГД, Админ, Супер-Админ | Все артикулы |
Отдельная страница с встроенными BI-дашбордами Apache Superset.
Предназначена для аналитики в свободном формате — настройка и просмотр дашбордов без ограничений по метрикам.
Доступ: ГД, Админ, Супер-Админ.
@superset-ui/embedded-sdkUUID дашбордов хранятся в конфиге деплоя (не в БД и не в настройках системы).
Изменение набора дашбордов → изменение конфига + редеплой.
Пример структуры конфига:
superset:
dashboards:
- id: "abc123-uuid"
title: "Продажи"
- id: "def456-uuid"
title: "Остатки"
- id: "ghi789-uuid"
title: "Реклама"
WB-система не передаёт пользователей в Superset напрямую.
Доступ к дашбордам обеспечивается через Guest Token:
POST /api/internal/superset/guest-tokenPOST /api/v1/security/login)POST /api/v1/security/guest_token/ с resources: [{type: "dashboard", id: uuid}]fetchGuestToken) до его истеченияRLS не требуется — ГД, Админ и Супер-Админ видят все данные без ограничений.
Фиксируется в superset_config.py при деплое:
FEATURE_FLAGS = {
"EMBEDDED_SUPERSET": True
}
ENABLE_CORS = True
CORS_OPTIONS = {
"origins": ["https://our-app-domain.com"]
}
TALISMAN_CONFIG = {
"content_security_policy": {
"frame-ancestors": ["https://our-app-domain.com"]
}
}
Сервисный аккаунт Superset (логин/пароль для минтинга guest token) хранится в секретах backend-сервиса.
| Раздел | Менеджер | РОП | ГД | Админ | Супер-Админ |
|---|---|---|---|---|---|
| РНП | ✓ | ✓ | ✓ | ✓ | ✓ |
| BI (Superset) | — | — | ✓ | ✓ | ✓ |
| Администрирование → Сотрудники | — | — | — | ✓ | ✓ |
| Администрирование → Отделы | — | — | — | ✓ | ✓ |
| Администрирование → Настройки | — | — | — | ✓ | ✓ |
| Администрирование → Мониторинг данных | — | — | — | ✓ | ✓ |
| Администрирование → Аудит | — | — | — | ✓ | ✓ |
| Роль | Видит артикулы |
|---|---|
| Менеджер | Только свои по историческому assignment на выбранный период |
| РОП | Все артикулы своего отдела по историческому составу отдела и assignment на выбранный период |
| ГД | Все артикулы |
| Админ | Все артикулы |
| Супер-Админ | Все артикулы |
Поля скрыты от роли Менеджер, остальные видят:
| Поле | Менеджер | РОП | ГД | Админ | Супер-Админ |
|---|---|---|---|---|---|
| Себестоимость (юани / руб) | — | ✓ | ✓ | ✓ | ✓ |
| Курс юань/руб | — | ✓ | ✓ | ✓ | ✓ |
| Переменные на ед. | — | ✓ | ✓ | ✓ | ✓ |
| Постоянные на ед. | — | ✓ | ✓ | ✓ | ✓ |
| Все комиссии | — | ✓ | ✓ | ✓ | ✓ |
| Налоговая нагрузка, % | — | ✓ | ✓ | ✓ | ✓ |
| Операция | Менеджер | РОП | ГД | Админ | Супер-Админ |
|---|---|---|---|---|---|
| Изменить цену / скидку | свои | отдел | — | все | все |
| Участие в акции | свои | отдел | — | все | все |
| Объединение / разъединение карточек | свои | отдел | — | все | все |
| План действий (текстовое поле) | свои | отдел | — | все | все |
"Свои" — артикулы, назначенные менеджеру по историческому assignment на выбранный период.
"Отдел" — все артикулы менеджеров отдела по историческому составу отдела и assignment на выбранный период.
ГД — только чтение по всем артикулам.
| Действие | Менеджер | РОП | ГД | Админ | Супер-Админ |
|---|---|---|---|---|---|
| Управление пользователями | — | — | — | ✓ | ✓ |
| Назначить роль Супер-Админ | — | — | — | — | — |
| Управление отделами | — | — | — | ✓ | ✓ |
| Глобальные настройки | — | — | — | ✓ | ✓ |
| Мониторинг данных (cron / Kafka) | — | — | — | ✓ | ✓ |
| Аудит операций | — | — | — | ✓ | ✓ |
Роль Супер-Админ не назначается через UI никем — создаётся при деплое, изменить нельзя.
Всё что нам нужно получить из 1С через Kafka.
Документ — основа для постановки задачи подрядчику 1С.
Канал передачи для всех блоков: 1С → Kafka → наш ETL → DWH.
Объект 1С: Справочник Сотрудники / Физические лица
| Поле | Описание | Примечание |
|---|---|---|
| GUID сотрудника | Уникальный идентификатор в 1С | Ключ для идемпотентной синхронизации и связки с ответственными по товару |
| Фамилия, Имя, Отчество | Отображается в интерфейсе | |
| Используется как уникальный логин в системе | Целевое обязательное поле auth-контура | |
| Признак активности | Работает / Уволен | Целевое обязательное поле auth-контура |
Механика синхронизации:
GUID, отображаем ФИОemail → отправляем письмо на авторизациюemail отсутствует → пользователь создаётся, но вход недоступен до появления emailВажно: если в текущей конфигурации 1С поля email и / или признака активности ещё нет, это не снимает требование с интеграционного контракта. Для запуска целевого auth-контура эти поля должны быть добавлены в модель 1С отдельной доработкой.
Отдел сотрудника: поле отдела из 1С не передаётся. Назначение в отдел — только через UI системы (раздел «Управление отделами»). Новый сотрудник из 1С автоматически попадает в «отдел по умолчанию» (настраивается в глобальных настройках).
Объект 1С: Справочник Номенклатура
Тип загрузки: SCD Type 2 (история изменений важна)
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | П3 | Vendor code, ключ связки с WB nmID |
| Категория 1С | П50 | Не совпадает с категорией WB |
| Вид категории | П51 | |
| Товарная категория | П52 | |
| Сезон продаж | П55 | |
| Особенности модели | П53 | |
| Пол | П54 | |
| Страна происхождения | П56 | |
| Направление | П57 | |
| Группа списка | П58 | |
| Материал верха | П48 | Источник — только 1С |
| Материал подкладки | П49 | |
| Цвет материала верха | П60 | |
| Цвет | П61 | |
| Фабрика / производитель | П47 | Источник — только 1С |
| Признак «Повтор» | П59 | Да / Нет |
Объект 1С: 1С Воронка продаж
Тип загрузки: SCD Type 2 (менеджер и коллекция меняются помесячно)
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | — | Ключ привязки к номенклатуре |
| Коллекция | П44 | Например: «Осень-Зима 2025-2026» |
| Менеджер (ID сотрудника) | П46 | Один менеджер на артикул в периоде |
| Дата начала назначения | — | Нужна для SCD Type 2 |
Критично: без этого источника невозможно разграничить данные по менеджерам за прошлые периоды.
Объект 1С: 1С Планирование продаж
Тип загрузки: плановые значения на месяц, обновляются при изменении плана
| Поле | Показатель | Гранулярность |
|---|---|---|
| Выручка план, руб | П67 | Артикул × месяц |
| Выручка план, шт | П71 | Артикул × месяц |
| Цена план (текущий месяц) | П68 / П31 | Артикул × месяц |
| Цена план (следующий месяц) | П141 / П32 | Артикул × месяц |
| % проданного план | П69 | Артикул × месяц |
| % проданного план накопленный по коллекции | П70 | Коллекция × месяц |
| ЧП план, руб | П77 | Артикул × месяц |
| Себестоимость план, ед | П78 | Артикул × месяц |
| Себестоимость план (агрегат) | П156 | Артикул × месяц |
Расходы на рекламу план, руб (Реклама внутренняя, руб) | П102 | Артикул × месяц |
| Заказы план, шт | П72 | Артикул × месяц |
| Корзины план | П73 | Артикул × месяц |
| Переходы план | П74 | Артикул × месяц |
| Показы план | П75 | Артикул × месяц |
| Отгрузки план | П76 | Артикул × месяц |
| Средняя цена заказа план | П100 | Артикул × месяц |
Примечание по рекламе: для П102 фиксируем поле Реклама внутренняя, руб в 1С Планирование продаж.
Объект 1С: Документ «Приобретение товаров и услуг»
Тип загрузки: событийный — появляется при фактическом поступлении товара
Источник: только 1С → Kafka. Excel как источник себестоимости исключён.
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | — | Ключ привязки |
| Себестоимость, руб | П62 | Пустое до момента прихода товара — отображать прочерк, не ноль |
| Дата поступления | — | Нужна для исторического хранения |
⚠️ Важно для подрядчика 1С — два жизненных цикла себестоимости:
Передавать нужно только проведённые документы «Приобретение товаров и услуг», не помеченные на удаление. Неподтверждённые и черновики исключаем.
Объект 1С: Документ «Заказ поставщику»
Тип загрузки: событийный
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | — | Ключ привязки |
| Заказано, шт | П45 | Количество в заказе |
| Себестоимость в юанях | П91 | Пустое до оформления заказа — отображать прочерк, не ноль |
| Признак типа заказа | — | Новый допреквизит документа: основной заказ / дозаказ |
| Сезон заказа | — | Используем для фильтрации дозаказов только в рамках актуального сезона / коллекции |
| Дата заказа | — |
Правило для Дозаказ, шт:
1С Заказ поставщику, а не ручной вводосновной заказ / дозаказДозаказ, шт считаем у себя как сумму количества по строкам артикула во всех документах, помеченных как дозаказ, только в рамках актуального сезона / коллекцииОбъект 1С: Документ «Приходный ордер»
Как найти: через связанные документы Заказа поставщику
Тип загрузки: событийный
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | — | Ключ привязки |
| Дата проведения | — | Используется для расчёта плановой даты отгрузки: дата проведения + 4 дня |
| Количество к отгрузке, шт | — |
⚠️ Транзиентное поле: мы не храним «плановую дату отгрузки» напрямую. При каждой загрузке берём дату проведения приходного ордера, добавляем 4 дня — и вот это и есть плановая дата. Никакого отдельного поля «план отгрузки» в 1С нет.
Объект 1С: Справочник / регистр «Нормативы для расчета планов»
Тип загрузки: справочник, меняется редко
| Поле | Показатель | Примечание |
|---|---|---|
| Комиссия ВБ, % | П83 | Плановый норматив |
| Налоговая нагрузка, % | П85 | |
| Переменные расходы на ед. (без налогов, комиссии и курсовых разниц) | П87 | |
| Постоянные расходы на ед. | П88 |
Бизнес-правило выбора норматива (подтверждено клиентом, Ольга показала из 1С):
1С Справочник Номенклатура), затем берётся норматив с ближайшей датой, соответствующей категории.Объект 1С: Справочник Сезон продаж
Тип загрузки: справочник
| Поле | Показатель | Примечание |
|---|---|---|
| Курс юань / руб | П90 | Плановый курс, хранящийся в 1С; нужен для пересчёта себестоимости |
Объект 1С: Документ «Реализация товаров и услуг»
Тип загрузки: событийный
| Поле | Показатель | Примечание |
|---|---|---|
| Артикул поставщика | — | Ключ привязки; downstream-агрегация по коллекции делается уже у нас |
| Отгрузки, руб | П155 | В reference-upd.xlsx показатель описан как сумма отгрузок по коллекции |
| Дата документа | — | Нужна для исторического хранения |
Эти показатели не входят в текущий обязательный контракт 1С.
| Показатель | Пок. | Вопрос |
|---|---|---|
| Юр лицо | П5 | Источник фиксируем не в 1С, а в WB API через seller-info по токену кабинета |
| Плановая оборачиваемость 1 и 2 | П29, П30 | В текущем MVP показатели не реализуем. Post-MVP follow-up для Веры / 1С: предусмотреть место в 1С для ввода плановой оборачиваемости с нужной детализацией, датами и версионностью; отдельно проработать допкритерии, которых сейчас нет в модели 1С |
| Объект 1С | Тип | Транспорт | Хранение в DWH |
|---|---|---|---|
| Справочник Сотрудники | Справочник | Kafka | Актуальное состояние + признак активности |
| Справочник Номенклатура | Справочник | Kafka | SCD Type 2 |
| Воронка продаж (менеджер / коллекция) | Справочник | Kafka | SCD Type 2 |
| Планирование продаж | Плановый документ | Kafka | Актуальный план на месяц |
| Приобретение товаров и услуг | Транзакционный | Kafka | Исторически по дате поступления |
| Заказ поставщику | Транзакционный | Kafka | Исторически по дате |
| Приходный ордер | Транзакционный | Kafka | Дата проведения + кол-во; плановая дата = дата + 4 дня (вычисляется, не хранится) |
| Нормативы для расчета планов | Справочник | Kafka | Актуальное состояние |
| Справочник Сезон продаж | Справочник | Kafka | Актуальное состояние (курс юань/руб) |
| Реализация товаров и услуг | Транзакционный | Kafka | Исторически по дате |
Всё что нам нужно забирать из API Wildberries для РНП.
Документ — основа для постановки задач по ETL и интеграции с WB API.
Канал передачи для всех блоков: WB API → наш ETL → DWH.
reference-upd.xlsx нет Метод или есть явная пометка ? уточнить, такой элемент помечается отдельно✅ — контур и ключевые поля подтверждены официальной документацией WB через Context7; местами дополнительно подтверждены live API.⚠️ — endpoint подтверждён, но в проектном использовании есть дополнительная бизнес-оговорка, derived-логика или составной ETL-блок.➕ — контур добавлен осознанно на стороне проекта и не идёт как прямая строка из вкладки АПИ.Статус валидации: ✅
Источник: WB Seller Analytics
Метод: POST /api/analytics/v3/sales-funnel/products
Домен: seller-analytics-api.wildberries.ru
Частота: раз в день
Гранулярность: nmID × день
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| Артикул WB | П2 | nmId | НСИ |
| Артикул поставщика | П3 | vendorCode | НСИ |
| Предмет | П4 | subjectName | НСИ |
| Бренд | П6 | brandName | |
| Заказы, шт | П7 | orderCount | |
| Заказы, руб | П8 | orderSum | |
| Перешли в карточку | П9 | openCount | |
| Положили в корзину | П10 | cartCount | |
| Доля карточки в выручке | П12 | shareOrderPercent | |
| Добавили в отложенные | П13 | addToWishlist | |
| Заказали WB Club, шт | П14 | wbClub_orderCount | |
| Выкупили WB Club, шт | П15 | wbClub_buyoutCount | |
| Среднее время доставки | П16 | timeToReady | |
| Отменили, шт | П17 | cancelCount | |
| Выкупы, шт | П19 | buyoutCount | |
| Выкупы, руб | П20 | buyoutSum | |
| Рейтинг карточки | П39 | productRating | |
| Рейтинг по отзывам | П40 | feedbackRating | Средний рейтинг товара по отзывам, шкала 1–5 |
| Цена минус Club WB | П142 | wbclub_avgPrice |
Технические замечания:
reference-upd.xlsx часть НСИ также привязана к этому методу. Это допустимо, но финальный выбор источника НСИ зависит от архитектуры витрины.Статус валидации: ✅ ➕
Источник: WB API Information
Метод: GET /api/v1/seller-info
Частота: при каждой полной загрузке WB + при подключении нового токена
Гранулярность: token / seller cabinet
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| Юр лицо | П5 | tin | Рабочий идентификатор юрлица в проекте |
| Идентификатор кабинета WB | — | sellerId | Технический идентификатор кабинета / продавца |
| Название кабинета / продавца | — | name | Display-name для кабинета |
Правило использования:
seller-info и сохраняем связку token -> sellerId -> tin -> namewb_seller_id, wb_seller_tin, wb_seller_nameП5 в витрине РНП используем tin как основной атрибут юрлица, name как display nameСтатус валидации: ✅
Источник: WB Seller Analytics
Метод: POST /api/v2/stocks-report/products/products
Домен: seller-analytics-api.wildberries.ru
Частота: раз в день
Гранулярность: nmID × день
| Поле | Показатель | Поле API |
|---|---|---|
| Остатки на текущий день, шт | П33 | stockCount |
| Стоимость остатков на текущий день | П34 | stockSum |
Статус валидации: ✅
Источник: WB Seller Analytics
Метод: POST /api/analytics/v1/stocks-report/wb-warehouses
Домен: seller-analytics-api.wildberries.ru
Частота: раз в день
Гранулярность: nmID × день
| Поле | Показатель | Поле API |
|---|---|---|
| В пути к клиенту | П35 | inWayToClient |
| В пути от клиента | П36 | inWayFromClient |
Статус валидации: ✅
Источник: WB Seller Analytics
Метод: POST /api/v2/stocks-report/offices
Домен: seller-analytics-api.wildberries.ru
Частота: раз в день
Гранулярность: nmID × офис × день
| Поле | Показатель | Поле API |
|---|---|---|
| Остатки по складам | П107 | stockCount |
Статус валидации: ⚠️
Источник: WB Content API
Метод: POST /content/v2/get/cards/list
Домен: content-api.wildberries.ru
Частота: раз в день
Гранулярность: nmID
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| Картинка | П22 | cards_photos | Храним URL / прокси-ссылку, не бинарник |
| Ярлык | П24 | tags | НСИ |
| Дата создания карточки WB | — | created_at | Технический атрибут карточки, храним отдельно как wb_card_created_at |
Правило для П38:
П38 не читаем напрямую из WB API.created_at используем только как технический атрибут карточки WB и сохраняем в модели товара отдельно.П38 считаем на нашей стороне по ежедневным снимкам остатков как первую дату, когда мы увидели stockCount > 0.wb_card_created_at >= Y, то при первом снимке с stockCount > 0 записываем дату снимка в П38.wb_card_created_at < Y, то П38 автоматически не заполняем.П38 не перезаписывается.Статус валидации: ✅
Источник: WB Продвижение
Метод: GET /adv/v1/upd
Домен: advert-api.wildberries.ru
Частота: раз в день
Гранулярность: зависит от рекламной сущности WB, в витрине агрегируется до товара / периода
| Поле | Показатель | Поле API |
|---|---|---|
| Расходы на рекламу, ₽ | П21 | updSum |
Статус валидации: ✅
Источник: WB Продвижение
Метод: GET /adv/v3/fullstats
Домен: advert-api.wildberries.ru
Частота: раз в день
Гранулярность: зависит от рекламной сущности WB, в витрине агрегируется до товара / периода
| Поле | Показатель | Поле API |
|---|---|---|
| Рекламные показы | П146 | views |
| Рекламные переходы | П147 | clicks |
| Рекламные корзины | П148 | atbs |
| Рекламные заказы | П149 | orders |
Статус валидации: ✅
Источник: WB Statistics API
Метод: GET /api/v1/supplier/orders
Домен: statistics-api.wildberries.ru
Частота: не зафиксирована в workbook
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| % скидки | П66 | discountPercent | Официально задокументированное поле WB Reports API |
Статус валидации: ✅
Источник: WB Promotion
Метод: GET /api/v1/calendar/promotions
Домен: dp-calendar-api.wildberries.ru
Частота: раз в день
Гранулярность: акция × период
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| Акция (название) | П104 | name | Список акций в заданном периоде |
Назначение в РНП:
id как вход в следующий метод проверки номенклатурСтатус валидации: ✅
Источник: WB Promotion
Метод: GET /api/v1/calendar/promotions/nomenclatures
Домен: dp-calendar-api.wildberries.ru
Частота: раз в день
Гранулярность: promotionID × nmID
| Поле | Показатель | Поле API | Примечание |
|---|---|---|---|
| Статус участия в акции | П104 | inAction | Участвует ли конкретный nmID в акции |
| Текущая цена в акции | П104 | price | Для UI и проверки write-back |
| Плановая цена акции | П104 | planPrice | Предложение WB по цене |
| Текущая скидка | П104 | discount | Текущая скидка в акции |
| Плановая скидка акции | П104 | planDiscount | Предложение WB по скидке |
Правило использования:
calendar/promotions и получаем promotionID, name, даты акцииpromotionID читаем calendar/promotions/nomenclaturesnmID найден и inAction=true, считаем, что товар участвует в акции с именем из первого методаОграничение WB:
calendar/promotions/nomenclatures не применим к автоакциямСтатус валидации: ✅
Источник: WB Seller Analytics
Метод: GET /api/v1/analytics/region-sale
Домен: seller-analytics-api.wildberries.ru
Частота: не зафиксирована в workbook
| Поле | Показатель | Поле API |
|---|---|---|
| Продажи по регионам / ЦФО | П108 | saleItemInvoiceQty |
Статус валидации: ✅
Источник: WB Reports
Точка входа в workbook: getMeasurementPenalties
| Поле | Показатель | Примечание |
|---|---|---|
| Штрафы | П103 | В workbook указано, что одного метода недостаточно: нужно суммировать ещё 4 метода из этого же раздела |
Зафиксированный состав ETL:
Retention Reports документации WB сейчас перечислены 5 методовШтрафы логично собирать все 5 денежных отчётов удержаний, так как даже warehouse-measurements содержит денежные поля удержания:GET /api/analytics/v1/measurement-penalties → поле penaltyAmountGET /api/analytics/v1/deductions → поле bonusSummGET /api/v1/analytics/antifraud-details → поле details[].sumGET /api/v1/analytics/goods-labeling → поле amountGET /api/analytics/v1/warehouse-measurements → поле penaltyAmount ; дополнительно в ответе есть reversalAmountПравило агрегации по умолчанию:
warehouse-measurements по умолчанию берём penaltyAmountreversalAmount не включаем автоматически в метрику Штрафы, пока бизнес отдельно не подтвердит, что показатель должен считаться неттоПроверено живым API:
GET /api/v1/analytics/antifraud-details реально возвращает массив details[] с денежным полем sumGET /api/analytics/v1/measurement-penalties реально возвращает data.reports[] с полями penaltyAmount и reversalAmountЭто строки из вкладки АПИ, которые пока не образуют готовый ETL-контур.
| Показатель | Причина |
|---|---|
| Дата | Это системная дата, не API |
| Ссылка | В workbook прямо указано: нет в API, расчёт через артикул |
| Заказали шт | В рамках текущего проекта источник зафиксирован как внешний парсер другой команды |
| Заказали на сумму руб | В рамках текущего проекта источник зафиксирован как внешний парсер другой команды |
| Выкупили шт | В рамках текущего проекта источник зафиксирован как внешний парсер другой команды |
| Выкупили на сумму руб | В рамках текущего проекта источник зафиксирован как внешний парсер другой команды |
| Цена минус СПП | Расчётный показатель |
| Комиссия ВБ, % | Источник — 1С Нормативы для расчета планов, не WB API |
| Контур | Источник | Метод | Частота |
|---|---|---|---|
| Sales Funnel v3 | Seller Analytics | /api/analytics/v3/sales-funnel/products | раз в день ✅ |
| Seller Info | API Information | /api/v1/seller-info | при полной загрузке / новый токен ✅ ➕ |
| Stocks products | Seller Analytics | /api/v2/stocks-report/products/products | раз в день ✅ |
| Stocks wb-warehouses | Seller Analytics | /api/analytics/v1/stocks-report/wb-warehouses | раз в день ✅ |
| Stocks offices | Seller Analytics | /api/v2/stocks-report/offices | раз в день ✅ |
| Content cards | Content API | /content/v2/get/cards/list | раз в день ⚠️ |
| Adv finance | Продвижение | /adv/v1/upd | раз в день ✅ |
| Adv fullstats | Продвижение | /adv/v3/fullstats | раз в день ✅ |
| Promotions calendar | Promotion | /api/v1/calendar/promotions | раз в день ✅ |
| Promotions nomenclatures | Promotion | /api/v1/calendar/promotions/nomenclatures | раз в день ✅ |
| Supplier orders | Statistics API | /api/v1/supplier/orders | уточнить ✅ |
| Region sale | Seller Analytics | /api/v1/analytics/region-sale | уточнить ✅ |
| Penalties block | Reports | несколько методов | уточнить ✅ |
Всё что нам нужно получать не через официальные API, а через парсинг / скрапинг.
Документ — основа для постановки задач по non-API интеграциям для РНП.
Часть этих данных будет поступать не из нашей реализации, а из готового скрапера / парсеров другой команды.
Канал передачи для всех блоков: Внешний скрапер / парсер другой команды → наш ETL → DWH.
reference-upd.xlsx основной источник не APIИсточник: парсинг WB Seller (неофициальный endpoint)
Причина: поле "Показы" отсутствует в официальном WB OpenAPI; данные берутся из внутреннего аналитического endpoint'а WB Seller
Метод: POST https://seller-content.wildberries.ru/ns/analytics-api/content-analytics/api/v1/sales-funnel/report/product/history
Частота: раз в день (забираем сегодня + вчера; вчера — финальные данные, сегодня — меняются в течение дня)
Гранулярность: nmID × день
Тело запроса:
{
"nmID": 820630478,
"currentPeriod": {
"start": "2026-04-05",
"end": "2026-04-11"
}
}
Ключевые поля ответа (data[].*):
| Поле | Показатель | Примечание |
|---|---|---|
date | П1 | Дата отчёта |
viewCount.current | П11 | Показы — база для CTR и воронки |
openCardCount.current | П9 | Перешли в карточку |
addToCartCount.current | П10 | Положили в корзину |
addToWishlistCount.current | П13 | Добавили в отложенные |
viewToOpenConversion.current | — | CTR переход в карточку, % |
openToCartConversion.current | — | Конверсия корзина, % |
cartToOrderConversion.current | — | Конверсия заказ, % |
orderCount.current | П7 | Заказы, шт |
orderSum.current | П8 | Заказы, руб |
buyoutSum.current | П20 | Выкупы, руб |
buyoutCount.current | П19 | Выкупы, шт |
cancelSum.current | — | Отмены, руб |
cancelCount.current | П17 | Отмены, шт |
buyoutPercent.current | — | % выкупа |
wbClub.orderCount.current | П14 | Заказили WB Club, шт |
wbClub.orderSum.current | — | Заказили WB Club, руб |
wbClub.buyoutSum.current | — | Выкупили WB Club, руб |
wbClub.buyoutCount.current | П15 | Выкупили WB Club, шт |
wbClub.cancelSum.current | — | Отмены WB Club, руб |
wbClub.cancelCount.current | — | Отмены WB Club, шт |
wbClub.buyoutPercent.current | — | % выкупа WB Club |
Стратегия сбора:
nmIDАвторизация:
authorizev3 и wb-seller-lk (JWT-токены)Использование downstream:
openCardCount.current / viewCount.currentИсточник: парсинг WB Seller (неофициальный endpoint)
Причина: СПП отсутствует в официальном WB OpenAPI; данные берутся из внутреннего endpoint'а WB Discounts & Prices
Метод: POST https://discounts-prices.wildberries.ru/ns/dp-api/discounts-prices/suppliers/api/v1/list/goods/filter
Частота: раз в час
Гранулярность: nmID × timestamp
Тело запроса:
{
"limit": 50,
"offset": 0,
"facets": [],
"filterWithoutPrice": false,
"filterWithLeftovers": false,
"filterWithoutCompetitivePrice": false,
"sort": "price",
"sortOrder": 0
}
Ключевые поля ответа (data.listGoods[].*):
| Поле | Показатель | Примечание |
|---|---|---|
nmID | П2 | Ключ связки с товаром |
discountOnSite | П65 | СПП, % — значение в процентах |
prices | — | Массив базовых цен (по размерам) |
discountedPrices | — | Массив цен со скидкой |
clubDiscountedPrices | — | Массив цен со скидкой WB Club |
discount | — | Общая скидка, % |
competitivePrice | — | Конкурентная цена |
promotions[] | — | Список акций, в которых участвует товар |
Стратегия сбора:
limit / offset — нужно проходить весь каталогАвторизация:
authorizev3 и wb-seller-lk (JWT-токены)Использование downstream:
П42 * (1 - П65)Источник: тот же endpoint, что и раздел 1 — парсинг WB Seller
Причина: эти показатели берутся из того же ответа /sales-funnel/report/product/history, что и Показы
| Поле | Показатель | Ключ в ответе |
|---|---|---|
| Заказали шт | П109 | orderCount.current |
| Заказали на сумму руб | П110 | orderSum.current |
| Выкупили шт | П111 | buyoutCount.current |
| Выкупили на сумму руб | П112 | buyoutSum.current |
Примечание: отдельный запрос не нужен — данные приходят в том же ответе, что и Показы (раздел 1).
Отличие П109–П112 от П7, П8, П19, П20:
orderCount), П8 (orderSum), П19 (buyoutCount), П20 (buyoutSum) — берутся из официального WB API POST /api/analytics/v3/sales-funnel/products (домен seller-analytics-api.wildberries.ru)orderCount.current), П110 (orderSum.current), П111 (buyoutCount.current), П112 (buyoutSum.current) — берутся из неофициального парсинг-endpoint'а POST /ns/analytics-api/content-analytics/api/v1/sales-funnel/report/product/history (домен seller-content.wildberries.ru).current за каждый деньИсточник: парсинг WB Seller (неофициальные endpoint'ы)
Причина: ИЛ и КТР недоступны через официальный WB OpenAPI; данные берутся из внутренних аналитических endpoint'ов WB Seller
Метод: POST https://seller-content.wildberries.ru/ns/analytics-api/content-analytics/api/v1/localization/report-by-nm
Частота: раз в день
Гранулярность: nmID × день
Тело запроса:
{
"nmIDs": [],
"subjectID": 0,
"brand": "",
"tagID": 0,
"start": "2026-04-05",
"end": "2026-04-11",
"limit": 50,
"offset": 0,
"orderBy": {"field": "nonLocalOrderCount", "mode": "desc"},
"stockType": ""
}
Ключевые поля ответа (data[].*):
| Поле | Показатель | Примечание |
|---|---|---|
nmID | П2 | Ключ связки с товаром |
localOrderPercent | П138 | Индекс локализации, % |
Метод: POST https://seller.wildberries.ru/ns/categories-info/suppliers-portal-analytics/api/v1/localization-list
Частота: раз в день
Гранулярность: справочник (обновляется раз в день)
Формат ответа (data.indexts[]):
{
"index": 0.5,
"left": 95,
"right": 100,
"pricePercent": 0
}
Правило расчёта П139:
localOrderPercent (П138) для конкретного nmID из endpoint'а 4.1indexts[], где left <= localOrderPercent <= right (включительно)index найденной записи = КТР для данного товараАвторизация:
authorizev3 и wb-seller-lk (JWT-токены)| Контур | Источник | Частота | Статус |
|---|---|---|---|
| Показы + воронка + нишевые метрики | парсинг WB Seller (/sales-funnel/report/product/history) | раз в день (сегодня + вчера) | обязательный |
| СПП | парсинг WB Discounts & Prices (/list/goods/filter) | раз в час | обязательный |
| Индекс локализации (ИЛ) | парсинг WB Seller (/localization/report-by-nm) | раз в день | обязательный |
| КТР | парсинг WB Seller (/localization-list) + расчёт по диапазону | раз в день | обязательный |
Единый source of truth по показателям РНП, которые реально входят в MVP по листу MVP пояснения из reference-upd.xlsx.
Документ отвечает на три вопроса:
ЧП, руб на листе MVP пояснения есть опечатка: указан П97, но в проекте используем П95. Это уже зафиксировано в «РНП — Короткий отчёт» и «РНП — Аналитика товара».П109–П112 (Заказали/Выкупили из нишевой аналитики) в MVP по листу MVP пояснения не участвуют. Они остаются отдельным внешним парсерным контуром и в эту карту не входят.метрики, меры и показатели и АПИ. В этой карте фиксируется уже выбранный проектный контракт, а не все исторические варианты из xlsx.fixed — источник и правило достаточно определены для реализации.tech — бизнес-смысл уже понятен, но остаётся техническое уточнение по маппингу/формуле.| П | Показатель | Где используется | Как берём | Статус |
|---|---|---|---|---|
| П1 | Дата | Фильтры | Дата ежедневного WB-снимка остатков; ось периода в витрине РНП | fixed |
| П2 | Артикул WB | Фильтры, Паспорт | WB daily product snapshot; в текущем API-контуре технически забираем через Sales Funnel v3, поле nmId | fixed |
| П3 | Артикул поставщика | Фильтры, Паспорт | WB daily product snapshot; в текущем API-контуре технически забираем через Sales Funnel v3, поле vendorCode | fixed |
| П4 | Предмет / категория WB | Паспорт | WB daily product snapshot; в текущем API-контуре технически забираем через Sales Funnel v3, поле subjectName | fixed |
| П5 | Юр лицо | Паспорт | GET /api/v1/seller-info, поле tin; один токен WB = одно юр лицо, во все WB-данные прокидываем атрибут кабинета токена | fixed |
| П6 | Бренд | Паспорт | WB daily product snapshot; в текущем API-контуре технически забираем через Sales Funnel v3, поле brandName | fixed |
| П7 | Заказы, шт | История | POST /api/analytics/v3/sales-funnel/products, поле orderCount | fixed |
| П19 | Выкупы, шт | Короткий отчёт, Аналитика | POST /api/analytics/v3/sales-funnel/products, поле buyoutCount | fixed |
| П20 | Выкупы, руб | Короткий отчёт, Аналитика | POST /api/analytics/v3/sales-funnel/products, поле buyoutSum | fixed |
| П21 | Расходы на рекламу, ₽ факт | Аналитика, История | GET /adv/v1/upd, поле updSum | fixed |
| П157 | Затраты на рекламную кампанию, ₽ факт | Аналитика, История | АПИ ВБ. Продвижение, поле sum; по смыслу совпадает с П21 — фактические затраты на рекламу | fixed |
| П33 | Остатки на текущий день, шт | История | POST /api/v2/stocks-report/products/products, поле stockCount | fixed |
| П40 | Рейтинг по отзывам | Паспорт, История | POST /api/analytics/v3/sales-funnel/products, поле feedbackRating | fixed |
| П66 | % скидки факт | История | GET /api/v1/supplier/orders, поле discountPercent | fixed |
| П103 | Штрафы | Аналитика | Агрегат по блоку retention reports WB; в «Требования к данным из API WB» зафиксировано суммирование денежных полей по 5 отчётам | fixed |
| П104 | Акция | История | Двухшаговый WB promotion-контур: GET /api/v1/calendar/promotions для списка акций и GET /api/v1/calendar/promotions/nomenclatures для проверки участия конкретного nmID и параметров акции | fixed |
| П142 | Цена минус Club WB | История | POST /api/analytics/v3/sales-funnel/products, поле wbclub_avgPrice | fixed |
| П | Показатель | Где используется | Как берём | Статус |
|---|---|---|---|---|
| П44 | Коллекция | Фильтры, Паспорт | 1С Воронка продаж; храним как SCD Type 2 по артикулу поставщика и периоду | fixed |
| П45 | Заказано, шт | Паспорт | 1С Заказ поставщику | fixed |
| П46 | Менеджер | Фильтры | 1С Воронка продаж; храним как SCD Type 2 по артикулу поставщика и периоду | fixed |
| П47 | Фабрика | Паспорт | 1С Справочник Номенклатура | fixed |
| П48 | Материал верха | Паспорт | 1С Справочник Номенклатура | fixed |
| П50 | Категория 1С | Фильтры, Паспорт | 1С Справочник Номенклатура | fixed |
| П55 | Сезон продаж | Фильтры, Паспорт | 1С Справочник Номенклатура | fixed |
| П59 | Повтор | Паспорт | 1С Справочник Номенклатура | fixed |
| П62 | Себестоимость, руб | Паспорт, История | 1С Приобретение товаров и услуг; появляется после фактического поступления товара | fixed |
| П67 | Выручка план | Короткий отчёт, Аналитика | 1С Планирование продаж | fixed |
| П68 | Цена план текущего месяца | Аналитика, История | 1С Планирование продаж | fixed |
| П69 | % проданного план | Короткий отчёт, Аналитика | 1С Планирование продаж | fixed |
| П71 | План шт | Аналитика | 1С Планирование продаж | fixed |
| П72 | План заказы шт | История | 1С Планирование продаж | fixed |
| П77 | План ЧП | Короткий отчёт, Аналитика | 1С Планирование продаж | fixed |
| П85 | Налоговая нагрузка, % | История | 1С Нормативы для расчета планов | fixed |
| П87 | Переменные расходы на ед. | История | 1С Нормативы для расчета планов | fixed |
| П88 | Постоянные расходы на ед. | История | 1С Нормативы для расчета планов | fixed |
| П90 | Курс | История | 1С Справочник Сезон продаж | fixed |
| П91 | Себестоимость, юани | Паспорт, История | 1С Заказ поставщику | fixed |
| П102 | Расходы на рекламу, ₽ план | Аналитика, История | 1С Планирование продаж, поле Реклама внутренняя, руб | fixed |
| П141 | Цена план следующего месяца | История | 1С Планирование продаж | fixed |
| П | Показатель | Где используется | Как берём | Статус |
|---|---|---|---|---|
| П65 | СПП | История, зависимости для П64 и графика эластичности | Ждём готовую реализацию от другой команды; на нашей стороне только приём, ETL и хранение истории | fixed |
Связанные зависимости вне MVP-таблицы:
П11 Показы не отображается отдельной строкой в MVP, но нужен для расчёта П18 и П134.П109–П112 остаются вне MVP, хотя тоже приходят из готового парсера другой команды.| П | Показатель | Где используется | Как считаем | Статус |
|---|---|---|---|---|
| П18 | CTR клик (по товару) | Аналитика | openCount / Показы, где openCount приходит из Sales Funnel v3, а Показы — из внешнего скрапера | fixed |
| П26 | % выкупа (по товару) | Аналитика | П19 / П7 | fixed |
| П37 | Остаток в пути | История | П35 + П36 = В пути к клиенту + В пути от клиента | fixed |
| П79 | Факт % проданного | Короткий отчёт, Аналитика | П19 / П45 (выкупы шт / заказано шт) | fixed |
| П81 | Валовая рентабельность факт | Фильтры, История | Валовая финансовая модель РНП; в фильтрах уже зафиксирована формула (Выручка - Себестоимость - Переменные расходы) / Выручка | fixed |
| П82 | ДРР факт | Аналитика | Расчётная метрика DWH на основе рекламных расходов факт и выручки | fixed |
| П84 | Все комиссии | История | П20 * П83 | fixed |
| П89 | Аутоффсток | Аналитика, История | Алгоритм уже согласован; считаем в DWH по размерной горке артикула | fixed |
| П99 | ABC | Фильтры, Аналитика | Алгоритм ABC уже согласован; считаем в DWH еженедельно | fixed |
| П113 | Количество дней на сайте | Фильтры, Паспорт | Считаем количество дат, в которые товар был в остатках, а не сегодня - дата первого появления | fixed |
| П134 | CTR клик (по коллекции) | История | Переходы по этой коллекции / Показы по этой коллекции | fixed |
| П135 | CTR корзина | Аналитика, История | Корзины по этой коллекции / Переходы по этой коллекции | fixed |
| П136 | CTR заказ | Аналитика, История | Заказы по этой коллекции / Корзины по этой коллекции | fixed |
| П137 | % отгруженного | Аналитика | П155 / П45 | fixed |
| П138 | Индекс локализации | Аналитика | Парсинг POST /ns/analytics-api/content-analytics/api/v1/localization/report-by-nm, поле localOrderPercent | fixed |
| П139 | КТР | Аналитика | Парсинг POST /ns/categories-info/suppliers-portal-analytics/api/v1/localization-list; index из записи где left <= П138 <= right | fixed |
| П150 | CTR клик рекламный | История | П147 / П146 | fixed |
| П153 | CPO | История | П157 / П149 | fixed |
| П154 | % выкупа (по коллекции) | История | Выкупы по этой коллекции / Заказы по этой коллекции | fixed |
| П | Показатель | Где используется | Как считаем | Статус |
|---|---|---|---|---|
| П42 | Цена факт | Аналитика, История | П20 / П19 | fixed |
| П64 | Цена минус СПП | История | П42 * (1 - П65); если П65 = 33%, то цена 99 превращается в 66 | fixed |
| П80 | Валовая прибыль факт | История | П20 - П63, где П63 = П62 * П19 | fixed |
| П95 | Чистая прибыль факт | Короткий отчёт, Аналитика | П80 - П84 - П86 - П87 - П88 - П21 по формуле workbook | fixed |
| П96 | Рентабельность по ЧП факт | Аналитика | П95 / П20 | fixed |
| П115 | Выполнение плана выручка | Короткий отчёт, Аналитика | П20 / П67, где П20 агрегируется по текущему фильтру / коллекции | fixed |
| П116 | Дельта выручка | Короткий отчёт, Аналитика | П20 - П67 | fixed |
| П117 | Выполнение плана % проданного | Короткий отчёт, Аналитика | П79 / П69 | fixed |
| П118 | Дельта % проданного | Короткий отчёт, Аналитика | П79 - П69 | fixed |
| П119 | Выполнение плана чистая прибыль | Короткий отчёт, Аналитика | П95 / П77 | fixed |
| П120 | Дельта чистая прибыль | Короткий отчёт, Аналитика | П95 - П77 | fixed |
| П121 | % участия в акциях | Короткий отчёт | (сумма заказов по товарам, участвовавшим хотя бы в одной акции) / (сумма всех заказов) * 100; для одной даты используем rolling окно 7 дней, для диапазона — выбранный период; менеджер считает по своим товарам, РОП — по товарам сотрудников | fixed |
| П122 | Мотивация менеджера | Короткий отчёт | Квартальная метрика по всем коллекциям: K = 0.7 (П20 / П67) + 0.3 (П80 / П144); шкала бонуса 95% -> 50k, 100% -> 100k, 105% -> 150k; при перевыполнении > 5% добавляется ещё 50k. Отдельный бонус: 5% * (П157 - П102) при положительной разнице (экономия на рекламе) | fixed |
| П123 | Выполнение плана количество | Аналитика | П19 / П71 | fixed |
| П124 | Дельта количество | Аналитика | П19 - П71 | fixed |
| П125 | Выполнение плана средний чек | Аналитика | П42 / П68 | fixed |
| П126 | Дельта средний чек | Аналитика | П42 - П68 | fixed |
| П127 | Выполнение плана рентабельность ЧП% | Аналитика | П96 / П140 | fixed |
| П128 | Дельта ЧП% | Аналитика | П96 - П140 | fixed |
| П129 | Выполнение плана по рекламе | Аналитика | П21 / П102 | fixed |
| П130 | Дельта реклама | Аналитика | П21 - П102 | fixed |
| П131 | ДРР план | Аналитика | П102 / П67 | fixed |
| П132 | Выполнение плана ДРР% | Аналитика | П82 / П131 | fixed |
| П133 | Дельта ДРР% | Аналитика | П82 - П131 | fixed |
| П140 | ЧП% план | Аналитика | П77 / П67 | fixed |
| П144 | Валовая прибыль план | История | П67 - П156 | fixed |
| П145 | Валовая рентабельность план | История | П144 / П67 | fixed |
| П | Показатель | Где используется | Что зафиксировано сейчас | Статус |
|---|---|---|---|---|
| П29 | Плановая оборачиваемость 1 | История | Вынесено из текущего MVP; post-MVP направление — перенос в 1С с отдельной проработкой структуры хранения | future |
| П30 | Плановая оборачиваемость 2 | История | Вынесено из текущего MVP; post-MVP направление — перенос в 1С с отдельной проработкой структуры хранения | future |
| П114 | Достижение параметров оборачиваемости | Фильтры | Вынесено из текущего MVP; в РНП сейчас не показываем, вернёмся после появления устойчивого источника П29/П30 | future |
Это важные элементы интерфейса РНП, которые присутствуют на листе MVP пояснения, но не имеют собственного номера показателя:
| Элемент | Где используется | Источник / решение |
|---|---|---|
| Фото товара | Паспорт, таблица РНП | WB Content API, главное фото карточки |
| Дозаказ, шт | Паспорт | 1С Заказ поставщику; считаем как сумму количества по строкам документов с признаком дозаказ только по актуальному сезону / коллекции |
| Эластичность спроса | Паспорт | График строится на истории П7, П42, П65, П142 |
| История изменений карточки | Паспорт | Собственный audit-log по дельтам ежедневных снимков карточки WB |
| Объединение / разъединение карточек | Паспорт | Write-back через WB API, отдельный функциональный контур |
| План действий | История | Редактируемое текстовое поле внутри нашей системы |
| План отгрузки | История | 1С Приходный ордер + 4 дня |
| Выгрузка новой цены / скидки | История | Write-back в WB API |
| Предложение WB по акции | История | WB promotion-контур: GET /api/v1/calendar/promotions + GET /api/v1/calendar/promotions/nomenclatures |
| Статус участия в акции / кнопка "Участвовать" | История | Write-back в WB promotion-контур |
| Кол-во негативных отзывов / расчёт перекрытия | История | Отдельная логика поверх отзывов; в текущем MVP не формализована в номерной метрике |
Целевое состояние данных для системы в целом:
Из этого документа сознательно исключены подвешенные блоки, вынесенные из текущего контура:
П29, П30 — плановая оборачиваемость;П114 — достижение параметров оборачиваемости;future-элементы.Базовый вариант: PostgreSQL + ClickHouse.
PG — operational state, auth, admin, mutable entities.CH — история, снапшоты, факты, derived-метрики, витрины.PG в CH, если это упрощает сборку витрин.product_bk = wb_seller_tin + vendor_code.vendor_code остаётся пользовательским и интеграционным идентификатором, но в модели CH не считаем его глобально уникальным сам по себе.nm_id — карточка WB, imt_id — группа карточек WB.collection и manager храним как SCD Type 2.SCD Type 2.wb_card_created_at — отдельный технический атрибут карточки WB.П38 не читается напрямую из WB API, а считается по нашим daily stock snapshots.CH, не в operational-слое.email считаем уникальным логином, если он заполнен.deleted_at -> employment_status=fired -> is_blocked=true -> active=false -> иначе вход разрешён.PG_DEPARTMENTS.head_user_id может ссылаться только на пользователя того же отдела с ролью РОП; поле остаётся nullable.CH хранят минимальный lineage: ingest_batch_id, pipeline_run_id, source_meta_json, loaded_at.source_meta_json кладём source-specific lineage: Kafka topic/partition/offset/event_id, file name для выгрузок или request context для API-загрузок.SCD: прошлые периоды показываем по историческому assignment и историческому составу отдела, а не по текущему состоянию оргструктуры.Это сущности, которые лучше держать в PG, потому что они часто мутируют, требуют точечных update/delete, участвуют в auth/RBAC или являются operational state.
erDiagram
PG_ROLES {
string code PK
string name
boolean is_system
datetime created_at
datetime updated_at
}
PG_DEPARTMENTS {
bigint id PK
boolean active
string name
bigint head_user_id FK
boolean is_default
datetime created_at
datetime updated_at
datetime deleted_at
}
PG_USERS {
bigint id PK
string employee_guid_1c UK
boolean active
string lastname
string firstname
string middlename
string full_name
string email UK
string password_hash
datetime password_changed_at
string role_code FK
bigint department_id FK
string employment_status
boolean is_blocked
datetime invited_at
datetime last_login_at
datetime created_at
datetime updated_at
datetime deleted_at
}
PG_USER_SESSIONS {
string session_id PK
bigint user_id FK
string refresh_token_hash
string ip
string user_agent
datetime expires_at
datetime revoked_at
datetime created_at
}
PG_PASSWORD_RESET_TOKENS {
string token_id PK
bigint user_id FK
string token_hash
datetime expires_at
datetime used_at
datetime created_at
}
PG_AUTH_LOGIN_ATTEMPTS {
bigint id PK
bigint user_id FK
string email
string ip
string user_agent
string outcome
string failure_reason
datetime created_at
}
PG_PASSWORD_RESET_REQUESTS {
bigint id PK
bigint user_id FK
string email
string ip
string request_status
datetime created_at
}
PG_CORE_SETTINGS {
bigint id PK
bigint default_department_id FK
int password_reset_ttl_minutes
int admin_audit_retention_days
int monitoring_feed_depth_days
bigint updated_by_user_id FK
datetime updated_at
}
PG_DYNAMIC_SETTINGS {
string key PK
string value_type
json value_json
bigint updated_by_user_id FK
datetime updated_at
}
PG_EXTERNAL_SERVICE_TOKENS {
bigint id PK
string service_code
string label
string secret_ref
boolean is_active
datetime rotated_at
datetime created_at
datetime updated_at
}
PG_WB_CABINETS {
bigint id PK
bigint external_service_token_id FK
string seller_id
string tin
string name
boolean is_active
datetime synced_at
datetime created_at
datetime updated_at
}
PG_ADMIN_AUDIT_LOG {
bigint id PK
bigint actor_user_id FK
string action_type
string entity_type
string entity_id
json before_payload
json after_payload
datetime created_at
}
PG_WRITEBACK_JOBS {
bigint id PK
string job_type
string target_system
string status
string idempotency_key
string external_task_id
bigint requested_by_user_id FK
int retry_count
datetime next_retry_at
string error_code
datetime locked_at
string worker_id
string resync_status
json request_payload
json response_payload
datetime created_at
datetime finished_at
}
PG_WRITEBACK_JOB_ITEMS {
bigint id PK
bigint job_id FK
bigint nm_id
bigint imt_id_before
bigint imt_id_after
string result_status
string error_code
string error_text
string external_item_id
string resync_status
datetime created_at
}
PG_PRODUCT_ACTION_PLANS {
bigint id PK
bigint nm_id
date plan_date
bigint author_user_id FK
text plan_text
datetime created_at
datetime updated_at
}
PG_ETL_PIPELINE_STATUS {
bigint id PK
string pipeline_code
string last_status
datetime last_started_at
datetime last_finished_at
int duration_sec
datetime next_run_at
datetime data_watermark_at
int freshness_lag_minutes
bigint processed_rows
bigint rejected_rows
bigint skipped_rows
bigint duplicate_rows
string error_message
datetime updated_at
}
PG_SOURCE_SYNC_STATUS {
bigint id PK
string source_system
string source_entity
string sync_status
datetime last_success_at
datetime data_watermark_at
int freshness_lag_minutes
bigint processed_rows
bigint rejected_rows
bigint skipped_rows
bigint duplicate_rows
string error_message
datetime updated_at
}
PG_INTEGRATION_INBOX {
bigint id PK
string source_system
string event_type
string entity_type
string entity_key
string processing_status
json payload
datetime event_time
datetime processed_at
}
PG_INTEGRATION_FAILED_EVENTS {
bigint id PK
bigint inbox_event_id FK
string source_system
string event_type
string entity_type
string entity_key
string failure_stage
string error_code
string error_text
json payload
datetime failed_at
}
PG_INTEGRATION_PIPELINE_RUNS {
bigint id PK
string pipeline_code
string run_status
int processed_events
int failed_events
string error_code
string error_text
datetime started_at
datetime finished_at
}
PG_ROLES ||--o{ PG_USERS : grants
PG_DEPARTMENTS ||--o{ PG_USERS : has_users
PG_DEPARTMENTS ||--o{ PG_CORE_SETTINGS : default_for_new_users
PG_USERS ||--o{ PG_USER_SESSIONS : owns
PG_USERS ||--o{ PG_PASSWORD_RESET_TOKENS : receives
PG_USERS ||--o{ PG_AUTH_LOGIN_ATTEMPTS : attempts
PG_USERS ||--o{ PG_PASSWORD_RESET_REQUESTS : requests_reset
PG_USERS ||--o{ PG_ADMIN_AUDIT_LOG : acts
PG_USERS ||--o{ PG_WRITEBACK_JOBS : requests
PG_WRITEBACK_JOBS ||--o{ PG_WRITEBACK_JOB_ITEMS : contains
PG_USERS ||--o{ PG_PRODUCT_ACTION_PLANS : authors
PG_USERS ||--o{ PG_CORE_SETTINGS : updates
PG_USERS ||--o{ PG_DYNAMIC_SETTINGS : updates
PG_EXTERNAL_SERVICE_TOKENS ||--o{ PG_WB_CABINETS : identifies
Это слой исторических измерений и текущего аналитического контекста товара.
erDiagram
CH_DIM_PRODUCT_SCD {
bigint product_sk PK
string product_bk
string vendor_code
bigint nm_id
bigint imt_id
string wb_seller_tin
string wb_seller_name
string brand_name
string subject_name
datetime wb_card_created_at
datetime valid_from
datetime valid_to
boolean is_current
}
CH_DIM_PRODUCT_ATTR_SCD {
bigint product_attr_sk PK
string product_bk
string vendor_code
string category_1c
string kind_1c
string product_category
string season_code
string features
string gender
string country
string direction
string group_name
string material_upper
string material_lining
string upper_color
string color
string factory
boolean is_repeat
datetime valid_from
datetime valid_to
boolean is_current
}
CH_DIM_PRODUCT_ASSIGNMENT_SCD {
bigint assignment_sk PK
string product_bk
string vendor_code
string collection_code
string manager_guid_1c
datetime valid_from
datetime valid_to
boolean is_current
}
CH_DIM_SEASON_RATE {
bigint season_rate_sk PK
string season_code
decimal cny_rub_rate
datetime valid_from
datetime valid_to
boolean is_current
}
CH_DIM_PLAN_NORMS_SCD {
bigint plan_norm_sk PK
string norm_scope_key
decimal wb_commission_percent
decimal tax_percent
decimal variable_cost_per_unit
decimal fixed_cost_per_unit
datetime valid_from
datetime valid_to
boolean is_current
}
CH_DIM_WB_PROMOTIONS {
bigint promotion_id PK
string name
datetime start_date
datetime end_date
datetime loaded_at
}
CH_DIM_PRODUCT_SCD ||--o{ CH_DIM_PRODUCT_ATTR_SCD : has_attrs_history
CH_DIM_PRODUCT_SCD ||--o{ CH_DIM_PRODUCT_ASSIGNMENT_SCD : has_assignment_history
erDiagram
CH_FACT_WB_SALES_FUNNEL_DAILY {
date snapshot_date
string product_bk
bigint nm_id
string wb_seller_tin
string vendor_code
int open_count
int cart_count
int order_count
decimal order_sum
int cancel_count
int buyout_count
decimal buyout_sum
decimal share_order_percent
int add_to_wishlist
int wbclub_order_count
int wbclub_buyout_count
int time_to_ready
decimal product_rating
decimal feedback_rating
decimal wbclub_avg_price
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_STOCK_PRODUCT_DAILY {
date snapshot_date
string product_bk
bigint nm_id
string wb_seller_tin
int stock_count
decimal stock_sum
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_STOCK_OFFICE_DAILY {
date snapshot_date
string product_bk
bigint nm_id
string office_id
string office_name
string region_name
int stock_count
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_STOCK_SIZE_DAILY {
date snapshot_date
string product_bk
bigint nm_id
bigint chrt_id
string sku
string warehouse_id
int quantity
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_STOCK_TRANSIT_DAILY {
date snapshot_date
string product_bk
bigint nm_id
string wb_seller_tin
int in_way_to_client
int in_way_from_client
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_CONTENT_SNAPSHOT_DAILY {
date snapshot_date
string product_bk
bigint nm_id
bigint imt_id
string main_photo_url
json photos_json
json tags_json
datetime wb_card_created_at
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_ADV_UPDATES {
datetime upd_time
bigint advert_id
string camp_name
string payment_type
int advert_type
int advert_status
int upd_num
decimal upd_sum
string currency
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_ADV_FULLSTATS_NM_DAILY {
date stat_date
bigint advert_id
int app_type
string product_bk
bigint nm_id
int views
int clicks
int atbs
int orders
int canceled
int shks
decimal spend_sum
decimal sum_price
decimal cpc
decimal ctr
decimal cr
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_PROMOTION_NM_DAILY {
date snapshot_date
bigint promotion_id
string product_bk
bigint nm_id
boolean in_action
decimal price
decimal plan_price
decimal discount
decimal plan_discount
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_SUPPLIER_ORDERS_RAW {
date order_date
string product_bk
bigint nm_id
string vendor_code
decimal discount_percent
string ingest_batch_id
string pipeline_run_id
json raw_payload
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_REGION_SALE_DAILY {
date snapshot_date
string product_bk
bigint nm_id
string region_code
decimal sale_item_invoice_qty
string ingest_batch_id
string pipeline_run_id
json raw_payload
json source_meta_json
datetime loaded_at
}
CH_FACT_WB_PENALTY_RAW {
string report_type
date event_date
string product_bk
bigint nm_id
decimal amount
string ingest_batch_id
string pipeline_run_id
json raw_payload
json source_meta_json
datetime loaded_at
}
CH_EVENT_PRODUCT_CARD_CHANGE {
bigint event_id PK
string product_bk
bigint nm_id
string change_type
json before_payload
json after_payload
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime detected_at
string source
}
CH_FACT_WB_REVIEWS_DAILY {
date snapshot_date
string product_bk
bigint nm_id
decimal feedback_rating
int negative_review_count
int total_review_count
int reviews_to_override
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_SALES_FUNNEL_DAILY : has_sales_funnel
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_STOCK_PRODUCT_DAILY : has_stock
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_STOCK_OFFICE_DAILY : has_office_stock
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_STOCK_SIZE_DAILY : has_size_stock
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_STOCK_TRANSIT_DAILY : has_transit
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_CONTENT_SNAPSHOT_DAILY : has_snapshots
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_ADV_FULLSTATS_NM_DAILY : has_ad_stats
CH_DIM_WB_PROMOTIONS ||--o{ CH_FACT_WB_PROMOTION_NM_DAILY : contains
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_PROMOTION_NM_DAILY : participates
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_SUPPLIER_ORDERS_RAW : has_supplier_orders
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_REGION_SALE_DAILY : has_region_sales
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_PENALTY_RAW : has_penalties
CH_DIM_PRODUCT_SCD ||--o{ CH_EVENT_PRODUCT_CARD_CHANGE : has_changes
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_WB_REVIEWS_DAILY : has_reviews
erDiagram
CH_FACT_1C_PURCHASE_ORDERS {
string order_id_1c
date order_date
string product_bk
string vendor_code
string season_code
boolean is_reorder
int ordered_qty
decimal cost_cny
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_1C_RECEIPTS {
string receipt_id_1c
date receipt_date
string product_bk
string vendor_code
decimal unit_cost_rub
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_1C_SALES_PLAN_MONTHLY {
date plan_month
string product_bk
string vendor_code
decimal revenue_plan_rub
int qty_plan
decimal price_plan_current
decimal price_plan_next
decimal pct_sold_plan
decimal pct_sold_plan_collection
decimal profit_plan_rub
decimal unit_cost_plan
decimal cost_plan_total
decimal ad_cost_plan_rub
int orders_plan_qty
int carts_plan_qty
int opens_plan_qty
int views_plan_qty
decimal shipments_plan_rub
decimal avg_order_price_plan
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_1C_SHIPMENTS {
string shipment_id_1c
date shipment_date
string product_bk
string vendor_code
decimal shipped_amount_rub
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_1C_RECEIVING_ORDERS {
string receiving_order_id_1c
date posting_date
string product_bk
string vendor_code
int qty_to_ship
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_SPP_HOURLY {
datetime snapshot_ts
string product_bk
bigint nm_id
decimal spp_percent
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_FACT_VIEWS_DAILY {
date snapshot_date
string product_bk
bigint nm_id
int views
string ingest_batch_id
string pipeline_run_id
json source_meta_json
datetime loaded_at
}
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_1C_PURCHASE_ORDERS : has_orders
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_1C_RECEIPTS : has_receipts
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_1C_SALES_PLAN_MONTHLY : has_plans
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_1C_SHIPMENTS : has_shipments
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_1C_RECEIVING_ORDERS : has_receiving_orders
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_SPP_HOURLY : has_spp
CH_DIM_PRODUCT_SCD ||--o{ CH_FACT_VIEWS_DAILY : has_views
CH_DIM_SEASON_RATE ||--o{ CH_FACT_1C_SALES_PLAN_MONTHLY : uses_rate
erDiagram
CH_MART_RNP_DAILY {
date snapshot_date
bigint nm_id
string product_bk
string vendor_code
string collection_code
string manager_guid_1c
string wb_seller_tin
decimal revenue_plan
decimal revenue_fact
int qty_plan
int orders_plan
decimal buyout_sum
int buyout_count
int order_count
int stock_count
int stock_in_transit
decimal price_plan_current
decimal price_plan_next
decimal price_fact
decimal price_minus_spp
decimal discount_percent_fact
decimal stock_sum
decimal wbclub_price
decimal rating_feedback
decimal spp_percent
int views
decimal click_ctr
decimal cart_cr
decimal order_cr
decimal buyout_pct
decimal pct_sold_plan
decimal pct_sold_fact
decimal gross_profit_plan
decimal gross_profit_fact
decimal gross_margin_plan
decimal gross_margin_fact
decimal drr_fact
decimal all_commissions_fact
decimal fx_diff_fact
decimal autoffstock_pct
string abc_class
decimal penalties_fact
int days_on_site_count
decimal localization_index
decimal ktr_value
boolean in_action
string promotion_name
decimal ad_spend_fact
decimal ad_click_ctr
decimal cpo
decimal shipped_pct
decimal net_profit_plan
decimal net_profit_fact
decimal net_margin_plan
decimal net_margin_fact
decimal promotion_participation_pct
int negative_review_count
int reviews_to_override
json calc_payload
datetime loaded_at
}
CH_MART_RNP_ROLLUP {
string period_grain
date period_start_date
bigint nm_id
string product_bk
string vendor_code
string collection_code
string manager_guid_1c
string wb_seller_tin
decimal revenue_plan
decimal revenue_fact
decimal revenue_plan_pct
decimal revenue_delta
decimal pct_sold_plan
decimal pct_sold_fact
decimal pct_sold_plan_pct
decimal pct_sold_delta
decimal net_profit_plan
decimal net_profit_fact
decimal net_profit_plan_pct
decimal net_profit_delta
decimal qty_plan_pct
decimal qty_delta
decimal price_plan_pct
decimal price_delta
decimal net_margin_plan
decimal net_margin_fact
decimal net_margin_plan_pct
decimal net_margin_delta
decimal ad_spend_plan
decimal ad_spend_fact
decimal ad_spend_plan_pct
decimal ad_spend_delta
decimal drr_plan
decimal drr_fact
decimal drr_plan_pct
decimal drr_delta
decimal gross_profit_plan
decimal gross_profit_fact
decimal gross_margin_plan
decimal gross_margin_fact
decimal promotion_participation_pct
decimal manager_bonus_amount
decimal localization_index
decimal ktr_value
json aggregated_payload
datetime loaded_at
}
CH_DIM_PRODUCT_SCD ||--o{ CH_MART_RNP_DAILY : denormalizes
CH_DIM_PRODUCT_SCD ||--o{ CH_MART_RNP_ROLLUP : denormalizes
CH_DIM_PRODUCT_ASSIGNMENT_SCD ||--o{ CH_MART_RNP_DAILY : scopes
CH_DIM_PRODUCT_ASSIGNMENT_SCD ||--o{ CH_MART_RNP_ROLLUP : scopes
Это не физические FK между БД, а логические связи, которые надо держать в голове при проектировании ETL и приложения.
erDiagram
PG_WB_CABINETS {
bigint id PK
string seller_id
string tin
string name
}
PG_USERS {
bigint id PK
string employee_guid_1c
string full_name
string role_code
bigint department_id
}
CH_DIM_PRODUCT_SCD {
bigint product_sk PK
string product_bk
string vendor_code
bigint nm_id
bigint imt_id
string wb_seller_tin
}
CH_DIM_PRODUCT_ASSIGNMENT_SCD {
bigint assignment_sk PK
string product_bk
string vendor_code
string collection_code
string manager_guid_1c
}
PG_WB_CABINETS ||--o{ CH_DIM_PRODUCT_SCD : scopes_by_tin
PG_USERS ||--o{ CH_DIM_PRODUCT_ASSIGNMENT_SCD : manages_by_guid
PG_USERSPG_ROLESPG_DEPARTMENTSPG_USER_SESSIONSPG_PASSWORD_RESET_TOKENSPG_AUTH_LOGIN_ATTEMPTSPG_PASSWORD_RESET_REQUESTSPG_CORE_SETTINGSPG_DYNAMIC_SETTINGSPG_EXTERNAL_SERVICE_TOKENSPG_WB_CABINETSPG_ADMIN_AUDIT_LOGPG_WRITEBACK_JOBSPG_WRITEBACK_JOB_ITEMSPG_PRODUCT_ACTION_PLANSPG_ETL_PIPELINE_STATUSPG_SOURCE_SYNC_STATUSPG_INTEGRATION_INBOXPG_INTEGRATION_FAILED_EVENTSPG_INTEGRATION_PIPELINE_RUNS1С, WB API, внешних парсеров;SCD-таблицы;Ниже короткое человеческое объяснение, что означает каждая таблица.
PG_ROLESСправочник ролей RBAC. Нужен, чтобы явно хранить доступные роли системы: Менеджер, РОП, Админ, Супер-админ, ГД.
PG_DEPARTMENTSСправочник отделов. Хранит сами отделы, признак отдела по умолчанию и руководителя отдела. Если head_user_id заполнен, он должен указывать на пользователя из этого же отдела с ролью РОП.
PG_USERSОсновная таблица пользователей приложения. Это не “исторический сотрудник”, а текущее состояние учётной записи: кто пользователь, активен ли он, заблокирован ли, в каком он отделе и какая у него роль.
PG_USER_SESSIONSАктивные и завершённые пользовательские сессии. Нужна для logout, инвалидирования доступа и контроля активных логинов.
PG_PASSWORD_RESET_TOKENSОдноразовые токены для восстановления пароля. Нужны только auth-слою.
PG_AUTH_LOGIN_ATTEMPTSЖурнал попыток входа. Нужен для истории неуспешных логинов, расследования проблем авторизации и базовых anti-bruteforce правил.
PG_PASSWORD_RESET_REQUESTSЖурнал запросов на восстановление пароля. Нужен для rate limit и контроля частоты reset-запросов по email / IP.
PG_CORE_SETTINGSTyped-глобальные настройки системы, которые критичны для логики приложения. Здесь держим параметры вроде отдела по умолчанию, TTL reset-link и срока хранения аудита, чтобы не терять валидацию и ссылочную целостность.
PG_DYNAMIC_SETTINGSДинамические key-value настройки, которые не требуют отдельных FK и строгой схемы. Это запасной контейнер для действительно гибких настроек, а не место для критичных параметров бизнес-логики.
PG_EXTERNAL_SERVICE_TOKENSХранилище подключённых внешних токенов и ссылок на секреты. Здесь не аналитика, а operational-конфигурация интеграций.
PG_WB_CABINETSТекущий реестр кабинетов WB, полученных через токены. Нужен, чтобы знать, какому юрлицу соответствует токен и какие данные пришли из какого кабинета.
PG_ADMIN_AUDIT_LOGАудит административных действий. Хранит факт “кто что поменял” в users/departments/settings.
PG_WRITEBACK_JOBSВерхнеуровневая сущность write-back операции. Одна запись = один запрос/операция в сторону WB, например merge/split или изменение параметров участия в акции. Помимо факта операции хранит operational-поля для реальной эксплуатации: идемпотентность, внешний task/request id WB, ретраи, блокировку воркером и статус post-writeback re-sync.
PG_WRITEBACK_JOB_ITEMSДетализация write-back job по карточкам. Нужна, когда одна операция затрагивает несколько nm_id. На этом уровне фиксируем per-item результат, внешний идентификатор WB при необходимости, код ошибки и статус re-sync.
Write-back state machine:
PG_WRITEBACK_JOBS.status: new -> running -> successPG_WRITEBACK_JOBS.status: new -> running -> failed -> retry_scheduled -> runningPG_WRITEBACK_JOBS.status: running -> cancelled если операцию остановили до успешного завершенияPG_WRITEBACK_JOBS.resync_status: not_needed -> done для операций без post-syncPG_WRITEBACK_JOBS.resync_status: pending -> running -> donePG_WRITEBACK_JOBS.resync_status: pending -> running -> failed -> retry_scheduled -> runningPG_WRITEBACK_JOB_ITEMS.result_status: как минимум pending / success / failed / skippedPG_WRITEBACK_JOB_ITEMS.resync_status: повторяет lifecycle post-writeback re-sync на уровне конкретного nm_idПравило: write-back и post-writeback re-sync считаем двумя разными state-машинами. У job может быть status = success, но resync_status = pending|running|failed, пока данные ещё не подтверждены обратной синхронизацией.
PG_PRODUCT_ACTION_PLANSРедактируемый пользователем “план действий” по товару. Это не импорт из 1С и не аналитика, а внутреннее прикладное поле системы.
PG_ETL_PIPELINE_STATUSКэш статусов пайплайнов для админского экрана мониторинга. Помимо статуса последнего запуска держим operational-показатели вроде watermark, freshness lag и количества обработанных / rejected / skipped / duplicate строк.
PG_SOURCE_SYNC_STATUSСводное состояние по каждому источнику и сущности загрузки. Нужен, чтобы мониторинг показывал не только “последний DAG зелёный”, но и реальную свежесть данных по каждому source-слою отдельно.
PG_INTEGRATION_INBOXOperational inbox для входящих интеграционных событий. Здесь живёт очередь на обработку и текущий processing state, но не долгоживущий аудит и не DLQ.
PG_INTEGRATION_FAILED_EVENTSОтдельный слой failed / dead-letter событий. Нужен для расследований, повторной обработки и хранения ошибок без превращения inbox в помойку.
PG_INTEGRATION_PIPELINE_RUNSЖурнал запусков интеграционных пайплайнов. Это не событие предметной области, а operational log конкретного прогона: когда стартовал, сколько обработал, сколько упало и с какой ошибкой завершился.
CH_DIM_PRODUCT_SCDГлавная историческая продуктовая размерность. Это точка, где стыкуются 1С и WB:
product_bk, vendor_code, nm_id, imt_id, юрлицо, базовые WB-атрибуты.
Канонический бизнес-ключ в аналитическом слое — product_bk = wb_seller_tin + vendor_code.
CH_DIM_PRODUCT_ATTR_SCDИстория справочных атрибутов товара из 1С: категория 1С, сезон, фабрика, материалы, повтор и т.д. Нужна, потому что атрибуты могут меняться во времени.
CH_DIM_PRODUCT_ASSIGNMENT_SCDИстория назначения товара на коллекцию и менеджера. Критична для корректной аналитики по менеджерам за прошлые периоды.
CH_DIM_SEASON_RATEИстория курса юань/руб по сезонам. Используется в расчётах и плановых моделях.
CH_DIM_PLAN_NORMS_SCDИстория нормативов для расчёта планов из 1С. Здесь лежат П83, П85, П87, П88. Держим отдельно от месячного плана продаж, потому что это другой источник и другой жизненный цикл. Business-grain нормативов подтверждён клиентом — norm_scope_key определяет scope норматива (категория/сезон/юрлицо/бренд/коллекция/тип товара или их комбинация).
CH_DIM_WB_PROMOTIONSСправочник акций WB. Хранит сами акции как отдельные сущности, а не участие товара в них.
CH_FACT_WB_SALES_FUNNEL_DAILYОсновной ежедневный WB-факт по карточке товара: открытия, корзины, заказы, выкупы, рейтинги, WB Club и т.д. Это одна из самых важных fact-таблиц для РНП.
CH_FACT_WB_STOCK_PRODUCT_DAILYЕжедневные агрегированные остатки по товару. Нужна для П33, П34, П38, П113 и других derived-метрик.
CH_FACT_WB_STOCK_OFFICE_DAILYЕжедневные остатки по офисам/складам WB. Это складской разрез, который нужен не для общего остатка, а для более детальной аналитики.
CH_FACT_WB_STOCK_SIZE_DAILYЕжедневные остатки по размеру и складу. Это слой, который нужен для расчёта П89 Аутоффсток и всех size-aware производных метрик.
CH_FACT_WB_STOCK_TRANSIT_DAILYЕжедневный факт по остаткам “в пути к клиенту / от клиента”.
CH_FACT_WB_CONTENT_SNAPSHOT_DAILYЕжедневный снапшот состояния карточки WB: фото, теги, imt_id, дата создания карточки. Нужен и для UI, и для аудита изменений карточки.
CH_FACT_WB_ADV_UPDATESИстория расходов на рекламу из GET /adv/v1/upd. Реальный grain по документации и live API: advert_id × upd_time. Здесь лежит cost-history кампании, а не товарный слой, и nm_id в этом факте нет.
CH_FACT_WB_ADV_FULLSTATS_NM_DAILYДетальная статистика рекламы из GET /adv/v3/fullstats. Реальный raw-grain по документации и live API: advert_id × stat_date × app_type × nm_id. Именно здесь живут товарные views / clicks / atbs / orders и spend на уровне nm_id.
CH_FACT_WB_PROMOTION_NM_DAILYЕжедневное участие конкретного товара в конкретной акции WB. Нужна для П104, истории участия в акциях и фильтрации “акционный товар / неакционный”.
CH_FACT_WB_SUPPLIER_ORDERS_RAWRaw-слой WB supplier/orders. Нужен в первую очередь для % скидки факт (П66) и как факт-источник для downstream-расчётов, где используется скидка WB.
CH_FACT_WB_REGION_SALE_DAILYЕжедневные продажи по регионам / ЦФО. Пока это узкоспециализированный слой для региональной аналитики.
CH_FACT_WB_PENALTY_RAWRaw-удержания и штрафы WB. Здесь не итоговая метрика, а сырые строки из retention reports, из которых потом собирается П103.
CH_EVENT_PRODUCT_CARD_CHANGEСобытия изменений карточки WB. Это уже не снапшот, а дельта: что изменилось между двумя снапшотами.
CH_FACT_WB_REVIEWS_DAILYЕжедневные данные по отзывам: рейтинг, количество негативных отзывов, расчётное количество для перекрытия негатива. Источник — WB API (отзывы/рейтинги), агрегируется daily по nmID.
CH_FACT_1C_PURCHASE_ORDERSRaw-факт из заказов поставщику. Нужен для П45, П91, а также для расчёта Дозаказ, шт.
CH_FACT_1C_RECEIPTSRaw-факт из документов прихода / приобретения. Это фактическая себестоимость в рублях и дата поступления.
CH_FACT_1C_SALES_PLAN_MONTHLYМесячный плановый факт из 1С. Здесь лежат выручка план, цена план, реклама план, ЧП план и другие плановые величины.
CH_FACT_1C_SHIPMENTSФакт отгрузок из 1С. Нужен для П155 и связанных производных показателей.
CH_FACT_1C_RECEIVING_ORDERSRaw-факт из приходного ордера. Нужен для ненумерованного “плана отгрузки”: downstream считаем posting_date + 4 дня, само транзиентное поле отдельно не храним.
CH_FACT_SPP_HOURLYИстория СПП из внешнего скрапера. Нужна для исторического анализа и расчёта цены для покупателя.
CH_FACT_VIEWS_DAILYИстория показов из внешнего скрапера. Нужна для CTR и воронки, потому что в WB API “показы” в нужном смысле нет.
CH_MART_RNP_DAILYГлавная ежедневная широкая витрина РНП. Именно из неё удобнее всего строить экран РНП, графики, daily drill-down и derived-метрики. В этой витрине держим текущие daily/history показатели и промежуточные расчётные поля вроде fx_diff_fact, если они нужны для формул верхнего уровня.
CH_MART_RNP_ROLLUPОграниченный acceleration-layer поверх daily-витрины. Здесь держим только фиксированные предагрегации по понятным grain, например week и month, без универсального scope_key. Произвольные диапазоны и произвольные комбинации фильтров считаем из CH_MART_RNP_DAILY.
Текущее правило простое:
CH_FACT_ и CH_DIM_;CH_MART_RNP_DAILY;CH_MART_RNP_ROLLUP, но только для фиксированных grain week/month; произвольные диапазоны считаются из CH_MART_RNP_DAILY.Что это закрывает по текущему scope РНП:
WB API: П1, П2, П3, П4, П5, П6, П7, П19, П20, П21, П33, П40, П66, П103, П104, П142;1С: П44, П45, П46, П47, П48, П50, П55, П59, П62, П67, П68, П69, П71, П72, П77, П83, П85, П87, П88, П90, П91, П102, П141, П155, П156;П65, а также показы для расчёта П18 и П134;П18, П26, П37, П42, П64, П79, П80, П81, П82, П84, П86, П89, П99, П113, П134, П135, П136, П137, П138, П139, П150, П153, П154, П95, П96;П115–П133, П140, П144, П145.Короткие определения для терминов, которые регулярно встречаются в спеках РНП и обсуждениях с клиентом.
Что это: рабочее обозначение показателя Аутоффсток (П89).
Смысл: доля отсутствующих размеров относительно полной размерной горки артикула.
Пример: если у артикула должно быть 6 размеров, а в наличии есть 4, то Ous = 2 / 6 = 33%.
Где используется: «РНП — Аналитика товара», «РНП — История товара», «Карта происхождения MVP-показателей».
Что уже понятно: для расчёта нужен размерный разрез остатков. Источник размерных остатков — GET /api/v3/stocks (WB API), где есть chrtId, warehouseId, quantity.
Что это: Индекс локализации (П138).
Смысл: показатель WB, связанный с тем, насколько заказы локализуются относительно нужных складов / кластеров.
Где используется: «РНП — Аналитика товара», «Карта происхождения MVP-показателей».
Источник: парсинг POST /ns/analytics-api/content-analytics/api/v1/localization/report-by-nm (seller-content.wildberries.ru), поле localOrderPercent по nmID.
Частота: раз в день.
Что это: Коэффициент территориального распределения (П139).
Смысл: показатель из методики WB по локализации, который используется в расчёте ИЛ.
Где используется: «РНП — Аналитика товара», «Карта происхождения MVP-показателей».
Источник: парсинг POST /ns/categories-info/suppliers-portal-analytics/api/v1/localization-list (seller.wildberries.ru).
Правило расчёта: берём localOrderPercent (П138) для nmID, находим запись в indexts[], где left <= localOrderPercent <= right (включительно), значение index = КТР.
Частота: раз в день.
Что это: Скидка постоянного покупателя (П65).
Смысл: скидка покупателя, которая влияет на фактическую цену для покупателя.
Где используется: «РНП — История товара», «РНП — Паспорт товара», «Требования к данным из парсинга и скрапинга», «Карта происхождения MVP-показателей».
Источник: парсинг POST /ns/dp-api/discounts-prices/suppliers/api/v1/list/goods/filter (discounts-prices.wildberries.ru), поле discountOnSite.
Частота: раз в час.
Связанная формула: П64 = П42 * (1 - П65).
Набор визуальных макетов интерфейса (схематичный «каркас» приложения с низкой детализацией) собран в едином документе: макеты интерфейса (PDF).
Содержит макеты разделов: