This commit is contained in:
Basoff 2026-02-19 15:30:23 +03:00
parent aa51e2ecde
commit 9dc861b25c
11 changed files with 521 additions and 395 deletions

View File

@ -0,0 +1,311 @@
# База знаний: полная структура SQL (mag_pbi) и Power BI
> Извлечено из `analytics/sql_db_mag_pbi/mag_pbi_schema.sql` и `analytics/pbi/`. Независимый справочник для трассировки метрик и работы с данными.
---
## 1. Схемы базы данных mag_pbi
| Схема | Назначение |
|-------|------------|
| `pbi` | Основные таблицы и представления для Power BI |
| `analytics` | Дефицит, прогноз, аналитика за 365 дней |
| `pbiProd` | Сводная себестоимость, производство |
| `ostatki` | Резервы, очереди сборок, склад |
| `sebest` | Себестоимость до 2022 |
| `stg` | Staging (загрузка прогноза) |
| `artem` | Дополнительные данные |
| `dbo` | Стандартные таблицы |
---
## 2. Таблицы (CREATE TABLE)
### 2.1 Схема pbi
| Таблица | Ключевые колонки |
|--------|------------------|
| `pbi.pricelist` | Цена, Вид цены, 1c_id, artic_id, Дата, _Period |
| `pbi.Себестоимость` | id, Период, Статья, Вид операции, artic_id, Количество, Сумма, Закупка, Учетная цена, Номер заказа |
| `pbi.СебестоимостьПродажи` | id, 1c_id, artic_id, Количество, Закупка, sebes_id |
| `pbi.ostatki_short` | artic_id, 1c_id, Code, sklad, Категория склада, upakovok, quantity, date |
| `pbi.enums` | — |
| `pbi.nomenclature` | artic_id, 1c_id, code, description, group_id, Цена учетная руб/usd, minAvailableQty |
| `pbi.groups` | group_id, path, 1c_id |
| `pbi.w_ostatok_da_net` | dt, _IDRREF, artic_id, quantity, upakovok, ostatok, sellable_stock |
| `pbi.content_rating` | — |
| `pbi.direct_adv_costs` | — |
| `pbi.direct_orders` | — |
| `pbi.nomenclatureVolumeStorehouse` | — |
| `pbi.ostatki` | Остатки полные |
| `pbi.ostatki_mp` | Остатки МП |
| `pbi.Turnover` | — |
| `pbi.Себестоимость2023`, `Себестоимость2024` | — |
| `pbi.СебестоимостьДо2022Тест` | — |
| `pbi.СебестоимостьСводныйОт2022Тестовый` | — |
| `pbi.СебестоимостьПродажиОт2022` | — |
| `pbi.СебестоимостьПродажиТест`, `СебестоимостьТест` | — |
### 2.2 Схема analytics
| Таблица | Ключевые колонки |
|---------|------------------|
| `analytics.forecast` | id, scenario_id, 1c_id, code, month, value |
| `analytics.forecast_scenarios` | scenario_id, name |
| `analytics.deficit_proposal` | scenario_id, 1c_id, code, place_month, arrival_month, order_qty, projected_stock_at_T |
| `analytics.stock_plan_by_arrival` | — |
| `analytics.аналитика за 365 дн.` | Агрегаты ROIC, ТН, средний остаток |
| `analytics.manufacturers` | — |
| `analytics.manufacturer_payment_stage` | — |
| `analytics.manufacturer_counterparty_map` | — |
| `analytics.deficit_money_request` | — |
| `analytics.forecast_history` | — |
| `analytics.load_log_w_ostatok_da_net` | — |
| `analytics.sales_weekly_features` | — |
| `analytics.seasonality_groups` | — |
| `analytics.seasonality_groups_summ_1` | — |
| `analytics.stock_balance` | — |
| `analytics.прогноз из excel` | — |
| `analytics.срез учетных цен` | — |
### 2.3 Схема pbiProd
| Таблица | Назначение |
|---------|------------|
| `pbiProd.СебестоимостьСводныйОт2022` | Сводная себестоимость |
| `pbiProd.СебестоимостьОт2022` | Себестоимость от 2022 |
| `pbiProd.СебестоимостьДо2022` | До 2022 |
| `pbiProd.СебестоимостьПроизводствоОт2022` | Производство |
| `pbiProd.СебестоимостьИтогиДо2022` | — |
| `pbiProd.УчетнаяЦенаПоСебестоимости` | — |
| `pbiProd.GroupsOfNomenclature` | — |
| `pbiProd.НоменклатураВПроизводствеПоУровням` | — |
### 2.4 Схема stg
| Таблица | Назначение |
|---------|------------|
| `stg.forecast_load` | Staging загрузки прогноза из Excel |
### 2.5 Схема dbo
| Таблица | Назначение |
|--------|------------|
| `dbo.content_rating`, `grades_quartal` | — |
| `dbo.lineage_edges`, `lineage_objects` | — |
| `dbo.order_source`, `site_product` | — |
| `dbo.Turnover` | — |
| `dbo.yandex_direct_criteria_stats` | — |
---
## 3. Представления (CREATE VIEW)
### 3.1 Схема pbi
| View | Источник / логика |
|------|-------------------|
| `pbi.[Себестоимость+СебестоимостьПродаж]` | pbi.Себестоимость + СебестоимостьПродажи, подстановка цен из pricelist |
| `pbi.ОстаткиTotal` | ostatki_short, накопительный итог по складу/artic_id |
| `pbi.БазоваяУпаковка` | Габариты из MAG_2019 |
| `pbi.Заказы_тех` | Заказы поставщику |
| `pbi.РекламаМаркетплейсы` | Реклама МП |
| `pbi.Стоимость обработки заказа` | Стоимость МП |
| `pbi.Резервы` | Резервы |
| `pbi.Заказы` | Заказы |
| `pbi.Заявки_на_оплату` | Заявки |
| `pbi.Внешние остатки` | Внешние остатки |
| `pbi.Расходы по годам` | Расходы |
| `pbi.node_mp` | Узлы МП |
| `pbi.Внешние продажи` | Продажи МП |
| `pbi.nomeclature_for_pbi` | Номенклатура для PBI |
| `pbi.Заказы в заявках` | — |
| `pbi.[Себестоимость+СебестоимостьПродажОт2022]` | — |
| `pbi.Сборки`, `Сборки_комплекты` | — |
| `pbi.значения доп реквизитов номенклатуры` | — |
| `pbi.Сохраненные настройки 1С для PowerBI` | — |
### 3.2 Схема analytics
| View | Назначение |
|------|------------|
| `analytics.get_forecast_by_group` | Прогноз по группе (forecast + nomenclature + groups) |
| `analytics.get_forecast_scenarios` | Сценарии |
| `analytics.get_orders_list` | Список заказов |
| `analytics.get_analytics_by_group` | Аналитика по группе |
| `analytics.get_orders_by_group` | Заказы по группе (входящие) |
| `analytics.deficit_orders` | deficit_proposal + nomenclature (цена, сумма) |
| `analytics.nomenclature` | — |
| `analytics.Внешние остатки` | — |
| `analytics.Остатки МП` | — |
| `analytics.Где товар` | — |
| `analytics.Заявки_на_оплату` | — |
| `analytics.Заявки_без_проектаеоплачено` | — |
| `analytics.Ожидаемый расход` | — |
| `analytics.Ожидаемое_поступление` | — |
| `analytics.ForecastBasesKs` | Базы прогноза |
| `analytics.doprekvizit`, `doprekvizitvalues` | — |
| `analytics.images` | — |
| `analytics.Курсы валют на сегодня` | — |
| `analytics.Проекты` | — |
| `analytics.v_manufacturers_roi_compat` | — |
| `analytics.v_contractors`, `v_producers` | — |
| `analytics.v_manufacturer_counterparty_mapping` | — |
### 3.3 Схема pbiProd
| View | Назначение |
|------|------------|
| `pbiProd.[СводныйСебестоимость Для PBI]` | **Основной источник Себестоимости в PBI** |
| `pbiProd.СводныйСебестоимость` | — |
| `pbiProd.ИтогСебестоимостьПродажОт2022` | — |
### 3.4 Схема ostatki
| View | Назначение |
|------|------------|
| `ostatki.РезервыМПиОПТ` | Резервы МП и ОПТ |
| `ostatki.OstatkiMarketSklad` | — |
| `ostatki.МаркировкаОчередьВРАботе` | — |
| `ostatki.НаСогласовании` | — |
| `ostatki.ОчередьНаСборкуРазборку` | — |
| `ostatki.СборкиРазборкиВРаботе` | — |
| `ostatki.СобираетсяИКСборке` | — |
| `ostatki.СобраноНеОплачено` | — |
| `ostatki.ТоварыВПеремещении` | — |
---
## 4. Хранимые процедуры
### 4.1 analytics — дефицит и прогноз
| Процедура | Назначение |
|-----------|------------|
| `analytics.sp_build_deficit_proposal` | Расчёт дефицита и рекомендаций к заказу |
| `analytics.sp_rebuild_stock_plan_by_arrival` | План остатков по месяцам прихода |
| `analytics.sp_run_deficit_all_skus` | Пересчёт дефицита по всем SKU |
| `analytics.sp_build_forecast_s4_by_group` | Прогноз по группе |
| `analytics.sp_загрузка_прогнозаакупки` | Загрузка прогноза из Excel |
| `analytics.create_seasonality_groups` | Сезонность по группам |
| `analytics.sp_create_analytics_365` | Аналитика за 365 дней |
| `analytics.sp_load_koef_groups` | Коэффициенты групп |
| `analytics.sp_recalc_roic` | Пересчёт ROIC |
| `analytics.sp_report_ROI` | Отчёт ROI |
| `analytics.Подготовка таблицы продаж к прогнозу` | Подготовка продаж |
### 4.2 pbi — миграция
| Процедура | Назначение |
|-----------|------------|
| `pbi.migrate_ostatki` | Миграция остатков |
| `pbi.migrate_nomenclature` | Миграция номенклатуры |
| `pbi.migrate_groups` | Миграция групп |
| `pbi.migrate_pricelist` | Миграция прайс-листа |
| `pbi.migrate_stock_balance` | — |
| `pbi.migrate_max_year_quantity` | — |
| `pbi.migrate_uchet_summa` | — |
| `pbi.создание среза учетных цен` | Срез учётных цен |
| `pbi.[Заполнить себестоимостьОт2022(закупки+продажи)]` | — |
| `pbi.[Заполнить себестоимостьОт2022(СкладХранение)]` | — |
| `pbi.РасчетСебестоимостиОт2022` | — |
### 4.3 pbiProd — себестоимость
| Процедура | Назначение |
|-----------|------------|
| `pbiProd.ЗаполнитьСебестоимостьСводныйОт2022` | — |
| `pbiProd.[Пакетное: ...]` | Различные этапы заполнения себестоимости |
| `pbiProd.[Подготовка Производство: ...]` | Подготовка производства |
### 4.4 sebest — себестоимость до 2022
| Процедура | Назначение |
|-----------|------------|
| `sebest.Заполнить себестоимость до 2022` | — |
| `sebest.Заполнить себестоимость закупкой/продажей` | — |
| `sebest.Расчет себестомисти` | — |
---
## 5. Power BI — таблицы и источники
### 5.1 Таблицы модели (из TMDL)
| Таблица PBI | Режим | SQL источник |
|-------------|-------|--------------|
| Номенклатура | import | pbi.nomeclature_for_pbi |
| Партнер | import | pbi.Партнеры |
| Стоимость МП | import | pbi.[Стоимость обработки заказа] |
| Себестоимость | import | **pbiProd.[СводныйСебестоимость Для PBI]** |
| Основной отчет | import | Calculated (placeholder) |
| Группы | import | pbi.groups |
| Остатки | import | **pbi.ostatki_short** |
| Заявки на оплату | import | pbi.Заявки_на_оплату |
| План продаж менеджеров | import | pbi.ПланПродажМенеджеров |
| План продаж по группам | import | pbi.ПланыПродажПоГруппам |
| Менеджеры | import | pbi.users_1C |
| mp остатки | import | pbi.Внешние остатки |
| mp аналитика продаж | import | pbi.[Внешние продажи] |
| ПРАЙСлист | import | pbi.pricelist |
| Упущенные продажи | import | pbi.w_ostatok_da_net (+ трансформации) |
| Заказы все | import | pbi.Заказы |
| mp реклама | import | pbi.РекламаМаркетплейсы |
| План маркеты | import | — |
| Резервы | import | pbi.Резервы |
| Расходы по годам | import | pbi.[Расходы по годам] |
| Я.Директ расходы | import | pbi.direct_adv_costs |
| Я.Директ заказы | import | pbi.direct_orders |
| mp узел | import | pbi.node_mp |
| mp оборот | import | pbi.[Внешний оборот] |
| .Календарь | calculated | Calendar |
| LocalDateTable_* | calculated | Calendar по диапазону полей |
| Организация | calculated | VALUES(Себестоимость[Организация]) |
| Закупки | calculated | — |
| Параметр цена продажи, % | calculated | GENERATESERIES(-20, 20, 0.5) |
### 5.2 Сервер
- **Sql.Database("prdsql", "mag_pbi")** — основной источник
- **Sql.Databases("prdsql")** → mag_pbi — альтернативный доступ
### 5.3 Связи (relationships.tmdl)
- artic_id → Номенклатура._artic_id (Себестоимость, Остатки, mp остатки, Заказы все и др.)
- Период/Дата → .Календарь.Дата
- Номенклатура._group_id → Группы.group_id (bothDirections)
- Остатки.Дата → LocalDateTable (variation)
---
## 6. Цепочка дефицита и прогноза
```
forecast (analytics.forecast)
sp_build_deficit_proposal → deficit_proposal
sp_rebuild_stock_plan_by_arrival → stock_plan_by_arrival
Формула: closing = opening + inbound_confirmed + inbound_deficit - forecast_demand
```
**Источники:**
- opening_qty — pbi.w_ostatok_da_net (остаток на дату)
- Входящие заказы — статусы: В пути, В производстве, Выгружен на складе, Согласован
- Stock quantity — только `quantity` (не sellable_stock)
---
## 7. Ключевые таблицы для остатков
| Объект | Роль |
|--------|------|
| `pbi.ostatki_short` | Остатки для PBI (date, sklad, artic_id, quantity, upakovok) |
| `pbi.w_ostatok_da_net` | Остаток на дату, opening_qty, availability (ostatok) |
| `pbi.ostatki` | Полные остатки (накопительная) |
| Фильтр | `[Категория склада] <> 'Виртуальный'` — исключение МП из складского остатка |
---
*Справочник сформирован по mag_pbi_schema.sql и analytics/pbi.*

View File

@ -0,0 +1,210 @@
# Описание проекта MAG для ИИ-помощника
> Полное описание проекта: структура, компоненты, API, frontend, аналитика. Используй при ответах, доработках и отладке.
---
## 1. Общая архитектура
### 1.1 Структура репозитория
```
mag/
├── api/ # Backend авторизации, задач, корзин (Node.js, port 5710)
├── magapi/ # Backend аналитики, MS SQL (Node.js, port 9001)
├── quasar/ # SPA на Quasar/Vue 3
├── analytics/ # PBI модель, SQL схема, база знаний
│ ├── pbi/ # Power BI отчёт (TMDL)
│ ├── sql_db_mag_pbi/ # Схема БД mag_pbi
│ ├── 01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md # База знаний SQL/PBI
│ └── 02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md # Этот файл
├── .cursor/rules/ # analize.mdc — правила для AI
└── nginx-agent-snippet.conf
```
### 1.2 Схема взаимодействия
```
Quasar (SPA)
├── api (axios) → MagAPI (/mag/) — данные аналитики, MSSQL
├── apiAuth → API (/mag_backend/) — авторизация
└── apiMain → API (/mag_backend/) — JWT, задачи, корзины, endpoints
MagAPI (9001) ──► MSSQL mag_pbi
API (5710) ──► MySQL (users, jobs, basket)
```
---
## 2. API (api/) — порт 5710
### 2.1 Маршруты
Динамический роутинг: `GET|POST /mag_backend/:lib/:path*`
| lib | Назначение | Примеры функций |
|-----|------------|----------------|
| auth | Авторизация | signIn, signInOneC, registerUser |
| admin | Админка | users, addUser, updateUser, impersonate |
| user | Профиль | fetchMe, myCategories |
| jobs | Задачи | createJob, getJobs, startJob, startWBReviewsSync |
| basket | Корзины | loadBaskets, addProductToBasket |
| endpoints | Файлы, аналитика | uploadExcelToBD, getWBContentAnalytics |
| products | Товары | getDetails, search |
| potentialOrders | Потенциальные заказы | getPotentialOrders |
| suppliers | Поставщики | loadProducts, getSupplierSettings |
| ozon, ozonFbo, ozonFbs | Ozon | getOzonStocks, getOzonFboOrders |
| agent | ИИ-помощник | **chat**, **chatStatus** |
| ImportTask | Импорт | updateForecastFromFile |
### 2.2 ИИ-агент (`api/lib/agent.js`)
- **POST /agent/chat** — запуск Cursor Agent. Тело: `{ prompt, history }`. Ответ: `{ jobId }`.
- **GET /agent/chatStatus?jobId=xxx** — polling результата. Ответ: `{ content, done }`.
- Маркер конца: `__AGENT_DONE__` в файле.
- CWD агента: `analytics/` (относительно api).
- `CURSOR_API_KEY` в .env — обязателен.
### 2.3 Система задач (JobManager)
- **Файлы:** `api/lib/jobManager.js`, `api/lib/jobsInit.js`, `api/lib/jobHandlers/*`
- **Модель:** `api/models/Job.js` (Sequelize, SQLite/MySQL)
- **Типы:** sync_wb_reviews, sync_ozon_reviews, load_ozon_orders, load_ozon_stocks, update_wb_competitors_prices, update_ozon_competitors_prices, update_magok_content, analyze_wb_content
- **Cron:** 02:00 WB, 03:00 Ozon, 04:00 Ozon orders, 05:00 Ozon stocks, 06:00 WB competitors, 07:00 Magok/Ozon competitors
- **DISABLE_MARKET_JOBS=true** — отключить задачи маркетов
### 2.4 Роли и доступ
| Маршрут | Роли |
|---------|------|
| /agent/* | admin |
| /jobs/* | admin, user |
| /admin/* | admin |
---
## 3. MagAPI (magapi/) — порт 9001
### 3.1 Маршруты
`POST /mag/:lib/:fn`
| lib | Функции |
|-----|---------|
| markets | getDopRekvizit, getGroups, getNomenclature, getImages |
| mag | getGroups, getPaymentRequests, getForecastScenarios, updateForecastFromFile |
| cards | search, filterValues, getSupplierOrderInfo |
| contractorProducer | getContractors, getProducers, calcNormalizedRoic |
### 3.2 База данных
- **MSSQL** mag_pbi (prdsql)
- **Файлы:** `magapi/dbconfig.js`, `magapi/lib/markets.js`, `mag.js`, `cards.js`
- **Swagger:** `/docs` — OpenAPI
---
## 4. Quasar (quasar/) — frontend
### 4.1 Конфигурация
- **settings.js:** baseURL (magapi), authURL (api), MAG_SECRET, AUTH_SECRET
- **Роли:** admin, user, stocks, supplier_products, markets_products, uploader, image_uploader, pay, agent
### 4.2 Страницы и роуты
| Path | Роли | Страница |
|------|------|----------|
| / | — | IndexPage |
| /auth | — | PageLogin |
| /stocks | admin, stocks | PageStocksNew — остатки, прогноз |
| /where_in_ozon | admin | PageWhereInOzon |
| /where_goods | admin | PageWhereGoods |
| /time_line | admin | PageTimeLine |
| /potential_orders | admin | PagePotentialOrders |
| /supplier_orders | admin, pay, stocks | PageSupplierOrders |
| /supplier_products | admin | PageSupplierProducts |
| /markets_products | admin | PageMarketsProducts |
| /uploader | admin | PageFileUploader |
| /image_uploader | admin | PageProductImageUploader |
| /pay | admin | PagePayments |
| **/agent** | **admin** | **PageAgent — чат с ИИ** |
| /admin, /admin/jobs-log | admin | Админка, лог задач |
### 4.3 Ключевые компоненты отчётов
- **stocksNew/** — PageStocksNew, ForecastView, CardView, AnalyticsCol
- **ForecastView.vue** — прогноз дефицита, план по месяцам
- **AnalyticsCol.vue** — ROIC, средний остаток, ТН
- **MainLayout.vue** — меню, корзина, drawer
---
## 5. Аналитика (analytics/)
### 5.1 Файлы базы знаний
- **01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md** — таблицы, представления, процедуры, PBI-источники. Использовать при трассировке мер и работе с SQL.
- **02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md** — этот файл.
### 5.2 Правила данных (соблюдать)
- **Stock quantity:** только `quantity`. Не `sellable_stock`.
- **MP stock:** отдельно.
- **Входящие заказы:** В пути, В производстве, Выгружен на складе, Согласован.
- **Интервалы:** `[start, end)`.
### 5.3 Дефицит и прогноз
1. `analytics.forecast` + `sp_build_deficit_proposal``deficit_proposal`
2. `sp_rebuild_stock_plan_by_arrival``stock_plan_by_arrival`
3. opening_qty из `pbi.w_ostatok_da_net`
---
## 6. Рекомендации для ИИ-помощника
### 6.1 При ответах
- Аналитика: использовать `01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md`.
- Не выдумывать объекты схемы — только из файлов.
- Отвечать на русском.
### 6.2 При доработке
- API: Express, JWT, checkRole.
- Quasar: Vue 3, Pinia.
- Аналитика: quantity, не sellable_stock.
### 6.3 Безопасность
- Ключи Ozon, WB, CURSOR_API_KEY — в .env.
- JWT_SECRET, MAG_SECRET, AUTH_SECRET — в .env.
### 6.4 Типичные проблемы
- **Остатки не сходятся:** фильтр `Категория склада <> Виртуальный`, источник ostatki_short vs w_ostatok_da_net.
- **Меры PBI пустые:** связи с .Календарь, REMOVEFILTERS.
- **Дефицит не считается:** выполнить sp_build_deficit_proposal до sp_rebuild_stock_plan_by_arrival.
- **Агент не отвечает:** CURSOR_API_KEY, путь agent.exe (Windows).
---
## 7. Файлы для быстрого поиска
| Вопрос | Файл |
|--------|------|
| Структура SQL/PBI | analytics/01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md |
| Этот документ | analytics/02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md |
| API маршруты | api/api.js |
| ИИ-агент | api/lib/agent.js |
| Задачи cron | api/lib/jobsInit.js |
| Роуты frontend | quasar/src/router/routes.js |
| Настройки | quasar/src/config/settings.js |
| Схема SQL | analytics/sql_db_mag_pbi/mag_pbi_schema.sql |
| Меры PBI | analytics/pbi/model/report/Model/tables/Основной отчет.tmdl |
| Cursor rules | .cursor/rules/analize.mdc |
---
*Документ для загрузки на сервер и использования ИИ-помощником при работе с проектом MAG.*

View File

@ -1,178 +0,0 @@
# Структура аналитики: 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
- Структурированные объяснения метрик
- Соблюдение правил данных
- **Не придумывать** объекты схемы — только из файлов проекта
- Трассировка дефицита/прогноза с процедурами

View File

@ -1,20 +0,0 @@
# AI Architect System Context
You are an AI architect for Power BI + MS SQL analytics.
Main responsibilities:
- Trace measures from TMDL to SQL sources.
- Build structured explanations of metrics.
- Respect project data rules.
- Never invent schema objects — always read project files.
- Trace deficit/forecast flow (context/06_DEFICIT_FORECAST.md) with procedures.
Workflow:
1. Find measure in TMDL.
2. Extract DAX.
3. Resolve dependencies.
4. Extract partition/source (Sql.Database, Schema, Item or Query).
5. Produce structured explanation.
Language: Russian.
Style: structured, precise, no fluff.

View File

@ -1,18 +0,0 @@
# Data Rules
## Идентификаторы 1С (схема analytics)
- **`*_1c_id`** — бинарный ключ 1С (`BINARY(16)`), ссылка на `_IDRRef` справочника/документа.
- **`*_id`** — строковый id (GUID в формате `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) для API, поиска, отображения.
Пример: `contractor_1c_id` (binary) в таблице, `contractor_id` (nvarchar) в представлении для выдачи во внешние системы.
---
- Stock quantity = field 'quantity' only.
- Never use 'sellable_stock' in stock calculations.
- Marketplace (MP) stock is calculated separately and added if needed.
- Orders with statuses:
'В пути', 'В производстве', 'Выгружен на складе', 'Согласован'
are treated as incoming stock.
- Use date intervals as [start, end) when aggregating.

View File

@ -1,6 +0,0 @@
# Glossary
- Stock (шт) — physical quantity, based on 'quantity'.
- Stock (руб) — monetary valuation of stock.
- MP — marketplace.
- Data mart — SQL view/table prepared for analytics.

View File

@ -1,23 +0,0 @@
# Standard Workflows
## Trace Measure
1. Locate measure in TMDL.
2. Show DAX.
3. List dependent measures/tables.
4. Extract SQL source from partition.
5. Produce explanation.
## Trace Deficit / Forecast
1. Читай context/06_DEFICIT_FORECAST.md.
2. Прогноз → sp_build_deficit_proposal → deficit_proposal.
3. deficit_proposal + forecast + inbound → sp_rebuild_stock_plan_by_arrival → stock_plan_by_arrival.
4. order_qty = прогноз окна [T .. T+cover); дефицит при net_stock < minAvailable.
## Documentation Draft
Structure:
- Purpose
- DAX
- Dependencies
- SQL sources
- Business meaning
- Usage notes

View File

@ -1,6 +0,0 @@
# Knowledge Base Policy
- New documentation starts as draft.
- Only approved content becomes shared knowledge.
- Store documentation under /docs/metrics.
- Each article must include DAX, SQL lineage and business explanation.

View File

@ -1,11 +0,0 @@
# Output Formats
## Measure Trace Format
1. Measure Name
2. DAX Formula
3. Dependencies
4. SQL Source (server, database, schema, object)
5. Business Explanation
6. Usage Recommendations
7. Validation Checks

View File

@ -1,133 +0,0 @@
# Механика расчёта дефицита поверх прогноза
## Общая схема
```
forecast (прогноз) → sp_build_deficit_proposal → deficit_proposal
↑ ↓
stock + inbound + minAvail │ sp_rebuild_stock_plan_by_arrival
│ ↓
└──────────────────── stock_plan_by_arrival
```
## Таблицы
| Таблица | Назначение |
|---------|------------|
| `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 |
## Процедуры
### 1. sp_build_deficit_proposal
**Назначение:** Дефицит и рекомендации к заказу с учётом прогноза по сценарию.
**Параметры (по умолчанию):**
- `@scenario_id` = 4
- `@group_path` = '' — path группы ('' = все группы)
- `@lead_time_m` = 4 — срок поставки (мес.)
- `@cover_months` = 6 — горизонт покрытия (мес.)
- `@from_month` = текущий месяц
- `@to_month_excl` = '2028-01-01'
**Шаги логики:**
1. Календарь месяцев [from, to)
2. SKU по group_path (pbi.groups.path LIKE @path + '%')
3. Прогноз из `analytics.forecast` по scenario_id
4. Inbound — подтверждённые заказы (get_orders_by_group): статусы В пути, В производстве, Выгружен на складе (Согласован закомментирован в коде)
5. Stock = остаток склад (get_quantity_by_group) + MP (get_mp_quantity_by_group)
6. Последовательность по месяцам: demand_m, inbound_m, served_m, lost_m, net_stock (рекурсивный flow)
7. Первый месяц дефицита T: net_stock < minAvailable, месяц >= @from + lead_time
8. Якоря: T, T+cover, T+2cover... до to_month_excl
9. order_qty = прогноз окна [T .. T+cover) (demand_window)
**Результат:** INSERT в `deficit_proposal` (order_qty > 0).
**Источники данных:**
- forecast ← `analytics.forecast`
- inbound ← `analytics.get_orders_by_group`
- stock ← `analytics.get_quantity_by_group`, `analytics.get_mp_quantity_by_group`
- SKU/minAvail ← `pbi.nomenclature`, `pbi.groups`
---
### 2. sp_rebuild_stock_plan_by_arrival
**Назначение:** План остатков по месяцам прихода (opening, inbound, forecast, closing).
**Параметры:** @scenario_id, @from_month, @to_month
**Источники по CTE:**
1. opening_qty — остаток на дату < from_month (pbi.w_ostatok_da_net)
2. inbound_confirmed — подтверждённые заказы по месяцу прихода (get_orders_by_group: В пути, В производстве, Выгружен на складе, Согласован)
3. inbound_deficit — SUM(order_qty) по deficit_proposal
4. forecast_demand — SUM(value) по forecast
**Формула closing:**
```
closing = opening + inbound_confirmed + inbound_deficit - forecast_demand
```
Rolling: opening для месяца M = LAG(closing) по SKU и arrival_month.
**Зависимость:** НЕ вызывает sp_build_deficit_proposal. Только читает deficit_proposal. Перед вызовом должен быть выполнен `sp_build_deficit_proposal` или `sp_run_deficit_all_skus`.
---
### 3. sp_run_deficit_all_skus
**Назначение:** Пересчёт дефицита по всем SKU (group_path = '').
Вызывает `sp_build_deficit_proposal` с @group_path = N''.
---
### 4. sp_загрузка_прогнозаакупки
**Назначение:** Загрузка прогноза из Excel/внешних источников.
Записывает в forecast (scenario_id = 8), при отсутствии кода — подтягивает из scenario_id = 5.
В конце может вызывать `sp_build_deficit_proposal` (закомментировано для scenario 8).
---
### 5. create_forecast_loop
**Назначение:** Цикл по группам (path из pbi.groups, lvl=2).
Для каждого path вызывает `sp_build_forecast_s4_by_group` — наполняет forecast, **не вызывает** sp_build_deficit_proposal.
---
### 6. sp_build_forecast_s4_by_group
**Назначение:** Построение прогноза по группе (rate_per_day × дни × seasonal_koef).
Вставляет в `analytics.forecast`. Источник сезонности — `analytics.seasonality_groups`.
---
## Представления
| View | Источник | Назначение |
|------|----------|------------|
| `analytics.deficit_orders` | deficit_proposal + nomenclature | Заказы по дефициту с ценой и суммой (status='Дефицит') |
---
## Порядок выполнения (рекомендуемый)
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)
---
## Правила данных (дефицит)
- Дефицит определяется как net_stock < minAvailable (nomenclature.minAvailableQty).
- order_qty = прогноз спроса на окно [T .. T+cover_months).
- Статусы заказов «входящих»: см. 01_DATA_RULES. Фактически: sp_build_deficit_proposal — 3 статуса (Согласован закомментирован); sp_rebuild_stock_plan_by_arrival — 4 статуса.
- Интервалы дат — [start, end) (полуоткрытые).

Binary file not shown.