diff --git a/01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md b/01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md new file mode 100644 index 0000000..3f97def --- /dev/null +++ b/01_ПОЛНАЯ_СТРУКТУРА_PBI_И_SQL.md @@ -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.* diff --git a/02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md b/02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md new file mode 100644 index 0000000..b503c3c --- /dev/null +++ b/02_КОММЕНТАРИИ_ДЛЯ_ИИ_ПОМОЩНИКА.md @@ -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.* diff --git a/STRUCTURE.md b/STRUCTURE.md deleted file mode 100644 index b26a687..0000000 --- a/STRUCTURE.md +++ /dev/null @@ -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 -- Структурированные объяснения метрик -- Соблюдение правил данных -- **Не придумывать** объекты схемы — только из файлов проекта -- Трассировка дефицита/прогноза с процедурами diff --git a/context/00_SYSTEM.md b/context/00_SYSTEM.md deleted file mode 100644 index b69a854..0000000 --- a/context/00_SYSTEM.md +++ /dev/null @@ -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. diff --git a/context/01_DATA_RULES.md b/context/01_DATA_RULES.md deleted file mode 100644 index 2af8074..0000000 --- a/context/01_DATA_RULES.md +++ /dev/null @@ -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. diff --git a/context/02_GLOSSARY.md b/context/02_GLOSSARY.md deleted file mode 100644 index f5f332f..0000000 --- a/context/02_GLOSSARY.md +++ /dev/null @@ -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. diff --git a/context/03_WORKFLOWS.md b/context/03_WORKFLOWS.md deleted file mode 100644 index 2551afc..0000000 --- a/context/03_WORKFLOWS.md +++ /dev/null @@ -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 diff --git a/context/04_KB_POLICY.md b/context/04_KB_POLICY.md deleted file mode 100644 index 915a76b..0000000 --- a/context/04_KB_POLICY.md +++ /dev/null @@ -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. diff --git a/context/05_OUTPUT_FORMATS.md b/context/05_OUTPUT_FORMATS.md deleted file mode 100644 index 9b8a801..0000000 --- a/context/05_OUTPUT_FORMATS.md +++ /dev/null @@ -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 diff --git a/context/06_DEFICIT_FORECAST.md b/context/06_DEFICIT_FORECAST.md deleted file mode 100644 index ff55263..0000000 --- a/context/06_DEFICIT_FORECAST.md +++ /dev/null @@ -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) (полуоткрытые). diff --git a/sql_db_mag_pbi/mag_pbi_schema.txt b/sql_db_mag_pbi/mag_pbi_schema.txt deleted file mode 100644 index 52bf2a9..0000000 Binary files a/sql_db_mag_pbi/mag_pbi_schema.txt and /dev/null differ