analytics/STRUCTURE.md
2026-02-18 14:36:38 +03:00

179 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Структура аналитики: SQL и Power BI
Справочник, объединяющий правила из `context/*.md` со структурой БД и PBI-модели.
---
## 1. Правила данных (01_DATA_RULES)
| Правило | Описание |
|---------|----------|
| Stock quantity | Только поле `quantity`. **Никогда** не использовать `sellable_stock` в расчётах остатков |
| MP stock | Остатки маркетплейса считаются отдельно и добавляются при необходимости |
| Входящие заказы | Статусы: `В пути`, `В производстве`, `Выгружен на складе`, `Согласован` |
| Интервалы дат | Формат `[start, end)` (полуоткрытый интервал) при агрегации |
---
## 2. Глоссарий (02_GLOSSARY)
| Термин | Значение |
|--------|----------|
| Stock (шт) | Физическое количество по полю `quantity` |
| Stock (руб) | Денежная оценка остатков |
| MP | Marketplace (маркетплейс) |
| Data mart | SQL view/table, подготовленная для аналитики |
---
## 3. SQL: Таблицы (analytics schema)
### 3.1 Дефицит и прогноз
| Таблица | Назначение | Ключевые поля |
|---------|------------|---------------|
| `analytics.forecast` | Прогноз спроса по месяцам | scenario_id, 1c_id, code, month, value |
| `analytics.deficit_proposal` | Рекомендации к заказу по дефициту | place_month, arrival_month, order_qty |
| `analytics.stock_plan_by_arrival` | План по месяцам прихода | opening, inbound_confirmed, inbound_deficit, forecast_demand, closing |
| `analytics.forecast_scenarios` | Сценарии прогноза | scenario_id, name |
| `analytics.seasonality_groups` | Сезонность по группам (для sp_build_forecast_s4_by_group) | — |
| `stg.forecast_load` | Staging загрузки прогноза из Excel | — |
### 3.2 Справочники и остатки (pbi schema)
| Таблица | Назначение |
|---------|------------|
| `pbi.nomenclature` | Номенклатура (minAvailableQty для minAvailable) |
| `pbi.groups` | Группы (path для group_path) |
| `pbi.w_ostatok_da_net` | Остаток на дату (для opening_qty) |
---
## 4. SQL: Представления (Views)
| View | Назначение | Источники |
|------|------------|-----------|
| `analytics.get_orders_by_group` | Входящие заказы по группе | Заказы со статусами 01_DATA_RULES |
| `analytics.get_quantity_by_group` | Остаток склада по группе | quantity (не sellable_stock) |
| `analytics.get_mp_quantity_by_group` | MP-остатки по группе | — |
| `analytics.get_forecast_by_group` | Прогноз по группе | analytics.forecast |
| `analytics.get_forecast_scenarios` | Сценарии прогноза | analytics.forecast_scenarios |
| `analytics.deficit_orders` | Заказы по дефициту с ценой и суммой | deficit_proposal + nomenclature (status='Дефицит') |
---
## 5. SQL: Хранимые процедуры
### 5.1 Цепочка дефицита (06_DEFICIT_FORECAST)
```
forecast → sp_build_deficit_proposal → deficit_proposal
↑ ↓
stock + inbound + │ sp_rebuild_stock_plan_by_arrival
minAvail └──────────────────── stock_plan_by_arrival
```
### 5.2 Процедуры
| Процедура | Назначение | Параметры по умолчанию |
|-----------|------------|------------------------|
| `sp_build_deficit_proposal` | Дефицит и рекомендации к заказу | @scenario_id=4, @group_path='', @lead_time_m=4, @cover_months=6 |
| `sp_rebuild_stock_plan_by_arrival` | План остатков по месяцам прихода | @scenario_id, @from_month, @to_month |
| `sp_run_deficit_all_skus` | Пересчёт дефицита по всем SKU | Вызывает sp_build_deficit_proposal с group_path='' |
| `create_forecast_loop` | Цикл по группам (lvl=2) | — |
| `sp_build_forecast_s4_by_group` | Прогноз по группе (rate×дни×seasonal_koef) | Вставляет в forecast |
| `sp_загрузка_прогнозаакупки` | Загрузка прогноза из Excel | forecast scenario_id=8 |
### 5.3 Рекомендуемый порядок выполнения
1. **Прогноз:** `create_forecast_loop` ИЛИ `sp_build_forecast_s4_by_group` ИЛИ `sp_загрузка_прогнозаакупки`
2. **Дефицит:** `sp_build_deficit_proposal` ИЛИ `sp_run_deficit_all_skus`
3. **План:** `sp_rebuild_stock_plan_by_arrival` (читает deficit_proposal; п.2 должен быть выполнен первым)
### 5.4 Формула closing (stock_plan_by_arrival)
```
closing = opening + inbound_confirmed + inbound_deficit - forecast_demand
```
---
## 6. Power BI: Модель (TMDL)
### 6.1 Таблицы модели (PBI QueryOrder)
| Таблица | Источник |
|---------|----------|
| Номенклатура | Sql.Database |
| Партнер | Sql.Database |
| Стоимость МП | Sql.Database |
| Основной отчет | Sql.Database |
| Группы | Sql.Database |
| Остатки | Sql.Database |
| Закупки | Sql.Database |
| Заявки на оплату | Sql.Database |
| План продаж менеджеров | Sql.Database |
| План продаж по группам | Sql.Database |
| Менеджеры | Sql.Database |
| mp остатки | Sql.Database |
| mp аналитика продаж | Sql.Database |
| ПРАЙСлист | Sql.Database |
| Заказы все | Sql.Database |
| ... (см. model.tmdl) | — |
### 6.2 Связи и меры
- Связи: `relationships.tmdl`
- Меры: `expressions.tmdl`, таблицы `.tmdl` в `Model/tables/`
- Культура: ru-RU
- Compatibility level: 1600
---
## 7. Workflow: Trace Measure (03_WORKFLOWS, 05_OUTPUT_FORMATS)
### Последовательность
1. Найти меру в TMDL
2. Показать DAX
3. Указать зависимые меры/таблицы
4. Извлечь SQL source из partition (Sql.Database, Schema, Item или Query)
5. Сформировать объяснение
### Формат вывода
1. Measure Name
2. DAX Formula
3. Dependencies
4. SQL Source (server, database, schema, object)
5. Business Explanation
6. Usage Recommendations
7. Validation Checks
---
## 8. Workflow: Trace Deficit / Forecast
1. Прогноз → `sp_build_deficit_proposal` → deficit_proposal
2. deficit_proposal + forecast + inbound → `sp_rebuild_stock_plan_by_arrival` → stock_plan_by_arrival
3. order_qty = прогноз окна [T .. T+cover); дефицит при net_stock < minAvailable
---
## 9. Knowledge Base Policy (04_KB_POLICY)
- Новая документация черновик
- Только утверждённое содержание в общую базу знаний
- Хранить в `/docs/metrics`
- Каждая статья: DAX, SQL lineage, бизнес-объяснение
---
## 10. AI Architect (00_SYSTEM)
- Трассировка мер от TMDL к SQL
- Структурированные объяснения метрик
- Соблюдение правил данных
- **Не придумывать** объекты схемы только из файлов проекта
- Трассировка дефицита/прогноза с процедурами